Commit 0d69f523 authored by LM's avatar LM

Working on user-loadable custom widgets

parent 0f28dcbf
...@@ -938,17 +938,45 @@ void MainWindow::connectCommonWidgets() ...@@ -938,17 +938,45 @@ void MainWindow::connectCommonWidgets()
void MainWindow::createCustomWidget() 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) { if (QGCToolWidget::instances()->size() < 2) {
// This is the first widget // This is the first widget
ui.menuTools->addSeparator(); ui.menuTools->addSeparator();
} }
QDockWidget* dock = new QDockWidget("Unnamed Tool", this);
connect(tool, SIGNAL(destroyed()), dock, SLOT(deleteLater())); connect(tool, SIGNAL(destroyed()), dock, SLOT(deleteLater()));
dock->setWidget(tool); 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); QAction* showAction = new QAction("Show Unnamed Tool", this);
showAction->setCheckable(true); showAction->setCheckable(true);
connect(dock, SIGNAL(visibilityChanged(bool)), showAction, SLOT(setChecked(bool))); connect(dock, SIGNAL(visibilityChanged(bool)), showAction, SLOT(setChecked(bool)));
...@@ -1333,6 +1361,7 @@ void MainWindow::connectCommonActions() ...@@ -1333,6 +1361,7 @@ void MainWindow::connectCommonActions()
// Custom widget actions // Custom widget actions
connect(ui.actionNewCustomWidget, SIGNAL(triggered()), this, SLOT(createCustomWidget())); connect(ui.actionNewCustomWidget, SIGNAL(triggered()), this, SLOT(createCustomWidget()));
connect(ui.actionLoadCustomWidgetFile, SIGNAL(triggered()), this, SLOT(loadCustomWidget()));
// Audio output // Audio output
ui.actionMuteAudioOutput->setChecked(GAudioOutput::instance()->isMuted()); ui.actionMuteAudioOutput->setChecked(GAudioOutput::instance()->isMuted());
......
...@@ -181,6 +181,9 @@ public slots: ...@@ -181,6 +181,9 @@ public slots:
/** @brief Add a custom tool widget */ /** @brief Add a custom tool widget */
void createCustomWidget(); void createCustomWidget();
/** @brief Load a custom tool widget from a file */
void loadCustomWidget();
void closeEvent(QCloseEvent* event); void closeEvent(QCloseEvent* event);
/** @brief Load data view, allowing to plot flight data */ /** @brief Load data view, allowing to plot flight data */
......
...@@ -111,6 +111,7 @@ ...@@ -111,6 +111,7 @@
<string>Widgets</string> <string>Widgets</string>
</property> </property>
<addaction name="actionNewCustomWidget"/> <addaction name="actionNewCustomWidget"/>
<addaction name="actionLoadCustomWidgetFile"/>
</widget> </widget>
<widget class="QMenu" name="menuHelp"> <widget class="QMenu" name="menuHelp">
<property name="title"> <property name="title">
...@@ -456,6 +457,15 @@ ...@@ -456,6 +457,15 @@
<string>Esc</string> <string>Esc</string>
</property> </property>
</action> </action>
<action name="actionLoadCustomWidgetFile">
<property name="icon">
<iconset resource="../../mavground.qrc">
<normaloff>:/images/status/folder-drag-accept.svg</normaloff>:/images/status/folder-drag-accept.svg</iconset>
</property>
<property name="text">
<string>Load Custom Widget File</string>
</property>
</action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<resources> <resources>
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#include <QDockWidget> #include <QDockWidget>
#include <QContextMenuEvent> #include <QContextMenuEvent>
#include <QSettings> #include <QSettings>
#include <QFileDialog>
#include <QDesktopServices>
#include "QGCParamSlider.h" #include "QGCParamSlider.h"
#include "QGCActionButton.h" #include "QGCActionButton.h"
...@@ -61,96 +63,144 @@ QGCToolWidget::~QGCToolWidget() ...@@ -61,96 +63,144 @@ QGCToolWidget::~QGCToolWidget()
* @param parent Object later holding these widgets, usually the main window * @param parent Object later holding these widgets, usually the main window
* @return List of all widgets * @return List of all widgets
*/ */
QList<QGCToolWidget*> QGCToolWidget::createWidgetsFromSettings(QWidget* parent) QList<QGCToolWidget*> QGCToolWidget::createWidgetsFromSettings(QWidget* parent, QString settingsFile)
{ {
// Store list of widgets // Load widgets from application settings
QSettings 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<QGCToolWidget*> newWidgets; QList<QGCToolWidget*> newWidgets;
int size = settings.beginReadArray("QGC_TOOL_WIDGET_NAMES"); int size = settings->beginReadArray("QGC_TOOL_WIDGET_NAMES");
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
settings.setArrayIndex(i); settings->setArrayIndex(i);
QString name = settings.value("TITLE", tr("UNKNOWN WIDGET %1").arg(i)).toString(); QString name = settings->value("TITLE", tr("UNKNOWN WIDGET %1").arg(i)).toString();
if (!instances()->contains(name)) { if (!instances()->contains(name)) {
QGCToolWidget* tool = new QGCToolWidget(name, parent); QGCToolWidget* tool = new QGCToolWidget(name, parent);
instances()->insert(name, tool); instances()->insert(name, tool);
newWidgets.append(tool); newWidgets.append(tool);
} }
else
{
qDebug() << "WIDGET DID ALREADY EXIST, REJECTING";
}
} }
settings.endArray(); settings->endArray();
qDebug() << "NEW WIDGETS: " << newWidgets.size(); qDebug() << "NEW WIDGETS: " << newWidgets.size();
// Load individual widget items // Load individual widget items
for (int i = 0; i < newWidgets.size(); i++) { for (int i = 0; i < newWidgets.size(); i++) {
QString widgetName = newWidgets.at(i)->getTitle(); newWidgets.at(i)->loadSettings(*settings);
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();
} }
delete settings;
return instances()->values(); 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 // Store list of widgets
QSettings settings; QSettings* settings;
settings.beginWriteArray("QGC_TOOL_WIDGET_NAMES"); 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) { for (int i = 0; i < instances()->size(); ++i) {
settings.setArrayIndex(i); settings->setArrayIndex(i);
settings.setValue("TITLE", instances()->values().at(i)->getTitle()); settings->setValue("TITLE", instances()->values().at(i)->getTitle());
} }
settings.endArray(); settings->endArray();
// Store individual widget items // Store individual widget items
for (int i = 0; i < instances()->size(); ++i) { for (int i = 0; i < instances()->size(); ++i) {
QString widgetName = instances()->values().at(i)->getTitle(); instances()->values().at(i)->storeSettings(*settings);
settings.beginGroup(widgetName); }
settings.beginWriteArray("QGC_TOOL_WIDGET_ITEMS"); delete settings;
int k = 0; // QGCToolItem counter }
for (int j = 0; j < instances()->values().at(i)->children().size(); ++j) {
// Store only QGCToolWidgetItems void QGCToolWidget::storeSettings(const QString& settingsFile)
QGCToolWidgetItem* item = dynamic_cast<QGCToolWidgetItem*>(instances()->values().at(i)->children().at(j)); {
if (item) { QSettings settings(settingsFile, QSettings::IniFormat);
settings.setArrayIndex(k++); storeSettings(settings);
// Store the ToolWidgetItem }
item->writeSettings(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<QGCToolWidgetItem*>(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) void QGCToolWidget::addUAS(UASInterface* uas)
...@@ -168,6 +218,7 @@ void QGCToolWidget::contextMenuEvent (QContextMenuEvent* event) ...@@ -168,6 +218,7 @@ void QGCToolWidget::contextMenuEvent (QContextMenuEvent* event)
menu.addAction(addParamAction); menu.addAction(addParamAction);
menu.addAction(addCommandAction); menu.addAction(addCommandAction);
menu.addAction(setTitleAction); menu.addAction(setTitleAction);
menu.addAction(exportAction);
menu.addAction(deleteAction); menu.addAction(deleteAction);
menu.addSeparator(); menu.addSeparator();
menu.addAction(addButtonAction); menu.addAction(addButtonAction);
...@@ -281,12 +332,20 @@ void QGCToolWidget::addToolWidget(QGCToolWidgetItem* widget) ...@@ -281,12 +332,20 @@ void QGCToolWidget::addToolWidget(QGCToolWidgetItem* widget)
void QGCToolWidget::exportWidget() 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() const QString QGCToolWidget::getTitle()
......
...@@ -23,11 +23,13 @@ public: ...@@ -23,11 +23,13 @@ public:
~QGCToolWidget(); ~QGCToolWidget();
/** @brief Factory method to instantiate all tool widgets */ /** @brief Factory method to instantiate all tool widgets */
static QList<QGCToolWidget*> createWidgetsFromSettings(QWidget* parent); static QList<QGCToolWidget*> createWidgetsFromSettings(QWidget* parent, QString settingsFile=QString());
/** @Give the tool widget a reference to its action in the main menu */ /** @Give the tool widget a reference to its action in the main menu */
void setMainMenuAction(QAction* action); void setMainMenuAction(QAction* action);
/** @brief All instances of this class */ /** @brief All instances of this class */
static QMap<QString, QGCToolWidget*>* instances(); static QMap<QString, QGCToolWidget*>* instances();
/** @brief Get title of widget */
const QString getTitle();
int isVisible(int view) { return viewVisible.value(view, false); } int isVisible(int view) { return viewVisible.value(view, false); }
Qt::DockWidgetArea getDockWidgetArea(int view) { return dockWidgetArea.value(view, Qt::BottomDockWidgetArea); } Qt::DockWidgetArea getDockWidgetArea(int view) { return dockWidgetArea.value(view, Qt::BottomDockWidgetArea); }
...@@ -39,9 +41,17 @@ public slots: ...@@ -39,9 +41,17 @@ public slots:
/** @brief Export this widget to a file */ /** @brief Export this widget to a file */
void exportWidget(); void exportWidget();
/** @brief Import settings for this widget from a file */ /** @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 */ /** @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 */ /** @brief Store the view id and dock widget area */
void setViewVisibilityAndDockWidgetArea(int view, bool visible, Qt::DockWidgetArea area); void setViewVisibilityAndDockWidgetArea(int view, bool visible, Qt::DockWidgetArea area);
...@@ -65,7 +75,6 @@ protected: ...@@ -65,7 +75,6 @@ protected:
void contextMenuEvent(QContextMenuEvent* event); void contextMenuEvent(QContextMenuEvent* event);
void createActions(); void createActions();
QList<QGCToolWidgetItem* >* itemList(); QList<QGCToolWidgetItem* >* itemList();
const QString getTitle();
/** @brief Add an existing tool widget */ /** @brief Add an existing tool widget */
void addToolWidget(QGCToolWidgetItem* widget); void addToolWidget(QGCToolWidgetItem* widget);
......
...@@ -449,7 +449,7 @@ void LinechartWidget::startLogging() ...@@ -449,7 +449,7 @@ void LinechartWidget::startLogging()
} }
// Let user select the log file name // 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("./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);;")); QString fileName = QFileDialog::getSaveFileName(this, tr("Specify log file name"), QDesktopServices::storageLocation(QDesktopServices::DesktopLocation), tr("Logfile (*.csv *.txt);;"));
......
...@@ -40,6 +40,7 @@ MAV2DIcon::MAV2DIcon(mapcontrol::MapGraphicItem* map, mapcontrol::OPMapWidget* p ...@@ -40,6 +40,7 @@ MAV2DIcon::MAV2DIcon(mapcontrol::MapGraphicItem* map, mapcontrol::OPMapWidget* p
drawIcon(pen); drawIcon(pen);
} }
size = QSize(radius, radius); size = QSize(radius, radius);
SetUAVPos(internals::PointLatLng(lat, lon), alt);
} }
MAV2DIcon::~MAV2DIcon() MAV2DIcon::~MAV2DIcon()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment