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  }
118 
119  aviation::CAircraftParts CAircraftPartsForm::guiToAircraftParts() const
120  {
121  const CAircraftLights lights(
122  ui->cb_AircraftPartsLightsStrobe->isChecked(), ui->cb_AircraftPartsLightsLanding->isChecked(),
123  ui->cb_AircraftPartsLightsTaxi->isChecked(), ui->cb_AircraftPartsLightsBeacon->isChecked(),
124  ui->cb_AircraftPartsLightsNav->isChecked(), ui->cb_AircraftPartsLightsLogo->isChecked(),
125  ui->cb_AircraftPartsLightsRecognition->isChecked(), ui->cb_AircraftPartsLightsCabin->isChecked(),
126  ui->cb_AircraftPartsLightsWing->isChecked());
127  const CAircraftEngineList engines(
128  { ui->cb_AircraftPartsEngine1->isChecked(), ui->cb_AircraftPartsEngine2->isChecked(),
129  ui->cb_AircraftPartsEngine3->isChecked(), ui->cb_AircraftPartsEngine4->isChecked(),
130  ui->cb_AircraftPartsEngine5->isChecked(), ui->cb_AircraftPartsEngine6->isChecked() });
131  const CAircraftParts parts(
132  lights, ui->cb_AircraftPartsGearDown->isChecked(), ui->sb_AircraftPartsFlapsPercentage->value(),
133  ui->cb_AircraftPartsSpoilers->isChecked(), engines, ui->cb_AircraftPartsIsOnGround->isChecked());
134  return parts;
135  }
136 
137  void CAircraftPartsForm::partsToGui(const CAircraftParts &parts)
138  {
139  ui->cb_AircraftPartsGearDown->setChecked(parts.isGearDown());
140  ui->cb_AircraftPartsIsOnGround->setChecked(parts.isOnGround());
141  ui->cb_AircraftPartsSpoilers->setChecked(parts.isSpoilersOut());
142  ui->sb_AircraftPartsFlapsPercentage->setValue(parts.getFlapsPercent());
143 
144  const CAircraftLights lights = parts.getLights();
145  ui->cb_AircraftPartsLightsBeacon->setChecked(lights.isBeaconOn());
146  ui->cb_AircraftPartsLightsLanding->setChecked(lights.isLandingOn());
147  ui->cb_AircraftPartsLightsLogo->setChecked(lights.isLogoOn());
148  ui->cb_AircraftPartsLightsNav->setChecked(lights.isNavOn());
149  ui->cb_AircraftPartsLightsStrobe->setChecked(lights.isStrobeOn());
150  ui->cb_AircraftPartsLightsTaxi->setChecked(lights.isTaxiOn());
151  ui->cb_AircraftPartsLightsWing->setChecked(lights.isWingOn());
152 
153  const CAircraftEngineList engines = parts.getEngines();
154  ui->cb_AircraftPartsEngine1->setChecked(engines.isEngineOn(1));
155  ui->cb_AircraftPartsEngine2->setChecked(engines.isEngineOn(2));
156  ui->cb_AircraftPartsEngine3->setChecked(engines.isEngineOn(3));
157  ui->cb_AircraftPartsEngine4->setChecked(engines.isEngineOn(4));
158  ui->cb_AircraftPartsEngine5->setChecked(engines.isEngineOn(5));
159  ui->cb_AircraftPartsEngine6->setChecked(engines.isEngineOn(6));
160  }
161 
162  void CAircraftPartsForm::guiToJson()
163  {
164  const QJsonDocument json(guiToAircraftParts().toJson());
165  const QString j(json.toJson(QJsonDocument::Indented));
166  ui->te_AircraftPartsJson->setText(j);
167  }
168 } // 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?
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