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