From eea6039d5866d6b00dba437629129b42dc673f8a Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 5 Aug 2017 00:46:50 +0200 Subject: [PATCH] Ref T111, created aircraft parts form to be used in internals and dummy driver --- src/blackgui/editors/aircraftpartsform.cpp | 196 ++++++++++++++++ src/blackgui/editors/aircraftpartsform.h | 87 +++++++ src/blackgui/editors/aircraftpartsform.ui | 250 +++++++++++++++++++++ src/blackgui/guiutility.cpp | 10 + src/blackgui/guiutility.h | 17 +- 5 files changed, 559 insertions(+), 1 deletion(-) create mode 100644 src/blackgui/editors/aircraftpartsform.cpp create mode 100644 src/blackgui/editors/aircraftpartsform.h create mode 100644 src/blackgui/editors/aircraftpartsform.ui diff --git a/src/blackgui/editors/aircraftpartsform.cpp b/src/blackgui/editors/aircraftpartsform.cpp new file mode 100644 index 000000000..c263fdf79 --- /dev/null +++ b/src/blackgui/editors/aircraftpartsform.cpp @@ -0,0 +1,196 @@ +/* Copyright (C) 2017 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "aircraftpartsform.h" +#include "ui_aircraftpartsform.h" +#include "blackgui/guiutility.h" +#include "blackmisc/aviation/aircraftenginelist.h" +#include "blackmisc/aviation/aircraftlights.h" +#include "blackmisc/logmessage.h" +#include "blackmisc/statusmessage.h" + +#include +#include +#include + +using namespace BlackGui; +using namespace BlackMisc; +using namespace BlackMisc::Aviation; + +namespace BlackGui +{ + namespace Editors + { + CAircraftPartsForm::CAircraftPartsForm(QWidget *parent) : + CForm(parent), + ui(new Ui::CAircraftPartsForm) + { + ui->setupUi(this); + connect(ui->pb_AircraftPartsLightsOn, &QPushButton::pressed, this, &CAircraftPartsForm::setAllLights); + connect(ui->pb_AircraftPartsLightsOff, &QPushButton::pressed, this, &CAircraftPartsForm::setAllLights); + connect(ui->pb_AircraftPartsEnginesOn, &QPushButton::pressed, this, &CAircraftPartsForm::setAllEngines); + connect(ui->pb_AircraftPartsEnginesOff, &QPushButton::pressed, this, &CAircraftPartsForm::setAllEngines); + connect(ui->pb_AircraftPartsUiToJson, &QPushButton::pressed, this, &CAircraftPartsForm::guiToJson); + } + + CAircraftPartsForm::~CAircraftPartsForm() + { } + + void CAircraftPartsForm::setReadOnly(bool readonly) + { + CGuiUtility::childrenSetEnabled(this, !readonly); + CGuiUtility::checkBoxesReadOnly(this, readonly); + } + + void CAircraftPartsForm::setSelectOnly() + { + this->setReadOnly(true); + } + + CStatusMessageList CAircraftPartsForm::validate(bool nested) const + { + Q_UNUSED(nested); + CStatusMessageList msgs; + return msgs; + } + + CAircraftParts CAircraftPartsForm::getAircraftPartsFromGui() const + { + return this->guiToAircraftParts(); + } + + CAircraftParts CAircraftPartsForm::getAircraftPartsFromJson() const + { + const QString jsonParts = ui->te_AircraftPartsJson->toPlainText().trimmed(); + CAircraftParts parts; + if (jsonParts.isEmpty()) + { + CLogMessage(this).validationError("No JSON content"); + return parts; + } + QJsonParseError jsonError; + QJsonDocument jsonDoc(QJsonDocument::fromJson(jsonParts.toUtf8(), &jsonError)); + if (jsonError.error != QJsonParseError::NoError) + { + CLogMessage(this).validationError("Parse error: %1") << jsonError.errorString(); + return parts; + } + + try + { + parts.convertFromJson(jsonDoc.object()); + } + catch (const CJsonException &ex) + { + ex.toLogMessage(this, "Parse error"); + return parts; + } + return parts; + } + + void CAircraftPartsForm::setAircraftParts(const CAircraftParts &parts) + { + this->partsToGui(parts); + ui->te_AircraftPartsJson->setText(parts.toJsonString()); + } + + void CAircraftPartsForm::showSetButton(bool visible) + { + ui->pb_Set->setVisible(visible); + } + + void CAircraftPartsForm::showJson(bool visible) + { + ui->te_AircraftPartsJson->setVisible(visible); + } + + void CAircraftPartsForm::setAllLights() + { + const bool on = (QObject::sender() == ui->pb_AircraftPartsLightsOn); + ui->cb_AircraftPartsLightsStrobe->setChecked(on); + ui->cb_AircraftPartsLightsLanding->setChecked(on); + ui->cb_AircraftPartsLightsTaxi->setChecked(on); + ui->cb_AircraftPartsLightsBeacon->setChecked(on); + ui->cb_AircraftPartsLightsNav->setChecked(on); + ui->cb_AircraftPartsLightsLogo->setChecked(on); + } + + void CAircraftPartsForm::setAllEngines() + { + const bool on = (QObject::sender() == ui->pb_AircraftPartsEnginesOn); + ui->cb_AircraftPartsEngine1->setChecked(on); + ui->cb_AircraftPartsEngine2->setChecked(on); + ui->cb_AircraftPartsEngine3->setChecked(on); + ui->cb_AircraftPartsEngine4->setChecked(on); + ui->cb_AircraftPartsEngine5->setChecked(on); + ui->cb_AircraftPartsEngine6->setChecked(on); + } + + Aviation::CAircraftParts CAircraftPartsForm::guiToAircraftParts() const + { + const CAircraftLights lights( + ui->cb_AircraftPartsLightsStrobe->isChecked(), + ui->cb_AircraftPartsLightsLanding->isChecked(), + ui->cb_AircraftPartsLightsTaxi->isChecked(), + ui->cb_AircraftPartsLightsBeacon->isChecked(), + ui->cb_AircraftPartsLightsNav->isChecked(), + ui->cb_AircraftPartsLightsLogo->isChecked() + ); + const CAircraftEngineList engines( + { + ui->cb_AircraftPartsEngine1->isChecked(), + ui->cb_AircraftPartsEngine2->isChecked(), + ui->cb_AircraftPartsEngine3->isChecked(), + ui->cb_AircraftPartsEngine4->isChecked(), + ui->cb_AircraftPartsEngine5->isChecked(), + ui->cb_AircraftPartsEngine6->isChecked() + } + ); + const CAircraftParts parts(lights, + ui->cb_AircraftPartsGearDown->isChecked(), + ui->sb_AircraftPartsFlapsPercentage->value(), + ui->cb_AircraftPartsSpoilers->isChecked(), + engines, + ui->cb_AircraftPartsIsOnGround->isChecked() + ); + return parts; + } + + void CAircraftPartsForm::partsToGui(const Aviation::CAircraftParts &parts) + { + ui->cb_AircraftPartsGearDown->setChecked(parts.isGearDown()); + ui->cb_AircraftPartsIsOnGround->setChecked(parts.isOnGround()); + ui->cb_AircraftPartsSpoilers->setChecked(parts.isSpoilersOut()); + ui->sb_AircraftPartsFlapsPercentage->setValue(parts.getFlapsPercent()); + + const CAircraftLights lights = parts.getLights(); + ui->cb_AircraftPartsLightsBeacon->setChecked(lights.isBeaconOn()); + ui->cb_AircraftPartsLightsLanding->setChecked(lights.isLandingOn()); + ui->cb_AircraftPartsLightsLogo->setChecked(lights.isLogoOn()); + ui->cb_AircraftPartsLightsNav->setChecked(lights.isNavOn()); + ui->cb_AircraftPartsLightsStrobe->setChecked(lights.isStrobeOn()); + ui->cb_AircraftPartsLightsTaxi->setChecked(lights.isTaxiOn()); + + const CAircraftEngineList engines = parts.getEngines(); + ui->cb_AircraftPartsEngine1->setChecked(engines.isEngineOn(1)); + ui->cb_AircraftPartsEngine2->setChecked(engines.isEngineOn(2)); + ui->cb_AircraftPartsEngine3->setChecked(engines.isEngineOn(3)); + ui->cb_AircraftPartsEngine4->setChecked(engines.isEngineOn(4)); + ui->cb_AircraftPartsEngine5->setChecked(engines.isEngineOn(5)); + ui->cb_AircraftPartsEngine6->setChecked(engines.isEngineOn(6)); + } + + void CAircraftPartsForm::guiToJson() + { + const QJsonDocument json(guiToAircraftParts().toJson()); + const QString j(json.toJson(QJsonDocument::Indented)); + ui->te_AircraftPartsJson->setText(j); + } + } // ns +} // ns diff --git a/src/blackgui/editors/aircraftpartsform.h b/src/blackgui/editors/aircraftpartsform.h new file mode 100644 index 000000000..f202d2375 --- /dev/null +++ b/src/blackgui/editors/aircraftpartsform.h @@ -0,0 +1,87 @@ +/* Copyright (C) 2017 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_EDITORS_AIRCRAFTPARTSFORM_H +#define BLACKGUI_EDITORS_AIRCRAFTPARTSFORM_H + +#include "blackgui/editors/form.h" +#include "blackgui/blackguiexport.h" +#include "blackmisc/aviation/aircraftparts.h" +#include "blackmisc/statusmessagelist.h" + +class QWidget; + +namespace Ui { class CAircraftPartsForm; } +namespace BlackGui +{ + namespace Editors + { + /** + * Edit and set aircraft parts + */ + class BLACKGUI_EXPORT CAircraftPartsForm : public CForm + { + Q_OBJECT + + public: + //! Constructor + explicit CAircraftPartsForm(QWidget *parent = nullptr); + + //! Destructor + virtual ~CAircraftPartsForm(); + + //! \name Form class implementations + //! @{ + virtual void setReadOnly(bool readonly) override; + virtual void setSelectOnly() override; + virtual BlackMisc::CStatusMessageList validate(bool nested = false) const override; + //! @} + + //! Get the parts + BlackMisc::Aviation::CAircraftParts getAircraftPartsFromGui() const; + + //! Get the parts from JSON + BlackMisc::Aviation::CAircraftParts getAircraftPartsFromJson() const; + + //! Set the parts + void setAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts); + + //! Set button visible + void showSetButton(bool visible); + + //! Set JSON textarea visible + void showJson(bool visible); + + signals: + //! Change coordinate + void changeAircraftParts(); + + private: + QScopedPointer ui; + + //! Get parts object + BlackMisc::Aviation::CAircraftParts guiToAircraftParts() const; + + //! GUI set by parts + void partsToGui(const BlackMisc::Aviation::CAircraftParts &parts); + + //! GUI values to JSON + void guiToJson(); + + //! All lights on + void setAllLights(); + + //! All engines on + void setAllEngines(); + }; + } // ns +} // ns +#endif // guard diff --git a/src/blackgui/editors/aircraftpartsform.ui b/src/blackgui/editors/aircraftpartsform.ui new file mode 100644 index 000000000..99559e411 --- /dev/null +++ b/src/blackgui/editors/aircraftpartsform.ui @@ -0,0 +1,250 @@ + + + CAircraftPartsForm + + + + 0 + 0 + 276 + 403 + + + + Frame + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 3 + + + 3 + + + 3 + + + 3 + + + + + Strobe + + + + + + + all off + + + + + + + Flaps %: + + + + + + + 100 + + + 5 + + + + + + + Landing + + + + + + + Nav + + + + + + + to JSON + + + + + + + Gear down + + + + + + + Beacon + + + + + + + on ground + + + + + + + Lights: + + + + + + + Taxi + + + + + + + Spoilers + + + + + + + all off + + + + + + + all on + + + + + + + Logo + + + + + + + all on + + + + + + + + + + Engines: + + + + + + + + 0 + 20 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + + + + + 2 + + + + + + + 3 + + + + + + + 4 + + + + + + + 5 + + + + + + + 6 + + + + + + + + + + set + + + + + + + + diff --git a/src/blackgui/guiutility.cpp b/src/blackgui/guiutility.cpp index 77ac58c7e..722dff8b9 100644 --- a/src/blackgui/guiutility.cpp +++ b/src/blackgui/guiutility.cpp @@ -211,6 +211,16 @@ namespace BlackGui } } + void CGuiUtility::checkBoxesReadOnly(QWidget *parent, bool readOnly) + { + if (!parent) { return; } + QList allCheckBoxes = parent->findChildren(); + for (QCheckBox *cb : allCheckBoxes) + { + CGuiUtility::checkBoxReadOnly(cb, readOnly); + } + } + QWidgetList CGuiUtility::topLevelApplicationWidgetsWithName() { QWidgetList tlw = QApplication::topLevelWidgets(); diff --git a/src/blackgui/guiutility.h b/src/blackgui/guiutility.h index d17099d67..1ca01316a 100644 --- a/src/blackgui/guiutility.h +++ b/src/blackgui/guiutility.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -26,7 +27,6 @@ class QComboBox; class QLayout; class QMimeData; class QTabWidget; -class QWidget; class QGraphicsOpacityEffect; namespace BlackGui @@ -86,6 +86,21 @@ namespace BlackGui //! Pseudo readonly state for checkbox static void checkBoxReadOnly(QCheckBox *checkBox, bool readOnly); + //! Pseudo readonly state for checkboxes of widget + static void checkBoxesReadOnly(QWidget *parent, bool readOnly); + + //! Enable/disable all child widgets + template + static void childrenSetEnabled(QWidget *parent, bool enabled) + { + if (!parent) { return; } + QList children = parent->findChildren(); + for (WIDGET *w : children) + { + w->setEnabled(enabled); + } + } + //! Toogle window flags / stay on top static bool toggleStayOnTop(QWidget *widget);