1 // SPDX-FileCopyrightText: 2019 Linus Jahn <lnj@kaidan.im>
2 // SPDX-FileCopyrightText: 2019-2020 Jonah Brüchert <jbb@kaidan.im>
3 //
4 // SPDX-License-Identifier: LGPL-2.0-or-later
5
6 #include "dirmodel.h"
7
8 #include <KIOWidgets/KDirLister>
9
10 #include "dirlister.h"
11
DirModel(QObject * parent)12 DirModel::DirModel(QObject *parent)
13 : KDirSortFilterProxyModel(parent)
14 , m_lister(new DirLister(this))
15 {
16 setSourceModel(&m_dirModel);
17 m_dirModel.setDirLister(m_lister);
18 connect(m_lister, QOverload<>::of(&KCoreDirLister::completed), this, &DirModel::isLoadingChanged);
19 connect(m_lister, &DirLister::errorOccured, this, [this](const QString &message) {
20 m_lastError = message;
21 Q_EMIT lastErrorChanged();
22 });
23 }
24
data(const QModelIndex & index,int role) const25 QVariant DirModel::data(const QModelIndex &index, int role) const
26 {
27 if (!hasIndex(index.row(), index.column(), index.parent()))
28 return {};
29
30 switch (role) {
31 case Roles::Name:
32 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).name();
33 case Url:
34 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).url();
35 case IconName:
36 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).iconName();
37 case IsDir:
38 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).isDir();
39 case IsLink:
40 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).isLink();
41 case FileSize:
42 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).size();
43 case MimeType:
44 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).mimetype();
45 case IsHidden:
46 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).isHidden();
47 case IsReadable:
48 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).isReadable();
49 case IsWritable:
50 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).isWritable();
51 case ModificationTime:
52 return qvariant_cast<KFileItem>(KDirSortFilterProxyModel::data(index, KDirModel::FileItemRole)).time(KFileItem::ModificationTime);
53 }
54
55 return {};
56 }
57
roleNames() const58 QHash<int, QByteArray> DirModel::roleNames() const
59 {
60 return {
61 {Name, QByteArrayLiteral("name")},
62 {Url, QByteArrayLiteral("url")},
63 {IconName, QByteArrayLiteral("iconName")},
64 {IsDir, QByteArrayLiteral("isDir")},
65 {IsLink, QByteArrayLiteral("isLink")},
66 {FileSize, QByteArrayLiteral("fileSize")},
67 {MimeType, QByteArrayLiteral("mimeType")},
68 {IsHidden, QByteArrayLiteral("isHidden")},
69 {IsReadable, QByteArrayLiteral("isReadable")},
70 {IsWritable, QByteArrayLiteral("isWritable")},
71 {ModificationTime, QByteArrayLiteral("modificationTime")},
72 };
73 }
74
folder() const75 QUrl DirModel::folder() const
76 {
77 return m_lister->url();
78 }
79
setFolder(const QUrl & folder)80 void DirModel::setFolder(const QUrl &folder)
81 {
82 if (folder != m_lister->url()) {
83 m_dirModel.openUrl(folder);
84
85 Q_EMIT folderChanged();
86 }
87 }
88
isLoading() const89 bool DirModel::isLoading() const
90 {
91 return !m_lister->isFinished();
92 }
93
showDotFiles() const94 bool DirModel::showDotFiles() const
95 {
96 return m_lister->showingDotFiles();
97 }
98
setShowDotFiles(bool showDotFiles)99 void DirModel::setShowDotFiles(bool showDotFiles)
100 {
101 m_lister->setShowingDotFiles(showDotFiles);
102 m_lister->emitChanges();
103 Q_EMIT showDotFilesChanged();
104 }
105
nameFilter() const106 QString DirModel::nameFilter() const
107 {
108 return m_lister->nameFilter();
109 }
110
setNameFilter(const QString & nameFilter)111 void DirModel::setNameFilter(const QString &nameFilter)
112 {
113 if (nameFilter != m_lister->nameFilter()) {
114 m_lister->setNameFilter(nameFilter);
115 m_lister->emitChanges();
116
117 Q_EMIT nameFilterChanged();
118 }
119 }
120
mimeFilters() const121 QStringList DirModel::mimeFilters() const
122 {
123 return m_lister->mimeFilters();
124 }
125
setMimeFilters(const QStringList & mimeFilters)126 void DirModel::setMimeFilters(const QStringList &mimeFilters)
127 {
128 if (mimeFilters != m_lister->mimeFilters()) {
129 QStringList newMimeFilters = mimeFilters;
130 newMimeFilters.append(QStringLiteral("inode/directory"));
131
132 m_lister->setMimeFilter(newMimeFilters);
133 m_lister->emitChanges();
134
135 Q_EMIT mimeFiltersChanged();
136 }
137 }
138
resetMimeFilters()139 void DirModel::resetMimeFilters()
140 {
141 m_lister->clearMimeFilter();
142 m_lister->emitChanges();
143 Q_EMIT mimeFiltersChanged();
144 }
145
lastError() const146 QString DirModel::lastError() const
147 {
148 return m_lastError;
149 }
150