From 07d11cac2f027be90659cdf877a3994f69424206 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Mon, 30 Aug 2021 15:38:55 +0200 Subject: [PATCH] UI: Add a way to close the unclosable widget docks on view destruction --- src/UI/AbstractDocumentView.cc | 11 +++++++++-- src/UI/AbstractDocumentView.hh | 6 ++++-- src/UI/UnclosableDockWidget.cc | 11 ++++++++++- src/UI/UnclosableDockWidget.hh | 4 ++++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/UI/AbstractDocumentView.cc b/src/UI/AbstractDocumentView.cc index e7ab9b7c..4de94c3f 100644 --- a/src/UI/AbstractDocumentView.cc +++ b/src/UI/AbstractDocumentView.cc @@ -19,6 +19,10 @@ AbstractDocumentView::AbstractDocumentView(AbstractDocumentView::Type type, void AbstractDocumentView::deleteAllContent() noexcept { + // Allow to close all dock widgets + for (UnclosableDockWidget *const dock : dockWidgets) + dock->allowClose(); + // Delete all widgets if (layout() != nullptr) { QLayoutItem *item; @@ -45,7 +49,7 @@ AbstractDocumentView::getType() const noexcept } void -AbstractDocumentView::delDockWidget(QDockWidget **dock) noexcept +AbstractDocumentView::delDockWidget(UnclosableDockWidget **dock) noexcept { // Remove the toggle view action QAction *act = (*dock)->toggleViewAction(); @@ -53,6 +57,7 @@ AbstractDocumentView::delDockWidget(QDockWidget **dock) noexcept viewsActions.removeAll(act); // Remove the widget + (*dock)->allowClose(); removeDockWidget(*dock); delete *dock; *dock = nullptr; @@ -61,7 +66,7 @@ AbstractDocumentView::delDockWidget(QDockWidget **dock) noexcept emit viewActionsChanged(); } void -AbstractDocumentView::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dock, +AbstractDocumentView::addDockWidget(Qt::DockWidgetArea area, UnclosableDockWidget *dock, Qt::Orientation orientation) noexcept { // dock->setTitleBarWidget(new QWidget(dock)); // <- to disable the header bar @@ -69,6 +74,8 @@ AbstractDocumentView::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dock, QAction *act = dock->toggleViewAction(); if (!viewsActions.contains(act)) viewsActions.prepend(act); + if (!dockWidgets.contains(dock)) + dockWidgets.append(dock); emit viewActionsChanged(); } diff --git a/src/UI/AbstractDocumentView.hh b/src/UI/AbstractDocumentView.hh index d1e097ee..8f5473a8 100644 --- a/src/UI/AbstractDocumentView.hh +++ b/src/UI/AbstractDocumentView.hh @@ -6,6 +6,7 @@ #include "../Lib/Utils.hh" #include "../Lib/AbstractDocument.hh" +#include "UnclosableDockWidget.hh" namespace Vivy { @@ -45,11 +46,12 @@ signals: protected: void deleteAllContent() noexcept; - void delDockWidget(QDockWidget **) noexcept; - void addDockWidget(Qt::DockWidgetArea, QDockWidget *, Qt::Orientation) noexcept; + void delDockWidget(UnclosableDockWidget **) noexcept; + void addDockWidget(Qt::DockWidgetArea, UnclosableDockWidget *, Qt::Orientation) noexcept; QList<QAction *> viewsActions{}; private: const Type documentType; + QVector<UnclosableDockWidget *> dockWidgets{}; }; } diff --git a/src/UI/UnclosableDockWidget.cc b/src/UI/UnclosableDockWidget.cc index 504fb790..0b7fb6be 100644 --- a/src/UI/UnclosableDockWidget.cc +++ b/src/UI/UnclosableDockWidget.cc @@ -12,5 +12,14 @@ UnclosableDockWidget::UnclosableDockWidget(const QString &name, QWidget *parent) void UnclosableDockWidget::closeEvent(QCloseEvent *event) noexcept { - event->ignore(); + if (allowedToClose) + event->accept(); + else + event->ignore(); +} + +void +UnclosableDockWidget::allowClose() noexcept +{ + allowedToClose = true; } diff --git a/src/UI/UnclosableDockWidget.hh b/src/UI/UnclosableDockWidget.hh index 2e13bcaa..99b4a37b 100644 --- a/src/UI/UnclosableDockWidget.hh +++ b/src/UI/UnclosableDockWidget.hh @@ -10,8 +10,12 @@ class UnclosableDockWidget final : public QDockWidget { public: explicit UnclosableDockWidget(const QString &, QWidget *parent) noexcept; + void allowClose() noexcept; protected: void closeEvent(QCloseEvent *event) noexcept override; + +private: + bool allowedToClose{ false }; }; } -- GitLab