diff --git a/src/Core.cc b/src/Core.cc index 04645abcaadc8b7f4220cb803c96b163dac369ce..b9ac4d622ec541078ac98d1056afa14d92d86cd4 100644 --- a/src/Core.cc +++ b/src/Core.cc @@ -39,6 +39,8 @@ This file is part of the QGROUNDCONTROL project #include #include +#include + #include "configuration.h" #include "QGC.h" #include "Core.h" @@ -65,29 +67,43 @@ This file is part of the QGROUNDCONTROL project Core::Core(int &argc, char* argv[]) : QApplication(argc, argv) { + // Set application name this->setApplicationName(QGC_APPLICATION_NAME); this->setApplicationVersion(QGC_APPLICATION_VERSION); this->setOrganizationName(QLatin1String("OPENMAV")); - this->setOrganizationDomain("http://qgroundcontrol.org"); + this->setOrganizationDomain("org.qgroundcontrol"); + + // Set settings format + QSettings::setDefaultFormat(QSettings::IniFormat); // Check application settings // clear them if they mismatch // QGC then falls back to default QSettings settings; - settings.sync(); - if (settings.contains("QGC_APPLICATION_VERSION_INT")) + + // Show user an upgrade message if QGC got upgraded (see code below, after splash screen) + bool upgraded = false; + QString lastApplicationVersion(""); + if (settings.contains("QGC_APPLICATION_VERSION")) { QString qgcVersion = settings.value("QGC_APPLICATION_VERSION").toString(); if (qgcVersion != QGC_APPLICATION_VERSION) { + lastApplicationVersion = qgcVersion; settings.clear(); + // Write current application version + settings.setValue("QGC_APPLICATION_VERSION", QGC_APPLICATION_VERSION); + upgraded = true; } } else { // If application version is not set, clear settings anyway settings.clear(); + // Write current application version + settings.setValue("QGC_APPLICATION_VERSION", QGC_APPLICATION_VERSION); } + settings.sync(); // Show splash screen @@ -98,7 +114,6 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv) splashScreen->show(); splashScreen->showMessage(tr("Loading application fonts"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); - QSettings::setDefaultFormat(QSettings::IniFormat); // Exit main application when last window is closed connect(this, SIGNAL(lastWindowClosed()), this, SLOT(quit())); @@ -147,9 +162,12 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv) //mainWindow->addLink(simulationLink); mainWindow = MainWindow::instance(); - // Remove splash screen + + // Remove splash screen splashScreen->finish(mainWindow); + if (upgraded) mainWindow->showInfoMessage(tr("Default Settings Loaded"), tr("QGroundControl has been upgraded from version %1 to version %2. Some of your user preferences have been reset to defaults for safety reasons. Please adjust them where needed.").arg(lastApplicationVersion).arg(QGC_APPLICATION_VERSION)); + // Check if link could be connected if (!udpLink->connect()) { diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 1533afba5a5ac7de04076caabaf419686b72d43b..a4636c62567399afb4b6732fa35d5d8d40d29ec4 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -66,12 +66,8 @@ MainWindow::MainWindow(QWidget *parent): toolsMenuActions(), currentView(VIEW_ENGINEER), aboutToCloseFlag(false), - changingViewsFlag(false), - settings() + changingViewsFlag(false) { - // Get current settings - settings.sync(); - if (!settings.contains("CURRENT_VIEW")) { // Set this view as default view @@ -132,6 +128,7 @@ MainWindow::MainWindow(QWidget *parent): // Setup user interface ui.setupUi(this); + ui.actionNewCustomWidget->setEnabled(false); setVisible(false); @@ -224,6 +221,43 @@ QString MainWindow::getWindowGeometryKey() return QString::number(currentView)+"/geometry"; } +void MainWindow::buildCustomWidget() +{ + // Show custom widgets only if UAS is connected + if (UASManager::instance()->getActiveUAS() != NULL) + { + // Enable custom widgets + ui.actionNewCustomWidget->setEnabled(true); + + // Create custom widgets + QList widgets = QGCToolWidget::createWidgetsFromSettings(this); + + if (widgets.size() > 0) + { + ui.menuTools->addSeparator(); + } + + for(int i = 0; i < widgets.size(); ++i) + { + qDebug() << "ADDING WIDGET #" << i << widgets.at(i); + // Check if this widget already has a parent, do not create it in this case + QDockWidget* dock = dynamic_cast(widgets.at(i)->parentWidget()); + if (!dock) + { + QDockWidget* dock = new QDockWidget(widgets.at(i)->windowTitle(), this); + dock->setWidget(widgets.at(i)); + connect(widgets.at(i), SIGNAL(destroyed()), dock, SLOT(deleteLater())); + QAction* showAction = new QAction(widgets.at(i)->windowTitle(), this); + connect(showAction, SIGNAL(triggered(bool)), dock, SLOT(setVisible(bool))); + connect(dock, SIGNAL(visibilityChanged(bool)), showAction, SLOT(setChecked(bool))); + widgets.at(i)->setMainMenuAction(showAction); + ui.menuTools->addAction(showAction); + addDockWidget(Qt::BottomDockWidgetArea, dock); + } + } + } +} + void MainWindow::buildCommonWidgets() { //TODO: move protocol outside UI @@ -824,10 +858,23 @@ void MainWindow::connectCommonWidgets() void MainWindow::createCustomWidget() { //qDebug() << "ADDING CUSTOM WIDGET"; - QGCToolWidget* tool = new QGCToolWidget(this); + QGCToolWidget* tool = new QGCToolWidget("Unnamed Tool", this); + + if (QGCToolWidget::instances()->size() < 2) + { + // This is the first widget + ui.menuTools->addSeparator(); + } + QDockWidget* dock = new QDockWidget("Unnamed Tool", this); + connect(tool, SIGNAL(destroyed()), dock, SLOT(deleteLater())); dock->setWidget(tool); - this->addDockWidget(Qt::LeftDockWidgetArea, dock); + QAction* showAction = new QAction("Show Unnamed Tool", this); + connect(dock, SIGNAL(visibilityChanged(bool)), showAction, SLOT(setChecked(bool))); + connect(showAction, SIGNAL(triggered(bool)), dock, SLOT(setVisible(bool))); + tool->setMainMenuAction(showAction); + ui.menuTools->addAction(showAction); + this->addDockWidget(Qt::BottomDockWidgetArea, dock); dock->setVisible(true); } @@ -1346,6 +1393,9 @@ void MainWindow::UASCreated(UASInterface* uas) } if (!ui.menuConnected_Systems->isEnabled()) ui.menuConnected_Systems->setEnabled(true); + + // Custom widgets, added last to all menus and layouts + buildCustomWidget(); } /** diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 62416469c2b6097dad5d761f8cd41977e5e2603f..04e29f07d6ea25d71fa1948c9c69b018dd0037a9 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -305,6 +305,7 @@ protected: void clearView(); + void buildCustomWidget(); void buildCommonWidgets(); void buildPxWidgets(); void buildSlugsWidgets(); diff --git a/src/ui/QGCMAVLinkLogPlayer.cc b/src/ui/QGCMAVLinkLogPlayer.cc index 1a4364fd36d35828d5bf974604f7d4c210330520..7624ce2888f1c19f2206936de46a4d3c9796b105 100644 --- a/src/ui/QGCMAVLinkLogPlayer.cc +++ b/src/ui/QGCMAVLinkLogPlayer.cc @@ -119,6 +119,13 @@ void QGCMAVLinkLogPlayer::setAccelerationFactorInt(int factor) void QGCMAVLinkLogPlayer::loadLogFile(const QString& file) { + // Check if logging is still enabled + if (mavlink->loggingEnabled()) + { + mavlink->enableLogging(false); + MainWindow::instance()->showInfoMessage(tr("MAVLink Logging Stopped during Replay"), tr("MAVLink logging has been stopped during the log replay. To re-enable logging, use the link properties in the communication menu.")); + } + // Ensure that the playback process is stopped if (logFile.isOpen()) { diff --git a/src/ui/designer/QGCActionButton.cc b/src/ui/designer/QGCActionButton.cc index 461e3a9beba1d380e80e5f812f294658f8de1241..bb3e0c24ff1eb94e1434d50ca0cbcc20a8cde7d4 100644 --- a/src/ui/designer/QGCActionButton.cc +++ b/src/ui/designer/QGCActionButton.cc @@ -52,7 +52,13 @@ QGCActionButton::QGCActionButton(QWidget *parent) : connect(ui->editFinishButton, SIGNAL(clicked()), this, SLOT(endEditMode())); connect(ui->editButtonName, SIGNAL(textChanged(QString)), this, SLOT(setActionButtonName(QString))); connect(ui->editActionComboBox, SIGNAL(currentIndexChanged(QString)), ui->nameLabel, SLOT(setText(QString))); - endEditMode(); + + // Hide all edit items + ui->editActionComboBox->hide(); + ui->editActionsRefreshButton->hide(); + ui->editFinishButton->hide(); + ui->editNameLabel->hide(); + ui->editButtonName->hide(); // add action labels to combobox for (int i = 0; i < MAV_ACTION_NB; i++) @@ -105,7 +111,28 @@ void QGCActionButton::endEditMode() ui->editButtonName->hide(); // Write to settings - + emit editingFinished(); isInEditMode = false; } + +void QGCActionButton::writeSettings(QSettings& settings) +{ + settings.setValue("TYPE", "BUTTON"); + settings.setValue("QGC_ACTION_BUTTON_DESCRIPTION", ui->nameLabel->text()); + settings.setValue("QGC_ACTION_BUTTON_BUTTONTEXT", ui->actionButton->text()); + settings.setValue("QGC_ACTION_BUTTON_ACTIONID", ui->editActionComboBox->currentIndex()); + settings.sync(); +} + +void QGCActionButton::readSettings(const QSettings& settings) +{ + ui->editNameLabel->setText(settings.value("QGC_ACTION_BUTTON_DESCRIPTION", "ERROR LOADING BUTTON").toString()); + ui->editButtonName->setText(settings.value("QGC_ACTION_BUTTON_BUTTONTEXT", "UNKNOWN").toString()); + ui->editActionComboBox->setCurrentIndex(settings.value("QGC_ACTION_BUTTON_ACTIONID", 0).toInt()); + + ui->nameLabel->setText(settings.value("QGC_ACTION_BUTTON_DESCRIPTION", "ERROR LOADING BUTTON").toString()); + ui->actionButton->setText(settings.value("QGC_ACTION_BUTTON_BUTTONTEXT", "UNKNOWN").toString()); + ui->editActionComboBox->setCurrentIndex(settings.value("QGC_ACTION_BUTTON_ACTIONID", 0).toInt()); + qDebug() << "DONE READING SETTINGS"; +} diff --git a/src/ui/designer/QGCActionButton.h b/src/ui/designer/QGCActionButton.h index b018514f8bcdfeb565132d28bd37889f934f8a66..5a0ff1994607f5a450dcbf659820542016dc9863 100644 --- a/src/ui/designer/QGCActionButton.h +++ b/src/ui/designer/QGCActionButton.h @@ -22,6 +22,8 @@ public slots: void setActionButtonName(QString text); void startEditMode(); void endEditMode(); + void writeSettings(QSettings& settings); + void readSettings(const QSettings& settings); private: Ui::QGCActionButton *ui; diff --git a/src/ui/designer/QGCParamSlider.cc b/src/ui/designer/QGCParamSlider.cc index e76c69a20bd06a980413a592acafc33dee5e5fb4..f5290b0347c54c9ab4940b256f78afa81932e6b5 100644 --- a/src/ui/designer/QGCParamSlider.cc +++ b/src/ui/designer/QGCParamSlider.cc @@ -53,6 +53,7 @@ void QGCParamSlider::endEditMode() ui->maxSpinBox->hide(); ui->typeComboBox->hide(); isInEditMode = false; + emit editingFinished(); } void QGCParamSlider::sendParameter() @@ -78,3 +79,13 @@ void QGCParamSlider::changeEvent(QEvent *e) break; } } + +void QGCParamSlider::writeSettings(QSettings& settings) +{ + +} + +void QGCParamSlider::readSettings(const QSettings& settings) +{ + +} diff --git a/src/ui/designer/QGCParamSlider.h b/src/ui/designer/QGCParamSlider.h index 97e0e8eb008af860f5cb6cc5031774cf3f30c2d3..51bd73b85aac8fa344d90ebc4a5995d8f62f514a 100644 --- a/src/ui/designer/QGCParamSlider.h +++ b/src/ui/designer/QGCParamSlider.h @@ -24,6 +24,8 @@ public slots: void endEditMode(); /** @brief Send the parameter to the MAV */ void sendParameter(); + void writeSettings(QSettings& settings); + void readSettings(const QSettings& settings); protected: QString parameterName; ///< Key/Name of the parameter diff --git a/src/ui/designer/QGCToolWidget.cc b/src/ui/designer/QGCToolWidget.cc index 4a3992b912ef0c274c17a3ccced481269b4d1ce6..3b11d8d7d98e1f78849e19af30ee7d412e199bc1 100644 --- a/src/ui/designer/QGCToolWidget.cc +++ b/src/ui/designer/QGCToolWidget.cc @@ -6,20 +6,31 @@ #include #include #include +#include + #include "QGCParamSlider.h" #include "QGCActionButton.h" #include "UASManager.h" -QGCToolWidget::QGCToolWidget(QWidget *parent) : +QGCToolWidget::QGCToolWidget(const QString& title, QWidget *parent) : QWidget(parent), - toolLayout(new QVBoxLayout(this)), mav(NULL), + mainMenuAction(NULL), ui(new Ui::QGCToolWidget) { ui->setupUi(this); + setObjectName(title); createActions(); + toolLayout = ui->toolLayout; toolLayout->setAlignment(Qt::AlignTop); + QDockWidget* dock = dynamic_cast(this->parentWidget()); + if (dock) + { + dock->setWindowTitle(title); + } + this->setWindowTitle(title); + QList systems = UASManager::instance()->getUASList(); foreach (UASInterface* uas, systems) { @@ -30,6 +41,7 @@ QGCToolWidget::QGCToolWidget(QWidget *parent) : } } connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(addUAS(UASInterface*))); + if (!instances()->contains(title)) instances()->insert(title, this); } QGCToolWidget::~QGCToolWidget() @@ -37,6 +49,109 @@ QGCToolWidget::~QGCToolWidget() delete ui; } +/** + * @param parent Object later holding these widgets, usually the main window + * @return List of all widgets + */ +QList QGCToolWidget::createWidgetsFromSettings(QWidget* parent) +{ + // Store list of widgets + QSettings settings; + QList newWidgets; + int size = settings.beginReadArray("QGC_TOOL_WIDGET_NAMES"); + for (int i = 0; i < size; i++) + { + settings.setArrayIndex(i); + QString name = settings.value("TITLE", tr("UNKNOWN WIDGET %1").arg(i)).toString(); + + if (!instances()->contains(name)) + { + QGCToolWidget* tool = new QGCToolWidget(name, parent); + instances()->insert(name, tool); + newWidgets.append(tool); + } + } + settings.endArray(); + + qDebug() << "NEW WIDGETS: " << newWidgets.size(); + + // Load individual widget items + for (int i = 0; i < newWidgets.size(); i++) + { + QString widgetName = newWidgets.at(i)->getTitle(); + qDebug() << "READING: " << widgetName; + settings.beginGroup(widgetName); + int size = settings.beginReadArray("QGC_TOOL_WIDGET_ITEMS"); + qDebug() << "CHILDREN SIZE:" << size; + for (int j = 0; j < size; j++) + { + settings.setArrayIndex(j); + QString type = settings.value("TYPE", "UNKNOWN").toString(); + if (type != "UNKNOWN") + { + QGCToolWidgetItem* item = NULL; + if (type == "BUTTON") + { + item = new QGCActionButton(newWidgets.at(i)); + qDebug() << "CREATED BUTTON"; + } + + if (item) + { + // Configure and add to layout + newWidgets.at(i)->addToolWidget(item); + item->readSettings(settings); + + qDebug() << "Created tool widget"; + } + } + else + { + qDebug() << "UNKNOWN TOOL WIDGET TYPE"; + } + } + settings.endArray(); + settings.endGroup(); + } + + return instances()->values(); +} + +void QGCToolWidget::storeWidgetsToSettings() +{ + // Store list of widgets + QSettings settings; + settings.beginWriteArray("QGC_TOOL_WIDGET_NAMES"); + for (int i = 0; i < instances()->size(); ++i) + { + settings.setArrayIndex(i); + settings.setValue("TITLE", instances()->values().at(i)->getTitle()); + } + settings.endArray(); + + // Store individual widget items + for (int i = 0; i < instances()->size(); ++i) + { + QString widgetName = instances()->values().at(i)->getTitle(); + settings.beginGroup(widgetName); + settings.beginWriteArray("QGC_TOOL_WIDGET_ITEMS"); + int k = 0; // QGCToolItem counter + for (int j = 0; j < instances()->values().at(i)->children().size(); ++j) + { + // Store only QGCToolWidgetItems + QGCToolWidgetItem* item = dynamic_cast(instances()->values().at(i)->children().at(j)); + if (item) + { + settings.setArrayIndex(k++); + // Store the ToolWidgetItem + item->writeSettings(settings); + } + } + settings.endArray(); + settings.endGroup(); + } +} + void QGCToolWidget::addUAS(UASInterface* uas) { UAS* newMav = dynamic_cast(uas); @@ -53,6 +168,7 @@ void QGCToolWidget::contextMenuEvent (QContextMenuEvent* event) //menu.addAction(addParamAction); menu.addAction(addButtonAction); menu.addAction(setTitleAction); + menu.addAction(deleteAction); menu.exec(event->globalPos()); } @@ -69,11 +185,33 @@ void QGCToolWidget::createActions() setTitleAction = new QAction(tr("Set Widget Title"), this); setTitleAction->setStatusTip(tr("Set the title caption of this tool widget")); connect(setTitleAction, SIGNAL(triggered()), this, SLOT(setTitle())); + + deleteAction = new QAction(tr("Delete this widget"), this); + deleteAction->setStatusTip(tr("Delete this widget permanently")); + connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteWidget())); +} + +QMap* QGCToolWidget::instances() +{ + static QMap* instances; + if (!instances) instances = new QMap(); + return instances; +} + +QList* QGCToolWidget::itemList() +{ + static QList* instances; + if (!instances) instances = new QList(); + return instances; } void QGCToolWidget::addParam() { QGCParamSlider* slider = new QGCParamSlider(this); + if (ui->hintLabel) + { + ui->hintLabel->deleteLater(); + } toolLayout->addWidget(slider); slider->startEditMode(); } @@ -81,20 +219,80 @@ void QGCToolWidget::addParam() void QGCToolWidget::addAction() { QGCActionButton* button = new QGCActionButton(this); + if (ui->hintLabel) + { + ui->hintLabel->deleteLater(); + } toolLayout->addWidget(button); button->startEditMode(); } +void QGCToolWidget::addToolWidget(QGCToolWidgetItem* widget) +{ + if (ui->hintLabel) + { + ui->hintLabel->deleteLater(); + } + toolLayout->addWidget(widget); +} + +const QString QGCToolWidget::getTitle() +{ + QDockWidget* parent = dynamic_cast(this->parentWidget()); + if (parent) + { + return parent->windowTitle(); + } + else + { + return this->windowTitle(); + } +} + + void QGCToolWidget::setTitle() { QDockWidget* parent = dynamic_cast(this->parentWidget()); if (parent) { - bool ok; + bool ok; QString text = QInputDialog::getText(this, tr("QInputDialog::getText()"), tr("Widget title:"), QLineEdit::Normal, parent->windowTitle(), &ok); if (ok && !text.isEmpty()) - parent->setWindowTitle(text); + { + QSettings settings; + settings.beginGroup(parent->windowTitle()); + settings.remove(""); + settings.endGroup(); + parent->setWindowTitle(text); + + storeWidgetsToSettings(); + emit titleChanged(text); + if (mainMenuAction) mainMenuAction->setText(text); + } } } + +void QGCToolWidget::setMainMenuAction(QAction* action) +{ + this->mainMenuAction = action; +} + +void QGCToolWidget::deleteWidget() +{ + // Remove from settings + + // Hide + this->hide(); + instances()->remove(getTitle()); + QSettings settings; + settings.beginGroup(getTitle()); + settings.remove(""); + settings.endGroup(); + storeWidgetsToSettings(); + + // Delete + mainMenuAction->deleteLater(); + this->deleteLater(); +} diff --git a/src/ui/designer/QGCToolWidget.h b/src/ui/designer/QGCToolWidget.h index 90d90eac8be3400581da89d2d225aa746aa36146..a2a556f89879576dfc9e016c9101e605a18bb2f2 100644 --- a/src/ui/designer/QGCToolWidget.h +++ b/src/ui/designer/QGCToolWidget.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "QGCToolWidgetItem.h" #include "UAS.h" @@ -16,21 +18,41 @@ class QGCToolWidget : public QWidget Q_OBJECT public: - explicit QGCToolWidget(QWidget *parent = 0); + explicit QGCToolWidget(const QString& title, QWidget *parent = 0); ~QGCToolWidget(); + /** @brief Factory method to instantiate all tool widgets */ + static QList createWidgetsFromSettings(QWidget* parent); + /** @Give the tool widget a reference to its action in the main menu */ + void setMainMenuAction(QAction* action); + /** @brief All instances of this class */ + static QMap* instances(); + public slots: void addUAS(UASInterface* uas); + /** @brief Delete this widget */ + void deleteWidget(); + /** @brief Store all widgets of this type to QSettings */ + static void storeWidgetsToSettings(); + +signals: + void titleChanged(QString); protected: QAction* addParamAction; QAction* addButtonAction; QAction* setTitleAction; + QAction* deleteAction; QVBoxLayout* toolLayout; UAS* mav; + QAction* mainMenuAction; void contextMenuEvent(QContextMenuEvent* event); void createActions(); + QList* itemList(); + const QString getTitle(); + /** @brief Add an existing tool widget */ + void addToolWidget(QGCToolWidgetItem* widget); protected slots: void addParam(); diff --git a/src/ui/designer/QGCToolWidget.ui b/src/ui/designer/QGCToolWidget.ui index 212fe670abd8315a7e7aa3d11751dce7fd591717..e3bc6c754105b0a86dc71e1beed7e11e9cc3d101 100644 --- a/src/ui/designer/QGCToolWidget.ui +++ b/src/ui/designer/QGCToolWidget.ui @@ -1,7 +1,5 @@ + - - - QGCToolWidget @@ -15,7 +13,16 @@ Form + + + + + Right-click into the widget to customize + + + + - + diff --git a/src/ui/designer/QGCToolWidgetItem.cc b/src/ui/designer/QGCToolWidgetItem.cc index e66ab0b0c0db05d69258b6e96492d6915105cab8..77032129ee819e887f9f461e9809063d3f1fb819 100644 --- a/src/ui/designer/QGCToolWidgetItem.cc +++ b/src/ui/designer/QGCToolWidgetItem.cc @@ -3,6 +3,7 @@ #include #include +#include "QGCToolWidget.h" #include "UASManager.h" QGCToolWidgetItem::QGCToolWidgetItem(const QString& name, QWidget *parent) : @@ -12,23 +13,30 @@ QGCToolWidgetItem::QGCToolWidgetItem(const QString& name, QWidget *parent) : uas(NULL), _component(-1) { - startEditAction = new QAction("Edit "+qgcToolWidgetItemName, this); + startEditAction = new QAction(tr("Edit %1").arg(qgcToolWidgetItemName), this); connect(startEditAction, SIGNAL(triggered()), this, SLOT(startEditMode())); - stopEditAction = new QAction("Finish Editing Slider", this); + stopEditAction = new QAction(tr("Finish Editing %1").arg(qgcToolWidgetItemName), this); connect(stopEditAction, SIGNAL(triggered()), this, SLOT(endEditMode())); + deleteAction = new QAction(tr("Delete %1").arg(qgcToolWidgetItemName), this); + connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteLater())); + + QGCToolWidget* tool = dynamic_cast(parent); + if (tool) + { + connect(this, SIGNAL(editingFinished()), tool, SLOT(storeWidgetsToSettings())); + } connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*))); // Set first UAS if it exists setActiveUAS(UASManager::instance()->getActiveUAS()); - - endEditMode(); } QGCToolWidgetItem::~QGCToolWidgetItem() { delete startEditAction; delete stopEditAction; + delete deleteAction; } void QGCToolWidgetItem::contextMenuEvent (QContextMenuEvent* event) @@ -37,6 +45,7 @@ void QGCToolWidgetItem::contextMenuEvent (QContextMenuEvent* event) if (!isInEditMode) { menu.addAction(startEditAction); + menu.addAction(deleteAction); } else { diff --git a/src/ui/designer/QGCToolWidgetItem.h b/src/ui/designer/QGCToolWidgetItem.h index a3ee5b6f4d86ce205a43f3e1625cc3a1f24ee2aa..b477bec14085bb1a883361c2ff8d9ff90554780b 100644 --- a/src/ui/designer/QGCToolWidgetItem.h +++ b/src/ui/designer/QGCToolWidgetItem.h @@ -3,6 +3,7 @@ #include #include +#include #include "UASInterface.h" @@ -19,11 +20,17 @@ public slots: virtual void startEditMode() {} virtual void endEditMode() {} virtual void setComponent(int comp) {_component = comp;} + virtual void writeSettings(QSettings& settings) = 0; + virtual void readSettings(const QSettings& settings) = 0; void setActiveUAS(UASInterface *uas); +signals: + void editingFinished(); + protected: QAction* startEditAction; QAction* stopEditAction; + QAction* deleteAction; bool isInEditMode; QString qgcToolWidgetItemName; UASInterface* uas;