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::physical_quantities;
24 
25 namespace swift::gui::models
26 {
27  CAircraftModelListModel::CAircraftModelListModel(AircraftModelMode mode, QObject *parent)
28  : COrderableListModelDbObjects("CAircraftModelListModel", parent)
29  {
30  this->setAircraftModelMode(mode);
31 
32  // force strings for translation in resource files
33  (void)QT_TRANSLATE_NOOP("CAircraftModelListModel", "callsign");
34  (void)QT_TRANSLATE_NOOP("CAircraftModelListModel", "combined type");
35  (void)QT_TRANSLATE_NOOP("CAircraftModelListModel", "model");
36  }
37 
39  {
40  if (m_mode == mode) { return; }
41  m_mode = mode;
42  m_columns.clear();
43  switch (mode)
44  {
45  case NotSet:
47  m_columns.addColumn(CColumn::standardString("model", { CAircraftModel::IndexModelString }));
49  CColumn("DB", "DB metadata", CAircraftModel::IndexDatabaseIcon, new CPixmapFormatter()));
51  CColumn::standardString("DB", "parts from DB", { CAircraftModel::IndexMembersDbStatus }));
52  m_columns.addColumn(CColumn("mode", "model mode(include, exclude)", CAircraftModel::IndexModelModeAsIcon,
53  new CPixmapFormatter()));
54  m_columns.addColumn(CColumn::standardString("description", { CAircraftModel::IndexDescription }));
56  CColumn::standardString("sim.", "simulator supported", CAircraftModel::IndexSimulatorInfoAsString));
57 
59  "dist.", "distributor", { CAircraftModel::IndexDistributor, CDistributor::IndexDbStringKey }));
60 
62  "aircraft", { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexDesignatorManufacturer }));
64  CColumn::standardString("livery", { CAircraftModel::IndexLivery, CLivery::IndexCombinedCode }));
66  CColumn::standardString("airline", { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode,
67  CAirlineIcaoCode::IndexDesignatorNameCountry }));
68 
69  m_columns.addColumn(CColumn::standardString("name", { CAircraftModel::IndexName }));
70  m_columns.addColumn(CColumn::standardString("filename", { CAircraftModel::IndexFileName }));
71 
72  // default sort order
73  this->setSortColumnByPropertyIndex(CAircraftModel::IndexModelString);
75  break;
76 
77  case OwnModelSet:
78  // intentional fall thru
80  [[fallthrough]];
81 
83  case StashModel:
84  m_columns.addColumn(CColumn::standardString("model", CAircraftModel::IndexModelString));
86  CColumn("DB", "DB metadata", CAircraftModel::IndexDatabaseIcon, new CPixmapFormatter()));
87  if (mode == StashModel)
88  {
90  CColumn::standardString("flags", "parts from DB", { CAircraftModel::IndexMembersDbStatus }));
91  }
92  m_columns.addColumn(CColumn("mode", "model mode(include, exclude)", CAircraftModel::IndexModelModeAsIcon,
93  new CPixmapFormatter()));
95  "dist.", "distributor", { CAircraftModel::IndexDistributor, CDistributor::IndexDbStringKey }));
96  if (mode == OwnModelSet)
97  {
99  "d#", "distributor order", { CAircraftModel::IndexDistributor, CDistributor::IndexOrderString }));
100  }
102  "ac", "aircraft ICAO",
103  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexAircraftDesignator }));
105  "fam.", "aircraft family", { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexFamily }));
107  CColumn::standardString("cat.", "category",
108  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexCategory,
109  CAircraftCategory::IndexLevelStringAndPath }));
111  CColumn::standardString("livery", { CAircraftModel::IndexLivery, CLivery::IndexCombinedCode }));
112  m_columns.addColumn(CColumn::standardString("al", "airline ICAO",
113  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode,
114  CAirlineIcaoCode::IndexAirlineDesignator }));
115  m_columns.addColumn(CColumn("CG", CAircraftModel::IndexCG,
116  new CPhysiqalQuantiyFormatter<CLengthUnit, CLength>(CLengthUnit::ft(), 1)));
117  m_columns.addColumn(CColumn::standardString("parts", CAircraftModel::IndexSupportedParts));
118  m_columns.addColumn(CColumn::standardString("description", CAircraftModel::IndexDescription));
119  m_columns.addColumn(CColumn::standardString("filename", CAircraftModel::IndexFileName));
120  m_columns.addColumn(CColumn::standardString("file ts.", "file timestamp",
121  CAircraftModel::IndexFileTimestampFormattedYmdhms));
122  m_columns.addColumn(CColumn::standardString("version", CAircraftModel::IndexVersion));
123  m_columns.addColumn(CColumn::standardString("changed", CAircraftModel::IndexUtcTimestampFormattedYmdhms));
124 
125  // default sort order
126  this->setSortColumnByPropertyIndex(CAircraftModel::IndexModelString);
128  break;
129 
130  case Database:
131  m_columns.addColumn(CColumn::standardString("id", CAircraftModel::IndexDbIntegerKey,
133  m_columns.addColumn(CColumn::standardString("model", CAircraftModel::IndexAllModelStrings));
134  m_columns.addColumn(CColumn("mode", "model mode(include, exclude)", CAircraftModel::IndexModelModeAsIcon,
135  new CPixmapFormatter()));
136 
138  "dist.", "distributor", { CAircraftModel::IndexDistributor, CDistributor::IndexDbStringKey }));
139  m_columns.addColumn(CColumn::standardString("name", CAircraftModel::IndexName));
140  m_columns.addColumn(CColumn::standardString("description", CAircraftModel::IndexDescription));
142  CColumn::standardString("sim.", "simulator supported", CAircraftModel::IndexSimulatorInfoAsString));
143 
145  "ac", "aircraft ICAO",
146  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexAircraftDesignator }));
148  "fam.", "aircraft family", { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexFamily }));
150  CColumn::standardString("cat.", "category",
151  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexCategory,
152  CAircraftCategory::IndexPath }));
154  "manufacturer", "aircraft ICAO",
155  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexManufacturer }));
156 
158  CColumn::standardString("code", { CAircraftModel::IndexLivery, CLivery::IndexCombinedCode }));
159  m_columns.addColumn(CColumn::standardString("liv.desc.", "livery description",
160  { CAircraftModel::IndexLivery, CLivery::IndexDescription }));
161  m_columns.addColumn(CColumn::standardString("al", "airline ICAO",
162  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode,
163  CAirlineIcaoCode::IndexAirlineDesignator }));
165  "al.name", "airline name",
166  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode, CAirlineIcaoCode::IndexAirlineName }));
167 
168  m_columns.addColumn(CColumn("CG", CAircraftModel::IndexCG,
169  new CPhysiqalQuantiyFormatter<CLengthUnit, CLength>(CLengthUnit::ft(), 1)));
170  m_columns.addColumn(CColumn::standardString("parts", CAircraftModel::IndexSupportedParts));
171 
172  m_columns.addColumn(CColumn("fuse.", "fuselage color",
173  { CAircraftModel::IndexLivery, CLivery::IndexColorFuselage },
174  new CColorFormatter()));
175  m_columns.addColumn(CColumn("tail", "tail color", { CAircraftModel::IndexLivery, CLivery::IndexColorTail },
176  new CColorFormatter()));
177  m_columns.addColumn(CColumn("mil.", "military livery",
178  { CAircraftModel::IndexLivery, CLivery::IndexIsMilitary },
179  new CBoolIconFormatter("military", "civil")));
180  m_columns.addColumn(CColumn::standardString("version", CAircraftModel::IndexVersion));
181  m_columns.addColumn(CColumn::standardString("changed", CAircraftModel::IndexUtcTimestampFormattedYmdhms));
182 
183  // default sort order
184  this->setSortColumnByPropertyIndex(CAircraftModel::IndexModelString);
186  break;
187 
188  case VPilotRuleModel:
189  m_columns.addColumn(CColumn::standardString("model", CAircraftModel::IndexModelString));
191  "dist.", "distributor", { CAircraftModel::IndexDistributor, CDistributor::IndexDbStringKey }));
193  CColumn::standardString("sim.", "simulator supported", CAircraftModel::IndexSimulatorInfoAsString));
194 
196  "ac", "aircraft ICAO",
197  { CAircraftModel::IndexAircraftIcaoCode, CAircraftIcaoCode::IndexAircraftDesignator }));
198 
199  m_columns.addColumn(CColumn::standardString("al", "airline ICAO",
200  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode,
201  CAirlineIcaoCode::IndexAirlineDesignator }));
203  "al.name", "airline name",
204  { CAircraftModel::IndexLivery, CLivery::IndexAirlineIcaoCode, CAirlineIcaoCode::IndexAirlineName }));
205 
206  m_columns.addColumn(CColumn::standardString("changed", CAircraftModel::IndexUtcTimestampFormattedYmdhms));
207 
208  // default sort order
209  this->setSortColumnByPropertyIndex(CAircraftModel::IndexModelString);
211  break;
212 
213  default: qFatal("Wrong mode"); break;
214  }
215  }
216 
218  {
219  this->beginResetModel();
220  m_highlightStrings = modelStrings;
221  this->endResetModel();
222  }
223 
225  {
226  this->setHighlightModelStrings(highlightModels.getModelStringList(true));
227  }
228 
229  void CAircraftModelListModel::setHighlight(bool highlightModels)
230  {
231  if (m_highlightModels == highlightModels) { return; }
232 
233  this->beginResetModel();
234  m_highlightModels = highlightModels;
235  this->endResetModel();
236  }
237 
239  {
240  if (this->isEmpty()) { return {}; }
241  return this->container().getModelStringList(sort);
242  }
243 
245  {
246  if (models.isEmpty()) { return; }
247  CAircraftModelList currentModels(container());
249  currentModels.push_back(models);
250  this->updateContainerMaybeAsync(currentModels);
251  }
252 
253  QVariant CAircraftModelListModel::data(const QModelIndex &index, int role) const
254  {
255  if (role == Qt::BackgroundRole)
256  {
257  const bool ms = highlightModels() && !m_highlightStrings.isEmpty();
258  if (!ms) { return CListModelDbObjects::data(index, role); }
259 
260  // the underlying model object
261  const CAircraftModel model(this->at(index));
262 
263  // highlight stashed first
264  if (m_highlightStrings.contains(model.getModelString(), Qt::CaseInsensitive)) { return m_highlightColor; }
265 
266  return {};
267  }
268  else if (role == Qt::ToolTipRole)
269  {
270  // the underlying model object as summary
271  const CAircraftModel model(this->at(index));
272  return model.asHtmlSummary("<br>");
273  }
274  return CListModelDbObjects::data(index, role);
275  }
276 
278  {
279  m_highlightModels = false;
280  m_highlightStrings.clear();
282  }
283 
284  bool CAircraftModelListModel::hasHighlightedRows() const { return !m_highlightStrings.isEmpty(); }
285 } // namespace swift::gui::models
QStringList getModelStrings(bool sort) const
Model strings.
void setAircraftModelMode(CAircraftModelListModel::AircraftModelMode stationMode)
Mode.
void setHighlight(bool highlightModels)
Highlight models.
QVariant data(const QModelIndex &index, int role) const
@ 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.
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
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.
void clear()
bool isEmpty() const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
CaseInsensitive
BackgroundRole
AscendingOrder