4 #include <QGuiApplication>
9 FilenameRole
= Qt::UserRole
+ 1,
10 FileKindRole
= Qt::UserRole
+ 2,
11 FileIconRole
= Qt::UserRole
+ 3,
12 PermissionsRole
= Qt::UserRole
+ 4,
13 SizeRole
= Qt::UserRole
+ 5,
14 LastModifiedRole
= Qt::UserRole
+ 6,
15 CreatedRole
= Qt::UserRole
+ 7,
16 IsDirRole
= Qt::UserRole
+ 8,
17 IsLinkRole
= Qt::UserRole
+ 9,
18 SymLinkTargetRole
= Qt::UserRole
+ 10
21 FileModel::FileModel(QObject
*parent
) :
22 QAbstractListModel(parent
),
27 m_watcher
= new QFileSystemWatcher(this);
28 connect(m_watcher
, SIGNAL(directoryChanged(const QString
&)), this, SLOT(refresh()));
29 connect(m_watcher
, SIGNAL(fileChanged(const QString
&)), this, SLOT(refresh()));
32 m_showAll
= settings
.value("showAll", false).toBool();
34 // refresh model every time settings are changed
35 Engine
*engine
= qApp
->property("engine").value
<Engine
*>();
36 connect(engine
, SIGNAL(settingsChanged()), this, SLOT(refreshFull()));
39 FileModel::~FileModel()
43 int FileModel::rowCount(const QModelIndex
&parent
) const
46 return m_files
.count();
49 QVariant
FileModel::data(const QModelIndex
&index
, int role
) const
51 if (!index
.isValid() || index
.row() > m_files
.size()-1)
54 QFileInfo info
= m_files
.at(index
.row()).info
;
59 return info
.fileName();
62 if (info
.isSymLink()) return "l";
63 if (info
.isDir()) return "d";
64 if (info
.isFile()) return "-";
68 if (info
.isSymLink() && info
.isDir()) return "folder-link";
69 if (info
.isDir()) return "folder";
70 if (info
.isSymLink()) return "link";
72 QString suffix
= info
.suffix().toLower();
73 return suffixToIconName(suffix
);
78 return permissionsToString(info
.permissions());
81 if (info
.isSymLink() && info
.isDir()) return "dir-link";
82 if (info
.isDir()) return "dir";
83 return filesizeToString(info
.size());
85 case LastModifiedRole
:
86 return datetimeToString(info
.lastModified());
89 return datetimeToString(info
.created());
95 return info
.isSymLink();
97 case SymLinkTargetRole
:
98 return info
.symLinkTarget();
105 QHash
<int, QByteArray
> FileModel::roleNames() const
107 QHash
<int, QByteArray
> roles
= QAbstractListModel::roleNames();
108 roles
.insert(FilenameRole
, QByteArray("filename"));
109 roles
.insert(FileKindRole
, QByteArray("filekind"));
110 roles
.insert(FileIconRole
, QByteArray("fileIcon"));
111 roles
.insert(PermissionsRole
, QByteArray("permissions"));
112 roles
.insert(SizeRole
, QByteArray("size"));
113 roles
.insert(LastModifiedRole
, QByteArray("modified"));
114 roles
.insert(CreatedRole
, QByteArray("created"));
115 roles
.insert(IsDirRole
, QByteArray("isDir"));
116 roles
.insert(IsLinkRole
, QByteArray("isLink"));
117 roles
.insert(SymLinkTargetRole
, QByteArray("symLinkTarget"));
121 int FileModel::fileCount() const
123 return m_files
.count();
126 QString
FileModel::errorMessage() const
128 return m_errorMessage
;
131 void FileModel::setDir(QString dir
)
136 // update watcher to watch the new directory
137 if (!m_dir
.isEmpty())
138 m_watcher
->removePath(m_dir
);
140 m_watcher
->addPath(dir
);
150 QString
FileModel::appendPath(QString dirName
)
152 return QDir::cleanPath(QDir(m_dir
).absoluteFilePath(dirName
));
155 void FileModel::setActive(bool active
)
157 if (m_active
== active
)
161 emit
activeChanged();
169 QString
FileModel::parentPath()
171 return QDir::cleanPath(QDir(m_dir
).absoluteFilePath(".."));
174 QString
FileModel::fileNameAt(int fileIndex
)
176 if (fileIndex
< 0 || fileIndex
>= m_files
.count())
179 return m_files
.at(fileIndex
).info
.absoluteFilePath();
182 void FileModel::refresh()
193 void FileModel::refreshFull()
204 void FileModel::readDirectory()
206 // wrapped in reset model methods to get views notified
212 if (!m_dir
.isEmpty())
216 emit
fileCountChanged();
217 emit
errorMessageChanged();
220 void FileModel::readEntries()
224 m_errorMessage
= tr("Folder does not exist");
227 if (access(m_dir
, R_OK
) == -1) {
228 m_errorMessage
= tr("No permission to read the folder");
233 bool hiddenSetting
= settings
.value("show-hidden-files", false).toBool();
234 QDir::Filter hidden
= hiddenSetting
? QDir::Hidden
: (QDir::Filter
)0;
235 dir
.setFilter(QDir::AllDirs
| QDir::Files
| QDir::NoDotAndDotDot
| hidden
);
237 if (settings
.value("show-dirs-first", false).toBool())
238 dir
.setSorting(QDir::Name
| QDir::DirsFirst
);
240 Engine
*engine
= qApp
->property("engine").value
<Engine
*>();
242 QFileInfoList infoList
= dir
.entryInfoList();
243 foreach (QFileInfo info
, infoList
) {
244 if (m_showAll
|| (info
.isDir()) || (info
.suffix() == engine
->extensionFilter())) {
247 m_files
.append(data
);
252 void FileModel::refreshEntries()
257 if (m_dir
.isEmpty()) {
261 emit
fileCountChanged();
262 emit
errorMessageChanged();
268 m_errorMessage
= tr("Folder does not exist");
269 emit
errorMessageChanged();
272 if (access(m_dir
, R_OK
) == -1) {
273 m_errorMessage
= tr("No permission to read the folder");
274 emit
errorMessageChanged();
279 bool hiddenSetting
= settings
.value("show-hidden-files", false).toBool();
280 QDir::Filter hidden
= hiddenSetting
? QDir::Hidden
: (QDir::Filter
)0;
281 dir
.setFilter(QDir::AllDirs
| QDir::Files
| QDir::NoDotAndDotDot
| hidden
);
283 if (settings
.value("show-dirs-first", false).toBool())
284 dir
.setSorting(QDir::Name
| QDir::DirsFirst
);
286 Engine
*engine
= qApp
->property("engine").value
<Engine
*>();
289 QList
<FileData
> newFiles
;
290 QFileInfoList infoList
= dir
.entryInfoList();
291 foreach (QFileInfo info
, infoList
) {
292 if ((m_showAll
) || (info
.isDir()) || (info
.suffix() == engine
->extensionFilter())) {
295 newFiles
.append(data
);
299 int oldFileCount
= m_files
.count();
301 // compare old and new files and do removes if needed
302 for (int i
= m_files
.count()-1; i
>= 0; --i
) {
303 FileData data
= m_files
.at(i
);
304 if (!newFiles
.contains(data
)) {
305 beginRemoveRows(QModelIndex(), i
, i
);
310 // compare old and new files and do inserts if needed
311 for (int i
= 0; i
< newFiles
.count(); ++i
) {
312 FileData data
= newFiles
.at(i
);
313 if (!m_files
.contains(data
)) {
314 beginInsertRows(QModelIndex(), i
, i
);
315 m_files
.insert(i
, data
);
320 if (m_files
.count() != oldFileCount
)
321 emit
fileCountChanged();
323 emit
errorMessageChanged();
326 void FileModel::setShowAll(bool showAll
)
328 if (m_showAll
!= showAll
) {
332 settings
.setValue("showAll", m_showAll
);
334 emit
showAllChanged();