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.
+
+
+