diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc
index 8eceb5c72f1d36c5734e539c1db7e9bb8a7d211d..1be5abf8f22f82621beba6b5ec16e4283bcae0f2 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 055072c63104062ead72633e76f0f3ca68b40833..1407fe4a33fa632c778423757acd798ed8273e19 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 d0d01ab77cdce2397b5727d17d2d997ce696203a..ce2b6e40287c1e570c6f18cd0c45b810710fd6ad 100644
--- a/src/ui/MainWindow.ui
+++ b/src/ui/MainWindow.ui
@@ -111,6 +111,7 @@
Widgets
+
diff --git a/src/ui/designer/QGCToolWidget.cc b/src/ui/designer/QGCToolWidget.cc
index d5ced7f65f23ce4c0faa92d7ad9958b3a6c50150..e75c2ca26e496af17ac99dabf6be0cfc596037bc 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 b1a890d562e14603f44554dac1788a16940f3711..3b0805193f3893d86fad4e385a10c2bb3b36fae6 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 f0ce402468387ab4dc4a08e3400b027ed59c728b..912858396d2d6251aec5c1edee5d22f2bd94b022 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 26de51e19554395112f8b72a8a127491c591ef90..e717349a1be370e895fea4cd247e07ee042ce730 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()