swift
atcstationlistmodel.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 <QDateTime>
7 #include <QList>
8 #include <QMap>
9 #include <QModelIndex>
10 #include <QString>
11 #include <Qt>
12 #include <QtDebug>
13 #include <QtGlobal>
14 
17 #include "gui/models/columns.h"
18 #include "misc/aviation/callsign.h"
19 #include "misc/icon.h"
21 #include "misc/network/user.h"
22 #include "misc/pq/frequency.h"
23 #include "misc/pq/length.h"
24 #include "misc/pq/units.h"
26 
27 using namespace swift::misc::physical_quantities;
28 using namespace swift::misc::audio;
29 using namespace swift::misc::aviation;
30 using namespace swift::misc::network;
31 
32 namespace swift::gui::models
33 {
34  CAtcStationListModel::CAtcStationListModel(AtcStationMode stationMode, QObject *parent)
35  : CListModelCallsignObjects("ModelAtcList", parent)
36  {
37  this->setStationMode(stationMode);
38 
39  // force strings for translation in resource files
40  (void)QT_TRANSLATE_NOOP("ModelAtcList", "callsign");
41  (void)QT_TRANSLATE_NOOP("ModelAtcList", "frequency");
42  (void)QT_TRANSLATE_NOOP("ModelAtcList", "distance");
43  (void)QT_TRANSLATE_NOOP("ModelAtcList", "controllername");
44  (void)QT_TRANSLATE_NOOP("ModelAtcList", "online");
45  }
46 
48  {
49  if (m_stationMode == stationMode) return;
50  m_stationMode = stationMode;
51  m_columns.clear();
52  switch (stationMode)
53  {
54  case NotSet:
55  case StationsOnline:
56  {
58  "cs.", "callsign", { CAtcStation::IndexCallsign, CCallsign::IndexCallsignStringAsSet }));
59  CColumn col("type", CAtcStation::IndexIcon);
60  col.setSortPropertyIndex({ CAtcStation::IndexCallsign, CCallsign::IndexSuffix });
61  m_columns.addColumn(col);
62  m_columns.addColumn(CColumn("frequency", CAtcStation::IndexFrequency, new CComFrequencyFormatter()));
64  CColumn("distance", CAtcStation::IndexRelativeDistance, new CAirspaceDistanceFormatter()));
65  m_columns.addColumn(CColumn("r.", "in range", CAtcStation::IndexIsInRange,
66  new CBoolIconFormatter("in range", "outside range")));
67  m_columns.addColumn(CColumn("xc.", "AFV cross coupled", CAtcStation::IndexIsAfvCrossCoupled,
68  new CBoolIconFormatter("AFV cross coupled", "not coupled")));
69  m_columns.addColumn(CColumn("range", CAtcStation::IndexRange, new CAirspaceDistanceFormatter()));
71  CColumn::standardString("controllername", { CAtcStation::IndexController, CUser::IndexRealName }));
72  m_columns.addColumn(CColumn("until", "expected logoff time", CAtcStation::IndexLogoffTime,
74 
75  // default sort order
76  this->setSortColumnByPropertyIndex(CAtcStation::IndexRelativeDistance);
77  m_sortOrder = Qt::AscendingOrder;
78  }
79  break;
80 
81  default: qFatal("Wrong mode"); break;
82  }
83  }
84 
86  {
87  CAtcStationTreeModel *tm = new CAtcStationTreeModel(QObject::parent());
88  tm->setColumns(m_columns);
89  tm->updateContainer(this->container());
90  return tm;
91  }
92 
94  {
95  if (station.getCallsign().isEmpty()) { return; }
96  if (added)
97  {
98  const bool c = m_container.contains(&CAtcStation::getCallsign, station.getCallsign());
99  if (!c) { this->insert(station); }
100  }
101  else
102  {
103  QModelIndex parent;
104  if (rowCount(parent) == 0) { return; }
105  beginRemoveRows(parent, 0, 0);
106  this->removeIf(&CAtcStation::getCallsign, station.getCallsign());
107  endRemoveRows();
108  }
109  }
110 } // namespace swift::gui::models
Airspace distance displayed in NM.
void changedAtcStationConnectionStatus(const swift::misc::aviation::CAtcStation &station, bool added)
Used to quickly update single station (better response for the user)
void setStationMode(AtcStationMode stationMode)
Set station mode.
CAtcStationTreeModel * toAtcTreeModel() const
A group by type (TWR, APP, ...) model.
void setColumns(const CColumns &columns)
Set columns.
void updateContainer(const swift::misc::aviation::CAtcStationList &stations)
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
void setSortPropertyIndex(const swift::misc::CPropertyIndex &propertyIndex)
Property index used when sorting, option alternative.
Definition: columns.cpp:30
void addColumnIncognito(const CColumn &column)
Add a column as incognito enabled.
Definition: columns.cpp:108
void addColumn(const CColumn &column)
Add a column.
Definition: columns.cpp:100
Formatter when column contains QDateTime, QDate or QTime.
static const QString & formatHm()
Hour minute.
const ContainerType & container() const
Used container data.
virtual void insert(const ObjectType &object)
Similar to ContainerType::insert here inserts at first position.
int removeIf(K0 k0, V0 v0, KeysValues... keysValues)
Remove elements matching some particular key/value pair(s).
ContainerType m_container
used container
int rowCount(const QModelIndex &parentIndex=QModelIndex()) const final
virtual bool setSortColumnByPropertyIndex(const swift::misc::CPropertyIndex &propertyIndex)
Set column for sorting.
QModelIndex parent(const QModelIndex &child) const final
List model for callsign based objects (callsign is unique key)
Value object encapsulating information about an ATC station.
Definition: atcstation.h:38
const CCallsign & getCallsign() const
Get callsign.
Definition: atcstation.h:84
bool isEmpty() const
Is empty?
Definition: callsign.h:63
Models to be used with views, mainly QTableView.