1 #include "PathListModel.hxx"
2
3 #include <QSettings>
4 #include <QDebug>
5
PathListModel(QObject * pr)6 PathListModel::PathListModel(QObject *pr) :
7 QAbstractListModel(pr)
8 {
9
10 }
11
~PathListModel()12 PathListModel::~PathListModel()
13 {
14
15 }
16
loadFromSettings(QString key)17 void PathListModel::loadFromSettings(QString key)
18 {
19 QSettings settings;
20 if (!settings.contains(key))
21 return;
22
23 QVariantList vl = settings.value(key).toList();
24 mPaths.clear();
25 mPaths.reserve(static_cast<size_t>(vl.size()));
26
27 beginResetModel();
28
29 Q_FOREACH(QVariant v, vl) {
30 QVariantMap m = v.toMap();
31 PathEntry entry;
32 entry.path = m.value("path").toString();
33 if (entry.path.isEmpty()) {
34 continue;
35 }
36
37 entry.enabled = m.value("enabled", QVariant{true}).toBool();
38 mPaths.push_back(entry);
39 }
40
41 endResetModel();
42 emit enabledPathsChanged();
43 emit countChanged();
44 }
45
saveToSettings(QString key) const46 void PathListModel::saveToSettings(QString key) const
47 {
48 QVariantList vl;
49 for (const auto &e : mPaths) {
50 QVariantMap v;
51 v["path"] = e.path;
52 v["enabled"] = e.enabled;
53 vl.append(v);
54 }
55
56 QSettings settings;
57 settings.setValue(key, vl);
58 }
59
readEnabledPaths(QString settingsKey)60 QStringList PathListModel::readEnabledPaths(QString settingsKey)
61 {
62 QSettings settings;
63 if (!settings.contains(settingsKey))
64 return {};
65
66 QStringList result;
67 QVariantList vl = settings.value(settingsKey).toList();
68 Q_FOREACH(QVariant v, vl) {
69 QVariantMap m = v.toMap();
70 if (!m.value("enabled").toBool())
71 continue;
72
73 result.append(m.value("path").toString());
74 }
75
76 return result;
77 }
78
enabledPaths() const79 QStringList PathListModel::enabledPaths() const
80 {
81 QStringList result;
82 for (const auto& e : mPaths) {
83 if (e.enabled) {
84 result.append(e.path);
85 }
86 }
87 return result;
88 }
89
count()90 int PathListModel::count()
91 {
92 return static_cast<int>(mPaths.size());
93 }
94
rowCount(const QModelIndex & parent) const95 int PathListModel::rowCount(const QModelIndex &parent) const
96 {
97 Q_UNUSED(parent)
98 return static_cast<int>(mPaths.size());
99 }
100
data(const QModelIndex & index,int role) const101 QVariant PathListModel::data(const QModelIndex &index, int role) const
102 {
103 int row = index.row();
104 const auto& entry = mPaths.at(static_cast<size_t>(row));
105 switch (role) {
106 case Qt::DisplayRole:
107 case PathRole:
108 return entry.path;
109
110 case PathEnabledRole:
111 return entry.enabled;
112
113 default:
114 break;
115 }
116
117 return {};
118 }
119
setData(const QModelIndex & index,const QVariant & value,int role)120 bool PathListModel::setData(const QModelIndex &index, const QVariant &value, int role)
121 {
122 int row = index.row();
123 auto& entry = mPaths.at(static_cast<size_t>(row));
124 if (role == PathEnabledRole) {
125 entry.enabled = value.toBool();
126 emit dataChanged(index, index, {PathEnabledRole});
127 emit enabledPathsChanged();
128 return true;
129 }
130
131 return false;
132 }
133
roleNames() const134 QHash<int, QByteArray> PathListModel::roleNames() const
135 {
136 QHash<int, QByteArray> result = QAbstractListModel::roleNames();
137 result[Qt::DisplayRole] = "path";
138 result[PathEnabledRole] = "enabled";
139 return result;
140 }
141
removePath(int index)142 void PathListModel::removePath(int index)
143 {
144 if ((index < 0) || (index >= static_cast<int>(mPaths.size()))) {
145 qWarning() << Q_FUNC_INFO << "index invalid:" << index;
146 return;
147 }
148
149 beginRemoveRows({}, index, index);
150 auto it = mPaths.begin() + index;
151 mPaths.erase(it);
152 endRemoveRows();
153 emit enabledPathsChanged();
154 emit countChanged();
155 }
156
appendPath(QString path)157 void PathListModel::appendPath(QString path)
158 {
159 PathEntry entry;
160 entry.path = path;
161 entry.enabled = true; // enable by default
162 const int newRow = static_cast<int>(mPaths.size());
163 beginInsertRows({}, newRow, newRow);
164 mPaths.push_back(entry);
165 endInsertRows();
166 emit enabledPathsChanged();
167 emit countChanged();
168 }
169
swapIndices(int indexA,int indexB)170 void PathListModel::swapIndices(int indexA, int indexB)
171 {
172 if ((indexA < 0) || (indexA >= static_cast<int>(mPaths.size()))) {
173 qWarning() << Q_FUNC_INFO << "index invalid:" << indexA;
174 return;
175 }
176
177 if ((indexB < 0) || (indexB >= static_cast<int>(mPaths.size()))) {
178 qWarning() << Q_FUNC_INFO << "index invalid:" << indexB;
179 return;
180 }
181
182 std::swap(mPaths[static_cast<size_t>(indexA)],
183 mPaths[static_cast<size_t>(indexB)]);
184 emit dataChanged(index(indexA), index(indexA));
185 emit dataChanged(index(indexB), index(indexB));
186 emit enabledPathsChanged();
187 }
188
189