swift
aircraftmodellistmodel.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QtDebug>
7 #include <QtGlobal>
8 
10 #include "gui/models/columns.h"
13 #include "misc/aviation/livery.h"
14 #include "misc/db/datastore.h"
15 #include "misc/orderable.h"
18 #include "misc/timestampbased.h"
19 
20 using namespace swift::misc;
21 using namespace swift::misc::simulation;
22 using namespace swift::misc::aviation;
23 using namespace swift::misc::network;
24 using namespace swift::misc::physical_quantities;
25 
26 namespace swift::gui::models
27 {
28  CAircraftModelListModel::CAircraftModelListModel(AircraftModelMode mode, QObject *parent)
29  : COrderableListModelDbObjects("CAircraftModelListModel", parent)
30  {
31  this->setAircraftModelMode(mode);
32 
33  // force strings for translation in resource files
34  (void)QT_TRANSLATE_NOOP("CAircraftModelListModel", "callsign");
35  (void)QT_TRANSLATE_NOOP("CAircraftModelListModel", "combined type");
36  (void)QT_TRANSLATE_NOOP("CAircraftModelListModel", "model");
37  }
38 
40  {
41  if (m_mode == mode) { return; }
42  m_mode = mode;
43  m_columns.clear();
44  switch (mode)
45  {
46  case NotSet:
48  m_columns.addColumn(CColumn::standardString("model", { CAircraftModel::IndexModelString }));
50  CColumn("DB", "DB metadata", CAircraftModel::IndexDatabaseIcon, new CPixmapFormatter()));
52  CColumn::standardString("DB", "parts from DB", { CAircraftModel::IndexMembersDbStatus }));
53  m_columns.addColumn(CColumn("mode", "model mode(include, exclude)", CAircraftModel::IndexModelModeAsIcon,
54  new CPixmapFormatter()));
55  m_columns.addColumn(CColumn::standardString("description", { CAircraftModel::IndexDescription }));
57  CColumn::standardString("sim.", "simulator supported", CAircraftModel::IndexSimulatorInfoAsString));
58 
60  "dist.", "distributor", { CAircraftModel::IndexDistributor, CDistributor::IndexDbStringKey }));
61 
63  "aircraft", { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexDesignatorManufacturer }));
65  CColumn::standardString("livery", { CAircraftModel::IndexLivery, CLivery::IndexCombinedCode }));
67  CColumn::standardString("airline", { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode,
68  CAirlineIcaoCode::IndexDesignatorNameCountry }));
69 
70  m_columns.addColumn(CColumn::standardString("name", { CAircraftModel::IndexName }));
71  m_columns.addColumn(CColumn::standardString("filename", { CAircraftModel::IndexFileName }));
72 
73  // default sort order
74  this->setSortColumnByPropertyIndex(CAircraftModel::IndexModelString);
75  m_sortOrder = Qt::AscendingOrder;
76  break;
77 
78  case OwnModelSet:
79  // intentional fall thru
81  [[fallthrough]];
82 
84  case StashModel:
85  m_columns.addColumn(CColumn::standardString("model", CAircraftModel::IndexModelString));
87  CColumn("DB", "DB metadata", CAircraftModel::IndexDatabaseIcon, new CPixmapFormatter()));
88  if (mode == StashModel)
89  {
91  CColumn::standardString("flags", "parts from DB", { CAircraftModel::IndexMembersDbStatus }));
92  }
93  m_columns.addColumn(CColumn("mode", "model mode(include, exclude)", CAircraftModel::IndexModelModeAsIcon,
94  new CPixmapFormatter()));
96  "dist.", "distributor", { CAircraftModel::IndexDistributor, CDistributor::IndexDbStringKey }));
97  if (mode == OwnModelSet)
98  {
100  "d#", "distributor order", { CAircraftModel::IndexDistributor, CDistributor::IndexOrderString }));
101  }
103  "ac", "aircraft ICAO",
104  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexAircraftDesignator }));
106  "fam.", "aircraft family", { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexFamily }));
108  CColumn::standardString("cat.", "category",
109  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexCategory,
110  CAircraftCategory::IndexLevelStringAndPath }));
112  CColumn::standardString("livery", { CAircraftModel::IndexLivery, CLivery::IndexCombinedCode }));
113  m_columns.addColumn(CColumn::standardString("al", "airline ICAO",
114  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode,
115  CAirlineIcaoCode::IndexAirlineDesignator }));
116  m_columns.addColumn(CColumn("CG", CAircraftModel::IndexCG,
117  new CPhysiqalQuantiyFormatter<CLengthUnit, CLength>(CLengthUnit::ft(), 1)));
118  m_columns.addColumn(CColumn::standardString("parts", CAircraftModel::IndexSupportedParts));
119  m_columns.addColumn(CColumn::standardString("description", CAircraftModel::IndexDescription));
120  m_columns.addColumn(CColumn::standardString("filename", CAircraftModel::IndexFileName));
121  m_columns.addColumn(CColumn::standardString("file ts.", "file timestamp",
122  CAircraftModel::IndexFileTimestampFormattedYmdhms));
123  m_columns.addColumn(CColumn::standardString("version", CAircraftModel::IndexVersion));
124  m_columns.addColumn(CColumn::standardString("changed", CAircraftModel::IndexUtcTimestampFormattedYmdhms));
125 
126  // default sort order
127  this->setSortColumnByPropertyIndex(CAircraftModel::IndexModelString);
128  m_sortOrder = Qt::AscendingOrder;
129  break;
130 
131  case Database:
132  m_columns.addColumn(CColumn::standardString("id", CAircraftModel::IndexDbIntegerKey,
134  m_columns.addColumn(CColumn::standardString("model", CAircraftModel::IndexAllModelStrings));
135  m_columns.addColumn(CColumn("mode", "model mode(include, exclude)", CAircraftModel::IndexModelModeAsIcon,
136  new CPixmapFormatter()));
137 
139  "dist.", "distributor", { CAircraftModel::IndexDistributor, CDistributor::IndexDbStringKey }));
140  m_columns.addColumn(CColumn::standardString("name", CAircraftModel::IndexName));
141  m_columns.addColumn(CColumn::standardString("description", CAircraftModel::IndexDescription));
143  CColumn::standardString("sim.", "simulator supported", CAircraftModel::IndexSimulatorInfoAsString));
144 
146  "ac", "aircraft ICAO",
147  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexAircraftDesignator }));
149  "fam.", "aircraft family", { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexFamily }));
151  CColumn::standardString("cat.", "category",
152  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexCategory,
153  CAircraftCategory::IndexPath }));
155  "manufacturer", "aircraft ICAO",
156  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexManufacturer }));
157 
159  CColumn::standardString("code", { CAircraftModel::IndexLivery, CLivery::IndexCombinedCode }));
160  m_columns.addColumn(CColumn::standardString("liv.desc.", "livery description",
161  { CAircraftModel::IndexLivery, CLivery::IndexDescription }));
162  m_columns.addColumn(CColumn::standardString("al", "airline ICAO",
163  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode,
164  CAirlineIcaoCode::IndexAirlineDesignator }));
166  "al.name", "airline name",
167  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode, CAirlineIcaoCode::IndexAirlineName }));
168 
169  m_columns.addColumn(CColumn("CG", CAircraftModel::IndexCG,
170  new CPhysiqalQuantiyFormatter<CLengthUnit, CLength>(CLengthUnit::ft(), 1)));
171  m_columns.addColumn(CColumn::standardString("parts", CAircraftModel::IndexSupportedParts));
172 
173  m_columns.addColumn(CColumn("fuse.", "fuselage color",
174  { CAircraftModel::IndexLivery, CLivery::IndexColorFuselage },
175  new CColorFormatter()));
176  m_columns.addColumn(CColumn("tail", "tail color", { CAircraftModel::IndexLivery, CLivery::IndexColorTail },
177  new CColorFormatter()));
178  m_columns.addColumn(CColumn("mil.", "military livery",
179  { CAircraftModel::IndexLivery, CLivery::IndexIsMilitary },
180  new CBoolIconFormatter("military", "civil")));
181  m_columns.addColumn(CColumn::standardString("version", CAircraftModel::IndexVersion));
182  m_columns.addColumn(CColumn::standardString("changed", CAircraftModel::IndexUtcTimestampFormattedYmdhms));
183 
184  // default sort order
185  this->setSortColumnByPropertyIndex(CAircraftModel::IndexModelString);
186  m_sortOrder = Qt::AscendingOrder;
187  break;
188 
189  case VPilotRuleModel:
190  m_columns.addColumn(CColumn::standardString("model", CAircraftModel::IndexModelString));
192  "dist.", "distributor", { CAircraftModel::IndexDistributor, CDistributor::IndexDbStringKey }));
194  CColumn::standardString("sim.", "simulator supported", CAircraftModel::IndexSimulatorInfoAsString));
195 
197  "ac", "aircraft ICAO",
198  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexAircraftDesignator }));
199 
200  m_columns.addColumn(CColumn::standardString("al", "airline ICAO",
201  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode,
202  CAirlineIcaoCode::IndexAirlineDesignator }));
204  "al.name", "airline name",
205  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode, CAirlineIcaoCode::IndexAirlineName }));
206 
207  m_columns.addColumn(CColumn::standardString("changed", CAircraftModel::IndexUtcTimestampFormattedYmdhms));
208 
209  // default sort order
210  this->setSortColumnByPropertyIndex(CAircraftModel::IndexModelString);
211  m_sortOrder = Qt::AscendingOrder;
212  break;
213 
214  default: qFatal("Wrong mode"); break;
215  }
216  }
217 
218  void CAircraftModelListModel::setHighlightModelStrings(const QStringList &modelStrings)
219  {
220  this->beginResetModel();
221  m_highlightStrings = modelStrings;
222  this->endResetModel();
223  }
224 
226  {
227  this->setHighlightModelStrings(highlightModels.getModelStringList(true));
228  }
229 
230  void CAircraftModelListModel::setHighlight(bool highlightModels)
231  {
232  if (m_highlightModels == highlightModels) { return; }
233 
234  this->beginResetModel();
235  m_highlightModels = highlightModels;
236  this->endResetModel();
237  }
238 
239  QStringList CAircraftModelListModel::getModelStrings(bool sort) const
240  {
241  if (this->isEmpty()) { return QStringList(); }
242  return this->container().getModelStringList(sort);
243  }
244 
246  {
247  if (models.isEmpty()) { return; }
248  CAircraftModelList currentModels(container());
249  currentModels.removeModelsWithString(models.getModelStringList(true), Qt::CaseInsensitive);
250  currentModels.push_back(models);
251  this->updateContainerMaybeAsync(currentModels);
252  }
253 
254  QVariant CAircraftModelListModel::data(const QModelIndex &index, int role) const
255  {
256  if (role == Qt::BackgroundRole)
257  {
258  const bool ms = highlightModels() && !m_highlightStrings.isEmpty();
259  if (!ms) { return CListModelDbObjects::data(index, role); }
260 
261  // the underlying model object
262  const CAircraftModel model(this->at(index));
263 
264  // highlight stashed first
265  if (m_highlightStrings.contains(model.getModelString(), Qt::CaseInsensitive)) { return m_highlightColor; }
266 
267  return QVariant();
268  }
269  else if (role == Qt::ToolTipRole)
270  {
271  // the underlying model object as summary
272  const CAircraftModel model(this->at(index));
273  return model.asHtmlSummary("<br>");
274  }
275  return CListModelDbObjects::data(index, role);
276  }
277 
279  {
280  m_highlightModels = false;
281  m_highlightStrings.clear();
283  }
284 
285  bool CAircraftModelListModel::hasHighlightedRows() const { return !m_highlightStrings.isEmpty(); }
286 } // namespace swift::gui::models
QStringList getModelStrings(bool sort) const
Model strings.
void setAircraftModelMode(CAircraftModelListModel::AircraftModelMode stationMode)
Mode.
void setHighlight(bool highlightModels)
Highlight models.
virtual QVariant data(const QModelIndex &index, int role) const
virtual void clearHighlighting()
Remove all highlighting.
@ OwnAircraftModelMappingTool
models of my simulator, but in mapping mode
@ VPilotRuleModel
vPilot rule turned into model
@ OwnAircraftModelClient
models existing for my simulator
void setHighlightModels(const swift::misc::simulation::CAircraftModelList &highlightModels)
Highlight models.
virtual bool hasHighlightedRows() const
Has highlighted rows?
void replaceOrAddByModelString(const swift::misc::simulation::CAircraftModelList &models)
Replace models with same model string, or just add.
void setHighlightModelStrings(const QStringList &modelStrings=QStringList())
Highlight models.
Formatter when column contains a color.
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
static CColumn orderColumn(const swift::misc::CPropertyIndex &propertyIndex=swift::misc::CPropertyIndexRef::GlobalIndexIOrderable, int alignment=CDefaultFormatter::alignRightVCenter())
Get a standard string object formatted column.
Definition: columns.cpp:68
void addColumn(const CColumn &column)
Add a column.
Definition: columns.cpp:100
static int alignRightVCenter()
Align right/vertically centered.
const ContainerType & container() const
Used container data.
virtual const ObjectType & at(const QModelIndex &index) const
Object at row position.
virtual void updateContainerMaybeAsync(const ContainerType &container, bool sort=true)
Update by new container.
virtual bool setSortColumnByPropertyIndex(const swift::misc::CPropertyIndex &propertyIndex)
Set column for sorting.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const final
virtual void clearHighlighting()
Remove all highlighting.
virtual QVariant data(const QModelIndex &index, int role) const
Get data for index and role.
Formatter for physical quantities.
void push_back(const T &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
const QString & getModelString() const
Model key, either queried or loaded from simulator model.
QString asHtmlSummary(const QString &separator="<br>") const
As a brief HTML summary (e.g. used in tooltips)
Value object encapsulating a list of aircraft models.
QStringList getModelStringList(bool sort=true) const
Model strings.
int removeModelsWithString(const CAircraftModelList &models, Qt::CaseSensitivity sensitivity)
Remove those models with given model strings.
Models to be used with views, mainly QTableView.
Free functions in swift::misc.