swift
distributorpreferencescomponent.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2016 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QFlags>
7 #include <QPointer>
8 #include <QPushButton>
9 #include <QTimer>
10 #include <Qt>
11 #include <QtGlobal>
12 
13 #include "ui_distributorpreferencescomponent.h"
14 
15 #include "core/webdataservices.h"
17 #include "gui/guiapplication.h"
18 #include "gui/guiutility.h"
22 #include "gui/views/viewbase.h"
23 #include "misc/logmessage.h"
24 #include "misc/orderable.h"
29 #include "misc/statusmessage.h"
30 
31 using namespace swift::misc;
32 using namespace swift::misc::simulation;
33 using namespace swift::misc::simulation::data;
34 using namespace swift::misc::network;
35 using namespace swift::gui::views;
36 using namespace swift::gui::models;
37 
38 namespace swift::gui::components
39 {
40  CDistributorPreferencesComponent::CDistributorPreferencesComponent(QWidget *parent)
42  {
43  ui->setupUi(this);
44  ui->comp_SimulatorSelector->setMode(CSimulatorSelector::RadioButtons);
45  ui->comp_SimulatorSelector->setRememberSelectionAndSetToLastSelection();
46 
47  connect(ui->pb_All, &QPushButton::pressed, this, &CDistributorPreferencesComponent::loadAllDistributors);
48  connect(ui->pb_AllForSimulator, &QPushButton::pressed, this,
49  &CDistributorPreferencesComponent::loadDistributorsForSimulator);
50  connect(ui->pb_AllInSet, &QPushButton::pressed, this,
51  &CDistributorPreferencesComponent::loadDistributorsFromSet);
52  connect(ui->pb_Save, &QPushButton::pressed, this, &CDistributorPreferencesComponent::save);
53  connect(ui->comp_SimulatorSelector, &CSimulatorSelector::changed, this,
54  &CDistributorPreferencesComponent::onSimulatorChanged);
55 
56  ui->tvp_Distributors->setDistributorMode(CDistributorListModel::NormalWithOrder);
57  ui->tvp_Distributors->menuRemoveItems(CDistributorView::MenuBackend |
58  CDistributorView::MenuDisplayAutomaticallyAndRefresh |
59  CDistributorView::MenuLoadAndSave);
60  ui->tvp_Distributors->menuAddItems(CDistributorView::MenuClear | CDistributorView::MenuOrderable |
61  CDistributorView::MenuRemoveSelectedRows);
62  ui->tvp_Distributors->initAsOrderable();
63 
64  this->triggerDeferredSimulatorChange();
65  }
66 
68 
69  void CDistributorPreferencesComponent::onPreferencesChanged()
70  {
71  // changed somewhere else
72  const CSimulatorInfo sim(ui->comp_SimulatorSelector->getValue());
73  const CDistributorList distributors = m_distributorPreferences.getThreadLocal().getDistributors(sim);
74  this->updateContainerMaybeAsync(distributors);
75  }
76 
77  void CDistributorPreferencesComponent::loadAllDistributors()
78  {
79  Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing application");
80  const CDistributorList distributors(sGui->getWebDataServices()->getDistributors());
81  if (distributors.isEmpty())
82  {
83  const CStatusMessage m = CStatusMessage(this).error(u"No distributors");
84  this->showOverlayMessage(m);
85  return;
86  }
87  this->updateContainerMaybeAsync(distributors);
88  }
89 
90  void CDistributorPreferencesComponent::loadDistributorsForSimulator()
91  {
92  const CSimulatorInfo sim(ui->comp_SimulatorSelector->getValue());
94  if (distributors.isEmpty())
95  {
96  const CStatusMessage m = CStatusMessage(this).error(u"No distributors, or no distributors matching %1")
97  << sim.toQString();
98  this->showOverlayMessage(m);
99  return;
100  }
101  this->updateContainerMaybeAsync(distributors);
102  }
103 
104  void CDistributorPreferencesComponent::loadDistributorsFromSet()
105  {
106  const CSimulatorInfo sim(ui->comp_SimulatorSelector->getValue());
107  const CAircraftModelList models =
108  CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().getCachedModels(sim);
109  if (models.isEmpty())
110  {
111  const CStatusMessage m = CStatusMessage(this).error(u"No data in model set %1") << sim.toQString();
112  this->showOverlayMessage(m);
113  return;
114  }
115  const CDistributorList distributors = models.getDistributors();
116  if (distributors.isEmpty())
117  {
118  const CStatusMessage m = CStatusMessage(this).error(u"No distributors for model set %1") << sim.toQString();
119  this->showOverlayMessage(m);
120  return;
121  }
122  this->updateContainerMaybeAsync(distributors);
123  }
124 
125  void CDistributorPreferencesComponent::save()
126  {
127  using namespace std::chrono_literals;
128  const CDistributorList distributors(ui->tvp_Distributors->container());
129  const CSimulatorInfo simulator = ui->comp_SimulatorSelector->getValue();
130  CDistributorListPreferences preferences = m_distributorPreferences.getThreadLocal();
131  preferences.setDistributors(distributors, simulator);
132  const CStatusMessage m = m_distributorPreferences.setAndSave(preferences);
133  CLogMessage::preformatted(m);
134  if (m.isSuccess()) { this->showOverlayHTMLMessage("Saved settings", 5s); }
135  else { this->showOverlayMessage(m); }
136  }
137 
138  void CDistributorPreferencesComponent::onSimulatorChanged(const CSimulatorInfo &simulator)
139  {
140  Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Expect single simulator");
141  const CDistributorList distributors(m_distributorPreferences.getThreadLocal().getDistributors(simulator));
142  ui->tvp_Distributors->updateContainerMaybeAsync(distributors);
143  }
144 
145  void CDistributorPreferencesComponent::triggerDeferredSimulatorChange()
146  {
147  QPointer<CDistributorPreferencesComponent> myself(this);
148  QTimer::singleShot(1000, this, [=] {
149  if (!myself) { return; }
150  if (!sApp || sApp->isShuttingDown()) { return; }
151  const CSimulatorInfo sim = ui->comp_SimulatorSelector->getValue();
152  this->onSimulatorChanged(sim);
153  });
154  }
155 
156  void CDistributorPreferencesComponent::updateContainerMaybeAsync(const CDistributorList &models, bool sortByOrder)
157  {
158  if (sortByOrder) { ui->tvp_Distributors->setSorting(CDistributor::IndexOrder, Qt::AscendingOrder); }
159  ui->tvp_Distributors->updateContainerMaybeAsync(models);
160  }
161 } // namespace swift::gui::components
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
Definition: application.cpp:71
bool isShuttingDown() const
Is application shutting down?
CWebDataServices * getWebDataServices() const
Get the web data services.
swift::misc::simulation::CDistributorList getDistributors() const
Distributors.
bool showOverlayHTMLMessage(const QString &htmlMessage, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
HTML message.
bool showOverlayMessage(const swift::misc::CStatusMessage &message, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show single message.
Using this class provides a QFrame with the overlay functionality already integrated.
Set and order distributors (to be used for model set)
void changed(const swift::misc::simulation::CSimulatorInfo &simulator)
Value has been changed.
const T & getThreadLocal() const
Read the current value.
Definition: valuecache.h:400
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Streamable status message, e.g.
bool isSuccess() const
Operation considered successful.
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:76
Value object encapsulating a list of aircraft models.
CDistributorList getDistributors(bool onlyDbDistributors=true) const
All distributors used with models of this list.
Value object encapsulating a list of distributors.
CDistributorList matchesSimulator(const CSimulatorInfo &simulator) const
Find for given simulator.
void setDistributors(const CDistributorList &distributors, const CSimulatorInfo &simulator)
Get distributors.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
bool isSingleSimulator() const
Single simulator selected.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
High level reusable GUI components.
Definition: aboutdialog.cpp:13
Models to be used with views, mainly QTableView.
Views, mainly QTableView.
Free functions in swift::misc.
auto singleShot(int msec, QObject *target, F &&task)
Starts a single-shot timer which will call a task in the thread of the given object when it times out...
Definition: threadutils.h:30