swift
aircraftpartsform.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2017 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "aircraftpartsform.h"
5 
6 #include <QJsonDocument>
7 #include <QJsonParseError>
8 #include <QPushButton>
9 
10 #include "ui_aircraftpartsform.h"
11 
12 #include "gui/guiutility.h"
15 #include "misc/logmessage.h"
16 #include "misc/statusmessage.h"
17 
18 using namespace swift::misc;
19 using namespace swift::misc::aviation;
20 
21 namespace swift::gui::editors
22 {
23  CAircraftPartsForm::CAircraftPartsForm(QWidget *parent) : CForm(parent), ui(new Ui::CAircraftPartsForm)
24  {
25  ui->setupUi(this);
26  connect(ui->pb_AircraftPartsLightsOn, &QPushButton::pressed, this, &CAircraftPartsForm::setAllLights);
27  connect(ui->pb_AircraftPartsLightsOff, &QPushButton::pressed, this, &CAircraftPartsForm::setAllLights);
28  connect(ui->pb_AircraftPartsEnginesOn, &QPushButton::pressed, this, &CAircraftPartsForm::setAllEngines);
29  connect(ui->pb_AircraftPartsEnginesOff, &QPushButton::pressed, this, &CAircraftPartsForm::setAllEngines);
30  connect(ui->pb_AircraftPartsUiToJson, &QPushButton::pressed, this, &CAircraftPartsForm::guiToJson);
31  connect(ui->pb_Set, &QPushButton::pressed, this,
32  &CAircraftPartsForm::changeAircraftParts); // force change signal
33  }
34 
36 
37  void CAircraftPartsForm::setReadOnly(bool readonly)
38  {
39  CGuiUtility::childrenSetEnabled<QPushButton>(this, !readonly);
40  CGuiUtility::checkBoxesReadOnly(this, readonly);
41  this->forceStyleSheetUpdate();
42  }
43 
45 
47  {
48  Q_UNUSED(nested);
49  CStatusMessageList msgs;
50  return msgs;
51  }
52 
53  CAircraftParts CAircraftPartsForm::getAircraftPartsFromGui() const { return this->guiToAircraftParts(); }
54 
56  {
57  const QString jsonParts = ui->te_AircraftPartsJson->toPlainText().trimmed();
58  CAircraftParts parts;
59  if (jsonParts.isEmpty())
60  {
61  CLogMessage(this).validationError(u"No JSON content");
62  return parts;
63  }
64  QJsonParseError jsonError;
65  QJsonDocument jsonDoc(QJsonDocument::fromJson(jsonParts.toUtf8(), &jsonError));
66  if (jsonError.error != QJsonParseError::NoError)
67  {
68  CLogMessage(this).validationError(u"Parse error: %1") << jsonError.errorString();
69  return parts;
70  }
71 
72  try
73  {
74  parts.convertFromJson(jsonDoc.object());
75  }
76  catch (const CJsonException &ex)
77  {
78  CLogMessage::preformatted(CStatusMessage::fromJsonException(ex, this, "Parse error"));
79  return parts;
80  }
81  return parts;
82  }
83 
85  {
86  this->partsToGui(parts);
87  ui->te_AircraftPartsJson->setText(parts.toJsonString());
88  }
89 
90  void CAircraftPartsForm::showSetButton(bool visible) { ui->pb_Set->setVisible(visible); }
91 
92  void CAircraftPartsForm::showJson(bool visible) { ui->te_AircraftPartsJson->setVisible(visible); }
93 
94  void CAircraftPartsForm::setAllLights()
95  {
96  const bool on = (QObject::sender() == ui->pb_AircraftPartsLightsOn);
97  ui->cb_AircraftPartsLightsStrobe->setChecked(on);
98  ui->cb_AircraftPartsLightsLanding->setChecked(on);
99  ui->cb_AircraftPartsLightsTaxi->setChecked(on);
100  ui->cb_AircraftPartsLightsBeacon->setChecked(on);
101  ui->cb_AircraftPartsLightsNav->setChecked(on);
102  ui->cb_AircraftPartsLightsLogo->setChecked(on);
103  ui->cb_AircraftPartsLightsWing->setChecked(on);
104  ui->cb_AircraftPartsLightsRecognition->setChecked(on);
105  ui->cb_AircraftPartsLightsCabin->setChecked(on);
106  }
107 
108  void CAircraftPartsForm::setAllEngines()
109  {
110  const bool on = (QObject::sender() == ui->pb_AircraftPartsEnginesOn);
111  ui->cb_AircraftPartsEngine1->setChecked(on);
112  ui->cb_AircraftPartsEngine2->setChecked(on);
113  ui->cb_AircraftPartsEngine3->setChecked(on);
114  ui->cb_AircraftPartsEngine4->setChecked(on);
115  ui->cb_AircraftPartsEngine5->setChecked(on);
116  ui->cb_AircraftPartsEngine6->setChecked(on);
117  ui->sb_AircraftPartsEngine1RpmPercentage->setValue(on ? 80 : 0);
118  ui->sb_AircraftPartsEngine2RpmPercentage->setValue(on ? 80 : 0);
119  ui->sb_AircraftPartsEngine3RpmPercentage->setValue(on ? 80 : 0);
120  ui->sb_AircraftPartsEngine4RpmPercentage->setValue(on ? 80 : 0);
121  ui->sb_AircraftPartsEngine5RpmPercentage->setValue(on ? 80 : 0);
122  ui->sb_AircraftPartsEngine6RpmPercentage->setValue(on ? 80 : 0);
123  }
124 
125  aviation::CAircraftParts CAircraftPartsForm::guiToAircraftParts() const
126  {
127  const CAircraftLights lights(
128  ui->cb_AircraftPartsLightsStrobe->isChecked(), ui->cb_AircraftPartsLightsLanding->isChecked(),
129  ui->cb_AircraftPartsLightsTaxi->isChecked(), ui->cb_AircraftPartsLightsBeacon->isChecked(),
130  ui->cb_AircraftPartsLightsNav->isChecked(), ui->cb_AircraftPartsLightsLogo->isChecked(),
131  ui->cb_AircraftPartsLightsRecognition->isChecked(), ui->cb_AircraftPartsLightsCabin->isChecked(),
132  ui->cb_AircraftPartsLightsWing->isChecked());
133  const CAircraftEngineList engines(
134  { { ui->cb_AircraftPartsEngine1->isChecked(), ui->sb_AircraftPartsEngine1RpmPercentage->value() },
135  { ui->cb_AircraftPartsEngine2->isChecked(), ui->sb_AircraftPartsEngine2RpmPercentage->value() },
136  { ui->cb_AircraftPartsEngine3->isChecked(), ui->sb_AircraftPartsEngine3RpmPercentage->value() },
137  { ui->cb_AircraftPartsEngine4->isChecked(), ui->sb_AircraftPartsEngine4RpmPercentage->value() },
138  { ui->cb_AircraftPartsEngine5->isChecked(), ui->sb_AircraftPartsEngine5RpmPercentage->value() },
139  { ui->cb_AircraftPartsEngine6->isChecked(), ui->sb_AircraftPartsEngine6RpmPercentage->value() } });
140  const CAircraftParts parts(
141  lights, ui->cb_AircraftPartsGearDown->isChecked(), ui->sb_AircraftPartsFlapsPercentage->value(),
142  ui->cb_AircraftPartsSpoilers->isChecked(), engines, ui->cb_AircraftPartsIsOnGround->isChecked());
143  return parts;
144  }
145 
146  void CAircraftPartsForm::partsToGui(const CAircraftParts &parts)
147  {
148  ui->cb_AircraftPartsGearDown->setChecked(parts.isGearDown());
149  ui->cb_AircraftPartsIsOnGround->setChecked(parts.isOnGround());
150  ui->cb_AircraftPartsSpoilers->setChecked(parts.isSpoilersOut());
151  ui->sb_AircraftPartsFlapsPercentage->setValue(parts.getFlapsPercent());
152 
153  const CAircraftLights lights = parts.getLights();
154  ui->cb_AircraftPartsLightsBeacon->setChecked(lights.isBeaconOn());
155  ui->cb_AircraftPartsLightsLanding->setChecked(lights.isLandingOn());
156  ui->cb_AircraftPartsLightsLogo->setChecked(lights.isLogoOn());
157  ui->cb_AircraftPartsLightsNav->setChecked(lights.isNavOn());
158  ui->cb_AircraftPartsLightsStrobe->setChecked(lights.isStrobeOn());
159  ui->cb_AircraftPartsLightsTaxi->setChecked(lights.isTaxiOn());
160  ui->cb_AircraftPartsLightsWing->setChecked(lights.isWingOn());
161 
162  const CAircraftEngineList engines = parts.getEngines();
163  ui->cb_AircraftPartsEngine1->setChecked(engines.isEngineOn(1));
164  ui->cb_AircraftPartsEngine2->setChecked(engines.isEngineOn(2));
165  ui->cb_AircraftPartsEngine3->setChecked(engines.isEngineOn(3));
166  ui->cb_AircraftPartsEngine4->setChecked(engines.isEngineOn(4));
167  ui->cb_AircraftPartsEngine5->setChecked(engines.isEngineOn(5));
168  ui->cb_AircraftPartsEngine6->setChecked(engines.isEngineOn(6));
169  ui->sb_AircraftPartsEngine1RpmPercentage->setValue(engines.getEngineRpmPct(1));
170  ui->sb_AircraftPartsEngine2RpmPercentage->setValue(engines.getEngineRpmPct(2));
171  ui->sb_AircraftPartsEngine3RpmPercentage->setValue(engines.getEngineRpmPct(3));
172  ui->sb_AircraftPartsEngine4RpmPercentage->setValue(engines.getEngineRpmPct(4));
173  ui->sb_AircraftPartsEngine5RpmPercentage->setValue(engines.getEngineRpmPct(5));
174  ui->sb_AircraftPartsEngine6RpmPercentage->setValue(engines.getEngineRpmPct(6));
175  }
176 
177  void CAircraftPartsForm::guiToJson()
178  {
179  const QJsonDocument json(guiToAircraftParts().toJson());
180  const QString j(json.toJson(QJsonDocument::Indented));
181  ui->te_AircraftPartsJson->setText(j);
182  }
183 } // namespace swift::gui::editors
static void checkBoxesReadOnly(QWidget *parent, bool readOnly)
Pseudo readonly state for checkboxes of widget.
Definition: guiutility.cpp:476
void changeAircraftParts()
Change coordinate.
void showSetButton(bool visible)
Set button visible.
void setSelectOnly()
Read only, but entity can be selected (normally used in mapping). Use setReadOnly to reset this very ...
swift::misc::aviation::CAircraftParts getAircraftPartsFromJson() const
Get the parts from JSON.
void showJson(bool visible)
Set JSON textarea visible.
void setAircraftParts(const swift::misc::aviation::CAircraftParts &parts)
Set the parts.
void setReadOnly(bool readonly)
Set editable.
swift::misc::CStatusMessageList validate(bool nested=false) const
Validate, empty list means OK.
swift::misc::aviation::CAircraftParts getAircraftPartsFromGui() const
Get the parts.
Form base class.
Definition: form.h:27
void forceStyleSheetUpdate()
Forces a stylesheet update.
Definition: form.cpp:47
Thrown when a convertFromJson method encounters an unrecoverable error in JSON data.
Definition: jsonexception.h:24
Class for emitting a log message.
Definition: logmessage.h:27
Derived & validationError(const char16_t(&format)[N])
Set the severity to error, providing a format string, and adding the validation category.
Status messages, e.g. from Core -> GUI.
Value object encapsulating a list of aircraft engines.
bool isEngineOn(int engineNumber) const
Engine number 1..x on?
int getEngineRpmPct(int engineNumber) const
Get engine RPM percentage (0..100+)
Value object encapsulating information about aircraft's lights.
bool isLandingOn() const
Landing lights on?
bool isBeaconOn() const
Beacon lights on?
bool isNavOn() const
Nac lights on?
bool isWingOn() const
Wing light on?
bool isLogoOn() const
Logo lights on?
bool isTaxiOn() const
Taxi lights on?
bool isStrobeOn() const
Strobes lights on?
Value object encapsulating information of aircraft's parts.
Definition: aircraftparts.h:26
bool isGearDown() const
Is gear down?
Definition: aircraftparts.h:90
CAircraftLights getLights() const
Get aircraft lights.
Definition: aircraftparts.h:72
bool isSpoilersOut() const
Are spoilers out?
bool isOnGround() const
Is aircraft on ground?
int getFlapsPercent() const
Get flaps position in percent.
CAircraftEngineList getEngines() const
Get engines.
void convertFromJson(const QJsonObject &json)
Assign from JSON object.
Definition: mixinjson.h:153
QString toJsonString(QJsonDocument::JsonFormat format=QJsonDocument::Indented) const
Convenience function JSON as string.
Definition: mixinjson.h:146
Free functions in swift::misc.
QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error)
QJsonObject object() const const
QString errorString() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QObject * sender() const const
bool isEmpty() const const
QByteArray toUtf8() const const