]> cloud.milkyroute.net Git - dolphin.git/blob - src/dolphinplacesmodelsingleton.cpp
Merge branch 'release/21.12'
[dolphin.git] / src / dolphinplacesmodelsingleton.cpp
1 /*
2 * SPDX-FileCopyrightText: 2018 Kai Uwe Broulik <kde@privat.broulik.de>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "dolphinplacesmodelsingleton.h"
8 #include "trash/dolphintrash.h"
9
10 #include <KAboutData>
11 #include <KFilePlacesModel>
12
13 #include <QIcon>
14
15 DolphinPlacesModel::DolphinPlacesModel(const QString &alternativeApplicationName, QObject *parent)
16 : KFilePlacesModel(alternativeApplicationName, parent)
17 {
18 connect(&Trash::instance(), &Trash::emptinessChanged, this, &DolphinPlacesModel::slotTrashEmptinessChanged);
19 }
20
21 DolphinPlacesModel::~DolphinPlacesModel() = default;
22
23 bool DolphinPlacesModel::panelsLocked() const
24 {
25 return m_panelsLocked;
26 }
27
28 void DolphinPlacesModel::setPanelsLocked(bool locked)
29 {
30 if (m_panelsLocked == locked) {
31 return;
32 }
33
34 m_panelsLocked = locked;
35
36 if (rowCount() > 0) {
37 int lastPlace = rowCount() - 1;
38
39 for (int i = 0; i < rowCount(); ++i) {
40 if (KFilePlacesModel::groupType(index(i, 0)) != KFilePlacesModel::PlacesType) {
41 lastPlace = i - 1;
42 break;
43 }
44 }
45
46 Q_EMIT dataChanged(index(0, 0), index(lastPlace, 0), {KFilePlacesModel::GroupRole});
47 }
48 }
49
50 QVariant DolphinPlacesModel::data(const QModelIndex &index, int role) const
51 {
52 switch (role) {
53 case Qt::DecorationRole:
54 if (isTrash(index)) {
55 if (m_isEmpty) {
56 return QIcon::fromTheme(QStringLiteral("user-trash"));
57 } else {
58 return QIcon::fromTheme(QStringLiteral("user-trash-full"));
59 }
60 }
61 break;
62 case KFilePlacesModel::GroupRole: {
63 // When panels are unlocked, avoid a double "Places" heading,
64 // one from the panel title bar, one from the places view section.
65 if (!m_panelsLocked) {
66 const auto groupType = KFilePlacesModel::groupType(index);
67 if (groupType == KFilePlacesModel::PlacesType) {
68 return QString();
69 }
70 }
71 break;
72 }
73 }
74
75 return KFilePlacesModel::data(index, role);
76 }
77
78 void DolphinPlacesModel::slotTrashEmptinessChanged(bool isEmpty)
79 {
80 if (m_isEmpty == isEmpty) {
81 return;
82 }
83
84 // NOTE Trash::isEmpty() reads the config file whereas emptinessChanged is
85 // hooked up to whether a dirlister in trash:/ has any files and they disagree...
86 m_isEmpty = isEmpty;
87
88 for (int i = 0; i < rowCount(); ++i) {
89 const QModelIndex index = this->index(i, 0);
90 if (isTrash(index)) {
91 Q_EMIT dataChanged(index, index, {Qt::DecorationRole});
92 }
93 }
94 }
95
96 bool DolphinPlacesModel::isTrash(const QModelIndex &index) const
97 {
98 return url(index) == QUrl(QStringLiteral("trash:/"));
99 }
100
101 DolphinPlacesModelSingleton::DolphinPlacesModelSingleton()
102 : m_placesModel(new DolphinPlacesModel(KAboutData::applicationData().componentName() + applicationNameSuffix()))
103 {
104
105 }
106
107 DolphinPlacesModelSingleton &DolphinPlacesModelSingleton::instance()
108 {
109 static DolphinPlacesModelSingleton s_self;
110 return s_self;
111 }
112
113 DolphinPlacesModel *DolphinPlacesModelSingleton::placesModel() const
114 {
115 return m_placesModel.data();
116 }
117
118 QString DolphinPlacesModelSingleton::applicationNameSuffix()
119 {
120 return QStringLiteral("-places-panel");
121 }