swift
cockpittranspondermodeledscomponent.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 <QBoxLayout>
7 #include <QHBoxLayout>
8 #include <QVBoxLayout>
9 #include <QWidget>
10 
12 #include "gui/guiapplication.h"
13 #include "gui/led.h"
14 
15 using namespace swift::misc;
16 using namespace swift::misc::aviation;
17 using namespace swift::misc::simulation;
18 using namespace swift::core;
19 using namespace swift::core::context;
20 
21 namespace swift::gui::components
22 {
23  CCockpitTransponderModeLedsComponent::CCockpitTransponderModeLedsComponent(QWidget *parent)
24  : QFrame(parent), CIdentifiable(this),
25  m_ledStandby(new CLedWidget(false, CLedWidget::Blue, CLedWidget::Black, CLedWidget::Rounded, "standby", "",
26  LedWidth, this)),
27  m_ledModes(new CLedWidget(false, CLedWidget::Green, CLedWidget::Black, CLedWidget::Rounded, "mode C", "",
28  LedWidth, this)),
29  m_ledIdent(new CLedWidget(false, CLedWidget::Yellow, CLedWidget::Black, CLedWidget::Rounded, "ident", "",
30  LedWidth, this))
31  {
32  this->init(true);
33 
34  Q_ASSERT_X(sGui, Q_FUNC_INFO, "Need sGui");
35  connect(sGui->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraftCockpit, this,
36  &CCockpitTransponderModeLedsComponent::onAircraftCockpitChanged);
37  }
38 
39  void CCockpitTransponderModeLedsComponent::onAircraftCockpitChanged(const CSimulatedAircraft &aircraft,
40  const swift::misc::CIdentifier &originator)
41  {
42  if (isMyIdentifier(originator)) { return; }
43  this->setMode(aircraft.getTransponderMode(), true);
44  }
45 
46  void CCockpitTransponderModeLedsComponent::onLedClicked()
47  {
48  QWidget *w = qobject_cast<QWidget *>(QObject::sender());
49  if (!w) { return; }
50  if (!sGui || sGui->isShuttingDown() || !sGui->getIContextOwnAircraft()) { return; }
52  if (m_ledStandby.data() == w) { mode = CTransponder::StateStandby; }
53  else if (m_ledIdent.data() == w) { mode = CTransponder::StateIdent; }
54  else if (m_ledModes.data() == w) { mode = CTransponder::ModeC; }
55  else { return; }
56  CSimulatedAircraft ownAircraft(this->getOwnAircraft());
57  if (ownAircraft.getTransponderMode() == mode) { return; }
58 
59  this->setMode(mode, true);
60  CTransponder xpdr = ownAircraft.getTransponder();
61  xpdr.setTransponderMode(mode);
62 
63  if (sGui)
64  {
65  sGui->getIContextOwnAircraft()->updateCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(),
66  xpdr, identifier());
67  }
68  }
69 
70  void CCockpitTransponderModeLedsComponent::init(bool horizontal)
71  {
72  QBoxLayout *ledLayout = nullptr;
73  if (horizontal) { ledLayout = new QHBoxLayout(this); }
74  else { ledLayout = new QVBoxLayout(this); }
75 
76  ledLayout->setContentsMargins(0, 0, 0, 0);
77  ledLayout->addWidget(m_ledStandby.data());
78  ledLayout->addWidget(m_ledModes.data());
79  ledLayout->addWidget(m_ledIdent.data());
80  connect(m_ledIdent.data(), &CLedWidget::clicked, this, &CCockpitTransponderModeLedsComponent::onLedClicked);
81  connect(m_ledModes.data(), &CLedWidget::clicked, this, &CCockpitTransponderModeLedsComponent::onLedClicked);
82  connect(m_ledStandby.data(), &CLedWidget::clicked, this, &CCockpitTransponderModeLedsComponent::onLedClicked);
83  this->setLayout(ledLayout);
84 
85  // if context is already available set mode
86  if (sGui && sGui->getIContextOwnAircraft()) { this->setMode(getOwnTransponder().getTransponderMode(), true); }
87  }
88 
90  {
91  if (!force && m_mode == mode) { return; }
92  m_ledStandby->setOn(false);
93  m_ledModes->setOn(false);
94  m_ledIdent->setOn(false);
95 
96  switch (mode)
97  {
98  case CTransponder::ModeA:
99  case CTransponder::ModeC:
100  case CTransponder::ModeS:
101  case CTransponder::ModeMil1:
102  case CTransponder::ModeMil2:
103  case CTransponder::ModeMil3:
104  case CTransponder::ModeMil4:
105  case CTransponder::ModeMil5: m_ledModes->setOn(true); break;
106  case CTransponder::StateIdent:
107  m_ledModes->setOn(true);
108  m_ledIdent->setOn(true);
109  break;
110  default:
111  case CTransponder::StateStandby: m_ledStandby->setOn(true); break;
112  }
113  }
114 
115  CTransponder CCockpitTransponderModeLedsComponent::getOwnTransponder() const
116  {
117  if (!sGui || sGui->isShuttingDown() || !sGui->getIContextOwnAircraft()) { return CTransponder(); }
119  }
120 
121  CSimulatedAircraft CCockpitTransponderModeLedsComponent::getOwnAircraft() const
122  {
123  if (!sGui || sGui->isShuttingDown() || !sGui->getIContextOwnAircraft()) { return CSimulatedAircraft(); }
125  }
126 } // namespace swift::gui::components
const context::IContextOwnAircraft * getIContextOwnAircraft() const
Direct access to contexts if a CCoreFacade has been initialized.
bool isShuttingDown() const
Is application shutting down?
virtual swift::misc::simulation::CSimulatedAircraft getOwnAircraft() const =0
Get own aircraft.
virtual bool updateCockpit(const swift::misc::aviation::CComSystem &com1, const swift::misc::aviation::CComSystem &com2, const swift::misc::aviation::CTransponder &transponder, const swift::misc::CIdentifier &originator)=0
Update own cockpit.
Displaying an LED as widget. Non copyable.
Definition: led.h:29
void clicked()
LED clicked.
void setMode(swift::misc::aviation::CTransponder::TransponderMode mode, bool force=false)
Set the mode.
Base class with a member CIdentifier to be inherited by a class which has an identity in the environm...
Definition: identifiable.h:24
bool isMyIdentifier(const CIdentifier &otherIdentifier) const
My identifier?
Definition: identifiable.h:33
const CIdentifier & identifier() const
Get identifier.
Definition: identifiable.h:27
Value object encapsulating information identifying a component of a modular distributed swift process...
Definition: identifier.h:29
bool setTransponderMode(TransponderMode mode)
Set transponder mode.
Definition: transponder.cpp:97
Comprehensive information of an aircraft.
aviation::CTransponder::TransponderMode getTransponderMode() const
Get transponder mode.
const aviation::CTransponder & getTransponder() const
Get transponder.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
High level reusable GUI components.
Definition: aboutdialog.cpp:13
Free functions in swift::misc.