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