diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateexportdialog.ui b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateexportdialog.ui index abbbb70f3..d2069645c 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateexportdialog.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateexportdialog.ui @@ -19,17 +19,11 @@ 700 - - - 610 - 700 - - Vehicle Templates - false + true true diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.cpp index 7956e6fc4..1a599e30c 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include "vehicletemplateexportdialog.h" #include "utils/pathutils.h" @@ -41,12 +42,13 @@ VehicleTemplateSelectorWidget::VehicleTemplateSelectorWidget(QWidget *parent) : ui->setupUi(this); ui->templateImage->setScene(new QGraphicsScene()); connect(ui->templateList, SIGNAL(itemSelectionChanged()), this, SLOT(templateSelectionChanged())); + connect(ui->deleteTemplateButton, SIGNAL(clicked()), this, SLOT(deleteSelectedTemplate())); } VehicleTemplateSelectorWidget::~VehicleTemplateSelectorWidget() { ui->templateList->clear(); - foreach(QJsonObject * templ, m_templates.values()) { + foreach(VehicleTemplate * templ, m_templates.values()) { delete templ; } m_templates.clear(); @@ -69,12 +71,47 @@ QJsonObject *VehicleTemplateSelectorWidget::selectedTemplate() const return NULL; } +bool VehicleTemplateSelectorWidget::selectedTemplateEditable() const +{ + if (ui->templateList->currentRow() >= 0) { + return ui->templateList->item(ui->templateList->currentRow())->data(Qt::UserRole + 2).value(); + } + return NULL; +} + +QString VehicleTemplateSelectorWidget::selectedTemplatePath() const +{ + if (ui->templateList->currentRow() >= 0) { + return ui->templateList->item(ui->templateList->currentRow())->data(Qt::UserRole + 3).value(); + } + return NULL; +} + void VehicleTemplateSelectorWidget::updateTemplates() { loadValidFiles(); setupTemplateList(); } +void VehicleTemplateSelectorWidget::deleteSelectedTemplate() +{ + if (selectedTemplateEditable()) { + if (QMessageBox::question(this, tr("Delete Vehicle Template"), + "Are you sure you want to delete the selected template?", + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + QFile fileToDelete(selectedTemplatePath()); + if (fileToDelete.remove()) { + QJsonObject* templObj = selectedTemplate(); + if (templObj) { + VehicleTemplate *templ = m_templates[templObj->value("uuid").toString()]; + m_templates.remove(templObj->value("uuid").toString()); + delete templ; + } + delete ui->templateList->item(ui->templateList->currentRow()); + } + } + } +} void VehicleTemplateSelectorWidget::updatePhoto(QJsonObject *templ) { QPixmap photo; @@ -129,6 +166,7 @@ void VehicleTemplateSelectorWidget::templateSelectionChanged() QJsonObject *templ = selectedTemplate(); updatePhoto(templ); updateDescription(templ); + ui->deleteTemplateButton->setEnabled(selectedTemplateEditable()); } } @@ -173,7 +211,8 @@ void VehicleTemplateSelectorWidget::loadFilesInDir(QString templateBasePath, boo templateDir.setSorting(QDir::Name); QStringList files = templateDir.entryList(); foreach(QString fileName, files) { - QFile file(QString("%1/%2").arg(templateDir.absolutePath()).arg(fileName)); + QString fullPathName = QString("%1/%2").arg(templateDir.absolutePath()).arg(fileName); + QFile file(fullPathName); if (file.open(QFile::ReadOnly)) { QByteArray jsonData = file.readAll(); @@ -184,7 +223,7 @@ void VehicleTemplateSelectorWidget::loadFilesInDir(QString templateBasePath, boo 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); + m_templates[json["uuid"].toString()] = new VehicleTemplate(new QJsonObject(json), local, fullPathName); } } } else { @@ -199,7 +238,7 @@ void VehicleTemplateSelectorWidget::loadFilesInDir(QString templateBasePath, boo void VehicleTemplateSelectorWidget::loadValidFiles() { ui->templateList->clear(); - foreach(QJsonObject * templ, m_templates.values()) { + foreach(VehicleTemplate * templ, m_templates.values()) { delete templ; } m_templates.clear(); @@ -213,10 +252,15 @@ void VehicleTemplateSelectorWidget::setupTemplateList() QListWidgetItem *item; foreach(QString templ, m_templates.keys()) { - QJsonObject *json = m_templates[templ]; + VehicleTemplate *vtemplate = m_templates[templ]; - item = new QListWidgetItem(json->value("name").toString(), ui->templateList); - item->setData(Qt::UserRole + 1, QVariant::fromValue(json)); + item = new QListWidgetItem(vtemplate->templateObject()->value("name").toString(), ui->templateList); + item->setData(Qt::UserRole + 1, QVariant::fromValue(vtemplate->templateObject())); + item->setData(Qt::UserRole + 2, QVariant::fromValue(vtemplate->editable())); + if (vtemplate->editable()) { + item->setData(Qt::ForegroundRole, QVariant::fromValue(QColor(Qt::darkGreen))); + } + item->setData(Qt::UserRole + 3, QVariant::fromValue(vtemplate->templatePath())); } ui->templateList->sortItems(Qt::AscendingOrder); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.h index 17c2fdeae..c8fa0be43 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.h @@ -36,6 +36,36 @@ namespace Ui { class VehicleTemplateSelectorWidget; } +class VehicleTemplate { +public: + VehicleTemplate(QJsonObject *templateObject, bool editable, QString templatePath) : + m_templateObject(templateObject), m_editable(editable), m_templatePath(templatePath) { + } + + ~VehicleTemplate() { + if (m_templateObject) { + delete m_templateObject; + } + } + + QJsonObject *templateObject() { + return m_templateObject; + } + + bool editable() { + return m_editable; + } + + QString templatePath() { + return m_templatePath; + } + +private: + QJsonObject *m_templateObject; + bool m_editable; + QString m_templatePath; +}; + class VehicleTemplateSelectorWidget : public QWidget { Q_OBJECT @@ -44,7 +74,6 @@ public: ~VehicleTemplateSelectorWidget(); void setTemplateInfo(int vehicleType, int vehicleSubType); QJsonObject *selectedTemplate() const; - public slots: void templateSelectionChanged(); @@ -57,7 +86,7 @@ private: int m_vehicleType; int m_vehicleSubType; - QMap m_templates; + QMap m_templates; QGraphicsPixmapItem *m_photoItem; void loadValidFiles(); @@ -68,9 +97,12 @@ private: void updateDescription(QJsonObject *templ); bool airframeIsCompatible(int vehicleType, int vehicleSubType); QString getTemplatePath(); + bool selectedTemplateEditable() const; + QString selectedTemplatePath() const; private slots: void updateTemplates(); + void deleteSelectedTemplate(); }; Q_DECLARE_METATYPE(QJsonObject *) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.ui b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.ui index 20caa1f19..c0a07e9ff 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicletemplateselectorwidget.ui @@ -13,71 +13,160 @@ Form - + + + 0 + + + 0 + + + 0 + + + 0 + - - - + + + Qt::Vertical + + + + + 6 + - + + + + 0 + 300 + + Qt::ScrollBarAlwaysOn + + Qt::ScrollBarAlwaysOff + QAbstractItemView::NoEditTriggers + + false + - - - - 250 - 250 - - - - background-color: rgba(254, 254, 254, 0); - - - false - - - QPainter::Antialiasing|QPainter::HighQualityAntialiasing|QPainter::TextAntialiasing - - + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Add... + + + + + + + false + + + Delete + + + + + + + - - - - 0 - 0 - + + + + 200 + 200 + - - - 10 - + + background-color: rgba(254, 254, 254, 0); - + false - - true + + QPainter::Antialiasing|QPainter::HighQualityAntialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing - - Information about the Vehicle in short. + + QGraphicsView::AnchorViewCenter - - + + + + + 0 + 0 + + + + + 10 + + + + false + + + true + + + Information about the Vehicle in short. + + +