swift
aircraftcategorytreemodel.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2019 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QList>
7 #include <QMap>
8 #include <QStandardItem>
9 #include <QStandardItemModel>
10 #include <QString>
11 #include <Qt>
12 #include <QtDebug>
13 #include <QtGlobal>
14 
16 #include "gui/models/columns.h"
17 #include "misc/icon.h"
19 #include "misc/propertyindex.h"
20 #include "misc/threadutils.h"
21 #include "misc/variant.h"
22 
23 using namespace swift::misc;
24 using namespace swift::misc::physical_quantities;
25 using namespace swift::misc::aviation;
26 
27 namespace swift::gui::models
28 {
29  CAircraftCategoryTreeModel::CAircraftCategoryTreeModel(QObject *parent) : QStandardItemModel(parent)
30  {
31  m_columns.addColumn(CColumn::standardString("id", CAircraftCategory::IndexDbIntegerKey));
32  m_columns.addColumn(CColumn::standardString("description", CAircraftCategory::IndexDescription));
33  m_columns.addColumn(CColumn::standardString("changed", CAircraftCategory::IndexUtcTimestampFormattedYmdhms));
34  }
35 
37  {
38  Q_ASSERT_X(CThreadUtils::isInThisThread(this), Q_FUNC_INFO, "Wrong thread");
39 
40  this->clear();
41  if (categories.isEmpty()) { return; }
42 
43  m_categories = categories;
44  m_categories.sortByLevel();
46  this->setColumnCount(m_columns.size() + 1);
47 
48  for (const CAircraftCategory &category : m_categories)
49  {
50  QList<QStandardItem *> categoryRow;
51 
52  // ownership of QStandardItem is taken by model
53  QStandardItem *si = new QStandardItem(category.isAssignable() ? CIcons::paperPlane16() : CIcons::folder16(),
54  category.getLevelAndName());
55  si->setEditable(false);
56  categoryRow.push_back(si);
57 
58  // add all clumns
59  for (const CColumn &column : m_columns.columns())
60  {
61  const CPropertyIndex i(column.getPropertyIndex());
62  const CVariant v(category.propertyByIndex(i));
63  const CVariant f = column.getFormatter()->displayRole(v);
64  si = new QStandardItem(f.toQString(true));
65  si->setEditable(false); // make not editable
66  categoryRow.push_back(si);
67  } // columns
68 
69  // add all items
70  if (categoryRow.isEmpty()) { continue; }
71 
72  QStandardItem *parent = categoryRow.first();
73  if (category.isFirstLevel()) { this->invisibleRootItem()->appendRow(categoryRow); }
74  else
75  {
76  const int p = category.getDepth() - 1;
77  Q_ASSERT_X(items[p], Q_FUNC_INFO, "No parent item");
78  items[p]->appendRow(categoryRow);
79  }
80  items.insert(category.getDepth(), parent);
81  }
82  }
83 
85  {
86  m_categories.clear();
87  QStandardItemModel::clear();
88  }
89 } // namespace swift::gui::models
void updateContainer(const swift::misc::aviation::CAircraftCategoryList &categories)
Update container.
Single column.
Definition: columns.h:26
static CColumn standardString(const QString &headerName, const swift::misc::CPropertyIndex &propertyIndex, int alignment=CDefaultFormatter::alignDefault())
Get a standard string object formatted column.
Definition: columns.cpp:57
int size() const
Size (number of columns)
Definition: columns.cpp:163
const QList< CColumn > & columns() const
Columns.
Definition: columns.h:238
void addColumn(const CColumn &column)
Add a column.
Definition: columns.cpp:100
void clear()
Removes all elements in the sequence.
Definition: sequence.h:288
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Definition: variant.h:66
Value object for aircraft categories.
Value object encapsulating a list of ICAO codes.
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:76
Models to be used with views, mainly QTableView.
Free functions in swift::misc.