From 0d69f5231c6bd5ad338176fd1c01457a6dd2fc4f Mon Sep 17 00:00:00 2001 From: LM Date: Mon, 18 Jul 2011 08:12:19 +0200 Subject: [PATCH] Working on user-loadable custom widgets --- src/ui/MainWindow.cc | 33 ++++- src/ui/MainWindow.h | 3 + src/ui/MainWindow.ui | 10 ++ src/ui/designer/QGCToolWidget.cc | 187 ++++++++++++++++++---------- src/ui/designer/QGCToolWidget.h | 17 ++- src/ui/linechart/LinechartWidget.cc | 2 +- src/ui/map/MAV2DIcon.cc | 1 + 7 files changed, 182 insertions(+), 71 deletions(-) diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 8eceb5c72..1be5abf8f 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -938,17 +938,45 @@ void MainWindow::connectCommonWidgets() void MainWindow::createCustomWidget() { - QGCToolWidget* tool = new QGCToolWidget("Unnamed Tool", this); + QDockWidget* dock = new QDockWidget("Unnamed Tool", this); + QGCToolWidget* tool = new QGCToolWidget("Unnamed Tool", dock); 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); + QAction* showAction = new QAction(tool->getTitle(), this); + showAction->setCheckable(true); + 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); +} + +void MainWindow::loadCustomWidget() +{ + QString widgetFileExtension(".qgw"); + QString fileName = QFileDialog::getOpenFileName(this, tr("Specify Widget File Name"), QDesktopServices::storageLocation(QDesktopServices::DesktopLocation), tr("QGroundControl Widget (*%1);;").arg(widgetFileExtension)); + QGCToolWidget* tool = new QGCToolWidget("", this); + tool->loadSettings(fileName); + + if (QGCToolWidget::instances()->size() < 2) { + // This is the first widget + ui.menuTools->addSeparator(); + } + + // Add widget to UI + QDockWidget* dock = new QDockWidget(tool->getTitle(), this); + connect(tool, SIGNAL(destroyed()), dock, SLOT(deleteLater())); + dock->setWidget(tool); + tool->setParent(dock); + QAction* showAction = new QAction("Show Unnamed Tool", this); showAction->setCheckable(true); connect(dock, SIGNAL(visibilityChanged(bool)), showAction, SLOT(setChecked(bool))); @@ -1333,6 +1361,7 @@ void MainWindow::connectCommonActions() // Custom widget actions connect(ui.actionNewCustomWidget, SIGNAL(triggered()), this, SLOT(createCustomWidget())); + connect(ui.actionLoadCustomWidgetFile, SIGNAL(triggered()), this, SLOT(loadCustomWidget())); // Audio output ui.actionMuteAudioOutput->setChecked(GAudioOutput::instance()->isMuted()); diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 055072c63..1407fe4a3 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -181,6 +181,9 @@ public slots: /** @brief Add a custom tool widget */ void createCustomWidget(); + /** @brief Load a custom tool widget from a file */ + void loadCustomWidget(); + void closeEvent(QCloseEvent* event); /** @brief Load data view, allowing to plot flight data */ diff --git a/src/ui/MainWindow.ui b/src/ui/MainWindow.ui index d0d01ab77..ce2b6e402 100644 --- a/src/ui/MainWindow.ui +++ b/src/ui/MainWindow.ui @@ -111,6 +111,7 @@ Widgets + @@ -456,6 +457,15 @@ Esc + + + + :/images/status/folder-drag-accept.svg:/images/status/folder-drag-accept.svg + + + Load Custom Widget File + + diff --git a/src/ui/designer/QGCToolWidget.cc b/src/ui/designer/QGCToolWidget.cc index d5ced7f65..e75c2ca26 100644 --- a/src/ui/designer/QGCToolWidget.cc +++ b/src/ui/designer/QGCToolWidget.cc @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include "QGCParamSlider.h" #include "QGCActionButton.h" @@ -61,96 +63,144 @@ QGCToolWidget::~QGCToolWidget() * @param parent Object later holding these widgets, usually the main window * @return List of all widgets */ -QList QGCToolWidget::createWidgetsFromSettings(QWidget* parent) +QList QGCToolWidget::createWidgetsFromSettings(QWidget* parent, QString settingsFile) { - // Store list of widgets - QSettings settings; + // Load widgets from application settings + QSettings* settings; + + // Or load them from a settings file + if (!settingsFile.isEmpty()) + { + settings = new QSettings(settingsFile, QSettings::IniFormat); + qDebug() << "LOADING SETTINGS FROM" << settingsFile; + } + else + { + settings = new QSettings(); + } + QList newWidgets; - int size = settings.beginReadArray("QGC_TOOL_WIDGET_NAMES"); + 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(); + 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); } + else + { + qDebug() << "WIDGET DID ALREADY EXIST, REJECTING"; + } } - settings.endArray(); + 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"; - } else if (type == "COMMANDBUTTON") { - item = new QGCCommandButton(newWidgets.at(i)); - qDebug() << "CREATED COMMANDBUTTON"; - } else if (type == "SLIDER") { - item = new QGCParamSlider(newWidgets.at(i)); - qDebug() << "CREATED PARAM SLIDER"; - } - - 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(); + newWidgets.at(i)->loadSettings(*settings); } + delete settings; return instances()->values(); } -void QGCToolWidget::storeWidgetsToSettings() +void QGCToolWidget::loadSettings(const QString& settings) +{ + QSettings(settings, QSettings::IniFormat); + loadSettings(settings); +} + +void QGCToolWidget::loadSettings(QSettings& settings) +{ + QString widgetName = getTitle(); + 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(this); + qDebug() << "CREATED BUTTON"; + } else if (type == "COMMANDBUTTON") { + item = new QGCCommandButton(this); + qDebug() << "CREATED COMMANDBUTTON"; + } else if (type == "SLIDER") { + item = new QGCParamSlider(this); + qDebug() << "CREATED PARAM SLIDER"; + } + + if (item) { + // Configure and add to layout + addToolWidget(item); + item->readSettings(settings); + + qDebug() << "Created tool widget"; + } + } else { + qDebug() << "UNKNOWN TOOL WIDGET TYPE"; + } + } + settings.endArray(); + settings.endGroup(); +} + +void QGCToolWidget::storeWidgetsToSettings(QString settingsFile) { // Store list of widgets - QSettings settings; - settings.beginWriteArray("QGC_TOOL_WIDGET_NAMES"); + QSettings* settings; + if (!settingsFile.isEmpty()) + { + settings = new QSettings(settingsFile, QSettings::IniFormat); + } + else + { + settings = new QSettings(); + } + + 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->setArrayIndex(i); + settings->setValue("TITLE", instances()->values().at(i)->getTitle()); } - settings.endArray(); + 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); - } + instances()->values().at(i)->storeSettings(*settings); + } + delete settings; +} + +void QGCToolWidget::storeSettings(const QString& settingsFile) +{ + QSettings settings(settingsFile, QSettings::IniFormat); + storeSettings(settings); +} + +void QGCToolWidget::storeSettings(QSettings& settings) +{ + QString widgetName = getTitle(); + settings.beginGroup(widgetName); + settings.beginWriteArray("QGC_TOOL_WIDGET_ITEMS"); + int k = 0; // QGCToolItem counter + for (int j = 0; j < children().size(); ++j) { + // Store only QGCToolWidgetItems + QGCToolWidgetItem* item = dynamic_cast(children().at(j)); + if (item) { + settings.setArrayIndex(k++); + // Store the ToolWidgetItem + item->writeSettings(settings); } - settings.endArray(); - settings.endGroup(); } + settings.endArray(); + settings.endGroup(); } void QGCToolWidget::addUAS(UASInterface* uas) @@ -168,6 +218,7 @@ void QGCToolWidget::contextMenuEvent (QContextMenuEvent* event) menu.addAction(addParamAction); menu.addAction(addCommandAction); menu.addAction(setTitleAction); + menu.addAction(exportAction); menu.addAction(deleteAction); menu.addSeparator(); menu.addAction(addButtonAction); @@ -281,12 +332,20 @@ void QGCToolWidget::addToolWidget(QGCToolWidgetItem* widget) void QGCToolWidget::exportWidget() { - + const QString widgetFileExtension(".qgw"); + QString fileName = QFileDialog::getSaveFileName(this, tr("Specify File Name"), QDesktopServices::storageLocation(QDesktopServices::DesktopLocation), tr("QGroundControl Widget (*%1);;").arg(widgetFileExtension)); + if (!fileName.endsWith(widgetFileExtension)) + { + fileName = fileName.append(widgetFileExtension); + } + storeSettings(fileName); } -void QGCToolWidget::importWidget(const QString& fileName) +void QGCToolWidget::importWidget() { - + const QString widgetFileExtension(".qgw"); + QString fileName = QFileDialog::getOpenFileName(this, tr("Specify File Name"), QDesktopServices::storageLocation(QDesktopServices::DesktopLocation), tr("QGroundControl Widget (*%1);;").arg(widgetFileExtension)); + loadSettings(fileName); } const QString QGCToolWidget::getTitle() diff --git a/src/ui/designer/QGCToolWidget.h b/src/ui/designer/QGCToolWidget.h index b1a890d56..3b0805193 100644 --- a/src/ui/designer/QGCToolWidget.h +++ b/src/ui/designer/QGCToolWidget.h @@ -23,11 +23,13 @@ public: ~QGCToolWidget(); /** @brief Factory method to instantiate all tool widgets */ - static QList createWidgetsFromSettings(QWidget* parent); + static QList createWidgetsFromSettings(QWidget* parent, QString settingsFile=QString()); /** @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(); + /** @brief Get title of widget */ + const QString getTitle(); int isVisible(int view) { return viewVisible.value(view, false); } Qt::DockWidgetArea getDockWidgetArea(int view) { return dockWidgetArea.value(view, Qt::BottomDockWidgetArea); } @@ -39,9 +41,17 @@ public slots: /** @brief Export this widget to a file */ void exportWidget(); /** @brief Import settings for this widget from a file */ - void importWidget(const QString& fileName); + void importWidget(); /** @brief Store all widgets of this type to QSettings */ - static void storeWidgetsToSettings(); + static void storeWidgetsToSettings(QString settingsFile=QString()); + /** @brief Load this widget from a QSettings object */ + void loadSettings(QSettings& settings); + /** @brief Load this widget from a settings file */ + void loadSettings(const QString& settings); + /** @brief Store this widget to a QSettings object */ + void storeSettings(QSettings& settings); + /** @brief Store this widget to a settings file */ + void storeSettings(const QString& settingsFile); /** @brief Store the view id and dock widget area */ void setViewVisibilityAndDockWidgetArea(int view, bool visible, Qt::DockWidgetArea area); @@ -65,7 +75,6 @@ protected: void contextMenuEvent(QContextMenuEvent* event); void createActions(); QList* itemList(); - const QString getTitle(); /** @brief Add an existing tool widget */ void addToolWidget(QGCToolWidgetItem* widget); diff --git a/src/ui/linechart/LinechartWidget.cc b/src/ui/linechart/LinechartWidget.cc index f0ce40246..912858396 100644 --- a/src/ui/linechart/LinechartWidget.cc +++ b/src/ui/linechart/LinechartWidget.cc @@ -449,7 +449,7 @@ void LinechartWidget::startLogging() } // Let user select the log file name - QDate date(QDate::currentDate()); + //QDate date(QDate::currentDate()); // QString("./pixhawk-log-" + date.toString("yyyy-MM-dd") + "-" + QString::number(logindex) + ".log") QString fileName = QFileDialog::getSaveFileName(this, tr("Specify log file name"), QDesktopServices::storageLocation(QDesktopServices::DesktopLocation), tr("Logfile (*.csv *.txt);;")); diff --git a/src/ui/map/MAV2DIcon.cc b/src/ui/map/MAV2DIcon.cc index 26de51e19..e717349a1 100644 --- a/src/ui/map/MAV2DIcon.cc +++ b/src/ui/map/MAV2DIcon.cc @@ -40,6 +40,7 @@ MAV2DIcon::MAV2DIcon(mapcontrol::MapGraphicItem* map, mapcontrol::OPMapWidget* p drawIcon(pen); } size = QSize(radius, radius); + SetUAVPos(internals::PointLatLng(lat, lon), alt); } MAV2DIcon::~MAV2DIcon() -- 2.22.0