From 73436f42c061306f42decaf4157890a0f07e1a4c Mon Sep 17 00:00:00 2001 From: pixhawk Date: Sun, 12 Dec 2010 15:35:10 +0100 Subject: [PATCH] Enabled selection of individual widgets in menu, persistence pending --- qgroundcontrol.pri | 4 +- src/QGC.h | 3 + src/ui/HUD.cc | 13 ++ src/ui/HUD.h | 2 + src/ui/MainWindow.cc | 185 +++++++++++++--------------- src/ui/MainWindow.h | 5 +- src/ui/XMLCommProtocolWidget.cc | 7 +- src/ui/linechart/LinechartWidget.cc | 10 +- src/ui/linechart/LinechartWidget.h | 2 + 9 files changed, 124 insertions(+), 107 deletions(-) diff --git a/qgroundcontrol.pri b/qgroundcontrol.pri index 08e2358f8..de49b3d6a 100644 --- a/qgroundcontrol.pri +++ b/qgroundcontrol.pri @@ -133,11 +133,13 @@ macx { exists(/opt/local/include/libfreenect) { - message("Building support for libfreenect") + message("ENABLED support for libfreenect") DEPENDENCIES_PRESENT += libfreenect # Include libfreenect libraries LIBS += -lfreenect DEFINES += QGC_LIBFREENECT_ENABLED + } else { + message("DISABLED libfreenect support") } # osg/osgEarth dynamic casts might fail without this compiler option. diff --git a/src/QGC.h b/src/QGC.h index 1ea849a23..4751cdda4 100644 --- a/src/QGC.h +++ b/src/QGC.h @@ -14,6 +14,9 @@ namespace QGC /** @brief Get the current ground time in microseconds */ quint64 groundTimeUsecs(); + + const QString APPNAME = "QGROUNDCONTROL"; + const QString COMPANYNAME = "OPENMAV"; } #endif // QGC_H diff --git a/src/ui/HUD.cc b/src/ui/HUD.cc index 872f2b965..c95107ea1 100644 --- a/src/ui/HUD.cc +++ b/src/ui/HUD.cc @@ -165,6 +165,19 @@ HUD::~HUD() } +void HUD::showEvent(QShowEvent* event) +{ + Q_UNUSED(event); + if (isVisible()) + { + refreshTimer->start(); + } + else + { + refreshTimer->stop(); + } +} + void HUD::start() { refreshTimer->start(); diff --git a/src/ui/HUD.h b/src/ui/HUD.h index 9255ac788..658054de3 100644 --- a/src/ui/HUD.h +++ b/src/ui/HUD.h @@ -123,6 +123,8 @@ protected: float refLineWidthToPen(float line); /** @brief Rotate a polygon around a point clockwise */ void rotatePolygonClockWiseRad(QPolygonF& p, float angle, QPointF origin); + /** @brief Override base class show */ + virtual void showEvent(QShowEvent* event); QImage* image; ///< Double buffer image QImage glImage; ///< The background / camera image diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index b655244bd..ff2c9a499 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -83,9 +83,13 @@ MainWindow::MainWindow(QWidget *parent) : adjustSize(); // Set menu - QMenu* widgetMenu = createPopupMenu(); + QMenu* widgetMenu = createDockWidgetMenu(); widgetMenu->setTitle("Widgets"); ui.menuBar->addMenu(widgetMenu); +// QMenu* centerMenu = createCenterWidgetMenu(); +// centerMenu->setTitle("Center"); +// ui.menuBar->addMenu(centerMenu); + this->show(); } MainWindow::~MainWindow() @@ -94,6 +98,46 @@ MainWindow::~MainWindow() statusBar = NULL; } +QMenu* MainWindow::createCenterWidgetMenu() +{ + QMenu* menu = NULL; + QStackedWidget* centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + if (centerStack->count() > 0) + { + menu = new QMenu(this); + for (int i = 0; i < centerStack->count(); ++i) + { + //menu->addAction(centerStack->widget(i)->actions()) + } + } + } + return menu; +} + +QMenu* MainWindow::createDockWidgetMenu() +{ + QMenu *menu = 0; +#ifndef QT_NO_DOCKWIDGET + QList dockwidgets = qFindChildren(this); + if (dockwidgets.size()) + { + menu = new QMenu(this); + for (int i = 0; i < dockwidgets.size(); ++i) + { + QDockWidget *dockWidget = dockwidgets.at(i); + if (dockWidget->parentWidget() == this) + { + menu->addAction(dockwidgets.at(i)->toggleViewAction()); + } + } + menu->addSeparator(); + } +#endif + return menu; +} + //QList* MainWindow::getMainWidgets() //{ @@ -174,59 +218,86 @@ void MainWindow::buildWidgets() // Dock widgets controlDockWidget = new QDockWidget(tr("Control"), this); controlDockWidget->setWidget( new UASControlWidget(this) ); + addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); + controlDockWidget->hide(); + + infoDockWidget = new QDockWidget(tr("Status Details"), this); + infoDockWidget->setWidget( new UASInfoWidget(this) ); + addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); + //infoDockWidget->hide(); listDockWidget = new QDockWidget(tr("Unmanned Systems"), this); listDockWidget->setWidget( new UASListWidget(this) ); + addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); + listDockWidget->hide(); waypointsDockWidget = new QDockWidget(tr("Waypoint List"), this); waypointsDockWidget->setWidget( new WaypointList(this, NULL) ); - - infoDockWidget = new QDockWidget(tr("Status Details"), this); - infoDockWidget->setWidget( new UASInfoWidget(this) ); + addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); + waypointsDockWidget->hide(); detectionDockWidget = new QDockWidget(tr("Object Recognition"), this); detectionDockWidget->setWidget( new ObjectDetectionView("images/patterns", this) ); + addDockWidget(Qt::RightDockWidgetArea, detectionDockWidget); + detectionDockWidget->hide(); debugConsoleDockWidget = new QDockWidget(tr("Communication Console"), this); debugConsoleDockWidget->setWidget( new DebugConsole(this) ); + addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget); parametersDockWidget = new QDockWidget(tr("Onboard Parameters"), this); parametersDockWidget->setWidget( new ParameterInterface(this) ); + addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); watchdogControlDockWidget = new QDockWidget(tr("Process Control"), this); watchdogControlDockWidget->setWidget( new WatchdogControl(this) ); + addDockWidget(Qt::RightDockWidgetArea, watchdogControlDockWidget); + watchdogControlDockWidget->hide(); hsiDockWidget = new QDockWidget(tr("Horizontal Situation Indicator"), this); hsiDockWidget->setWidget( new HSIDisplay(this) ); + addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget); - headDown1DockWidget = new QDockWidget(tr("Primary Flight Display"), this); + headDown1DockWidget = new QDockWidget(tr("System Stats"), this); headDown1DockWidget->setWidget( new HDDisplay(acceptList, this) ); + addDockWidget(Qt::RightDockWidgetArea, headDown1DockWidget); headDown2DockWidget = new QDockWidget(tr("Payload Status"), this); headDown2DockWidget->setWidget( new HDDisplay(acceptList2, this) ); + addDockWidget(Qt::RightDockWidgetArea, headDown2DockWidget); rcViewDockWidget = new QDockWidget(tr("Radio Control"), this); rcViewDockWidget->setWidget( new QGCRemoteControlView(this) ); + addDockWidget(Qt::BottomDockWidgetArea, rcViewDockWidget); + rcViewDockWidget->hide(); headUpDockWidget = new QDockWidget(tr("Control Indicator"), this); headUpDockWidget->setWidget( new HUD(320, 240, this)); + this->addDockWidget(Qt::LeftDockWidgetArea, headUpDockWidget); - // Dialogue widgets - //FIXME: free memory in destructor - joystick = new JoystickInput(); - + // SLUGS slugsDataWidget = new QDockWidget(tr("Slugs Data"), this); slugsDataWidget->setWidget( new SlugsDataSensorView(this)); + addDockWidget(Qt::LeftDockWidgetArea, slugsDataWidget); + slugsDataWidget->hide(); - slugsPIDControlWidget = new QDockWidget(tr("PID Control"), this); + slugsPIDControlWidget = new QDockWidget(tr("Slugs PID Control"), this); slugsPIDControlWidget->setWidget(new SlugsPIDControl(this)); + addDockWidget(Qt::BottomDockWidgetArea, slugsPIDControlWidget); + slugsPIDControlWidget->hide(); slugsHilSimWidget = new QDockWidget(tr("Slugs Hil Sim"), this); slugsHilSimWidget->setWidget( new SlugsHilSim(this)); + addDockWidget(Qt::BottomDockWidgetArea, slugsHilSimWidget); + slugsHilSimWidget->hide(); - slugsCamControlWidget = new QDockWidget(tr("Video Camera Control"), this); + slugsCamControlWidget = new QDockWidget(tr("Slugs Video Camera Control"), this); slugsCamControlWidget->setWidget(new SlugsVideoCamControl(this)); + addDockWidget(Qt::BottomDockWidgetArea, slugsCamControlWidget); + slugsCamControlWidget->hide(); + //FIXME: free memory in destructor + joystick = new JoystickInput(); } /** @@ -332,16 +403,6 @@ void MainWindow::configureWindowName() #endif } -void MainWindow::createCenterWidgetMenu() -{ - -} - -void MainWindow::createDockWidgetMenu() -{ - -} - QStatusBar* MainWindow::createStatusBar() { QStatusBar* bar = new QStatusBar(); @@ -693,7 +754,8 @@ void MainWindow::clearView() if (dockWidget) { // Remove dock widget from main window - this->removeDockWidget(dockWidget); + //this->removeDockWidget(dockWidget); + dockWidget->setVisible(false); // Deletion of dockWidget would also delete all child // widgets of dockWidget // Is there a way to unset a widget from QDockWidget? @@ -766,7 +828,6 @@ void MainWindow::loadSlugsView() addDockWidget(Qt::LeftDockWidgetArea, slugsHilSimWidget); slugsHilSimWidget->show(); } - this->show(); } void MainWindow::loadPixhawkView() @@ -840,8 +901,6 @@ void MainWindow::loadPixhawkView() addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); parametersDockWidget->show(); } - - this->show(); } void MainWindow::loadDataView() @@ -910,8 +969,6 @@ void MainWindow::loadPilotView() hdd->start(); } } - - this->show(); } void MainWindow::loadOperatorView() @@ -981,8 +1038,6 @@ void MainWindow::loadOperatorView() addDockWidget(Qt::RightDockWidgetArea, watchdogControlDockWidget); watchdogControlDockWidget->show(); } - - this->show(); } void MainWindow::loadGlobalOperatorView() @@ -1026,64 +1081,6 @@ void MainWindow::loadGlobalOperatorView() addDockWidget(Qt::BottomDockWidgetArea, slugsCamControlWidget); slugsCamControlWidget->show(); } - - - -// // UAS CONTROL -// if (controlDockWidget) -// { -// addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); -// controlDockWidget->show(); -// } - -// // UAS LIST -// if (listDockWidget) -// { -// addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); -// listDockWidget->show(); -// } - -// // UAS STATUS -// if (infoDockWidget) -// { -// addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); -// infoDockWidget->show(); -// } - - -// // HORIZONTAL SITUATION INDICATOR -// if (hsiDockWidget) -// { -// HSIDisplay* hsi = dynamic_cast( hsiDockWidget->widget() ); -// if (hsi) -// { -// addDockWidget(Qt::BottomDockWidgetArea, hsiDockWidget); -// hsiDockWidget->show(); -// hsi->start(); -// } -// } - - // PROCESS CONTROL -// if (watchdogControlDockWidget) -// { -// addDockWidget(Qt::RightDockWidgetArea, watchdogControlDockWidget); -// watchdogControlDockWidget->show(); -// } - - // HEAD UP DISPLAY -// if (headUpDockWidget) -// { -// addDockWidget(Qt::RightDockWidgetArea, headUpDockWidget); -// // FIXME Replace with default ->show() call -// HUD* hud = dynamic_cast(headUpDockWidget->widget()); - -// if (hud) -// { -// headUpDockWidget->show(); -// hud->start(); -// } -// } - } void MainWindow::load3DMapView() @@ -1135,7 +1132,6 @@ void MainWindow::load3DMapView() } } #endif - this->show(); } void MainWindow::loadGoogleEarthView() @@ -1185,7 +1181,6 @@ void MainWindow::loadGoogleEarthView() hsiDockWidget->show(); } } - this->show(); #endif } @@ -1240,8 +1235,6 @@ void MainWindow::load3DView() } } #endif - this->show(); - } void MainWindow::loadEngineerView() @@ -1308,8 +1301,6 @@ void MainWindow::loadEngineerView() addDockWidget(Qt::BottomDockWidgetArea, rcViewDockWidget); rcViewDockWidget->show(); } - - this->show(); } void MainWindow::loadMAVLinkView() @@ -1324,8 +1315,6 @@ void MainWindow::loadMAVLinkView() centerStack->setCurrentWidget(protocolWidget); } } - - this->show(); } void MainWindow::loadAllView() @@ -1413,13 +1402,9 @@ void MainWindow::loadAllView() addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); parametersDockWidget->show(); } - - this->show(); } void MainWindow::loadWidgets() { - //loadOperatorView(); - loadEngineerView(); - //loadPilotView(); + //loadEngineerView(); } diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 475da821d..47a799515 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -160,8 +160,8 @@ protected: void arrangeCenterStack(); void configureWindowName(); - void createCenterWidgetMenu(); - void createDockWidgetMenu(); + QMenu* createCenterWidgetMenu(); + QMenu* createDockWidgetMenu(); // TODO Should be moved elsewhere, as the protocol does not belong to the UI MAVLinkProtocol* mavlink; @@ -203,6 +203,7 @@ protected: QPointer headUpDockWidget; QPointer hsiDockWidget; QPointer rcViewDockWidget; + QPointer hudDockWidget; QPointer slugsDataWidget; QPointer slugsPIDControlWidget; QPointer slugsHilSimWidget; diff --git a/src/ui/XMLCommProtocolWidget.cc b/src/ui/XMLCommProtocolWidget.cc index 582c74ac6..d472828bf 100644 --- a/src/ui/XMLCommProtocolWidget.cc +++ b/src/ui/XMLCommProtocolWidget.cc @@ -7,6 +7,7 @@ #include "ui_XMLCommProtocolWidget.h" #include "MAVLinkXMLParser.h" #include "MAVLinkSyntaxHighlighter.h" +#include "QGC.h" #include #include @@ -31,7 +32,7 @@ XMLCommProtocolWidget::XMLCommProtocolWidget(QWidget *parent) : void XMLCommProtocolWidget::selectXMLFile() { //QString fileName = QFileDialog::getOpenFileName(this, tr("Load Protocol Definition File"), ".", "*.xml"); - QSettings settings; + QSettings settings(QGC::COMPANYNAME, QGC::APPNAME); const QString mavlinkXML = "MAVLINK_XML_FILE"; QString dirPath = settings.value(mavlinkXML, QCoreApplication::applicationDirPath() + "../").toString(); QFileDialog dialog; @@ -92,7 +93,7 @@ void XMLCommProtocolWidget::setXML(const QString& xml) void XMLCommProtocolWidget::selectOutputDirectory() { - QSettings settings; + QSettings settings(QGC::COMPANYNAME, QGC::APPNAME); const QString mavlinkOutputDir = "MAVLINK_OUTPUT_DIR"; QString dirPath = settings.value(mavlinkOutputDir, QCoreApplication::applicationDirPath() + "../").toString(); QFileDialog dialog; @@ -110,7 +111,7 @@ void XMLCommProtocolWidget::selectOutputDirectory() { m_ui->outputDirNameLabel->setText(fileNames.first()); // Store directory for next time - settings.setValue(mavlinkOutputDir, fileNames.first()); + settings.setValue(mavlinkOutputDir, QFileInfo(fileNames.first()).absoluteFilePath()); //QFile file(fileName); } } diff --git a/src/ui/linechart/LinechartWidget.cc b/src/ui/linechart/LinechartWidget.cc index d3b17b279..03153e9ac 100644 --- a/src/ui/linechart/LinechartWidget.cc +++ b/src/ui/linechart/LinechartWidget.cc @@ -159,7 +159,9 @@ void LinechartWidget::createLayout() QToolButton* timeButton = new QToolButton(this); timeButton->setText(tr("Ground Time")); timeButton->setCheckable(true); - timeButton->setChecked(false); + bool gTimeDefault = true; + if (activePlot) activePlot->enforceGroundTime(gTimeDefault); + timeButton->setChecked(gTimeDefault); layout->addWidget(timeButton, 1, 4); layout->setColumnStretch(4, 0); connect(timeButton, SIGNAL(clicked(bool)), activePlot, SLOT(enforceGroundTime(bool))); @@ -442,6 +444,12 @@ void LinechartWidget::removeCurve(QString curve) // Remove name } +void LinechartWidget::showEvent(QShowEvent* event) +{ + Q_UNUSED(event); + setActive(isVisible()); +} + void LinechartWidget::setActive(bool active) { if (activePlot) diff --git a/src/ui/linechart/LinechartWidget.h b/src/ui/linechart/LinechartWidget.h index 26644f755..850b0aaa9 100644 --- a/src/ui/linechart/LinechartWidget.h +++ b/src/ui/linechart/LinechartWidget.h @@ -77,6 +77,8 @@ public slots: void setPlotWindowPosition(int scrollBarValue); void setPlotWindowPosition(quint64 position); void setPlotInterval(quint64 interval); + /** @brief Override base class show */ + virtual void showEvent(QShowEvent* event); void setActive(bool active); /** @brief Set the number of values to average over */ void setAverageWindow(int windowSize); -- 2.22.0