swift
Loading...
Searching...
No Matches
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
23using namespace swift::misc;
24using namespace swift::misc::physical_quantities;
25using namespace swift::misc::aviation;
26
27namespace swift::gui::models
28{
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())
42 {
43 return;
44 }
45
46 m_categories = categories;
47 m_categories.sortByLevel();
49 this->setColumnCount(m_columns.size() + 1);
50
51 for (const CAircraftCategory &category : m_categories)
52 {
53 QList<QStandardItem *> categoryRow;
54
55 // ownership of QStandardItem is taken by model
56 auto *si = new QStandardItem(category.isAssignable() ? CIcons::paperPlane16() : CIcons::folder16(),
57 category.getLevelAndName());
58 si->setEditable(false);
59 categoryRow.push_back(si);
60
61 // add all clumns
62 for (const CColumn &column : m_columns.columns())
63 {
64 const CPropertyIndex i(column.getPropertyIndex());
65 const CVariant v(category.propertyByIndex(i));
66 const CVariant f = column.getFormatter()->displayRole(v);
67 si = new QStandardItem(f.toQString(true));
68 si->setEditable(false); // make not editable
69 categoryRow.push_back(si);
70 } // columns
71
72 // add all items
73 if (categoryRow.isEmpty())
74 {
75 continue;
76 }
77
78 QStandardItem *parent = categoryRow.first();
79 if (category.isFirstLevel())
80 {
81 this->invisibleRootItem()->appendRow(categoryRow);
82 }
83 else
84 {
85 const int p = category.getDepth() - 1;
86 Q_ASSERT_X(items[p], Q_FUNC_INFO, "No parent item");
87 items[p]->appendRow(categoryRow);
88 }
89 items.insert(category.getDepth(), parent);
90 }
91 }
92
94 {
95 m_categories.clear();
97 }
98} // namespace swift::gui::models
CAircraftCategoryTreeModel(QObject *parent=nullptr)
Constructor.
void updateContainer(const swift::misc::aviation::CAircraftCategoryList &categories)
Update container.
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
static const QPixmap & paperPlane16()
Paper plane.
static const QPixmap & folder16()
Folder.
bool isEmpty() const
Synonym for empty.
Definition sequence.h:285
static bool isInThisThread(const QObject *toBeTested)
Is the current thread the object's thread?
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Definition variant.h:69
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:74
Models to be used with views, mainly QTableView.
Free functions in swift::misc.
T & first()
bool isEmpty() const const
void push_back(QList< T >::parameter_type value)
QMap< Key, T >::iterator insert(QMap< Key, T >::const_iterator pos, const Key &key, const T &value)
QObject(QObject *parent)
void appendRow(QStandardItem *item)
QStandardItemModel(QObject *parent)
QStandardItem * invisibleRootItem() const const
virtual QModelIndex parent(const QModelIndex &child) const const override
void setColumnCount(int columns)