diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index 9e026e6..ec75f53 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #include #include @@ -171,6 +172,7 @@ static ads::CDockWidget* createEditorWidget(QMenu* ViewMenu) ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Editor %1").arg(EditorCount++)); DockWidget->setWidget(w); DockWidget->setIcon(svgIcon(":/adsdemo/images/edit.svg")); + DockWidget->setFeature(ads::CDockWidget::CustomCloseHandling, true); ViewMenu->addAction(DockWidget->toggleViewAction()); return DockWidget; } @@ -475,6 +477,21 @@ void CMainWindow::createEditor() DockWidget->setFeature(ads::CDockWidget::DockWidgetDeleteOnClose, true); auto FloatingWidget = d->DockManager->addDockWidgetFloating(DockWidget); FloatingWidget->move(QPoint(20, 20)); + connect(DockWidget, SIGNAL(closeRequested()), SLOT(onEditorCloseRequested())); +} + + +//============================================================================ +void CMainWindow::onEditorCloseRequested() +{ + auto DockWidget = qobject_cast(sender()); + int Result = QMessageBox::question(this, "Close Editor", QString("Editor %1 " + "contains unsaved changes? Would you like to close it?") + .arg(DockWidget->windowTitle())); + if (QMessageBox::Yes == Result) + { + DockWidget->closeDockWidget(); + } } diff --git a/demo/MainWindow.h b/demo/MainWindow.h index 7af99e3..c7575eb 100644 --- a/demo/MainWindow.h +++ b/demo/MainWindow.h @@ -61,6 +61,7 @@ private slots: void onViewToggled(bool Open); void createEditor(); void createTable(); + void onEditorCloseRequested(); }; #endif // MAINWINDOW_H diff --git a/src/DockAreaTabBar.cpp b/src/DockAreaTabBar.cpp index 3fe74ae..b109bbe 100644 --- a/src/DockAreaTabBar.cpp +++ b/src/DockAreaTabBar.cpp @@ -478,7 +478,14 @@ void CDockAreaTabBar::onCloseOtherTabsRequested() int Offset = Tab->dockWidget()->features().testFlag( CDockWidget::DockWidgetDeleteOnClose) ? 1 : 0; closeTab(i); - i -= Offset; + + // If the the dock widget blocks closing, i.e. if the flag + // CustomCloseHandling is set, and the dock widget is still open, + // then we do not need to correct the index + if (Tab->dockWidget()->isClosed()) + { + i -= Offset; + } } } } @@ -569,7 +576,7 @@ void CDockAreaTabBar::closeTab(int Index) { return; } - Tab->hide(); + //Tab->hide(); emit tabCloseRequested(Index); } diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index 2ec5ff3..ca2f964 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -495,7 +495,7 @@ void CDockAreaWidget::onTabCloseRequested(int Index) if (DockWidget->features().testFlag(CDockWidget::DockWidgetDeleteOnClose)) { //DockWidget->deleteDockWidget(); - DockWidget->closeDockWidget(); + DockWidget->closeDockWidgetInternal(); } else { @@ -758,15 +758,26 @@ CDockWidget* CDockAreaWidget::nextOpenDockWidget(CDockWidget* DockWidget) const //============================================================================ -CDockWidget::DockWidgetFeatures CDockAreaWidget::features() const +CDockWidget::DockWidgetFeatures CDockAreaWidget::features(eBitwiseOperator Mode) const { - CDockWidget::DockWidgetFeatures Features(CDockWidget::AllDockWidgetFeatures); - for (const auto DockWidget : dockWidgets()) + if (BitwiseAnd == Mode) { - Features &= DockWidget->features(); + CDockWidget::DockWidgetFeatures Features(CDockWidget::AllDockWidgetFeatures); + for (const auto DockWidget : dockWidgets()) + { + Features &= DockWidget->features(); + } + return Features; + } + else + { + CDockWidget::DockWidgetFeatures Features(CDockWidget::NoDockWidgetFeatures); + for (const auto DockWidget : dockWidgets()) + { + Features |= DockWidget->features(); + } + return Features; } - - return Features; } @@ -805,7 +816,7 @@ void CDockAreaWidget::closeArea() auto OpenDockWidgets = openedDockWidgets(); if (OpenDockWidgets.count() == 1 && OpenDockWidgets[0]->features().testFlag(CDockWidget::DockWidgetDeleteOnClose)) { - OpenDockWidgets[0]->deleteDockWidget(); + OpenDockWidgets[0]->closeDockWidgetInternal(); } else { diff --git a/src/DockAreaWidget.h b/src/DockAreaWidget.h index d443c84..03688b4 100644 --- a/src/DockAreaWidget.h +++ b/src/DockAreaWidget.h @@ -238,10 +238,10 @@ public: * A bitwise and is used to combine the flags of all dock widgets. That * means, if only one single dock widget does not support a certain flag, * the whole dock are does not support the flag. I.e. if one single - * dock widget in this area is not closabe, the whole dock are is not + * dock widget in this area is not closable, the whole dock are is not * closable. */ - CDockWidget::DockWidgetFeatures features() const; + CDockWidget::DockWidgetFeatures features(eBitwiseOperator Mode = BitwiseAnd) const; /** * Returns the title bar button corresponding to the given title bar diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index e2048e2..b809948 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -1713,10 +1713,24 @@ void CDockContainerWidget::closeOtherAreas(CDockAreaWidget* KeepOpenArea) { for (const auto DockArea : d->DockAreas) { - if (DockArea != KeepOpenArea && DockArea->features().testFlag(CDockWidget::DockWidgetClosable)) + if (DockArea == KeepOpenArea) { - DockArea->closeArea(); + continue; } + + if (!DockArea->features(BitwiseAnd).testFlag(CDockWidget::DockWidgetClosable)) + { + continue; + } + + // We do not close areas with widgets with custom close handling + if (DockArea->features(BitwiseOr).testFlag(CDockWidget::CustomCloseHandling)) + { + std::cout << "CDockWidget::CustomCloseHandling" << std::endl; + continue; + } + + DockArea->closeArea(); } } diff --git a/src/DockWidget.cpp b/src/DockWidget.cpp index 8f0cfd9..28713b8 100644 --- a/src/DockWidget.cpp +++ b/src/DockWidget.cpp @@ -64,7 +64,7 @@ struct DockWidgetPrivate QBoxLayout* Layout = nullptr; QWidget* Widget = nullptr; CDockWidgetTab* TabWidget = nullptr; - CDockWidget::DockWidgetFeatures Features = CDockWidget::AllDockWidgetFeatures; + CDockWidget::DockWidgetFeatures Features = CDockWidget::DefaultDockWidgetFeatures; CDockManager* DockManager = nullptr; CDockAreaWidget* DockArea = nullptr; QAction* ToggleViewAction = nullptr; @@ -744,42 +744,40 @@ void CDockWidget::deleteDockWidget() { dockManager()->removeDockWidget(this); deleteLater(); -} - - -//============================================================================ -bool CDockWidget::handleCloseRequest() -{ - std::cout << "CDockWidget::handleCloseRequest()" << std::endl; - return true; + d->Closed = true; } //============================================================================ void CDockWidget::closeDockWidget() { - closeDockWidgetInternal(); + closeDockWidgetInternal(true); } //============================================================================ -bool CDockWidget::closeDockWidgetInternal() +bool CDockWidget::closeDockWidgetInternal(bool ForceClose) { + if (!ForceClose) + { + emit closeRequested(); + } + + if (!ForceClose && features().testFlag(CDockWidget::CustomCloseHandling)) + { + return false; + } + if (features().testFlag(CDockWidget::DockWidgetDeleteOnClose)) { - if (handleCloseRequest()) - { - deleteDockWidget(); - return true; - } + deleteDockWidget(); } else { toggleView(false); - return true; } - return false; + return true; } diff --git a/src/DockWidget.h b/src/DockWidget.h index b70c733..0f96430 100644 --- a/src/DockWidget.h +++ b/src/DockWidget.h @@ -53,414 +53,421 @@ class CFloatingDockContainer; */ class ADS_EXPORT CDockWidget : public QFrame { - Q_OBJECT + Q_OBJECT private: - DockWidgetPrivate* d; ///< private data (pimpl) - friend struct DockWidgetPrivate; + DockWidgetPrivate* d; ///< private data (pimpl) + friend struct DockWidgetPrivate; private slots: - /** - * Adjusts the toolbar icon sizes according to the floating state - */ - void setToolbarFloatingStyle(bool topLevel); + /** + * Adjusts the toolbar icon sizes according to the floating state + */ + void setToolbarFloatingStyle(bool topLevel); protected: - friend class CDockContainerWidget; - friend class CDockAreaWidget; - friend class CFloatingDockContainer; - friend class CDockManager; - friend struct DockManagerPrivate; - friend class DockContainerWidgetPrivate; - friend class CDockAreaTabBar; - friend class CDockWidgetTab; - friend struct DockWidgetTabPrivate; + friend class CDockContainerWidget; + friend class CDockAreaWidget; + friend class CFloatingDockContainer; + friend class CDockManager; + friend struct DockManagerPrivate; + friend class DockContainerWidgetPrivate; + friend class CDockAreaTabBar; + friend class CDockWidgetTab; + friend struct DockWidgetTabPrivate; - /** - * Assigns the dock manager that manages this dock widget - */ - void setDockManager(CDockManager* DockManager); + /** + * Assigns the dock manager that manages this dock widget + */ + void setDockManager(CDockManager* DockManager); - /** - * If this dock widget is inserted into a dock area, the dock area will - * be registered on this widget via this function. If a dock widget is - * removed from a dock area, this function will be called with nullptr - * value. - */ - void setDockArea(CDockAreaWidget* DockArea); + /** + * If this dock widget is inserted into a dock area, the dock area will + * be registered on this widget via this function. If a dock widget is + * removed from a dock area, this function will be called with nullptr + * value. + */ + void setDockArea(CDockAreaWidget* DockArea); - /** - * This function changes the toggle view action without emitting any - * signal - */ - void setToggleViewActionChecked(bool Checked); + /** + * This function changes the toggle view action without emitting any + * signal + */ + void setToggleViewActionChecked(bool Checked); - /** - * Saves the state into the given stream - */ - void saveState(QXmlStreamWriter& Stream) const; + /** + * Saves the state into the given stream + */ + void saveState(QXmlStreamWriter& Stream) const; - /** - * This is a helper function for the dock manager to flag this widget - * as unassigned. - * When calling the restore function, it may happen, that the saved state - * contains less dock widgets then currently available. All widgets whose - * data is not contained in the saved state, are flagged as unassigned - * after the restore process. If the user shows an unassigned dock widget, - * a floating widget will be created to take up the dock widget. - */ - void flagAsUnassigned(); + /** + * This is a helper function for the dock manager to flag this widget + * as unassigned. + * When calling the restore function, it may happen, that the saved state + * contains less dock widgets then currently available. All widgets whose + * data is not contained in the saved state, are flagged as unassigned + * after the restore process. If the user shows an unassigned dock widget, + * a floating widget will be created to take up the dock widget. + */ + void flagAsUnassigned(); - /** - * Call this function to emit a topLevelChanged() signal and to update - * the dock area tool bar visibility - */ - static void emitTopLevelEventForWidget(CDockWidget* TopLevelDockWidget, bool Floating); + /** + * Call this function to emit a topLevelChanged() signal and to update + * the dock area tool bar visibility + */ + static void emitTopLevelEventForWidget(CDockWidget* TopLevelDockWidget, bool Floating); - /** - * Use this function to emit a top level changed event. - * Do never use emit topLevelChanged(). Always use this function because - * it only emits a signal if the floating state has really changed - */ - void emitTopLevelChanged(bool Floating); + /** + * Use this function to emit a top level changed event. + * Do never use emit topLevelChanged(). Always use this function because + * it only emits a signal if the floating state has really changed + */ + void emitTopLevelChanged(bool Floating); - /** - * Internal function for modifying the closed state when restoring - * a saved docking state - */ - void setClosedState(bool Closed); + /** + * Internal function for modifying the closed state when restoring + * a saved docking state + */ + void setClosedState(bool Closed); - /** - * Internal toggle view function that does not check if the widget - * already is in the given state - */ - void toggleViewInternal(bool Open); + /** + * Internal toggle view function that does not check if the widget + * already is in the given state + */ + void toggleViewInternal(bool Open); - /** - * Internal close dock widget implementation. - * The function returns true if the dock widget has been closed or hidden - */ - bool closeDockWidgetInternal(); + /** + * Internal close dock widget implementation. + * The function returns true if the dock widget has been closed or hidden + */ + bool closeDockWidgetInternal(bool ForceClose = false); public: - using Super = QFrame; + using Super = QFrame; - enum DockWidgetFeature - { - DockWidgetClosable = 0x01, - DockWidgetMovable = 0x02,///< this feature is not properly implemented yet and is ignored - DockWidgetFloatable = 0x04, - DockWidgetDeleteOnClose = 0x08, ///< deletes the dock widget when it is closed - AllDockWidgetFeatures = DockWidgetClosable | DockWidgetMovable | DockWidgetFloatable, - NoDockWidgetFeatures = 0x00 - }; - Q_DECLARE_FLAGS(DockWidgetFeatures, DockWidgetFeature) + enum DockWidgetFeature + { + DockWidgetClosable = 0x01, + DockWidgetMovable = 0x02,///< this feature is not properly implemented yet and is ignored + DockWidgetFloatable = 0x04, + DockWidgetDeleteOnClose = 0x08, ///< deletes the dock widget when it is closed + CustomCloseHandling = 0x10, + DefaultDockWidgetFeatures = DockWidgetClosable | DockWidgetMovable | DockWidgetFloatable, + AllDockWidgetFeatures = DefaultDockWidgetFeatures | DockWidgetDeleteOnClose | CustomCloseHandling, + NoDockWidgetFeatures = 0x00 + }; + Q_DECLARE_FLAGS(DockWidgetFeatures, DockWidgetFeature) - enum eState - { - StateHidden, - StateDocked, - StateFloating - }; + enum eState + { + StateHidden, + StateDocked, + StateFloating + }; - /** - * Sets the widget for the dock widget to widget. - * The InsertMode defines how the widget is inserted into the dock widget. - * The content of a dock widget should be resizable do a very small size to - * prevent the dock widget from blocking the resizing. To ensure, that a - * dock widget can be resized very well, it is better to insert the content+ - * widget into a scroll area or to provide a widget that is already a scroll - * area or that contains a scroll area. - * If the InsertMode is AutoScrollArea, the DockWidget tries to automatically - * detect how to insert the given widget. If the widget is derived from - * QScrollArea (i.e. an QAbstractItemView), then the widget is inserted - * directly. If the given widget is not a scroll area, the widget will be - * inserted into a scroll area. - * To force insertion into a scroll area, you can also provide the InsertMode - * ForceScrollArea. To prevent insertion into a scroll area, you can - * provide the InsertMode ForceNoScrollArea - */ - enum eInsertMode - { - AutoScrollArea, - ForceScrollArea, - ForceNoScrollArea - }; + /** + * Sets the widget for the dock widget to widget. + * The InsertMode defines how the widget is inserted into the dock widget. + * The content of a dock widget should be resizable do a very small size to + * prevent the dock widget from blocking the resizing. To ensure, that a + * dock widget can be resized very well, it is better to insert the content+ + * widget into a scroll area or to provide a widget that is already a scroll + * area or that contains a scroll area. + * If the InsertMode is AutoScrollArea, the DockWidget tries to automatically + * detect how to insert the given widget. If the widget is derived from + * QScrollArea (i.e. an QAbstractItemView), then the widget is inserted + * directly. If the given widget is not a scroll area, the widget will be + * inserted into a scroll area. + * To force insertion into a scroll area, you can also provide the InsertMode + * ForceScrollArea. To prevent insertion into a scroll area, you can + * provide the InsertMode ForceNoScrollArea + */ + enum eInsertMode + { + AutoScrollArea, + ForceScrollArea, + ForceNoScrollArea + }; - /** - * This mode configures the behavior of the toggle view action. - * If the mode if ActionModeToggle, then the toggle view action is - * a checkable action to show / hide the dock widget. If the mode - * is ActionModeShow, then the action is not checkable an it will - * always show the dock widget if clicked. If the mode is ActionModeShow, - * the user can only close the DockWidget with the close button. - */ - enum eToggleViewActionMode - { - ActionModeToggle,//!< ActionModeToggle - ActionModeShow //!< ActionModeShow - }; + /** + * This mode configures the behavior of the toggle view action. + * If the mode if ActionModeToggle, then the toggle view action is + * a checkable action to show / hide the dock widget. If the mode + * is ActionModeShow, then the action is not checkable an it will + * always show the dock widget if clicked. If the mode is ActionModeShow, + * the user can only close the DockWidget with the close button. + */ + enum eToggleViewActionMode + { + ActionModeToggle,//!< ActionModeToggle + ActionModeShow //!< ActionModeShow + }; - /** - * This constructor creates a dock widget with the given title. - * The title is the text that is shown in the window title when the dock - * widget is floating and it is the title that is shown in the titlebar - * or the tab of this dock widget if it is tabified. - * The object name of the dock widget is also set to the title. The - * object name is required by the dock manager to properly save and restore - * the state of the dock widget. That means, the title needs to be unique. - * If your title is not unique or if you would like to change the title - * during runtime, you need to set a unique object name explicitely - * by calling setObjectName() after construction. - * Use the layoutFlags to configure the layout of the dock widget. - */ - CDockWidget(const QString &title, QWidget* parent = 0); + /** + * This constructor creates a dock widget with the given title. + * The title is the text that is shown in the window title when the dock + * widget is floating and it is the title that is shown in the titlebar + * or the tab of this dock widget if it is tabified. + * The object name of the dock widget is also set to the title. The + * object name is required by the dock manager to properly save and restore + * the state of the dock widget. That means, the title needs to be unique. + * If your title is not unique or if you would like to change the title + * during runtime, you need to set a unique object name explicitely + * by calling setObjectName() after construction. + * Use the layoutFlags to configure the layout of the dock widget. + */ + CDockWidget(const QString &title, QWidget* parent = 0); - /** - * Virtual Destructor - */ - virtual ~CDockWidget(); + /** + * Virtual Destructor + */ + virtual ~CDockWidget(); - /** - * We return a fixed minimum size hint for all dock widgets - */ - virtual QSize minimumSizeHint() const override; + /** + * We return a fixed minimum size hint for all dock widgets + */ + virtual QSize minimumSizeHint() const override; - /** - * Sets the widget for the dock widget to widget. - * The InsertMode defines how the widget is inserted into the dock widget. - * The content of a dock widget should be resizable do a very small size to - * prevent the dock widget from blocking the resizing. To ensure, that a - * dock widget can be resized very well, it is better to insert the content+ - * widget into a scroll area or to provide a widget that is already a scroll - * area or that contains a scroll area. - * If the InsertMode is AutoScrollArea, the DockWidget tries to automatically - * detect how to insert the given widget. If the widget is derived from - * QScrollArea (i.e. an QAbstractItemView), then the widget is inserted - * directly. If the given widget is not a scroll area, the widget will be - * inserted into a scroll area. - * To force insertion into a scroll area, you can also provide the InsertMode - * ForceScrollArea. To prevent insertion into a scroll area, you can - * provide the InsertMode ForceNoScrollArea - */ - void setWidget(QWidget* widget, eInsertMode InsertMode = AutoScrollArea); + /** + * Sets the widget for the dock widget to widget. + * The InsertMode defines how the widget is inserted into the dock widget. + * The content of a dock widget should be resizable do a very small size to + * prevent the dock widget from blocking the resizing. To ensure, that a + * dock widget can be resized very well, it is better to insert the content+ + * widget into a scroll area or to provide a widget that is already a scroll + * area or that contains a scroll area. + * If the InsertMode is AutoScrollArea, the DockWidget tries to automatically + * detect how to insert the given widget. If the widget is derived from + * QScrollArea (i.e. an QAbstractItemView), then the widget is inserted + * directly. If the given widget is not a scroll area, the widget will be + * inserted into a scroll area. + * To force insertion into a scroll area, you can also provide the InsertMode + * ForceScrollArea. To prevent insertion into a scroll area, you can + * provide the InsertMode ForceNoScrollArea + */ + void setWidget(QWidget* widget, eInsertMode InsertMode = AutoScrollArea); - /** - * Remove the widget from the dock and give ownership back to the caller - */ - QWidget* takeWidget(); + /** + * Remove the widget from the dock and give ownership back to the caller + */ + QWidget* takeWidget(); - /** - * Returns the widget for the dock widget. This function returns zero if - * the widget has not been set. - */ - QWidget* widget() const; + /** + * Returns the widget for the dock widget. This function returns zero if + * the widget has not been set. + */ + QWidget* widget() const; - /** - * Returns the tab widget of this dock widget that is shown in the dock - * area title bar - */ - CDockWidgetTab* tabWidget() const; + /** + * Returns the tab widget of this dock widget that is shown in the dock + * area title bar + */ + CDockWidgetTab* tabWidget() const; - /** - * Sets, whether the dock widget is movable, closable, and floatable. - */ - void setFeatures(DockWidgetFeatures features); + /** + * Sets, whether the dock widget is movable, closable, and floatable. + */ + void setFeatures(DockWidgetFeatures features); - /** - * Sets the feature flag for this dock widget if on is true; otherwise - * clears the flag. - */ - void setFeature(DockWidgetFeature flag, bool on); + /** + * Sets the feature flag for this dock widget if on is true; otherwise + * clears the flag. + */ + void setFeature(DockWidgetFeature flag, bool on); - /** - * This property holds whether the dock widget is movable, closable, and - * floatable. - * By default, this property is set to a combination of DockWidgetClosable, - * DockWidgetMovable and DockWidgetFloatable. - */ - DockWidgetFeatures features() const; + /** + * This property holds whether the dock widget is movable, closable, and + * floatable. + * By default, this property is set to a combination of DockWidgetClosable, + * DockWidgetMovable and DockWidgetFloatable. + */ + DockWidgetFeatures features() const; - /** - * Returns the dock manager that manages the dock widget or 0 if the widget - * has not been assigned to any dock manager yet - */ - CDockManager* dockManager() const; + /** + * Returns the dock manager that manages the dock widget or 0 if the widget + * has not been assigned to any dock manager yet + */ + CDockManager* dockManager() const; - /** - * Returns the dock container widget this dock area widget belongs to or 0 - * if this dock widget has not been docked yet - */ - CDockContainerWidget* dockContainer() const; + /** + * Returns the dock container widget this dock area widget belongs to or 0 + * if this dock widget has not been docked yet + */ + CDockContainerWidget* dockContainer() const; - /** - * Returns the dock area widget this dock widget belongs to or 0 - * if this dock widget has not been docked yet - */ - CDockAreaWidget* dockAreaWidget() const; + /** + * Returns the dock area widget this dock widget belongs to or 0 + * if this dock widget has not been docked yet + */ + CDockAreaWidget* dockAreaWidget() const; - /** - * This property holds whether the dock widget is floating. - * A dock widget is only floating, if it is the one and only widget inside - * of a floating container. If there are more than one dock widget in a - * floating container, the all dock widgets are docked and not floating. - */ - bool isFloating() const; + /** + * This property holds whether the dock widget is floating. + * A dock widget is only floating, if it is the one and only widget inside + * of a floating container. If there are more than one dock widget in a + * floating container, the all dock widgets are docked and not floating. + */ + bool isFloating() const; - /** - * This function returns true, if this dock widget is in a floating. - * The function returns true, if the dock widget is floating and it also - * returns true if it is docked inside of a floating container. - */ - bool isInFloatingContainer() const; + /** + * This function returns true, if this dock widget is in a floating. + * The function returns true, if the dock widget is floating and it also + * returns true if it is docked inside of a floating container. + */ + bool isInFloatingContainer() const; - /** - * Returns true, if this dock widget is closed. - */ - bool isClosed() const; + /** + * Returns true, if this dock widget is closed. + */ + bool isClosed() const; - /** - * Returns a checkable action that can be used to show or close this dock widget. - * The action's text is set to the dock widget's window title. - */ - QAction* toggleViewAction() const; + /** + * Returns a checkable action that can be used to show or close this dock widget. + * The action's text is set to the dock widget's window title. + */ + QAction* toggleViewAction() const; - /** - * Configures the behavior of the toggle view action. - * \see eToggleViewActionMode for a detailed description - */ - void setToggleViewActionMode(eToggleViewActionMode Mode); + /** + * Configures the behavior of the toggle view action. + * \see eToggleViewActionMode for a detailed description + */ + void setToggleViewActionMode(eToggleViewActionMode Mode); - /** - * Sets the dock widget icon that is shown in tabs and in toggle view - * actions - */ - void setIcon(const QIcon& Icon); + /** + * Sets the dock widget icon that is shown in tabs and in toggle view + * actions + */ + void setIcon(const QIcon& Icon); - /** - * Returns the icon that has been assigned to the dock widget - */ - QIcon icon() const; + /** + * Returns the icon that has been assigned to the dock widget + */ + QIcon icon() const; - /** - * If the WithToolBar layout flag is enabled, then this function returns - * the dock widget toolbar. If the flag is disabled, the function returns - * a nullptr. - * This function returns the dock widget top tool bar. - * If no toolbar is assigned, this function returns nullptr. To get a vaild - * toolbar you either need to create a default empty toolbar via - * createDefaultToolBar() function or you need to assign you custom - * toolbar via setToolBar(). - */ - QToolBar* toolBar() const; + /** + * If the WithToolBar layout flag is enabled, then this function returns + * the dock widget toolbar. If the flag is disabled, the function returns + * a nullptr. + * This function returns the dock widget top tool bar. + * If no toolbar is assigned, this function returns nullptr. To get a vaild + * toolbar you either need to create a default empty toolbar via + * createDefaultToolBar() function or you need to assign you custom + * toolbar via setToolBar(). + */ + QToolBar* toolBar() const; - /** - * If you would like to use the default top tool bar, then call this - * function to create the default tool bar. - * After this function the toolBar() function will return a valid toolBar() - * object. - */ - QToolBar* createDefaultToolBar(); + /** + * If you would like to use the default top tool bar, then call this + * function to create the default tool bar. + * After this function the toolBar() function will return a valid toolBar() + * object. + */ + QToolBar* createDefaultToolBar(); - /** - * Assign a new tool bar that is shown above the content widget. - * The dock widget will become the owner of the tool bar and deletes it - * on destruction - */ - void setToolBar(QToolBar* ToolBar); + /** + * Assign a new tool bar that is shown above the content widget. + * The dock widget will become the owner of the tool bar and deletes it + * on destruction + */ + void setToolBar(QToolBar* ToolBar); - /** - * This function sets the tool button style for the given dock widget state. - * It is possible to switch the tool button style depending on the state. - * If a dock widget is floating, then here are more space and it is - * possible to select a style that requires more space like - * Qt::ToolButtonTextUnderIcon. For the docked state Qt::ToolButtonIconOnly - * might be better. - */ - void setToolBarStyle(Qt::ToolButtonStyle Style, eState State); + /** + * This function sets the tool button style for the given dock widget state. + * It is possible to switch the tool button style depending on the state. + * If a dock widget is floating, then here are more space and it is + * possible to select a style that requires more space like + * Qt::ToolButtonTextUnderIcon. For the docked state Qt::ToolButtonIconOnly + * might be better. + */ + void setToolBarStyle(Qt::ToolButtonStyle Style, eState State); - /** - * Returns the tool button style for the given docking state. - * \see setToolBarStyle() - */ - Qt::ToolButtonStyle toolBarStyle(eState State) const; + /** + * Returns the tool button style for the given docking state. + * \see setToolBarStyle() + */ + Qt::ToolButtonStyle toolBarStyle(eState State) const; - /** - * This function sets the tool button icon size for the given state. - * If a dock widget is floating, there is more space an increasing the - * icon size is possible. For docked widgets, small icon sizes, eg. 16 x 16 - * might be better. - */ - void setToolBarIconSize(const QSize& IconSize, eState State); + /** + * This function sets the tool button icon size for the given state. + * If a dock widget is floating, there is more space an increasing the + * icon size is possible. For docked widgets, small icon sizes, eg. 16 x 16 + * might be better. + */ + void setToolBarIconSize(const QSize& IconSize, eState State); - /** - * Returns the icon size for a given docking state. - * \see setToolBarIconSize() - */ - QSize toolBarIconSize(eState State) const; + /** + * Returns the icon size for a given docking state. + * \see setToolBarIconSize() + */ + QSize toolBarIconSize(eState State) const; #ifndef QT_NO_TOOLTIP - /** - * This is function sets text tooltip for title bar widget - * and tooltip for toggle view action - */ - void setTabToolTip(const QString &text); + /** + * This is function sets text tooltip for title bar widget + * and tooltip for toggle view action + */ + void setTabToolTip(const QString &text); #endif public: // reimplements QFrame ----------------------------------------------- - /** - * Emits titleChanged signal if title change event occurs - */ - virtual bool event(QEvent *e) override; + /** + * Emits titleChanged signal if title change event occurs + */ + virtual bool event(QEvent *e) override; public slots: - /** - * This property controls whether the dock widget is open or closed. - * The toogleViewAction triggers this slot - */ - void toggleView(bool Open = true); + /** + * This property controls whether the dock widget is open or closed. + * The toogleViewAction triggers this slot + */ + void toggleView(bool Open = true); - /** - * This function will make a docked widget floating - */ - void setFloating(); + /** + * This function will make a docked widget floating + */ + void setFloating(); - /** - * This function will delete the dock widget and its content from the - * docking system - */ - void deleteDockWidget(); + /** + * This function will delete the dock widget and its content from the + * docking system + */ + void deleteDockWidget(); - /** - * Closes the dock widget - */ - void closeDockWidget(); + /** + * Closes the dock widget + */ + void closeDockWidget(); signals: - /** - * This signal is emitted if the dock widget is opened or closed - */ - void viewToggled(bool Open); + /** + * This signal is emitted if the dock widget is opened or closed + */ + void viewToggled(bool Open); - /** - * This signal is emitted if the dock widget is closed - */ - void closed(); + /** + * This signal is emitted if the dock widget is closed + */ + void closed(); - /** - * This signal is emitted if the window title of this dock widget - * changed - */ - void titleChanged(const QString& Title); + /** + * This signal is emitted if the window title of this dock widget + * changed + */ + void titleChanged(const QString& Title); - /** - * This signal is emitted when the floating property changes. - * The topLevel parameter is true if the dock widget is now floating; - * otherwise it is false. - */ - void topLevelChanged(bool topLevel); + /** + * This signal is emitted when the floating property changes. + * The topLevel parameter is true if the dock widget is now floating; + * otherwise it is false. + */ + void topLevelChanged(bool topLevel); + + /** + * This signal is emitted, if close is requested + */ + void closeRequested(); }; // class DockWidget } // namespace ads diff --git a/src/FloatingDockContainer.cpp b/src/FloatingDockContainer.cpp index 5454fd4..91e8568 100644 --- a/src/FloatingDockContainer.cpp +++ b/src/FloatingDockContainer.cpp @@ -28,6 +28,8 @@ //============================================================================ #include "FloatingDockContainer.h" +#include + #include #include #include @@ -358,8 +360,15 @@ void CFloatingDockContainer::closeEvent(QCloseEvent *event) auto TopLevelDockWidget = topLevelDockWidget(); if (TopLevelDockWidget && TopLevelDockWidget->features().testFlag(CDockWidget::DockWidgetDeleteOnClose)) { - TopLevelDockWidget->deleteDockWidget(); - this->deleteLater(); + if (TopLevelDockWidget->closeDockWidgetInternal()) + { + this->deleteLater(); + } + else + { + event->ignore(); + return; + } } // In Qt version after 5.9.2 there seems to be a bug that causes the diff --git a/src/ads_globals.h b/src/ads_globals.h index 043a07d..f8c48c0 100644 --- a/src/ads_globals.h +++ b/src/ads_globals.h @@ -117,6 +117,15 @@ enum eIcon IconCount, //!< just a delimiter for range checks }; +/** + * For bitwise combination of dock wdget features + */ +enum eBitwiseOperator +{ + BitwiseAnd, + BitwiseOr +}; + namespace internal { static const bool RestoreTesting = true;