From 661b9aeb996770623d456db73533e67ad1edfaea Mon Sep 17 00:00:00 2001 From: John Tapsell Date: Sun, 13 Oct 2013 17:47:44 +0100 Subject: [PATCH] Fix changing the dock window title when not in advanced mode --- qgroundcontrol.pro | 6 ++-- src/ui/MainWindow.cc | 4 ++- src/ui/designer/QGCToolWidget.cc | 57 ++++++-------------------------- src/ui/dockwidgeteventfilter.cpp | 21 ++++++++++++ src/ui/dockwidgeteventfilter.h | 16 +++++++++ 5 files changed, 55 insertions(+), 49 deletions(-) create mode 100644 src/ui/dockwidgeteventfilter.cpp create mode 100644 src/ui/dockwidgeteventfilter.h diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 3fb4c0281..fcf375d39 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -506,7 +506,8 @@ HEADERS += src/MG.h \ src/ui/px4_configuration/QGCPX4AirframeConfig.h \ src/ui/QGCBaseParamWidget.h \ src/ui/px4_configuration/QGCPX4MulticopterConfig.h \ - src/ui/px4_configuration/QGCPX4SensorCalibration.h + src/ui/px4_configuration/QGCPX4SensorCalibration.h \ + src/ui/dockwidgeteventfilter.h # Google Earth is only supported on Mac OS and Windows with Visual Studio Compiler macx|macx-g++|macx-g++42|win32-msvc2008|win32-msvc2010|win32-msvc2012::HEADERS += src/ui/map3D/QGCGoogleEarthView.h @@ -728,7 +729,8 @@ SOURCES += src/main.cc \ src/ui/px4_configuration/QGCPX4AirframeConfig.cc \ src/ui/QGCBaseParamWidget.cc \ src/ui/px4_configuration/QGCPX4MulticopterConfig.cc \ - src/ui/px4_configuration/QGCPX4SensorCalibration.cc + src/ui/px4_configuration/QGCPX4SensorCalibration.cc \ + src/ui/dockwidgeteventfilter.cpp # Enable Google Earth only on Mac OS and Windows with Visual Studio compiler macx|macx-g++|macx-g++42|win32-msvc2008|win32-msvc2010|win32-msvc2012::SOURCES += src/ui/map3D/QGCGoogleEarthView.cc diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 0f4da285e..454c44d9d 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -40,6 +40,7 @@ This file is part of the QGROUNDCONTROL project #include #include #include "dockwidgettitlebareventfilter.h" +#include "dockwidgeteventfilter.h" #include "QGC.h" #include "MAVLinkSimulationLink.h" #include "SerialLink.h" @@ -895,7 +896,8 @@ void MainWindow::setDockWidgetTitleBar(QDockWidget* widget) { QLabel* label = new QLabel(this); label->setText(widget->windowTitle()); - label->installEventFilter(new DockWidgetTitleBarEventFilter()); + label->installEventFilter(new DockWidgetTitleBarEventFilter()); //Ignore mouse clicks + widget->installEventFilter(new DockWidgetEventFilter()); //Update label if window title changes widget->setTitleBarWidget(label); } // And if nothing should be shown, use an empty widget. diff --git a/src/ui/designer/QGCToolWidget.cc b/src/ui/designer/QGCToolWidget.cc index df998b891..bbd140d5a 100644 --- a/src/ui/designer/QGCToolWidget.cc +++ b/src/ui/designer/QGCToolWidget.cc @@ -33,26 +33,12 @@ QGCToolWidget::QGCToolWidget(const QString& title, QWidget *parent, QSettings* s } //qDebug() << "WidgetTitle" << widgetTitle; - setObjectName(widgetTitle); createActions(); toolLayout = ui->toolLayout; toolLayout->setAlignment(Qt::AlignTop); toolLayout->setSpacing(8); - QDockWidget* dock = dynamic_cast(this->parentWidget()); - if (dock) { - dock->setWindowTitle(widgetTitle); - dock->setObjectName(widgetTitle+"DOCK"); - } - - // Try with parent - dock = dynamic_cast(parent); - if (dock) { - dock->setWindowTitle(widgetTitle); - dock->setObjectName(widgetTitle+"DOCK"); - } - - this->setWindowTitle(widgetTitle); + this->setTitle(widgetTitle); QList systems = UASManager::instance()->getUASList(); foreach (UASInterface* uas, systems) { @@ -63,7 +49,6 @@ QGCToolWidget::QGCToolWidget(const QString& title, QWidget *parent, QSettings* s } } connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(addUAS(UASInterface*))); - if (!instances()->contains(widgetTitle)) instances()->insert(widgetTitle, this); // Enforce storage if this not loaded from settings // is MUST NOT BE SAVED if it was loaded from settings! @@ -80,13 +65,7 @@ QGCToolWidget::~QGCToolWidget() void QGCToolWidget::setParent(QWidget *parent) { QWidget::setParent(parent); - // Try with parent - QDockWidget* dock = dynamic_cast(parent); - if (dock) - { - dock->setWindowTitle(getTitle()); - dock->setObjectName(getTitle()+"DOCK"); - } + setTitle(getTitle()); //Update titles } /** @@ -654,34 +633,20 @@ void QGCToolWidget::setTitle() } } -void QGCToolWidget::setWindowTitle(const QString& title) +void QGCToolWidget::setTitle(const QString& title) { - // Sets title and calls setWindowTitle on QWidget - widgetTitle = title; - QWidget::setWindowTitle(title); -} - -void QGCToolWidget::setTitle(QString title) -{ - // Remove references to old title - /*QSettings settings; - settings.beginGroup(widgetTitle); - settings.remove(""); - settings.endGroup(); - settings.sync();*/ - if (instances()->contains(widgetTitle)) instances()->remove(widgetTitle); + if (!instances()->contains(title)) instances()->insert(title, this); - // Switch to new title + // Sets title and calls setWindowTitle on QWidget widgetTitle = title; - - if (!instances()->contains(title)) instances()->insert(title, this); QWidget::setWindowTitle(title); - QDockWidget* parent = dynamic_cast(this->parentWidget()); - if (parent) parent->setWindowTitle(title); - // Store all widgets - //storeWidgetsToSettings(); - + setObjectName(widgetTitle); + QDockWidget* dock = dynamic_cast(this->parentWidget()); + if (dock) { + dock->setWindowTitle(widgetTitle); + dock->setObjectName(widgetTitle+"DOCK"); + } emit titleChanged(title); if (mainMenuAction) mainMenuAction->setText(title); } diff --git a/src/ui/dockwidgeteventfilter.cpp b/src/ui/dockwidgeteventfilter.cpp new file mode 100644 index 000000000..260e3a546 --- /dev/null +++ b/src/ui/dockwidgeteventfilter.cpp @@ -0,0 +1,21 @@ +#include +#include +#include + +#include "dockwidgeteventfilter.h" + +DockWidgetEventFilter::DockWidgetEventFilter(QObject *parent) : QObject(parent) {} + +bool DockWidgetEventFilter::eventFilter(QObject *object,QEvent *event) +{ + if (event->type() == QEvent::WindowTitleChange) + { + QDockWidget *dock = dynamic_cast(object); + if(dock) { + QLabel *label = dynamic_cast(dock->titleBarWidget()); + if(label) + label->setText(dock->windowTitle()); + } + } + return QObject::eventFilter(object,event); +} diff --git a/src/ui/dockwidgeteventfilter.h b/src/ui/dockwidgeteventfilter.h new file mode 100644 index 000000000..60de1e400 --- /dev/null +++ b/src/ui/dockwidgeteventfilter.h @@ -0,0 +1,16 @@ +#ifndef DOCKWIDGETEVENTFILTER_H +#define DOCKWIDGETEVENTFILTER_H + +#include + +/** Event filter to update a QLabel titleBarWidget if the window's title changes */ +class DockWidgetEventFilter : public QObject +{ + Q_OBJECT +public: + DockWidgetEventFilter(QObject *parent = 0); +protected: + virtual bool eventFilter(QObject *object,QEvent *event) override; +}; + +#endif // DOCKWIDGETEVENTFILTER_H -- 2.22.0