diff --git a/src/UI/AbstractDocumentView.cc b/src/UI/AbstractDocumentView.cc index e7ab9b7cfcb2ce4da4c698b324f75c7b08cf5b09..4de94c3ff1db74d25b361a9602cb260a5f96be1f 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 d1e097eebadf4f72cab4dd3d8b8b7cd3694e2f7a..8f5473a895a9258dd00186f37214e820bf525b52 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 504fb790be0ec2834ef951fd5000c453fa632dd1..0b7fb6bec74aa2a0b56192e24db60d475ea8dd03 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 2e13bcaa077e73a51c7f05952a616b6833ba3251..99b4a37befc687681536dd3de72acc15772429b8 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 }; }; }