8 #include "../include/ccAsprsModel.h"
16 if (m_data.size() == 0) {
34 Qt::Orientation orientation,
36 if (role != Qt::DisplayRole)
return {};
38 if (orientation == Qt::Vertical)
return section;
60 if (!index.isValid())
return {};
62 const AsprsItem& item = m_data[index.row()];
65 if (index.column() ==
VISIBLE) {
67 if (role == Qt::CheckStateRole) {
68 return item.
visible ? Qt::Checked : Qt::Unchecked;
76 if (role != Qt::DisplayRole && role != Qt::EditRole) {
80 switch (index.column()) {
98 const QVariant& value,
102 if (!index.isValid()) {
108 switch (index.column()) {
110 if (role == Qt::CheckStateRole) {
111 item.
visible =
static_cast<Qt::CheckState
>(value.toInt()) ==
120 QString
name = value.toString();
121 if (!isNameExist(
name)) {
130 int code = value.toInt();
131 if (!isCodeExist(code)) {
132 int oldCode = item.
code;
142 item.
color = value.value<QColor>();
147 item.
count = value.toInt();
151 emit dataChanged(index, index);
157 if (!index.isValid()) {
158 return Qt::ItemIsEnabled;
161 Qt::ItemFlags f = QAbstractItemModel::flags(index);
162 if (index.column() ==
NAME || index.column() ==
CODE) {
163 f |= (Qt::ItemIsEditable);
164 }
else if (index.column() ==
VISIBLE) {
165 f |= (Qt::ItemIsUserCheckable);
172 const int rowNumber = m_data.size();
173 beginInsertRows(QModelIndex(), rowNumber, rowNumber);
178 return createIndex(rowNumber,
NAME);
181 bool ccAsprsModel::isNameExist(
const QString&
name)
const {
182 auto item = std::find_if(
183 m_data.begin(), m_data.end(),
184 [
name](
const AsprsItem& item) { return item.name == name; });
185 return item != m_data.end();
188 bool ccAsprsModel::isCodeExist(
int code)
const {
189 auto item = std::find_if(
190 m_data.begin(), m_data.end(),
191 [code](
const AsprsItem& item) { return item.code == code; });
192 return item != m_data.end();
196 const QString& className,
199 bool visible =
true) {
200 QString cleanClassName = className;
201 cleanClassName.replace(QChar(
'/'), QChar(
'@'));
203 settings.beginGroup(cleanClassName);
205 settings.setValue(
"class", classValue);
206 settings.setValue(
"color", classColor.rgb());
207 settings.setValue(
"visible", visible);
213 const QString& className,
215 QString cleanClassName = className;
216 cleanClassName.replace(QChar(
'/'), QChar(
'@'));
218 QString readableClassName = className;
219 readableClassName.replace(QChar(
'@'), QChar(
'/'));
221 item.
name = readableClassName;
222 item.
code = settings.value(cleanClassName +
"/class", 0).toInt();
223 item.
color = QColor(settings.value(cleanClassName +
"/color", 0).toUInt());
224 item.
visible = settings.value(cleanClassName +
"/visible",
true).toBool();
228 void ccAsprsModel::createDefaultItems() {
230 settings.beginGroup(
"qCloudLayers/ASPRS");
233 AddClass(settings,
"Unclassified", 1, Qt::lightGray);
234 AddClass(settings,
"Ground", 2, qRgb(166, 116, 4));
235 AddClass(settings,
"Low vegetation", 3, qRgb(38, 114, 0));
236 AddClass(settings,
"Medium vegetation", 4, qRgb(69, 229, 0));
237 AddClass(settings,
"High vegetation", 5, qRgb(204, 240, 123));
242 AddClass(settings,
"Rail", 10, qRgb(85, 85, 0));
243 AddClass(settings,
"Road surface", 11, Qt::darkGray);
244 AddClass(settings,
"Overlap", 12, qRgb(255, 170, 255));
245 AddClass(settings,
"Wire Shield/Neutral/Com", 13, qRgb(191, 231, 205));
246 AddClass(settings,
"Wire Conductors/Phases", 14, qRgb(193, 230, 125));
248 AddClass(settings,
"Wire Insulators", 16, Qt::darkYellow);
249 AddClass(settings,
"Bridge Deck", 17, Qt::darkCyan);
250 AddClass(settings,
"High Noise", 18, Qt::darkRed);
252 AddClass(settings,
"Conductor Attachment Points", 64, qRgb(25, 0, 51));
253 AddClass(settings,
"Shield Attachment Points", 65, qRgb(51, 0, 102));
254 AddClass(settings,
"Midspan Points", 66, qRgb(76, 0, 153));
255 AddClass(settings,
"Structure Top Points", 67, qRgb(102, 0, 204));
256 AddClass(settings,
"Structure Bottom Points", 68, qRgb(127, 0, 255));
258 AddClass(settings,
"Guy Wire", 70, qRgb(153, 51, 255));
259 AddClass(settings,
"Substation", 75, qRgb(178, 102, 255));
261 AddClass(settings,
"Misc Temporary", 81, qRgb(204, 153, 255));
262 AddClass(settings,
"Misc Permanent", 82, qRgb(229, 204, 255));
263 AddClass(settings,
"Misc Fences", 83, qRgb(204, 204, 255));
273 settings.beginGroup(
"qCloudLayers/ASPRS");
275 QStringList classes = settings.childGroups();
278 m_data.reserve(classes.size());
279 for (
int i = 0; i < classes.length(); ++i) {
288 settings.remove(
"qCloudLayers/ASPRS");
289 settings.beginGroup(
"qCloudLayers/ASPRS");
291 for (
int i = 0; i < m_data.length(); ++i) {
301 QModelIndex a = createIndex(0,
COUNT);
302 QModelIndex b = createIndex(m_data.count() - 1,
COUNT);
303 emit dataChanged(a, b);
308 const QModelIndex& parent) {
312 for (
int i = 0; i < rows; ++i) {
321 auto it = std::find_if(m_data.begin(), m_data.end(),
323 return item.name == name;
325 return it != m_data.end() ? &(*it) :
nullptr;
329 auto it = std::find_if(m_data.begin(), m_data.end(),
331 return item.code == code;
333 return it != m_data.end() ? &(*it) :
nullptr;
337 auto it = std::find_if(m_data.begin(), m_data.end(),
339 return item.name == name;
341 return it != m_data.end() ? it - m_data.begin() : -1;
344 int ccAsprsModel::getUnusedCode()
const {
345 auto it = std::max_element(m_data.cbegin(), m_data.cend(),
346 [](
const AsprsItem& a,
const AsprsItem& b) {
347 return a.code < b.code;
349 return it != m_data.end() ? (*it).code + 1 : 0;
static void ReadClass(const QSettings &settings, const QString &className, ccAsprsModel::AsprsItem &item)
static void AddClass(QSettings &settings, const QString &className, int classValue, QColor classColor, bool visible=true)
bool removeRows(int position, int rows, const QModelIndex &parent)
void colorChanged(AsprsItem &item)
QVariant headerData(int section, Qt::Orientation orientation, int role) const
int rowCount(const QModelIndex &parent) const
AsprsItem * find(QString name)
int columnCount(const QModelIndex &parent) const
int indexOf(QString name) const
QVariant data(const QModelIndex &index, int role) const
QModelIndex createNewItem()
void codeChanged(AsprsItem &item, int oldCode)
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Qt::ItemFlags flags(const QModelIndex &index) const
ccAsprsModel(QObject *parent=nullptr)
constexpr Rgb black(0, 0, 0)
constexpr Rgb magenta(MAX, 0, MAX)
constexpr Rgb darkBlue(0, 0, MAX/2)
constexpr Rgb white(MAX, MAX, MAX)
constexpr Rgb red(MAX, 0, 0)
constexpr Rgb blue(0, 0, MAX)
constexpr Rgb yellow(MAX, MAX, 0)