From 2b0d357df345f0fcc60752cac22e16e3abc764aa Mon Sep 17 00:00:00 2001 From: m_thread Date: Tue, 17 Mar 2015 23:13:29 +0100 Subject: [PATCH] OP-1763 Extracted template selector functionality as a widget for reuse. --- .../pages/airframeinitialtuningpage.cpp | 186 +----------------- .../pages/airframeinitialtuningpage.h | 19 -- .../pages/airframeinitialtuningpage.ui | 79 ++------ .../vehicletemplateselectorwidget.cpp | 19 +- .../vehicletemplateselectorwidget.h | 8 +- 5 files changed, 45 insertions(+), 266 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.cpp index 428521e3d..81ade3cca 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.cpp @@ -35,58 +35,48 @@ AirframeInitialTuningPage::AirframeInitialTuningPage(SetupWizard *wizard, QWidget *parent) : AbstractWizardPage(wizard, parent), - ui(new Ui::AirframeInitialTuningPage), m_dir(NULL), m_photoItem(NULL) + ui(new Ui::AirframeInitialTuningPage) { ui->setupUi(this); - ui->templateImage->setScene(new QGraphicsScene()); - connect(ui->templateList, SIGNAL(itemSelectionChanged()), this, SLOT(templateSelectionChanged())); } AirframeInitialTuningPage::~AirframeInitialTuningPage() { - ui->templateList->clear(); - foreach(QJsonObject * templ, m_templates.values()) { - delete templ; - } - m_templates.clear(); - delete ui; } void AirframeInitialTuningPage::initializePage() { + const char* path; switch (getWizard()->getVehicleType()) { case VehicleConfigurationSource::VEHICLE_FIXEDWING: - m_dir = VehicleTemplateExportDialog::EXPORT_FIXEDWING_NAME; + path = VehicleTemplateExportDialog::EXPORT_FIXEDWING_NAME; break; case VehicleConfigurationSource::VEHICLE_MULTI: - m_dir = VehicleTemplateExportDialog::EXPORT_MULTI_NAME; + path = VehicleTemplateExportDialog::EXPORT_MULTI_NAME; break; case VehicleConfigurationSource::VEHICLE_HELI: - m_dir = VehicleTemplateExportDialog::EXPORT_HELI_NAME; + path = VehicleTemplateExportDialog::EXPORT_HELI_NAME; break; case VehicleConfigurationSource::VEHICLE_SURFACE: - m_dir = VehicleTemplateExportDialog::EXPORT_SURFACE_NAME; + path = VehicleTemplateExportDialog::EXPORT_SURFACE_NAME; break; default: - m_dir = NULL; + path = NULL; break; } - loadValidFiles(); - setupTemplateList(); + ui->selectorWidget->setTemplateInfo(path, getWizard()->getVehicleType(), getWizard()->getVehicleSubType()); } bool AirframeInitialTuningPage::validatePage() { - QJsonObject *templ = NULL; + QJsonObject *templ = ui->selectorWidget->selectedTemplate(); - if (ui->templateList->currentRow() >= 0) { - templ = ui->templateList->item(ui->templateList->currentRow())->data(Qt::UserRole + 1).value(); - } if (getWizard()->getVehicleTemplate() != NULL) { delete getWizard()->getVehicleTemplate(); } getWizard()->setVehicleTemplate(templ != NULL ? new QJsonObject(*templ) : NULL); + return true; } @@ -94,159 +84,3 @@ bool AirframeInitialTuningPage::isComplete() const { return true; } - -void AirframeInitialTuningPage::updatePhoto(QJsonObject *templ) -{ - QPixmap photo; - - if (m_photoItem != NULL) { - ui->templateImage->scene()->removeItem(m_photoItem); - } - if (templ != NULL && !templ->value("photo").isUndefined()) { - QByteArray imageData = QByteArray::fromBase64(templ->value("photo").toString().toLatin1()); - photo.loadFromData(imageData, "PNG"); - } else { - photo.load(":/core/images/openpilot_logo_500.png"); - } - m_photoItem = ui->templateImage->scene()->addPixmap(photo); - ui->templateImage->setSceneRect(ui->templateImage->scene()->itemsBoundingRect()); - ui->templateImage->fitInView(ui->templateImage->scene()->itemsBoundingRect(), Qt::KeepAspectRatio); -} - -void AirframeInitialTuningPage::updateDescription(QJsonObject *templ) -{ - if (templ != NULL) { - QString description; - description.append("").append(tr("Name of Vehicle: ")).append("").append(templ->value("name").toString()).append("
"); - description.append("").append(tr("Name of Owner: ")).append("").append(templ->value("owner").toString()); - if (templ->value("nick") != QStringLiteral("")) { - description.append(" (").append(templ->value("nick").toString()).append(")"); - } - description.append("
"); - description.append("").append(tr("Size: ")).append("").append(templ->value("size").toString()).append("
"); - description.append("").append(tr("Weight: ")).append("").append(templ->value("weight").toString()).append("
"); - description.append("").append(tr("Motor(s): ")).append("").append(templ->value("motor").toString()).append("
"); - description.append("").append(tr("ESC(s): ")).append("").append(templ->value("esc").toString()).append("
"); - description.append("").append(tr("Servo(s): ")).append("").append(templ->value("servo").toString()).append("
"); - description.append("").append(tr("Battery: ")).append("").append(templ->value("battery").toString()).append("
"); - description.append("").append(tr("Propellers(s): ")).append("").append(templ->value("propeller").toString()).append("
"); - description.append("").append(tr("Controller: ")).append("").append(templ->value("controller").toString()).append("
"); - description.append("").append(tr("Comments: ")).append("").append(templ->value("comment").toString()); - ui->templateDescription->setText(description); - } else { - ui->templateDescription->setText(tr("This option will use the current tuning settings saved on the controller, if your controller " - "is currently unconfigured, then the OpenPilot firmware defaults will be used.\n\n" - "It is suggested that if this is a first time configuration of your controller, rather than " - "use this option, instead select a tuning set that matches your own airframe as close as " - "possible from the list above or if you are not able to fine one, then select the generic item " - "from the list.")); - } -} - -void AirframeInitialTuningPage::templateSelectionChanged() -{ - if (ui->templateList->currentRow() >= 0) { - QJsonObject *templ = ui->templateList->item(ui->templateList->currentRow())->data(Qt::UserRole + 1).value(); - updatePhoto(templ); - updateDescription(templ); - } -} - -bool AirframeInitialTuningPage::airframeIsCompatible(int vehicleType, int vehicleSubType) -{ - if (vehicleType != getWizard()->getVehicleType()) { - return false; - } - - int wizSubType = getWizard()->getVehicleSubType(); - switch (vehicleType) { - case VehicleConfigurationSource::MULTI_ROTOR_QUAD_X: - { - return wizSubType == VehicleConfigurationSource::MULTI_ROTOR_QUAD_X; - } - default: - return vehicleSubType == wizSubType; - } -} - -void AirframeInitialTuningPage::loadFilesInDir(QString templateBasePath) -{ - QDir templateDir(templateBasePath); - - qDebug() << "Loading templates from base path:" << templateBasePath; - QStringList names; - names << "*.optmpl"; - templateDir.setNameFilters(names); - templateDir.setSorting(QDir::Name); - QStringList files = templateDir.entryList(); - foreach(QString fileName, files) { - QFile file(QString("%1/%2").arg(templateDir.absolutePath()).arg(fileName)); - - if (file.open(QFile::ReadOnly)) { - QByteArray jsonData = file.readAll(); - QJsonParseError error; - QJsonDocument templateDoc = QJsonDocument::fromJson(jsonData, &error); - if (error.error == QJsonParseError::NoError) { - QJsonObject json = templateDoc.object(); - if (airframeIsCompatible(json["type"].toInt(), json["subtype"].toInt())) { - QString uuid = json["uuid"].toString(); - if (!m_templates.contains(uuid)) { - m_templates[json["uuid"].toString()] = new QJsonObject(json); - } - } - } else { - qDebug() << "Error parsing json file: " - << fileName << ". Error was:" << error.errorString(); - } - } - file.close(); - } -} - -void AirframeInitialTuningPage::loadValidFiles() -{ - ui->templateList->clear(); - foreach(QJsonObject * templ, m_templates.values()) { - delete templ; - } - m_templates.clear(); - - loadFilesInDir(QString("%1/%2/").arg(Utils::PathUtils().InsertDataPath("%%DATAPATH%%cloudconfig")).arg(m_dir)); - loadFilesInDir(QString("%1/%2/").arg(Utils::PathUtils().InsertStoragePath("%%STOREPATH%%cloudconfig")).arg(m_dir)); -} - -void AirframeInitialTuningPage::setupTemplateList() -{ - QListWidgetItem *item; - - foreach(QString templ, m_templates.keys()) { - QJsonObject *json = m_templates[templ]; - - item = new QListWidgetItem(json->value("name").toString(), ui->templateList); - item->setData(Qt::UserRole + 1, QVariant::fromValue(json)); - } - ui->templateList->sortItems(Qt::AscendingOrder); - - item = new QListWidgetItem(tr("Current Tuning")); - item->setData(Qt::UserRole + 1, QVariant::fromValue((QJsonObject *)NULL)); - ui->templateList->insertItem(0, item); - ui->templateList->setCurrentRow(0); - // TODO Add generics to top under item Current tuning -} - -QString AirframeInitialTuningPage::getTemplateKey(QJsonObject *templ) -{ - return QString(templ->value("name").toString()); -} - -void AirframeInitialTuningPage::resizeEvent(QResizeEvent *) -{ - ui->templateImage->setSceneRect(ui->templateImage->scene()->itemsBoundingRect()); - ui->templateImage->fitInView(ui->templateImage->scene()->itemsBoundingRect(), Qt::KeepAspectRatio); -} - -void AirframeInitialTuningPage::showEvent(QShowEvent *) -{ - ui->templateImage->setSceneRect(ui->templateImage->scene()->itemsBoundingRect()); - ui->templateImage->fitInView(ui->templateImage->scene()->itemsBoundingRect(), Qt::KeepAspectRatio); -} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.h index fecad62bf..b9069a9d5 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.h @@ -44,28 +44,9 @@ public: void initializePage(); bool validatePage(); bool isComplete() const; -public slots: - void templateSelectionChanged(); - -protected: - void resizeEvent(QResizeEvent *); - void showEvent(QShowEvent *); private: Ui::AirframeInitialTuningPage *ui; - const char *m_dir; - QMap m_templates; - QGraphicsPixmapItem *m_photoItem; - - void loadValidFiles(); - void loadFilesInDir(QString templateBasePath); - void setupTemplateList(); - QString getTemplateKey(QJsonObject *templ); - void updatePhoto(QJsonObject *templ); - void updateDescription(QJsonObject *templ); - bool airframeIsCompatible(int vehicleType, int vehicleSubType); }; -Q_DECLARE_METATYPE(QJsonObject *) - #endif // AIRFRAMEINITIALTUNINGPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.ui index 8b0b075d6..061cefe2b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/airframeinitialtuningpage.ui @@ -33,72 +33,25 @@ p, li { white-space: pre-wrap; } - - - - - - - - - Qt::ScrollBarAlwaysOn - - - QAbstractItemView::NoEditTriggers - - - - - - - - 250 - 250 - - - - background-color: rgba(254, 254, 254, 0); - - - false - - - QPainter::Antialiasing|QPainter::HighQualityAntialiasing|QPainter::TextAntialiasing - - - - - - - - - - 0 - 0 - - - - - 10 - - - - false - - - true - - - Information about the Vehicle in short. - - - - - - + + + + 0 + 0 + + + + + + VehicleTemplateSelectorWidget + QWidget +
vehicletemplateselectorwidget.h
+ 1 +
+
diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.cpp index 5c4d916dc..a3d3c0571 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.cpp @@ -36,7 +36,7 @@ VehicleTemplateSelectorWidget::VehicleTemplateSelectorWidget(QWidget *parent) : QWidget(parent), - ui(new Ui::VehicleTemplateSelectorWidget) + ui(new Ui::VehicleTemplateSelectorWidget), m_photoItem(NULL) { ui->setupUi(this); ui->templateImage->setScene(new QGraphicsScene()); @@ -54,6 +54,21 @@ VehicleTemplateSelectorWidget::~VehicleTemplateSelectorWidget() delete ui; } +void VehicleTemplateSelectorWidget::setTemplateInfo(QString path, int vehicleType, int vehicleSubType) { + m_templateFolder = path; + m_vehicleType = vehicleType; + m_vehicleSubType = vehicleSubType; + updateTemplates(); +} + +QJsonObject *VehicleTemplateSelectorWidget::selectedTemplate() const +{ + if (ui->templateList->currentRow() >= 0) { + return ui->templateList->item(ui->templateList->currentRow())->data(Qt::UserRole + 1).value(); + } + return NULL; +} + void VehicleTemplateSelectorWidget::updateTemplates() { loadValidFiles(); @@ -111,7 +126,7 @@ void VehicleTemplateSelectorWidget::updateDescription(QJsonObject *templ) void VehicleTemplateSelectorWidget::templateSelectionChanged() { if (ui->templateList->currentRow() >= 0) { - QJsonObject *templ = ui->templateList->item(ui->templateList->currentRow())->data(Qt::UserRole + 1).value(); + QJsonObject *templ = selectedTemplate(); updatePhoto(templ); updateDescription(templ); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.h index 99e828142..4d0205847 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.h @@ -43,12 +43,8 @@ class VehicleTemplateSelectorWidget : public QWidget public: explicit VehicleTemplateSelectorWidget(QWidget *parent = 0); ~VehicleTemplateSelectorWidget(); - void setTemplateInfo(QString path, int vehicleType, int vehicleSubType) { - m_templateFolder = path; - m_vehicleType = vehicleType; - m_vehicleSubType = vehicleSubType; - updateTemplates(); - } + void setTemplateInfo(QString path, int vehicleType, int vehicleSubType); + QJsonObject *selectedTemplate() const; public slots: void templateSelectionChanged();