From 1cc6abee445d2a52f755012751e633b7c0bd1461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Sat, 27 Apr 2019 11:46:29 +0200 Subject: [PATCH] Delete Extra Widgets on Close (#1490) --- src/core/MainWindow.cpp | 9 +++++---- src/core/MainWindow.h | 2 +- src/widgets/CutterDockWidget.cpp | 3 +++ src/widgets/CutterDockWidget.h | 8 ++++++++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/core/MainWindow.cpp b/src/core/MainWindow.cpp index da622b1c..8c7c1e4f 100644 --- a/src/core/MainWindow.cpp +++ b/src/core/MainWindow.cpp @@ -315,24 +315,25 @@ void MainWindow::updateTasksIndicator() void MainWindow::on_actionExtraGraph_triggered() { - QDockWidget *extraDock = new GraphWidget(this, 0); + auto *extraDock = new GraphWidget(this, nullptr); addExtraWidget(extraDock); } void MainWindow::on_actionExtraHexdump_triggered() { - QDockWidget *extraDock = new HexdumpWidget(this, 0); + auto *extraDock = new HexdumpWidget(this, nullptr); addExtraWidget(extraDock); } void MainWindow::on_actionExtraDisassembly_triggered() { - QDockWidget *extraDock = new DisassemblyWidget(this, 0); + auto *extraDock = new DisassemblyWidget(this, nullptr); addExtraWidget(extraDock); } -void MainWindow::addExtraWidget(QDockWidget *extraDock) +void MainWindow::addExtraWidget(CutterDockWidget *extraDock) { + extraDock->setTransient(true); addDockWidget(Qt::TopDockWidgetArea, extraDock); auto restoreExtraDock = qhelpers::forceWidth(extraDock->widget(), 600); qApp->processEvents(); diff --git a/src/core/MainWindow.h b/src/core/MainWindow.h index ef77d134..6bcc0d84 100644 --- a/src/core/MainWindow.h +++ b/src/core/MainWindow.h @@ -96,7 +96,7 @@ public: void addToDockWidgetList(QDockWidget *dockWidget); void addDockWidgetAction(QDockWidget *dockWidget, QAction *action); - void addExtraWidget(QDockWidget *extraDock); + void addExtraWidget(CutterDockWidget *extraDock); void addPluginDockWidget(QDockWidget *dockWidget, QAction *action); enum class MenuType { File, Edit, View, Windows, Debug, Help, Plugins }; diff --git a/src/widgets/CutterDockWidget.cpp b/src/widgets/CutterDockWidget.cpp index be9d9334..8bf37e06 100644 --- a/src/widgets/CutterDockWidget.cpp +++ b/src/widgets/CutterDockWidget.cpp @@ -68,6 +68,9 @@ void CutterDockWidget::closeEvent(QCloseEvent *event) this->action->setChecked(false); } QDockWidget::closeEvent(event); + if (isTransient) { + deleteLater(); + } } QAction *CutterDockWidget::getBoundAction() const diff --git a/src/widgets/CutterDockWidget.h b/src/widgets/CutterDockWidget.h index 7096e49c..8793a4c2 100644 --- a/src/widgets/CutterDockWidget.h +++ b/src/widgets/CutterDockWidget.h @@ -17,6 +17,12 @@ public: bool eventFilter(QObject *object, QEvent *event) override; bool isVisibleToUser() { return isVisibleToUserCurrent; } + /** + * @brief Set whether the Widget should be deleted after it is closed. + * This is especially important for extra widgets. + */ + void setTransient(bool v) { isTransient = v; } + /** * @brief Convenience method for creating and registering a RefreshDeferrer without any parameters * @param refreshNowFunc lambda taking no parameters, called when a refresh should occur @@ -64,6 +70,8 @@ protected: private: QAction *action; + bool isTransient = false; + bool isVisibleToUserCurrent = false; void updateIsVisibleToUser(); };