FlightGear next
PathListModel.cxx
Go to the documentation of this file.
1#include "PathListModel.hxx"
2
3#include <QSettings>
4#include <QDebug>
5
7 QAbstractListModel(pr)
8{
9
10}
11
16
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();
43 emit countChanged();
44}
45
46void 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
60QStringList 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
79QStringList 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
91{
92 return static_cast<int>(mPaths.size());
93}
94
95int PathListModel::rowCount(const QModelIndex &parent) const
96{
97 Q_UNUSED(parent)
98 return static_cast<int>(mPaths.size());
99}
100
101QVariant 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
120bool 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
134QHash<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
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
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
170void 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
const int PathRole
const int PathEnabledRole
static QStringList readEnabledPaths(QString settingsKey)
void removePath(int index)
void swapIndices(int indexA, int indexB)
void countChanged()
PathListModel(QObject *pr)
QHash< int, QByteArray > roleNames() const override
void enabledPathsChanged()
~PathListModel() override
void saveToSettings(QString key) const
void loadFromSettings(QString key)
void appendPath(QString path)
QStringList enabledPaths() const
QVariant data(const QModelIndex &index, int role) const override
int rowCount(const QModelIndex &parent) const override
bool setData(const QModelIndex &index, const QVariant &value, int role) override