From 5edbcc1970bc8858ad09a41f4c3ac1700e489c8b Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Thu, 25 Jul 2024 08:42:30 +0200 Subject: [PATCH 01/24] Fixed issue #654 - Wheel event on DockAreaTabBar --- src/DockAreaTabBar.cpp | 9 +++++++++ src/DockAreaWidget.cpp | 1 - src/DockWidgetTab.cpp | 7 +++++++ src/DockWidgetTab.h | 6 ++++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/DockAreaTabBar.cpp b/src/DockAreaTabBar.cpp index 81307d0..cf1cb09 100644 --- a/src/DockAreaTabBar.cpp +++ b/src/DockAreaTabBar.cpp @@ -473,6 +473,15 @@ bool CDockAreaTabBar::eventFilter(QObject *watched, QEvent *event) updateGeometry(); break; + // Manage wheel event + case QEvent::Wheel: + // Ignore wheel events if tab is currently dragged + if (Tab->dragState() == DraggingInactive) + { + wheelEvent((QWheelEvent* )event); + } + break; + default: break; } diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index aa6d16d..b3828d3 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -34,7 +34,6 @@ #include #include -#include #include #include #include diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 962de17..654c000 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -789,6 +789,13 @@ bool CDockWidgetTab::event(QEvent *e) } +//============================================================================ +eDragState CDockWidgetTab::dragState() const +{ + return d->DragState; +} + + //============================================================================ void CDockWidgetTab::onDockWidgetFeaturesChanged() { diff --git a/src/DockWidgetTab.h b/src/DockWidgetTab.h index 0b5ba71..973a1ad 100644 --- a/src/DockWidgetTab.h +++ b/src/DockWidgetTab.h @@ -178,6 +178,12 @@ public: */ void setIconSize(const QSize& Size); + /** + * Returns the current drag state of this tab. + * Use this function to determine if the tab is currently being dragged + */ + eDragState dragState() const; + public Q_SLOTS: virtual void setVisible(bool visible) override; From 952131a1e9730636e0ee87e99fcc8bdb259f6451 Mon Sep 17 00:00:00 2001 From: gavininfinity <160417585+gavininfinity@users.noreply.github.com> Date: Mon, 19 Aug 2024 01:37:51 -0400 Subject: [PATCH 02/24] Make startDragging public (#658) --- src/FloatingDockContainer.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/FloatingDockContainer.h b/src/FloatingDockContainer.h index 7e6faec..2dd9d49 100644 --- a/src/FloatingDockContainer.h +++ b/src/FloatingDockContainer.h @@ -131,15 +131,6 @@ protected: virtual void startFloating(const QPoint& DragStartMousePos, const QSize& Size, eDragState DragState, QWidget* MouseEventHandler) override; - /** - * Call this function to start dragging the floating widget - */ - void startDragging(const QPoint& DragStartMousePos, const QSize& Size, - QWidget* MouseEventHandler) - { - startFloating(DragStartMousePos, Size, DraggingFloatingWidget, MouseEventHandler); - } - /** * Call this function if you explicitly want to signal that dragging has * finished @@ -149,7 +140,7 @@ protected: /** * This function deletes all dock widgets in it. * This functions should be called only from dock manager in its - * destructor before deleting the floating widget + * destructor before deleting the floating widget */ void deleteContent(); @@ -236,6 +227,15 @@ public: */ CDockContainerWidget* dockContainer() const; + /** + * Call this function to start dragging the floating widget + */ + void startDragging(const QPoint& DragStartMousePos, const QSize& Size, + QWidget* MouseEventHandler) + { + startFloating(DragStartMousePos, Size, DraggingFloatingWidget, MouseEventHandler); + } + /** * This function returns true, if it can be closed. * It can be closed, if all dock widgets in all dock areas can be closed From 6ff39bccf82486d4bc85c4dcfb04bc2b092a4a8e Mon Sep 17 00:00:00 2001 From: TheBoje <47856523+TheBoje@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:17:42 +0200 Subject: [PATCH 03/24] Add open auto-hide dock on hover from drag and drop (#663) --- doc/cfg_flag_AutoHideOpenOnDragHover.gif | Bin 0 -> 275277 bytes doc/user-guide.md | 32 +- src/AutoHideDockContainer.cpp | 815 +++++++++++------------ src/AutoHideDockContainer.h | 245 +++---- src/AutoHideTab.cpp | 39 +- src/AutoHideTab.h | 5 +- src/DockManager.h | 1 + 7 files changed, 585 insertions(+), 552 deletions(-) create mode 100644 doc/cfg_flag_AutoHideOpenOnDragHover.gif diff --git a/doc/cfg_flag_AutoHideOpenOnDragHover.gif b/doc/cfg_flag_AutoHideOpenOnDragHover.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b62e26ce56d8cfcc772128809c9c22c995fcd56 GIT binary patch literal 275277 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%0A#ZHo#2C_KNH#bkrl{NE-cs$Cv!$+8m@wd=``I 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

  • S%wU614!M8HfgapxqbK*H#92c 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 mAy?6c^NjOuJYw%(Ag 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

    |k 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%0A#GN_KBrPSzCgw>Cd8;DJrTM(5+HxiOjyp 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

    QjU*%|>s8*pH15T*iruf>%t+ z8!J3d%Pkp%b9nY$NK;sTxYdY>|dTa=XsT_xI;d;=^JKIBJpW;k+xm6!4$r>``)S| zyyG?@{F3WOAI)dgd||3{>CojD&sBUo-cFFw5TRk^#sy9{O5FwSB!Kj+eP0cA95srC z#)yj~&LKJ)h20UnV_xWiX)({fMkAKe&uh}9Zt?XFjO7?6$C7Hs9c9rSvwdrG;2ks( z^$k+Qr%XWjUUDrjx{q?)l*6E-l81_91;tJUULoOwJy|@Z8zWGkE8YDx3Z1~F#j-@} z@6BJ?3CKQ#UKxLB`TJq`hIUxsfg+FiHEmz}Ezbq5*%up*c2)?)X!}aNXYOihqECIY zcgK1Y=YbvDZ%zyY*@XM9Hi!K#JqGXkO}-zqU3aGuN0KzL>c#cn$T3H$i0tFXKkijt z^YK_q{4#gDpf4yjO!K}zaaeqtRaBY literal 0 HcmV?d00001 diff --git a/doc/user-guide.md b/doc/user-guide.md index e59bae6..4edf7a6 100644 --- a/doc/user-guide.md +++ b/doc/user-guide.md @@ -49,6 +49,7 @@ - [`AutoHideCloseButtonCollapsesDock`](#autohideclosebuttoncollapsesdock) - [`AutoHideHasCloseButton`](#autohidehasclosebutton) - [`AutoHideHasMinimizeButton`](#autohidehasminimizebutton) + - [`AutoHideOpenOnDragHover`](#autohideopenondraghover) - [DockWidget Feature Flags](#dockwidget-feature-flags) - [`DockWidgetClosable`](#dockwidgetclosable) - [`DockWidgetMovable`](#dockwidgetmovable) @@ -150,7 +151,7 @@ This ie enabled by default to minimize the size of the saved data. ### `TabCloseButtonIsToolButton` -If enabled the tab close buttons will be `QToolButtons` instead of `QPushButtons` - +If enabled the tab close buttons will be `QToolButtons` instead of `QPushButtons` - disabled by default. Normally the default configuration should be ok but if your application requires `QToolButtons` instead of `QPushButtons` for styling reasons or for any other reasons, then you can enable this flag. @@ -181,7 +182,7 @@ constant, that means, if enabled, the tabs need more space. ### `DragPreviewIsDynamic` -If non-opaque undocking is enabled, this flag defines the behavior of the drag +If non-opaque undocking is enabled, this flag defines the behavior of the drag preview window. If this flag is enabled, then it will give the user the impression, that the floating drag preview is dynamically adjusted to the drop area. In order to give the perfect impression, you should disable the flags @@ -197,7 +198,7 @@ CDockManager::setConfigFlag(CDockManager::DragPreviewHasWindowFrame, false); ### `DragPreviewShowsContentPixmap` -If non-opaque undocking is enabled, the created drag preview window shows a +If non-opaque undocking is enabled, the created drag preview window shows a copy of the content of the dock widget / dock are that is dragged, if this flag is enabled (default). @@ -210,7 +211,7 @@ like window without any content. ### `DragPreviewHasWindowFrame` -If non-opaque undocking is enabled, then this flag configures if the drag +If non-opaque undocking is enabled, then this flag configures if the drag preview is frameless (default) or looks like a real window. If it is enabled, then the drag preview is a transparent window with a system window frame. @@ -378,7 +379,7 @@ ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar If you have a content widget that does not support focussing for some reason (like `QVTKOpenGLStereoWidget` from the [VTK library](https://github.com/Kitware/VTK)), -then you can manually switch the focus by reacting on mouse events. The +then you can manually switch the focus by reacting on mouse events. The following code shows, how to install en event filter on the `QVTKOpenGLStereoWidget` to properly switch the focus on `QEvent::MouseButtonPress`: @@ -422,7 +423,7 @@ bool CMainWindow::eventFilter(QObject *watched, QEvent *event) ### `EqualSplitOnInsertion` This flag configures how the space is distributed if a new dock widget is -inserted into an existing dock area. The flag is disabled by default. If 3 +inserted into an existing dock area. The flag is disabled by default. If 3 dock widgets are inserted with the following code ```c++ @@ -433,7 +434,7 @@ then this is the result, if the flag is disabled: ![EqualSplitOnInsertion false](cfg_flag_EqualSplitOnInsertion_false.png) -If the flag is enabled, then the space is equally distributed to all widgets +If the flag is enabled, then the space is equally distributed to all widgets in a splitter: ![EqualSplitOnInsertion true](cfg_flag_EqualSplitOnInsertion_true.png) @@ -501,7 +502,7 @@ for active tabs. Inactive tabs only show their icon: The Advanced Docking System supports "Auto-Hide" functionality for **all** dock containers. The "Auto Hide" feature allows to display more information -using less screen space by hiding or showing windows pinned to one of the +using less screen space by hiding or showing windows pinned to one of the four dock container borders. Enabling this feature adds a button with a pin icon to each dock area. @@ -563,7 +564,7 @@ That means, you can drag them to a different border or sidebar: ### Auto-Hide Tab Sorting -You can drag Auto-Hide tabs to a new position in the current sidebar +You can drag Auto-Hide tabs to a new position in the current sidebar to sort them: ![Auo-Hide sort tabs](AutoHide_Sort_Tabs.gif) @@ -632,7 +633,7 @@ the other Auto-Hide flags will be evaluated. ### `DockAreaHasAutoHideButton` -If this flag is set (default), then each dock area has a pin button in the title +If this flag is set (default), then each dock area has a pin button in the title bar to toggle Auto-Hide state. ![DockAreaHasAutoHideButton true](cfg_flag_DockAreaHasAutoHideButton.png) @@ -676,7 +677,7 @@ works if this feature is enabled. Some users don't understand the distinction between closing an auto hide dock and collapsing an auto hide dock. This may lead to situations where they press the close button (losing the side tab widget) instead of simply clicking outside -the auto hide dock (collapsing the dock). +the auto hide dock (collapsing the dock). ![AutoHideCloseButtonCollapsesDock false](cfg_flag_AutoHideCloseButtonCollapsesDock_false.gif) @@ -704,6 +705,15 @@ If this flag is set (disabled by default), then each auto hide widget has a mini ![AutoHideHasMinimizeButton](cfg_flag_AutoHideHasMinimizeButton.png) + +### `AutoHideOpenOnDragHover` + +If this flag is set (disabled by default), then holding a dragging cursor hover an auto-hide collapsed dock's tab will open said dock: + +![AutoHideOpenOnDragHover](cfg_flag_AutoHideOpenOnDragHover.gif) + +Said dock must be set to accept drops to hide when cursor leaves its scope. + ## DockWidget Feature Flags ### `DockWidgetClosable` diff --git a/src/AutoHideDockContainer.cpp b/src/AutoHideDockContainer.cpp index 44af9e2..6a2f59b 100644 --- a/src/AutoHideDockContainer.cpp +++ b/src/AutoHideDockContainer.cpp @@ -16,7 +16,6 @@ ** License along with this library; If not, see . ******************************************************************************/ - //============================================================================ /// \file AutoHideDockContainer.cpp /// \author Syarif Fakhri @@ -29,24 +28,24 @@ //============================================================================ #include "AutoHideDockContainer.h" -#include -#include -#include -#include -#include #include +#include #include - -#include "DockManager.h" -#include "DockAreaWidget.h" -#include "ResizeHandle.h" -#include "DockComponentsFactory.h" -#include "AutoHideSideBar.h" -#include "AutoHideTab.h" - +#include +#include +#include +#include #include +#include "AutoHideSideBar.h" +#include "AutoHideTab.h" +#include "DockAreaWidget.h" +#include "DockComponentsFactory.h" +#include "DockManager.h" +#include "ResizeHandle.h" +#include "ads_globals.h" + namespace ads { static const int ResizeMargin = 30; @@ -54,453 +53,439 @@ static const int ResizeMargin = 30; //============================================================================ bool static isHorizontalArea(SideBarLocation Area) { - switch (Area) - { - case SideBarLocation::SideBarTop: - case SideBarLocation::SideBarBottom: return true; - case SideBarLocation::SideBarLeft: - case SideBarLocation::SideBarRight: return false; - default: - return true; - } + switch (Area) + { + case SideBarLocation::SideBarTop: + case SideBarLocation::SideBarBottom: return true; + case SideBarLocation::SideBarLeft: + case SideBarLocation::SideBarRight: return false; + default: return true; + } - return true; + return true; } - //============================================================================ Qt::Edge static edgeFromSideTabBarArea(SideBarLocation Area) { - switch (Area) - { - case SideBarLocation::SideBarTop: return Qt::BottomEdge; - case SideBarLocation::SideBarBottom: return Qt::TopEdge; - case SideBarLocation::SideBarLeft: return Qt::RightEdge; - case SideBarLocation::SideBarRight: return Qt::LeftEdge; - default: - return Qt::LeftEdge; - } + switch (Area) + { + case SideBarLocation::SideBarTop: return Qt::BottomEdge; + case SideBarLocation::SideBarBottom: return Qt::TopEdge; + case SideBarLocation::SideBarLeft: return Qt::RightEdge; + case SideBarLocation::SideBarRight: return Qt::LeftEdge; + default: return Qt::LeftEdge; + } - return Qt::LeftEdge; + return Qt::LeftEdge; } - //============================================================================ int resizeHandleLayoutPosition(SideBarLocation Area) { - switch (Area) - { - case SideBarLocation::SideBarBottom: - case SideBarLocation::SideBarRight: return 0; + switch (Area) + { + case SideBarLocation::SideBarBottom: + case SideBarLocation::SideBarRight: return 0; - case SideBarLocation::SideBarTop: - case SideBarLocation::SideBarLeft: return 1; + case SideBarLocation::SideBarTop: + case SideBarLocation::SideBarLeft: return 1; - default: - return 0; - } + default: return 0; + } - return 0; + return 0; } - /** * Private data of CAutoHideDockContainer - pimpl */ struct AutoHideDockContainerPrivate { CAutoHideDockContainer* _this; - CDockAreaWidget* DockArea{nullptr}; - CDockWidget* DockWidget{nullptr}; - SideBarLocation SideTabBarArea = SideBarNone; - QBoxLayout* Layout = nullptr; - CResizeHandle* ResizeHandle = nullptr; - QSize Size; // creates invalid size - QPointer SideTab; - QSize SizeCache; + CDockAreaWidget* DockArea{nullptr}; + CDockWidget* DockWidget{nullptr}; + SideBarLocation SideTabBarArea = SideBarNone; + QBoxLayout* Layout = nullptr; + CResizeHandle* ResizeHandle = nullptr; + QSize Size; // creates invalid size + QPointer SideTab; + QSize SizeCache; - /** - * Private data constructor - */ - AutoHideDockContainerPrivate(CAutoHideDockContainer *_public); + /** + * Private data constructor + */ + AutoHideDockContainerPrivate(CAutoHideDockContainer* _public); - /** - * Convenience function to get a dock widget area - */ - DockWidgetArea getDockWidgetArea(SideBarLocation area) - { + /** + * Convenience function to get a dock widget area + */ + DockWidgetArea getDockWidgetArea(SideBarLocation area) + { switch (area) { - case SideBarLocation::SideBarLeft: return LeftDockWidgetArea; - case SideBarLocation::SideBarRight: return RightDockWidgetArea; - case SideBarLocation::SideBarBottom: return BottomDockWidgetArea; - case SideBarLocation::SideBarTop: return TopDockWidgetArea; - default: - return LeftDockWidgetArea; + case SideBarLocation::SideBarLeft: return LeftDockWidgetArea; + case SideBarLocation::SideBarRight: return RightDockWidgetArea; + case SideBarLocation::SideBarBottom: return BottomDockWidgetArea; + case SideBarLocation::SideBarTop: return TopDockWidgetArea; + default: return LeftDockWidgetArea; } - return LeftDockWidgetArea; - } + return LeftDockWidgetArea; + } - /** - * Update the resize limit of the resize handle - */ - void updateResizeHandleSizeLimitMax() - { - auto Rect = _this->dockContainer()->contentRect(); - const auto maxResizeHandleSize = ResizeHandle->orientation() == Qt::Horizontal - ? Rect.width() : Rect.height(); - ResizeHandle->setMaxResizeSize(maxResizeHandleSize - ResizeMargin); - } + /** + * Update the resize limit of the resize handle + */ + void updateResizeHandleSizeLimitMax() + { + auto Rect = _this->dockContainer()->contentRect(); + const auto maxResizeHandleSize = + ResizeHandle->orientation() == Qt::Horizontal ? Rect.width() : + Rect.height(); + ResizeHandle->setMaxResizeSize(maxResizeHandleSize - ResizeMargin); + } - /** - * Convenience function to check, if this is an horizontal area - */ - bool isHorizontal() const - { - return isHorizontalArea(SideTabBarArea); - } + /** + * Convenience function to check, if this is an horizontal area + */ + bool isHorizontal() const { return isHorizontalArea(SideTabBarArea); } - /** - * Forward this event to the dock container - */ - void forwardEventToDockContainer(QEvent* event) - { - auto DockContainer = _this->dockContainer(); - if (DockContainer) - { - DockContainer->handleAutoHideWidgetEvent(event, _this); - } - } - -}; // struct AutoHideDockContainerPrivate + /** + * Forward this event to the dock container + */ + void forwardEventToDockContainer(QEvent* event) + { + auto DockContainer = _this->dockContainer(); + if (DockContainer) + { + DockContainer->handleAutoHideWidgetEvent(event, _this); + } + } +}; // struct AutoHideDockContainerPrivate //============================================================================ AutoHideDockContainerPrivate::AutoHideDockContainerPrivate( - CAutoHideDockContainer *_public) : - _this(_public) -{ - -} - + CAutoHideDockContainer* _public) + : _this(_public) +{} //============================================================================ CDockContainerWidget* CAutoHideDockContainer::dockContainer() const { - return internal::findParent(this); + return internal::findParent(this); } - //============================================================================ -CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, SideBarLocation area, CDockContainerWidget* parent) : - Super(parent), - d(new AutoHideDockContainerPrivate(this)) +CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, + SideBarLocation area, + CDockContainerWidget* parent) + : Super(parent), d(new AutoHideDockContainerPrivate(this)) { - hide(); // auto hide dock container is initially always hidden - d->SideTabBarArea = area; - d->SideTab = componentsFactory()->createDockWidgetSideTab(nullptr); - connect(d->SideTab, &CAutoHideTab::pressed, this, &CAutoHideDockContainer::toggleCollapseState); - d->DockArea = new CDockAreaWidget(DockWidget->dockManager(), parent); - d->DockArea->setObjectName("autoHideDockArea"); - d->DockArea->setAutoHideDockContainer(this); + hide(); // auto hide dock container is initially always hidden + d->SideTabBarArea = area; + d->SideTab = componentsFactory()->createDockWidgetSideTab(nullptr); + connect(d->SideTab, &CAutoHideTab::pressed, this, + &CAutoHideDockContainer::toggleCollapseState); + d->DockArea = new CDockAreaWidget(DockWidget->dockManager(), parent); + d->DockArea->setObjectName("autoHideDockArea"); + d->DockArea->setAutoHideDockContainer(this); - setObjectName("autoHideDockContainer"); + setObjectName("autoHideDockContainer"); - d->Layout = new QBoxLayout(isHorizontalArea(area) ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight); - d->Layout->setContentsMargins(0, 0, 0, 0); - d->Layout->setSpacing(0); - setLayout(d->Layout); - d->ResizeHandle = new CResizeHandle(edgeFromSideTabBarArea(area), this); - d->ResizeHandle->setMinResizeSize(64); - bool OpaqueResize = CDockManager::testConfigFlag(CDockManager::OpaqueSplitterResize); - d->ResizeHandle->setOpaqueResize(OpaqueResize); - d->Size = d->DockArea->size(); - d->SizeCache = DockWidget->size(); + d->Layout = new QBoxLayout(isHorizontalArea(area) ? QBoxLayout::TopToBottom : + QBoxLayout::LeftToRight); + d->Layout->setContentsMargins(0, 0, 0, 0); + d->Layout->setSpacing(0); + setLayout(d->Layout); + d->ResizeHandle = new CResizeHandle(edgeFromSideTabBarArea(area), this); + d->ResizeHandle->setMinResizeSize(64); + bool OpaqueResize = + CDockManager::testConfigFlag(CDockManager::OpaqueSplitterResize); + d->ResizeHandle->setOpaqueResize(OpaqueResize); + d->Size = d->DockArea->size(); + d->SizeCache = DockWidget->size(); - addDockWidget(DockWidget); - parent->registerAutoHideWidget(this); - // The dock area should not be added to the layout before it contains the - // dock widget. If you add it to the layout before it contains the dock widget - // then you will likely see this warning for OpenGL widgets or QAxWidgets: - // setGeometry: Unable to set geometry XxY+Width+Height on QWidgetWindow/'WidgetClassWindow - d->Layout->addWidget(d->DockArea); - d->Layout->insertWidget(resizeHandleLayoutPosition(area), d->ResizeHandle); + addDockWidget(DockWidget); + parent->registerAutoHideWidget(this); + // The dock area should not be added to the layout before it contains the + // dock widget. If you add it to the layout before it contains the dock widget + // then you will likely see this warning for OpenGL widgets or QAxWidgets: + // setGeometry: Unable to set geometry XxY+Width+Height on + // QWidgetWindow/'WidgetClassWindow + d->Layout->addWidget(d->DockArea); + d->Layout->insertWidget(resizeHandleLayoutPosition(area), d->ResizeHandle); } - //============================================================================ void CAutoHideDockContainer::updateSize() { - auto dockContainerParent = dockContainer(); - if (!dockContainerParent) - { - return; - } + auto dockContainerParent = dockContainer(); + if (!dockContainerParent) + { + return; + } - auto rect = dockContainerParent->contentRect(); - switch (sideBarLocation()) - { - case SideBarLocation::SideBarTop: - resize(rect.width(), qMin(rect.height() - ResizeMargin, d->Size.height())); - move(rect.topLeft()); - break; + auto rect = dockContainerParent->contentRect(); + switch (sideBarLocation()) + { + case SideBarLocation::SideBarTop: + resize(rect.width(), + qMin(rect.height() - ResizeMargin, d->Size.height())); + move(rect.topLeft()); + break; - case SideBarLocation::SideBarLeft: - resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); - move(rect.topLeft()); - break; + case SideBarLocation::SideBarLeft: + resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); + move(rect.topLeft()); + break; - case SideBarLocation::SideBarRight: - { - resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); - QPoint p = rect.topRight(); - p.rx() -= (width() - 1); - move(p); - } - break; + case SideBarLocation::SideBarRight: + { + resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); + QPoint p = rect.topRight(); + p.rx() -= (width() - 1); + move(p); + } + break; - case SideBarLocation::SideBarBottom: - { - resize(rect.width(), qMin(rect.height() - ResizeMargin, d->Size.height())); - QPoint p = rect.bottomLeft(); - p.ry() -= (height() - 1); - move(p); - } - break; + case SideBarLocation::SideBarBottom: + { + resize(rect.width(), + qMin(rect.height() - ResizeMargin, d->Size.height())); + QPoint p = rect.bottomLeft(); + p.ry() -= (height() - 1); + move(p); + } + break; - default: - break; - } + default: break; + } - if (orientation() == Qt::Horizontal) - { - d->SizeCache.setHeight(this->height()); - } - else - { - d->SizeCache.setWidth(this->width()); - } + if (orientation() == Qt::Horizontal) + { + d->SizeCache.setHeight(this->height()); + } + else + { + d->SizeCache.setWidth(this->width()); + } } //============================================================================ CAutoHideDockContainer::~CAutoHideDockContainer() { - ADS_PRINT("~CAutoHideDockContainer"); + ADS_PRINT("~CAutoHideDockContainer"); - // Remove event filter in case there are any queued messages - qApp->removeEventFilter(this); - if (dockContainer()) - { - dockContainer()->removeAutoHideWidget(this); - } + // Remove event filter in case there are any queued messages + qApp->removeEventFilter(this); + if (dockContainer()) + { + dockContainer()->removeAutoHideWidget(this); + } - if (d->SideTab) - { - delete d->SideTab; - } + if (d->SideTab) + { + delete d->SideTab; + } - delete d; + delete d; } //============================================================================ CAutoHideSideBar* CAutoHideDockContainer::autoHideSideBar() const { - if (d->SideTab) - { - return d->SideTab->sideBar(); - } - else - { - auto DockContainer = dockContainer(); - return DockContainer ? DockContainer->autoHideSideBar(d->SideTabBarArea) : nullptr; - } + if (d->SideTab) + { + return d->SideTab->sideBar(); + } + else + { + auto DockContainer = dockContainer(); + return DockContainer ? DockContainer->autoHideSideBar(d->SideTabBarArea) : + nullptr; + } } - //============================================================================ CAutoHideTab* CAutoHideDockContainer::autoHideTab() const { - return d->SideTab; + return d->SideTab; } - //============================================================================ CDockWidget* CAutoHideDockContainer::dockWidget() const { - return d->DockWidget; + return d->DockWidget; } //============================================================================ void CAutoHideDockContainer::addDockWidget(CDockWidget* DockWidget) { - if (d->DockWidget) - { - // Remove the old dock widget at this area + if (d->DockWidget) + { + // Remove the old dock widget at this area d->DockArea->removeDockWidget(d->DockWidget); - } + } - d->DockWidget = DockWidget; - d->SideTab->setDockWidget(DockWidget); + d->DockWidget = DockWidget; + d->SideTab->setDockWidget(DockWidget); CDockAreaWidget* OldDockArea = DockWidget->dockAreaWidget(); auto IsRestoringState = DockWidget->dockManager()->isRestoringState(); if (OldDockArea && !IsRestoringState) { - // The initial size should be a little bit bigger than the original dock - // area size to prevent that the resize handle of this auto hid dock area - // is near of the splitter of the old dock area. - d->Size = OldDockArea->size() + QSize(16, 16); + // The initial size should be a little bit bigger than the original dock + // area size to prevent that the resize handle of this auto hid dock area + // is near of the splitter of the old dock area. + d->Size = OldDockArea->size() + QSize(16, 16); OldDockArea->removeDockWidget(DockWidget); } - d->DockArea->addDockWidget(DockWidget); - updateSize(); - // The dock area is not visible and will not update the size when updateSize() - // is called for this auto hide container. Therefore we explicitly resize - // it here. As soon as it will become visible, it will get the right size + d->DockArea->addDockWidget(DockWidget); + updateSize(); + // The dock area is not visible and will not update the size when updateSize() + // is called for this auto hide container. Therefore we explicitly resize + // it here. As soon as it will become visible, it will get the right size d->DockArea->resize(size()); } - //============================================================================ SideBarLocation CAutoHideDockContainer::sideBarLocation() const { - return d->SideTabBarArea; + return d->SideTabBarArea; } - //============================================================================ void CAutoHideDockContainer::setSideBarLocation(SideBarLocation SideBarLocation) { - if (d->SideTabBarArea == SideBarLocation) - { - return; - } + if (d->SideTabBarArea == SideBarLocation) + { + return; + } - d->SideTabBarArea = SideBarLocation; - d->Layout->removeWidget(d->ResizeHandle); - d->Layout->setDirection(isHorizontalArea(SideBarLocation) ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight); - d->Layout->insertWidget(resizeHandleLayoutPosition(SideBarLocation), d->ResizeHandle); - d->ResizeHandle->setHandlePosition(edgeFromSideTabBarArea(SideBarLocation)); + d->SideTabBarArea = SideBarLocation; + d->Layout->removeWidget(d->ResizeHandle); + d->Layout->setDirection(isHorizontalArea(SideBarLocation) ? + QBoxLayout::TopToBottom : + QBoxLayout::LeftToRight); + d->Layout->insertWidget(resizeHandleLayoutPosition(SideBarLocation), + d->ResizeHandle); + d->ResizeHandle->setHandlePosition(edgeFromSideTabBarArea(SideBarLocation)); internal::repolishStyle(this, internal::RepolishDirectChildren); } - //============================================================================ CDockAreaWidget* CAutoHideDockContainer::dockAreaWidget() const { - return d->DockArea; + return d->DockArea; } //============================================================================ void CAutoHideDockContainer::moveContentsToParent() { - cleanupAndDelete(); - // If we unpin the auto hide dock widget, then we insert it into the same - // location like it had as a auto hide widget. This brings the least surprise - // to the user and he does not have to search where the widget was inserted. - d->DockWidget->setDockArea(nullptr); - auto DockContainer = dockContainer(); - DockContainer->addDockWidget(d->getDockWidgetArea(d->SideTabBarArea), d->DockWidget); + cleanupAndDelete(); + // If we unpin the auto hide dock widget, then we insert it into the same + // location like it had as a auto hide widget. This brings the least surprise + // to the user and he does not have to search where the widget was inserted. + d->DockWidget->setDockArea(nullptr); + auto DockContainer = dockContainer(); + DockContainer->addDockWidget(d->getDockWidgetArea(d->SideTabBarArea), + d->DockWidget); } - //============================================================================ void CAutoHideDockContainer::cleanupAndDelete() { - const auto dockWidget = d->DockWidget; - if (dockWidget) - { - - auto SideTab = d->SideTab; + const auto dockWidget = d->DockWidget; + if (dockWidget) + { + auto SideTab = d->SideTab; SideTab->removeFromSideBar(); SideTab->setParent(nullptr); SideTab->hide(); - } + } - hide(); - deleteLater(); + hide(); + deleteLater(); } - //============================================================================ void CAutoHideDockContainer::saveState(QXmlStreamWriter& s) { - s.writeStartElement("Widget"); - s.writeAttribute("Name", d->DockWidget->objectName()); - s.writeAttribute("Closed", QString::number(d->DockWidget->isClosed() ? 1 : 0)); - s.writeAttribute("Size", QString::number(d->isHorizontal() ? d->Size.height() : d->Size.width())); - s.writeEndElement(); + s.writeStartElement("Widget"); + s.writeAttribute("Name", d->DockWidget->objectName()); + s.writeAttribute("Closed", + QString::number(d->DockWidget->isClosed() ? 1 : 0)); + s.writeAttribute( + "Size", + QString::number(d->isHorizontal() ? d->Size.height() : d->Size.width())); + s.writeEndElement(); } - //============================================================================ void CAutoHideDockContainer::toggleView(bool Enable) { - if (Enable) - { + if (Enable) + { if (d->SideTab) { d->SideTab->show(); } - } - else - { + } + else + { if (d->SideTab) { d->SideTab->hide(); } hide(); qApp->removeEventFilter(this); - } + } } - //============================================================================ void CAutoHideDockContainer::collapseView(bool Enable) { - if (Enable) - { - hide(); - qApp->removeEventFilter(this); - } - else - { - updateSize(); - d->updateResizeHandleSizeLimitMax(); - raise(); - show(); - d->DockWidget->dockManager()->setDockWidgetFocused(d->DockWidget); - qApp->installEventFilter(this); - } + if (Enable) + { + hide(); + qApp->removeEventFilter(this); + } + else + { + updateSize(); + d->updateResizeHandleSizeLimitMax(); + raise(); + show(); + d->DockWidget->dockManager()->setDockWidgetFocused(d->DockWidget); + qApp->installEventFilter(this); + } - ADS_PRINT("CAutoHideDockContainer::collapseView " << Enable); + ADS_PRINT("CAutoHideDockContainer::collapseView " << Enable); d->SideTab->updateStyle(); } - //============================================================================ void CAutoHideDockContainer::toggleCollapseState() { - collapseView(isVisible()); + collapseView(isVisible()); } - //============================================================================ void CAutoHideDockContainer::setSize(int Size) { - if (d->isHorizontal()) - { - d->Size.setHeight(Size); - } - else - { - d->Size.setWidth(Size); - } + if (d->isHorizontal()) + { + d->Size.setHeight(Size); + } + else + { + d->Size.setWidth(Size); + } - updateSize(); + updateSize(); } - //============================================================================ /** * Returns true if the object given in ancestor is an ancestor of the object @@ -523,190 +508,186 @@ static bool objectIsAncestorOf(const QObject* descendant, const QObject* ancesto return false; } - //============================================================================ /** * Returns true if the object given in ancestor is the object given in descendant * or if it is an ancestor of the object given in descendant */ -static bool isObjectOrAncestor(const QObject *descendant, const QObject *ancestor) +static bool isObjectOrAncestor(const QObject* descendant, const QObject* ancestor) { - if (ancestor && (descendant == ancestor)) - { - return true; - } - else - { - return objectIsAncestorOf(descendant, ancestor); - } + if (ancestor && (descendant == ancestor)) + { + return true; + } + else + { + return objectIsAncestorOf(descendant, ancestor); + } } - //============================================================================ bool CAutoHideDockContainer::eventFilter(QObject* watched, QEvent* event) { - // A switch case statement would be nicer here, but we cannot use - // internal::FloatingWidgetDragStartEvent in a switch case + // A switch case statement would be nicer here, but we cannot use + // internal::FloatingWidgetDragStartEvent in a switch case if (event->type() == QEvent::Resize) - { - if (!d->ResizeHandle->isResizing()) - { - updateSize(); - } - } - else if (event->type() == QEvent::MouseButtonPress) - { - auto widget = qobject_cast(watched); - // Ignore non widget events - if (!widget) - { - return Super::eventFilter(watched, event); - } + { + if (!d->ResizeHandle->isResizing()) + { + updateSize(); + } + } + else if (event->type() == QEvent::MouseButtonPress) + { + auto widget = qobject_cast(watched); + // Ignore non widget events + if (!widget) + { + return Super::eventFilter(watched, event); + } - // Now check, if the user clicked into the side tab and ignore this event, - // because the side tab click handler will call collapseView(). If we - // do not ignore this here, then we will collapse the container and the side tab - // click handler will uncollapse it - if (widget == d->SideTab.data()) - { - return Super::eventFilter(watched, event); - } + // Now check, if the user clicked into the side tab and ignore this event, + // because the side tab click handler will call collapseView(). If we + // do not ignore this here, then we will collapse the container and the + // side tab click handler will uncollapse it + if (widget == d->SideTab.data()) + { + return Super::eventFilter(watched, event); + } - // Now we check, if the user clicked inside of this auto hide container. - // If the click is inside of this auto hide container, then we can - // ignore the event, because the auto hide overlay should not get collapsed if - // user works in it - if (isObjectOrAncestor(widget, this)) - { - return Super::eventFilter(watched, event); - } + // Now we check, if the user clicked inside of this auto hide container. + // If the click is inside of this auto hide container, then we can + // ignore the event, because the auto hide overlay should not get + // collapsed if user works in it + if (isObjectOrAncestor(widget, this)) + { + return Super::eventFilter(watched, event); + } - // Ignore the mouse click if it is not inside of this container - if (!isObjectOrAncestor(widget, dockContainer())) - { - return Super::eventFilter(watched, event); - } + // Ignore the mouse click if it is not inside of this container + if (!isObjectOrAncestor(widget, dockContainer())) + { + return Super::eventFilter(watched, event); + } - // user clicked into container - collapse the auto hide widget - collapseView(true); - } + // user clicked into container - collapse the auto hide widget + collapseView(true); + } else if (event->type() == internal::FloatingWidgetDragStartEvent) { - // If we are dragging our own floating widget, the we do not need to - // collapse the view - auto FloatingWidget = dockContainer()->floatingWidget(); - if (FloatingWidget != watched) - { - collapseView(true); - } + // If we are dragging our own floating widget, the we do not need to + // collapse the view + auto FloatingWidget = dockContainer()->floatingWidget(); + if (FloatingWidget != watched) + { + collapseView(true); + } } else if (event->type() == internal::DockedWidgetDragStartEvent) { - collapseView(true); + collapseView(true); } - return Super::eventFilter(watched, event); + return Super::eventFilter(watched, event); } - //============================================================================ void CAutoHideDockContainer::resizeEvent(QResizeEvent* event) { Super::resizeEvent(event); - if (d->ResizeHandle->isResizing()) - { + if (d->ResizeHandle->isResizing()) + { d->Size = this->size(); - d->updateResizeHandleSizeLimitMax(); - } + d->updateResizeHandleSizeLimitMax(); + } } - //============================================================================ -void CAutoHideDockContainer::leaveEvent(QEvent *event) +void CAutoHideDockContainer::leaveEvent(QEvent* event) { - // Resizing of the dock container via the resize handle in non opaque mode - // mays cause a leave event that is not really a leave event. Therefore - // we check here, if we are really outside of our rect. - auto pos = mapFromGlobal(QCursor::pos()); - if (!rect().contains(pos)) - { - d->forwardEventToDockContainer(event); - } - Super::leaveEvent(event); + // Resizing of the dock container via the resize handle in non opaque mode + // mays cause a leave event that is not really a leave event. Therefore + // we check here, if we are really outside of our rect. + auto pos = mapFromGlobal(QCursor::pos()); + if (!rect().contains(pos)) + { + d->forwardEventToDockContainer(event); + } + Super::leaveEvent(event); } - //============================================================================ bool CAutoHideDockContainer::event(QEvent* event) { - switch (event->type()) - { - case QEvent::Enter: - case QEvent::Hide: - d->forwardEventToDockContainer(event); - break; + switch (event->type()) + { + case QEvent::Enter: + case QEvent::Hide: d->forwardEventToDockContainer(event); break; - case QEvent::MouseButtonPress: - return true; - break; + case QEvent::MouseButtonPress: return true; break; - default: - break; - } + default: break; + } - return Super::event(event); + return Super::event(event); } +//============================================================================ +void CAutoHideDockContainer::dragLeaveEvent(QDragLeaveEvent*) +{ + if (CDockManager::testAutoHideConfigFlag( + CDockManager::AutoHideOpenOnDragHover)) + { + collapseView(true); + } +} //============================================================================ Qt::Orientation CAutoHideDockContainer::orientation() const { - return ads::internal::isHorizontalSideBarLocation(d->SideTabBarArea) - ? Qt::Horizontal : Qt::Vertical; + return ads::internal::isHorizontalSideBarLocation(d->SideTabBarArea) ? + Qt::Horizontal : + Qt::Vertical; } - //============================================================================ void CAutoHideDockContainer::resetToInitialDockWidgetSize() { - if (orientation() == Qt::Horizontal) - { - setSize(d->SizeCache.height()); - } - else - { - setSize(d->SizeCache.width()); - } + if (orientation() == Qt::Horizontal) + { + setSize(d->SizeCache.height()); + } + else + { + setSize(d->SizeCache.width()); + } } - //============================================================================ -void CAutoHideDockContainer::moveToNewSideBarLocation(SideBarLocation NewSideBarLocation, - int TabIndex) +void CAutoHideDockContainer::moveToNewSideBarLocation( + SideBarLocation NewSideBarLocation, int TabIndex) { - if (NewSideBarLocation == sideBarLocation() && TabIndex == this->tabIndex()) - { - return; - } + if (NewSideBarLocation == sideBarLocation() && TabIndex == this->tabIndex()) + { + return; + } - auto OldOrientation = orientation(); - auto SideBar = dockContainer()->autoHideSideBar(NewSideBarLocation); - SideBar->addAutoHideWidget(this, TabIndex); - // If we move a horizontal auto hide container to a vertical position - // then we resize it to the original dock widget size, to avoid - // an extremely stretched dock widget after insertion - if (SideBar->orientation() != OldOrientation) - { - resetToInitialDockWidgetSize(); - } + auto OldOrientation = orientation(); + auto SideBar = dockContainer()->autoHideSideBar(NewSideBarLocation); + SideBar->addAutoHideWidget(this, TabIndex); + // If we move a horizontal auto hide container to a vertical position + // then we resize it to the original dock widget size, to avoid + // an extremely stretched dock widget after insertion + if (SideBar->orientation() != OldOrientation) + { + resetToInitialDockWidgetSize(); + } } - //============================================================================ int CAutoHideDockContainer::tabIndex() const { - return d->SideTab->tabIndex(); -} - + return d->SideTab->tabIndex(); } +} // namespace ads diff --git a/src/AutoHideDockContainer.h b/src/AutoHideDockContainer.h index 2fdce37..fb9b504 100644 --- a/src/AutoHideDockContainer.h +++ b/src/AutoHideDockContainer.h @@ -18,7 +18,6 @@ ** License along with this library; If not, see . ******************************************************************************/ - //============================================================================ /// \file AutoHideDockContainer.h /// \author Syarif Fakhri @@ -29,10 +28,10 @@ //============================================================================ // INCLUDES //============================================================================ -#include "ads_globals.h" - #include + #include "AutoHideTab.h" +#include "ads_globals.h" QT_FORWARD_DECLARE_CLASS(QXmlStreamWriter) @@ -52,151 +51,153 @@ struct SideTabBarPrivate; */ class ADS_EXPORT CAutoHideDockContainer : public QFrame { - Q_OBJECT + Q_OBJECT Q_PROPERTY(int sideBarLocation READ sideBarLocation) private: - AutoHideDockContainerPrivate* d; ///< private data (pimpl) - friend struct AutoHideDockContainerPrivate; - friend CAutoHideSideBar; - friend SideTabBarPrivate; + AutoHideDockContainerPrivate* d; ///< private data (pimpl) + friend struct AutoHideDockContainerPrivate; + friend CAutoHideSideBar; + friend SideTabBarPrivate; protected: - virtual bool eventFilter(QObject* watched, QEvent* event) override; - virtual void resizeEvent(QResizeEvent* event) override; - virtual void leaveEvent(QEvent *event) override; - virtual bool event(QEvent* event) override; + virtual bool eventFilter(QObject* watched, QEvent* event) override; + virtual void resizeEvent(QResizeEvent* event) override; + virtual void leaveEvent(QEvent* event) override; + virtual bool event(QEvent* event) override; + virtual void dragLeaveEvent(QDragLeaveEvent* ev) override; - /** - * Updates the size considering the size limits and the resize margins - */ - void updateSize(); + /** + * Updates the size considering the size limits and the resize margins + */ + void updateSize(); - /* - * Saves the state and size - */ - void saveState(QXmlStreamWriter& Stream); + /* + * Saves the state and size + */ + void saveState(QXmlStreamWriter& Stream); public: - using Super = QFrame; + using Super = QFrame; /** - * Create Auto Hide widget with the given dock widget - */ - CAutoHideDockContainer(CDockWidget* DockWidget, SideBarLocation area, - CDockContainerWidget* parent); - - /** - * Virtual Destructor - */ - virtual ~CAutoHideDockContainer(); - - /** - * Gets the side tab bar - */ - CAutoHideSideBar* autoHideSideBar() const; - - /** - * Returns the side tab - */ - CAutoHideTab* autoHideTab() const; - - /** - * Gets the dock widget in this dock container - */ - CDockWidget* dockWidget() const; - - /** - * Returns the index of this container in the sidebar - */ - int tabIndex() const; - - /** - * Adds a dock widget and removes the previous dock widget - */ - void addDockWidget(CDockWidget* DockWidget); + * Create Auto Hide widget with the given dock widget + */ + CAutoHideDockContainer(CDockWidget* DockWidget, SideBarLocation area, + CDockContainerWidget* parent); /** - * Returns the side tab bar area of this Auto Hide dock container - */ - SideBarLocation sideBarLocation() const; + * Virtual Destructor + */ + virtual ~CAutoHideDockContainer(); - /** - * Sets a new SideBarLocation. - * If a new side bar location is set, the auto hide dock container needs - * to update its resize handle position - */ - void setSideBarLocation(SideBarLocation SideBarLocation); + /** + * Gets the side tab bar + */ + CAutoHideSideBar* autoHideSideBar() const; - /** - * Returns the dock area widget of this Auto Hide dock container - */ - CDockAreaWidget* dockAreaWidget() const; + /** + * Returns the side tab + */ + CAutoHideTab* autoHideTab() const; - /** - * Returns the parent container that hosts this auto hide container - */ - CDockContainerWidget* dockContainer() const; + /** + * Gets the dock widget in this dock container + */ + CDockWidget* dockWidget() const; - /** - * Moves the contents to the parent container widget - * Used before removing this Auto Hide dock container - */ + /** + * Returns the index of this container in the sidebar + */ + int tabIndex() const; + + /** + * Adds a dock widget and removes the previous dock widget + */ + void addDockWidget(CDockWidget* DockWidget); + + /** + * Returns the side tab bar area of this Auto Hide dock container + */ + SideBarLocation sideBarLocation() const; + + /** + * Sets a new SideBarLocation. + * If a new side bar location is set, the auto hide dock container needs + * to update its resize handle position + */ + void setSideBarLocation(SideBarLocation SideBarLocation); + + /** + * Returns the dock area widget of this Auto Hide dock container + */ + CDockAreaWidget* dockAreaWidget() const; + + /** + * Returns the parent container that hosts this auto hide container + */ + CDockContainerWidget* dockContainer() const; + + /** + * Moves the contents to the parent container widget + * Used before removing this Auto Hide dock container + */ void moveContentsToParent(); - /** - * Cleanups up the side tab widget and then deletes itself - */ - void cleanupAndDelete(); + /** + * Cleanups up the side tab widget and then deletes itself + */ + void cleanupAndDelete(); - /* - * Toggles the auto Hide dock container widget - * This will also hide the side tab widget - */ - void toggleView(bool Enable); + /* + * Toggles the auto Hide dock container widget + * This will also hide the side tab widget + */ + void toggleView(bool Enable); - /* - * Collapses the auto hide dock container widget - * Does not hide the side tab widget - */ - void collapseView(bool Enable); + /* + * Collapses the auto hide dock container widget + * Does not hide the side tab widget + */ + void collapseView(bool Enable); - /** - * Toggles the current collapse state - */ - void toggleCollapseState(); + /** + * Toggles the current collapse state + */ + void toggleCollapseState(); - /** - * Use this instead of resize. - * Depending on the sidebar location this will set the width or height - * of this auto hide container. - */ - void setSize(int Size); + /** + * Use this instead of resize. + * Depending on the sidebar location this will set the width or height + * of this auto hide container. + */ + void setSize(int Size); - /** - * Resets the width or height to the initial dock widget size dependinng on - * the orientation. - * If the orientation is Qt::Horizontal, then the height is reset to - * the initial size and if orientation is Qt::Vertical, then the width is - * reset to the initial size - */ - void resetToInitialDockWidgetSize(); + /** + * Resets the width or height to the initial dock widget size dependinng on + * the orientation. + * If the orientation is Qt::Horizontal, then the height is reset to + * the initial size and if orientation is Qt::Vertical, then the width is + * reset to the initial size + */ + void resetToInitialDockWidgetSize(); - /** - * Returns orientation of this container. - * Left and right containers have a Qt::Vertical orientation and top / bottom - * containers have a Qt::Horizontal orientation. - * The function returns the orientation of the corresponding auto hide - * side bar. - */ - Qt::Orientation orientation() const; + /** + * Returns orientation of this container. + * Left and right containers have a Qt::Vertical orientation and top / bottom + * containers have a Qt::Horizontal orientation. + * The function returns the orientation of the corresponding auto hide + * side bar. + */ + Qt::Orientation orientation() const; - /** - * Removes the AutoHide container from the current side bar and adds - * it to the new side bar given in SideBarLocation - */ - void moveToNewSideBarLocation(SideBarLocation SideBarLocation, int TabIndex = -1); + /** + * Removes the AutoHide container from the current side bar and adds + * it to the new side bar given in SideBarLocation + */ + void moveToNewSideBarLocation(SideBarLocation SideBarLocation, + int TabIndex = -1); }; -} // namespace ads +} // namespace ads //----------------------------------------------------------------------------- #endif diff --git a/src/AutoHideTab.cpp b/src/AutoHideTab.cpp index e2d6265..23fee07 100644 --- a/src/AutoHideTab.cpp +++ b/src/AutoHideTab.cpp @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include "AutoHideDockContainer.h" #include "AutoHideSideBar.h" @@ -41,6 +43,7 @@ #include "DockWidget.h" #include "FloatingDragPreview.h" #include "DockOverlay.h" +#include "ads_globals.h" namespace ads { @@ -55,6 +58,7 @@ struct AutoHideTabPrivate CAutoHideSideBar* SideBar = nullptr; Qt::Orientation Orientation{Qt::Vertical}; QElapsedTimer TimeSinceHoverMousePress; + QElapsedTimer TimeSinceDragOver; bool MousePressed = false; eDragState DragState = DraggingInactive; QPoint GlobalDragStartMousePosition; @@ -252,6 +256,9 @@ CAutoHideTab::CAutoHideTab(QWidget* parent) : { setAttribute(Qt::WA_NoMousePropagation); setFocusPolicy(Qt::NoFocus); + if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) { + setAcceptDrops(true); + } } @@ -355,7 +362,6 @@ bool CAutoHideTab::event(QEvent* event) case QEvent::Leave: d->forwardEventToDockContainer(event); break; - default: break; } @@ -537,6 +543,37 @@ void CAutoHideTab::mouseMoveEvent(QMouseEvent* ev) Super::mouseMoveEvent(ev); } +//============================================================================ +void CAutoHideTab::dragEnterEvent(QDragEnterEvent* ev) { + if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) { + if (!d->TimeSinceDragOver.isValid()) { + d->TimeSinceDragOver.restart(); + ev->accept(); + } + else if (d->TimeSinceDragOver.hasExpired(500)) { + ev->accept(); + } + } +} + +//============================================================================ +void CAutoHideTab::dragLeaveEvent(QDragLeaveEvent* ev) { + if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) { + d->TimeSinceDragOver.invalidate(); + d->forwardEventToDockContainer(ev); + } +} + +//============================================================================ +void CAutoHideTab::dragMoveEvent(QDragMoveEvent* ev) { + if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover) + && d->TimeSinceDragOver.isValid() + && d->TimeSinceDragOver.hasExpired(500)) { + d->TimeSinceDragOver.invalidate(); + d->DockWidget->autoHideDockContainer()->collapseView(false); + ev->accept(); + } +} //============================================================================ void CAutoHideTab::requestCloseDockWidget() diff --git a/src/AutoHideTab.h b/src/AutoHideTab.h index 3a42df8..07d4344 100644 --- a/src/AutoHideTab.h +++ b/src/AutoHideTab.h @@ -55,7 +55,7 @@ class ADS_EXPORT CAutoHideTab : public CPushButton Q_PROPERTY(bool activeTab READ isActiveTab) Q_PROPERTY(bool iconOnly READ iconOnly) -private: +private: AutoHideTabPrivate* d; ///< private data (pimpl) friend struct AutoHideTabPrivate; friend class CDockWidget; @@ -76,6 +76,9 @@ protected: virtual void mousePressEvent(QMouseEvent* ev) override; virtual void mouseReleaseEvent(QMouseEvent* ev) override; virtual void mouseMoveEvent(QMouseEvent* ev) override; + virtual void dragEnterEvent(QDragEnterEvent* ev) override; + virtual void dragLeaveEvent(QDragLeaveEvent* ev) override; + virtual void dragMoveEvent(QDragMoveEvent* ev) override; public: using Super = CPushButton; diff --git a/src/DockManager.h b/src/DockManager.h index dcb2356..e56e9ac 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -254,6 +254,7 @@ public: AutoHideCloseButtonCollapsesDock = 0x40, ///< Close button of an auto hide container collapses the dock instead of hiding it completely AutoHideHasCloseButton = 0x80, //< If the flag is set an auto hide title bar has a close button AutoHideHasMinimizeButton = 0x100, ///< if this flag is set, the auto hide title bar has a minimize button to collapse the dock widget + AutoHideOpenOnDragHover = 0x200, ///< if this flag is set, dragging hover the tab bar will open the dock DefaultAutoHideConfig = AutoHideFeatureEnabled | DockAreaHasAutoHideButton From 2878559ee6f4852cf19f284aba007f9669f47ef3 Mon Sep 17 00:00:00 2001 From: TheBoje <47856523+TheBoje@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:23:40 +0200 Subject: [PATCH 04/24] Fix formatting (#663) --- src/AutoHideDockContainer.h | 246 ++++++++++++++++++------------------ src/AutoHideTab.cpp | 3 +- 2 files changed, 124 insertions(+), 125 deletions(-) diff --git a/src/AutoHideDockContainer.h b/src/AutoHideDockContainer.h index fb9b504..e12dbba 100644 --- a/src/AutoHideDockContainer.h +++ b/src/AutoHideDockContainer.h @@ -18,6 +18,7 @@ ** License along with this library; If not, see . ******************************************************************************/ + //============================================================================ /// \file AutoHideDockContainer.h /// \author Syarif Fakhri @@ -28,11 +29,11 @@ //============================================================================ // INCLUDES //============================================================================ -#include - -#include "AutoHideTab.h" #include "ads_globals.h" +#include +#include "AutoHideTab.h" + QT_FORWARD_DECLARE_CLASS(QXmlStreamWriter) namespace ads @@ -51,153 +52,152 @@ struct SideTabBarPrivate; */ class ADS_EXPORT CAutoHideDockContainer : public QFrame { - Q_OBJECT + Q_OBJECT Q_PROPERTY(int sideBarLocation READ sideBarLocation) private: - AutoHideDockContainerPrivate* d; ///< private data (pimpl) - friend struct AutoHideDockContainerPrivate; - friend CAutoHideSideBar; - friend SideTabBarPrivate; + AutoHideDockContainerPrivate* d; ///< private data (pimpl) + friend struct AutoHideDockContainerPrivate; + friend CAutoHideSideBar; + friend SideTabBarPrivate; protected: - virtual bool eventFilter(QObject* watched, QEvent* event) override; - virtual void resizeEvent(QResizeEvent* event) override; - virtual void leaveEvent(QEvent* event) override; - virtual bool event(QEvent* event) override; + virtual bool eventFilter(QObject* watched, QEvent* event) override; + virtual void resizeEvent(QResizeEvent* event) override; + virtual void leaveEvent(QEvent *event) override; + virtual bool event(QEvent* event) override; virtual void dragLeaveEvent(QDragLeaveEvent* ev) override; - /** - * Updates the size considering the size limits and the resize margins - */ - void updateSize(); + /** + * Updates the size considering the size limits and the resize margins + */ + void updateSize(); - /* - * Saves the state and size - */ - void saveState(QXmlStreamWriter& Stream); + /* + * Saves the state and size + */ + void saveState(QXmlStreamWriter& Stream); public: - using Super = QFrame; + using Super = QFrame; /** - * Create Auto Hide widget with the given dock widget - */ - CAutoHideDockContainer(CDockWidget* DockWidget, SideBarLocation area, - CDockContainerWidget* parent); + * Create Auto Hide widget with the given dock widget + */ + CAutoHideDockContainer(CDockWidget* DockWidget, SideBarLocation area, + CDockContainerWidget* parent); + + /** + * Virtual Destructor + */ + virtual ~CAutoHideDockContainer(); + + /** + * Gets the side tab bar + */ + CAutoHideSideBar* autoHideSideBar() const; + + /** + * Returns the side tab + */ + CAutoHideTab* autoHideTab() const; + + /** + * Gets the dock widget in this dock container + */ + CDockWidget* dockWidget() const; + + /** + * Returns the index of this container in the sidebar + */ + int tabIndex() const; + + /** + * Adds a dock widget and removes the previous dock widget + */ + void addDockWidget(CDockWidget* DockWidget); /** - * Virtual Destructor - */ - virtual ~CAutoHideDockContainer(); + * Returns the side tab bar area of this Auto Hide dock container + */ + SideBarLocation sideBarLocation() const; - /** - * Gets the side tab bar - */ - CAutoHideSideBar* autoHideSideBar() const; + /** + * Sets a new SideBarLocation. + * If a new side bar location is set, the auto hide dock container needs + * to update its resize handle position + */ + void setSideBarLocation(SideBarLocation SideBarLocation); - /** - * Returns the side tab - */ - CAutoHideTab* autoHideTab() const; + /** + * Returns the dock area widget of this Auto Hide dock container + */ + CDockAreaWidget* dockAreaWidget() const; - /** - * Gets the dock widget in this dock container - */ - CDockWidget* dockWidget() const; + /** + * Returns the parent container that hosts this auto hide container + */ + CDockContainerWidget* dockContainer() const; - /** - * Returns the index of this container in the sidebar - */ - int tabIndex() const; - - /** - * Adds a dock widget and removes the previous dock widget - */ - void addDockWidget(CDockWidget* DockWidget); - - /** - * Returns the side tab bar area of this Auto Hide dock container - */ - SideBarLocation sideBarLocation() const; - - /** - * Sets a new SideBarLocation. - * If a new side bar location is set, the auto hide dock container needs - * to update its resize handle position - */ - void setSideBarLocation(SideBarLocation SideBarLocation); - - /** - * Returns the dock area widget of this Auto Hide dock container - */ - CDockAreaWidget* dockAreaWidget() const; - - /** - * Returns the parent container that hosts this auto hide container - */ - CDockContainerWidget* dockContainer() const; - - /** - * Moves the contents to the parent container widget - * Used before removing this Auto Hide dock container - */ + /** + * Moves the contents to the parent container widget + * Used before removing this Auto Hide dock container + */ void moveContentsToParent(); - /** - * Cleanups up the side tab widget and then deletes itself - */ - void cleanupAndDelete(); + /** + * Cleanups up the side tab widget and then deletes itself + */ + void cleanupAndDelete(); - /* - * Toggles the auto Hide dock container widget - * This will also hide the side tab widget - */ - void toggleView(bool Enable); + /* + * Toggles the auto Hide dock container widget + * This will also hide the side tab widget + */ + void toggleView(bool Enable); - /* - * Collapses the auto hide dock container widget - * Does not hide the side tab widget - */ - void collapseView(bool Enable); + /* + * Collapses the auto hide dock container widget + * Does not hide the side tab widget + */ + void collapseView(bool Enable); - /** - * Toggles the current collapse state - */ - void toggleCollapseState(); + /** + * Toggles the current collapse state + */ + void toggleCollapseState(); - /** - * Use this instead of resize. - * Depending on the sidebar location this will set the width or height - * of this auto hide container. - */ - void setSize(int Size); + /** + * Use this instead of resize. + * Depending on the sidebar location this will set the width or height + * of this auto hide container. + */ + void setSize(int Size); - /** - * Resets the width or height to the initial dock widget size dependinng on - * the orientation. - * If the orientation is Qt::Horizontal, then the height is reset to - * the initial size and if orientation is Qt::Vertical, then the width is - * reset to the initial size - */ - void resetToInitialDockWidgetSize(); + /** + * Resets the width or height to the initial dock widget size dependinng on + * the orientation. + * If the orientation is Qt::Horizontal, then the height is reset to + * the initial size and if orientation is Qt::Vertical, then the width is + * reset to the initial size + */ + void resetToInitialDockWidgetSize(); - /** - * Returns orientation of this container. - * Left and right containers have a Qt::Vertical orientation and top / bottom - * containers have a Qt::Horizontal orientation. - * The function returns the orientation of the corresponding auto hide - * side bar. - */ - Qt::Orientation orientation() const; + /** + * Returns orientation of this container. + * Left and right containers have a Qt::Vertical orientation and top / bottom + * containers have a Qt::Horizontal orientation. + * The function returns the orientation of the corresponding auto hide + * side bar. + */ + Qt::Orientation orientation() const; - /** - * Removes the AutoHide container from the current side bar and adds - * it to the new side bar given in SideBarLocation - */ - void moveToNewSideBarLocation(SideBarLocation SideBarLocation, - int TabIndex = -1); + /** + * Removes the AutoHide container from the current side bar and adds + * it to the new side bar given in SideBarLocation + */ + void moveToNewSideBarLocation(SideBarLocation SideBarLocation, int TabIndex = -1); }; -} // namespace ads +} // namespace ads //----------------------------------------------------------------------------- #endif diff --git a/src/AutoHideTab.cpp b/src/AutoHideTab.cpp index 23fee07..c555b10 100644 --- a/src/AutoHideTab.cpp +++ b/src/AutoHideTab.cpp @@ -33,8 +33,7 @@ #include #include #include -#include -#include +#include #include "AutoHideDockContainer.h" #include "AutoHideSideBar.h" From 8cfa5c8e0e01e3bb469fb506e264528b47105532 Mon Sep 17 00:00:00 2001 From: TheBoje <47856523+TheBoje@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:27:15 +0200 Subject: [PATCH 05/24] Fix formatting#2 (#663) --- src/AutoHideDockContainer.cpp | 805 ++++++++++++++++++---------------- 1 file changed, 416 insertions(+), 389 deletions(-) diff --git a/src/AutoHideDockContainer.cpp b/src/AutoHideDockContainer.cpp index 6a2f59b..7dabcfe 100644 --- a/src/AutoHideDockContainer.cpp +++ b/src/AutoHideDockContainer.cpp @@ -16,6 +16,7 @@ ** License along with this library; If not, see . ******************************************************************************/ + //============================================================================ /// \file AutoHideDockContainer.cpp /// \author Syarif Fakhri @@ -28,23 +29,23 @@ //============================================================================ #include "AutoHideDockContainer.h" -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include -#include - +#include "DockManager.h" +#include "DockAreaWidget.h" +#include "ResizeHandle.h" +#include "DockComponentsFactory.h" #include "AutoHideSideBar.h" #include "AutoHideTab.h" -#include "DockAreaWidget.h" -#include "DockComponentsFactory.h" -#include "DockManager.h" -#include "ResizeHandle.h" -#include "ads_globals.h" + + +#include namespace ads { @@ -53,439 +54,453 @@ static const int ResizeMargin = 30; //============================================================================ bool static isHorizontalArea(SideBarLocation Area) { - switch (Area) - { - case SideBarLocation::SideBarTop: - case SideBarLocation::SideBarBottom: return true; - case SideBarLocation::SideBarLeft: - case SideBarLocation::SideBarRight: return false; - default: return true; - } + switch (Area) + { + case SideBarLocation::SideBarTop: + case SideBarLocation::SideBarBottom: return true; + case SideBarLocation::SideBarLeft: + case SideBarLocation::SideBarRight: return false; + default: + return true; + } - return true; + return true; } + //============================================================================ Qt::Edge static edgeFromSideTabBarArea(SideBarLocation Area) { - switch (Area) - { - case SideBarLocation::SideBarTop: return Qt::BottomEdge; - case SideBarLocation::SideBarBottom: return Qt::TopEdge; - case SideBarLocation::SideBarLeft: return Qt::RightEdge; - case SideBarLocation::SideBarRight: return Qt::LeftEdge; - default: return Qt::LeftEdge; - } + switch (Area) + { + case SideBarLocation::SideBarTop: return Qt::BottomEdge; + case SideBarLocation::SideBarBottom: return Qt::TopEdge; + case SideBarLocation::SideBarLeft: return Qt::RightEdge; + case SideBarLocation::SideBarRight: return Qt::LeftEdge; + default: + return Qt::LeftEdge; + } - return Qt::LeftEdge; + return Qt::LeftEdge; } + //============================================================================ int resizeHandleLayoutPosition(SideBarLocation Area) { - switch (Area) - { - case SideBarLocation::SideBarBottom: - case SideBarLocation::SideBarRight: return 0; + switch (Area) + { + case SideBarLocation::SideBarBottom: + case SideBarLocation::SideBarRight: return 0; - case SideBarLocation::SideBarTop: - case SideBarLocation::SideBarLeft: return 1; + case SideBarLocation::SideBarTop: + case SideBarLocation::SideBarLeft: return 1; - default: return 0; - } + default: + return 0; + } - return 0; + return 0; } + /** * Private data of CAutoHideDockContainer - pimpl */ struct AutoHideDockContainerPrivate { CAutoHideDockContainer* _this; - CDockAreaWidget* DockArea{nullptr}; - CDockWidget* DockWidget{nullptr}; - SideBarLocation SideTabBarArea = SideBarNone; - QBoxLayout* Layout = nullptr; - CResizeHandle* ResizeHandle = nullptr; - QSize Size; // creates invalid size - QPointer SideTab; - QSize SizeCache; + CDockAreaWidget* DockArea{nullptr}; + CDockWidget* DockWidget{nullptr}; + SideBarLocation SideTabBarArea = SideBarNone; + QBoxLayout* Layout = nullptr; + CResizeHandle* ResizeHandle = nullptr; + QSize Size; // creates invalid size + QPointer SideTab; + QSize SizeCache; - /** - * Private data constructor - */ - AutoHideDockContainerPrivate(CAutoHideDockContainer* _public); + /** + * Private data constructor + */ + AutoHideDockContainerPrivate(CAutoHideDockContainer *_public); - /** - * Convenience function to get a dock widget area - */ - DockWidgetArea getDockWidgetArea(SideBarLocation area) - { + /** + * Convenience function to get a dock widget area + */ + DockWidgetArea getDockWidgetArea(SideBarLocation area) + { switch (area) { - case SideBarLocation::SideBarLeft: return LeftDockWidgetArea; - case SideBarLocation::SideBarRight: return RightDockWidgetArea; - case SideBarLocation::SideBarBottom: return BottomDockWidgetArea; - case SideBarLocation::SideBarTop: return TopDockWidgetArea; - default: return LeftDockWidgetArea; + case SideBarLocation::SideBarLeft: return LeftDockWidgetArea; + case SideBarLocation::SideBarRight: return RightDockWidgetArea; + case SideBarLocation::SideBarBottom: return BottomDockWidgetArea; + case SideBarLocation::SideBarTop: return TopDockWidgetArea; + default: + return LeftDockWidgetArea; } - return LeftDockWidgetArea; - } + return LeftDockWidgetArea; + } - /** - * Update the resize limit of the resize handle - */ - void updateResizeHandleSizeLimitMax() - { - auto Rect = _this->dockContainer()->contentRect(); - const auto maxResizeHandleSize = - ResizeHandle->orientation() == Qt::Horizontal ? Rect.width() : - Rect.height(); - ResizeHandle->setMaxResizeSize(maxResizeHandleSize - ResizeMargin); - } + /** + * Update the resize limit of the resize handle + */ + void updateResizeHandleSizeLimitMax() + { + auto Rect = _this->dockContainer()->contentRect(); + const auto maxResizeHandleSize = ResizeHandle->orientation() == Qt::Horizontal + ? Rect.width() : Rect.height(); + ResizeHandle->setMaxResizeSize(maxResizeHandleSize - ResizeMargin); + } - /** - * Convenience function to check, if this is an horizontal area - */ - bool isHorizontal() const { return isHorizontalArea(SideTabBarArea); } + /** + * Convenience function to check, if this is an horizontal area + */ + bool isHorizontal() const + { + return isHorizontalArea(SideTabBarArea); + } - /** - * Forward this event to the dock container - */ - void forwardEventToDockContainer(QEvent* event) - { - auto DockContainer = _this->dockContainer(); - if (DockContainer) - { - DockContainer->handleAutoHideWidgetEvent(event, _this); - } - } + /** + * Forward this event to the dock container + */ + void forwardEventToDockContainer(QEvent* event) + { + auto DockContainer = _this->dockContainer(); + if (DockContainer) + { + DockContainer->handleAutoHideWidgetEvent(event, _this); + } + } + +}; // struct AutoHideDockContainerPrivate -}; // struct AutoHideDockContainerPrivate //============================================================================ AutoHideDockContainerPrivate::AutoHideDockContainerPrivate( - CAutoHideDockContainer* _public) - : _this(_public) -{} + CAutoHideDockContainer *_public) : + _this(_public) +{ + +} + //============================================================================ CDockContainerWidget* CAutoHideDockContainer::dockContainer() const { - return internal::findParent(this); + return internal::findParent(this); } + //============================================================================ -CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, - SideBarLocation area, - CDockContainerWidget* parent) - : Super(parent), d(new AutoHideDockContainerPrivate(this)) +CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, SideBarLocation area, CDockContainerWidget* parent) : + Super(parent), + d(new AutoHideDockContainerPrivate(this)) { - hide(); // auto hide dock container is initially always hidden - d->SideTabBarArea = area; - d->SideTab = componentsFactory()->createDockWidgetSideTab(nullptr); - connect(d->SideTab, &CAutoHideTab::pressed, this, - &CAutoHideDockContainer::toggleCollapseState); - d->DockArea = new CDockAreaWidget(DockWidget->dockManager(), parent); - d->DockArea->setObjectName("autoHideDockArea"); - d->DockArea->setAutoHideDockContainer(this); + hide(); // auto hide dock container is initially always hidden + d->SideTabBarArea = area; + d->SideTab = componentsFactory()->createDockWidgetSideTab(nullptr); + connect(d->SideTab, &CAutoHideTab::pressed, this, &CAutoHideDockContainer::toggleCollapseState); + d->DockArea = new CDockAreaWidget(DockWidget->dockManager(), parent); + d->DockArea->setObjectName("autoHideDockArea"); + d->DockArea->setAutoHideDockContainer(this); - setObjectName("autoHideDockContainer"); + setObjectName("autoHideDockContainer"); - d->Layout = new QBoxLayout(isHorizontalArea(area) ? QBoxLayout::TopToBottom : - QBoxLayout::LeftToRight); - d->Layout->setContentsMargins(0, 0, 0, 0); - d->Layout->setSpacing(0); - setLayout(d->Layout); - d->ResizeHandle = new CResizeHandle(edgeFromSideTabBarArea(area), this); - d->ResizeHandle->setMinResizeSize(64); - bool OpaqueResize = - CDockManager::testConfigFlag(CDockManager::OpaqueSplitterResize); - d->ResizeHandle->setOpaqueResize(OpaqueResize); - d->Size = d->DockArea->size(); - d->SizeCache = DockWidget->size(); + d->Layout = new QBoxLayout(isHorizontalArea(area) ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight); + d->Layout->setContentsMargins(0, 0, 0, 0); + d->Layout->setSpacing(0); + setLayout(d->Layout); + d->ResizeHandle = new CResizeHandle(edgeFromSideTabBarArea(area), this); + d->ResizeHandle->setMinResizeSize(64); + bool OpaqueResize = CDockManager::testConfigFlag(CDockManager::OpaqueSplitterResize); + d->ResizeHandle->setOpaqueResize(OpaqueResize); + d->Size = d->DockArea->size(); + d->SizeCache = DockWidget->size(); - addDockWidget(DockWidget); - parent->registerAutoHideWidget(this); - // The dock area should not be added to the layout before it contains the - // dock widget. If you add it to the layout before it contains the dock widget - // then you will likely see this warning for OpenGL widgets or QAxWidgets: - // setGeometry: Unable to set geometry XxY+Width+Height on - // QWidgetWindow/'WidgetClassWindow - d->Layout->addWidget(d->DockArea); - d->Layout->insertWidget(resizeHandleLayoutPosition(area), d->ResizeHandle); + addDockWidget(DockWidget); + parent->registerAutoHideWidget(this); + // The dock area should not be added to the layout before it contains the + // dock widget. If you add it to the layout before it contains the dock widget + // then you will likely see this warning for OpenGL widgets or QAxWidgets: + // setGeometry: Unable to set geometry XxY+Width+Height on QWidgetWindow/'WidgetClassWindow + d->Layout->addWidget(d->DockArea); + d->Layout->insertWidget(resizeHandleLayoutPosition(area), d->ResizeHandle); } + //============================================================================ void CAutoHideDockContainer::updateSize() { - auto dockContainerParent = dockContainer(); - if (!dockContainerParent) - { - return; - } + auto dockContainerParent = dockContainer(); + if (!dockContainerParent) + { + return; + } - auto rect = dockContainerParent->contentRect(); - switch (sideBarLocation()) - { - case SideBarLocation::SideBarTop: - resize(rect.width(), - qMin(rect.height() - ResizeMargin, d->Size.height())); - move(rect.topLeft()); - break; + auto rect = dockContainerParent->contentRect(); + switch (sideBarLocation()) + { + case SideBarLocation::SideBarTop: + resize(rect.width(), qMin(rect.height() - ResizeMargin, d->Size.height())); + move(rect.topLeft()); + break; - case SideBarLocation::SideBarLeft: - resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); - move(rect.topLeft()); - break; + case SideBarLocation::SideBarLeft: + resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); + move(rect.topLeft()); + break; - case SideBarLocation::SideBarRight: - { - resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); - QPoint p = rect.topRight(); - p.rx() -= (width() - 1); - move(p); - } - break; + case SideBarLocation::SideBarRight: + { + resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); + QPoint p = rect.topRight(); + p.rx() -= (width() - 1); + move(p); + } + break; - case SideBarLocation::SideBarBottom: - { - resize(rect.width(), - qMin(rect.height() - ResizeMargin, d->Size.height())); - QPoint p = rect.bottomLeft(); - p.ry() -= (height() - 1); - move(p); - } - break; + case SideBarLocation::SideBarBottom: + { + resize(rect.width(), qMin(rect.height() - ResizeMargin, d->Size.height())); + QPoint p = rect.bottomLeft(); + p.ry() -= (height() - 1); + move(p); + } + break; - default: break; - } + default: + break; + } - if (orientation() == Qt::Horizontal) - { - d->SizeCache.setHeight(this->height()); - } - else - { - d->SizeCache.setWidth(this->width()); - } + if (orientation() == Qt::Horizontal) + { + d->SizeCache.setHeight(this->height()); + } + else + { + d->SizeCache.setWidth(this->width()); + } } //============================================================================ CAutoHideDockContainer::~CAutoHideDockContainer() { - ADS_PRINT("~CAutoHideDockContainer"); + ADS_PRINT("~CAutoHideDockContainer"); - // Remove event filter in case there are any queued messages - qApp->removeEventFilter(this); - if (dockContainer()) - { - dockContainer()->removeAutoHideWidget(this); - } + // Remove event filter in case there are any queued messages + qApp->removeEventFilter(this); + if (dockContainer()) + { + dockContainer()->removeAutoHideWidget(this); + } - if (d->SideTab) - { - delete d->SideTab; - } + if (d->SideTab) + { + delete d->SideTab; + } - delete d; + delete d; } //============================================================================ CAutoHideSideBar* CAutoHideDockContainer::autoHideSideBar() const { - if (d->SideTab) - { - return d->SideTab->sideBar(); - } - else - { - auto DockContainer = dockContainer(); - return DockContainer ? DockContainer->autoHideSideBar(d->SideTabBarArea) : - nullptr; - } + if (d->SideTab) + { + return d->SideTab->sideBar(); + } + else + { + auto DockContainer = dockContainer(); + return DockContainer ? DockContainer->autoHideSideBar(d->SideTabBarArea) : nullptr; + } } + //============================================================================ CAutoHideTab* CAutoHideDockContainer::autoHideTab() const { - return d->SideTab; + return d->SideTab; } + //============================================================================ CDockWidget* CAutoHideDockContainer::dockWidget() const { - return d->DockWidget; + return d->DockWidget; } //============================================================================ void CAutoHideDockContainer::addDockWidget(CDockWidget* DockWidget) { - if (d->DockWidget) - { - // Remove the old dock widget at this area + if (d->DockWidget) + { + // Remove the old dock widget at this area d->DockArea->removeDockWidget(d->DockWidget); - } + } - d->DockWidget = DockWidget; - d->SideTab->setDockWidget(DockWidget); + d->DockWidget = DockWidget; + d->SideTab->setDockWidget(DockWidget); CDockAreaWidget* OldDockArea = DockWidget->dockAreaWidget(); auto IsRestoringState = DockWidget->dockManager()->isRestoringState(); if (OldDockArea && !IsRestoringState) { - // The initial size should be a little bit bigger than the original dock - // area size to prevent that the resize handle of this auto hid dock area - // is near of the splitter of the old dock area. - d->Size = OldDockArea->size() + QSize(16, 16); + // The initial size should be a little bit bigger than the original dock + // area size to prevent that the resize handle of this auto hid dock area + // is near of the splitter of the old dock area. + d->Size = OldDockArea->size() + QSize(16, 16); OldDockArea->removeDockWidget(DockWidget); } - d->DockArea->addDockWidget(DockWidget); - updateSize(); - // The dock area is not visible and will not update the size when updateSize() - // is called for this auto hide container. Therefore we explicitly resize - // it here. As soon as it will become visible, it will get the right size + d->DockArea->addDockWidget(DockWidget); + updateSize(); + // The dock area is not visible and will not update the size when updateSize() + // is called for this auto hide container. Therefore we explicitly resize + // it here. As soon as it will become visible, it will get the right size d->DockArea->resize(size()); } + //============================================================================ SideBarLocation CAutoHideDockContainer::sideBarLocation() const { - return d->SideTabBarArea; + return d->SideTabBarArea; } + //============================================================================ void CAutoHideDockContainer::setSideBarLocation(SideBarLocation SideBarLocation) { - if (d->SideTabBarArea == SideBarLocation) - { - return; - } + if (d->SideTabBarArea == SideBarLocation) + { + return; + } - d->SideTabBarArea = SideBarLocation; - d->Layout->removeWidget(d->ResizeHandle); - d->Layout->setDirection(isHorizontalArea(SideBarLocation) ? - QBoxLayout::TopToBottom : - QBoxLayout::LeftToRight); - d->Layout->insertWidget(resizeHandleLayoutPosition(SideBarLocation), - d->ResizeHandle); - d->ResizeHandle->setHandlePosition(edgeFromSideTabBarArea(SideBarLocation)); + d->SideTabBarArea = SideBarLocation; + d->Layout->removeWidget(d->ResizeHandle); + d->Layout->setDirection(isHorizontalArea(SideBarLocation) ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight); + d->Layout->insertWidget(resizeHandleLayoutPosition(SideBarLocation), d->ResizeHandle); + d->ResizeHandle->setHandlePosition(edgeFromSideTabBarArea(SideBarLocation)); internal::repolishStyle(this, internal::RepolishDirectChildren); } + //============================================================================ CDockAreaWidget* CAutoHideDockContainer::dockAreaWidget() const { - return d->DockArea; + return d->DockArea; } //============================================================================ void CAutoHideDockContainer::moveContentsToParent() { - cleanupAndDelete(); - // If we unpin the auto hide dock widget, then we insert it into the same - // location like it had as a auto hide widget. This brings the least surprise - // to the user and he does not have to search where the widget was inserted. - d->DockWidget->setDockArea(nullptr); - auto DockContainer = dockContainer(); - DockContainer->addDockWidget(d->getDockWidgetArea(d->SideTabBarArea), - d->DockWidget); + cleanupAndDelete(); + // If we unpin the auto hide dock widget, then we insert it into the same + // location like it had as a auto hide widget. This brings the least surprise + // to the user and he does not have to search where the widget was inserted. + d->DockWidget->setDockArea(nullptr); + auto DockContainer = dockContainer(); + DockContainer->addDockWidget(d->getDockWidgetArea(d->SideTabBarArea), d->DockWidget); } + //============================================================================ void CAutoHideDockContainer::cleanupAndDelete() { - const auto dockWidget = d->DockWidget; - if (dockWidget) - { - auto SideTab = d->SideTab; + const auto dockWidget = d->DockWidget; + if (dockWidget) + { + + auto SideTab = d->SideTab; SideTab->removeFromSideBar(); SideTab->setParent(nullptr); SideTab->hide(); - } + } - hide(); - deleteLater(); + hide(); + deleteLater(); } + //============================================================================ void CAutoHideDockContainer::saveState(QXmlStreamWriter& s) { - s.writeStartElement("Widget"); - s.writeAttribute("Name", d->DockWidget->objectName()); - s.writeAttribute("Closed", - QString::number(d->DockWidget->isClosed() ? 1 : 0)); - s.writeAttribute( - "Size", - QString::number(d->isHorizontal() ? d->Size.height() : d->Size.width())); - s.writeEndElement(); + s.writeStartElement("Widget"); + s.writeAttribute("Name", d->DockWidget->objectName()); + s.writeAttribute("Closed", QString::number(d->DockWidget->isClosed() ? 1 : 0)); + s.writeAttribute("Size", QString::number(d->isHorizontal() ? d->Size.height() : d->Size.width())); + s.writeEndElement(); } + //============================================================================ void CAutoHideDockContainer::toggleView(bool Enable) { - if (Enable) - { + if (Enable) + { if (d->SideTab) { d->SideTab->show(); } - } - else - { + } + else + { if (d->SideTab) { d->SideTab->hide(); } hide(); qApp->removeEventFilter(this); - } + } } + //============================================================================ void CAutoHideDockContainer::collapseView(bool Enable) { - if (Enable) - { - hide(); - qApp->removeEventFilter(this); - } - else - { - updateSize(); - d->updateResizeHandleSizeLimitMax(); - raise(); - show(); - d->DockWidget->dockManager()->setDockWidgetFocused(d->DockWidget); - qApp->installEventFilter(this); - } + if (Enable) + { + hide(); + qApp->removeEventFilter(this); + } + else + { + updateSize(); + d->updateResizeHandleSizeLimitMax(); + raise(); + show(); + d->DockWidget->dockManager()->setDockWidgetFocused(d->DockWidget); + qApp->installEventFilter(this); + } - ADS_PRINT("CAutoHideDockContainer::collapseView " << Enable); + ADS_PRINT("CAutoHideDockContainer::collapseView " << Enable); d->SideTab->updateStyle(); } + //============================================================================ void CAutoHideDockContainer::toggleCollapseState() { - collapseView(isVisible()); + collapseView(isVisible()); } + //============================================================================ void CAutoHideDockContainer::setSize(int Size) { - if (d->isHorizontal()) - { - d->Size.setHeight(Size); - } - else - { - d->Size.setWidth(Size); - } + if (d->isHorizontal()) + { + d->Size.setHeight(Size); + } + else + { + d->Size.setWidth(Size); + } - updateSize(); + updateSize(); } + //============================================================================ /** * Returns true if the object given in ancestor is an ancestor of the object @@ -508,128 +523,138 @@ static bool objectIsAncestorOf(const QObject* descendant, const QObject* ancesto return false; } + //============================================================================ /** * Returns true if the object given in ancestor is the object given in descendant * or if it is an ancestor of the object given in descendant */ -static bool isObjectOrAncestor(const QObject* descendant, const QObject* ancestor) +static bool isObjectOrAncestor(const QObject *descendant, const QObject *ancestor) { - if (ancestor && (descendant == ancestor)) - { - return true; - } - else - { - return objectIsAncestorOf(descendant, ancestor); - } + if (ancestor && (descendant == ancestor)) + { + return true; + } + else + { + return objectIsAncestorOf(descendant, ancestor); + } } + //============================================================================ bool CAutoHideDockContainer::eventFilter(QObject* watched, QEvent* event) { - // A switch case statement would be nicer here, but we cannot use - // internal::FloatingWidgetDragStartEvent in a switch case + // A switch case statement would be nicer here, but we cannot use + // internal::FloatingWidgetDragStartEvent in a switch case if (event->type() == QEvent::Resize) - { - if (!d->ResizeHandle->isResizing()) - { - updateSize(); - } - } - else if (event->type() == QEvent::MouseButtonPress) - { - auto widget = qobject_cast(watched); - // Ignore non widget events - if (!widget) - { - return Super::eventFilter(watched, event); - } + { + if (!d->ResizeHandle->isResizing()) + { + updateSize(); + } + } + else if (event->type() == QEvent::MouseButtonPress) + { + auto widget = qobject_cast(watched); + // Ignore non widget events + if (!widget) + { + return Super::eventFilter(watched, event); + } - // Now check, if the user clicked into the side tab and ignore this event, - // because the side tab click handler will call collapseView(). If we - // do not ignore this here, then we will collapse the container and the - // side tab click handler will uncollapse it - if (widget == d->SideTab.data()) - { - return Super::eventFilter(watched, event); - } + // Now check, if the user clicked into the side tab and ignore this event, + // because the side tab click handler will call collapseView(). If we + // do not ignore this here, then we will collapse the container and the side tab + // click handler will uncollapse it + if (widget == d->SideTab.data()) + { + return Super::eventFilter(watched, event); + } - // Now we check, if the user clicked inside of this auto hide container. - // If the click is inside of this auto hide container, then we can - // ignore the event, because the auto hide overlay should not get - // collapsed if user works in it - if (isObjectOrAncestor(widget, this)) - { - return Super::eventFilter(watched, event); - } + // Now we check, if the user clicked inside of this auto hide container. + // If the click is inside of this auto hide container, then we can + // ignore the event, because the auto hide overlay should not get collapsed if + // user works in it + if (isObjectOrAncestor(widget, this)) + { + return Super::eventFilter(watched, event); + } - // Ignore the mouse click if it is not inside of this container - if (!isObjectOrAncestor(widget, dockContainer())) - { - return Super::eventFilter(watched, event); - } + // Ignore the mouse click if it is not inside of this container + if (!isObjectOrAncestor(widget, dockContainer())) + { + return Super::eventFilter(watched, event); + } - // user clicked into container - collapse the auto hide widget - collapseView(true); - } + // user clicked into container - collapse the auto hide widget + collapseView(true); + } else if (event->type() == internal::FloatingWidgetDragStartEvent) { - // If we are dragging our own floating widget, the we do not need to - // collapse the view - auto FloatingWidget = dockContainer()->floatingWidget(); - if (FloatingWidget != watched) - { - collapseView(true); - } + // If we are dragging our own floating widget, the we do not need to + // collapse the view + auto FloatingWidget = dockContainer()->floatingWidget(); + if (FloatingWidget != watched) + { + collapseView(true); + } } else if (event->type() == internal::DockedWidgetDragStartEvent) { - collapseView(true); + collapseView(true); } - return Super::eventFilter(watched, event); + return Super::eventFilter(watched, event); } + //============================================================================ void CAutoHideDockContainer::resizeEvent(QResizeEvent* event) { Super::resizeEvent(event); - if (d->ResizeHandle->isResizing()) - { + if (d->ResizeHandle->isResizing()) + { d->Size = this->size(); - d->updateResizeHandleSizeLimitMax(); - } + d->updateResizeHandleSizeLimitMax(); + } } + //============================================================================ -void CAutoHideDockContainer::leaveEvent(QEvent* event) +void CAutoHideDockContainer::leaveEvent(QEvent *event) { - // Resizing of the dock container via the resize handle in non opaque mode - // mays cause a leave event that is not really a leave event. Therefore - // we check here, if we are really outside of our rect. - auto pos = mapFromGlobal(QCursor::pos()); - if (!rect().contains(pos)) - { - d->forwardEventToDockContainer(event); - } - Super::leaveEvent(event); + // Resizing of the dock container via the resize handle in non opaque mode + // mays cause a leave event that is not really a leave event. Therefore + // we check here, if we are really outside of our rect. + auto pos = mapFromGlobal(QCursor::pos()); + if (!rect().contains(pos)) + { + d->forwardEventToDockContainer(event); + } + Super::leaveEvent(event); } + //============================================================================ bool CAutoHideDockContainer::event(QEvent* event) { - switch (event->type()) - { - case QEvent::Enter: - case QEvent::Hide: d->forwardEventToDockContainer(event); break; + switch (event->type()) + { + case QEvent::Enter: + case QEvent::Hide: + d->forwardEventToDockContainer(event); + break; - case QEvent::MouseButtonPress: return true; break; + case QEvent::MouseButtonPress: + return true; + break; - default: break; - } + default: + break; + } - return Super::event(event); + return Super::event(event); } //============================================================================ @@ -645,49 +670,51 @@ void CAutoHideDockContainer::dragLeaveEvent(QDragLeaveEvent*) //============================================================================ Qt::Orientation CAutoHideDockContainer::orientation() const { - return ads::internal::isHorizontalSideBarLocation(d->SideTabBarArea) ? - Qt::Horizontal : - Qt::Vertical; + return ads::internal::isHorizontalSideBarLocation(d->SideTabBarArea) + ? Qt::Horizontal : Qt::Vertical; } + //============================================================================ void CAutoHideDockContainer::resetToInitialDockWidgetSize() { - if (orientation() == Qt::Horizontal) - { - setSize(d->SizeCache.height()); - } - else - { - setSize(d->SizeCache.width()); - } + if (orientation() == Qt::Horizontal) + { + setSize(d->SizeCache.height()); + } + else + { + setSize(d->SizeCache.width()); + } } + //============================================================================ -void CAutoHideDockContainer::moveToNewSideBarLocation( - SideBarLocation NewSideBarLocation, int TabIndex) +void CAutoHideDockContainer::moveToNewSideBarLocation(SideBarLocation NewSideBarLocation, + int TabIndex) { - if (NewSideBarLocation == sideBarLocation() && TabIndex == this->tabIndex()) - { - return; - } + if (NewSideBarLocation == sideBarLocation() && TabIndex == this->tabIndex()) + { + return; + } - auto OldOrientation = orientation(); - auto SideBar = dockContainer()->autoHideSideBar(NewSideBarLocation); - SideBar->addAutoHideWidget(this, TabIndex); - // If we move a horizontal auto hide container to a vertical position - // then we resize it to the original dock widget size, to avoid - // an extremely stretched dock widget after insertion - if (SideBar->orientation() != OldOrientation) - { - resetToInitialDockWidgetSize(); - } + auto OldOrientation = orientation(); + auto SideBar = dockContainer()->autoHideSideBar(NewSideBarLocation); + SideBar->addAutoHideWidget(this, TabIndex); + // If we move a horizontal auto hide container to a vertical position + // then we resize it to the original dock widget size, to avoid + // an extremely stretched dock widget after insertion + if (SideBar->orientation() != OldOrientation) + { + resetToInitialDockWidgetSize(); + } } + //============================================================================ int CAutoHideDockContainer::tabIndex() const { - return d->SideTab->tabIndex(); + return d->SideTab->tabIndex(); } -} // namespace ads +} From a13ed7e4d6c8c115a24d61add01d71e6f446b522 Mon Sep 17 00:00:00 2001 From: TheBoje <47856523+TheBoje@users.noreply.github.com> Date: Tue, 22 Oct 2024 22:36:53 +0200 Subject: [PATCH 06/24] Add AutoHideDragNDrop example --- CMakeLists.txt | 2 +- doc/user-guide.md | 2 +- examples/CMakeLists.txt | 3 +- examples/autohidedragndrop/CMakeLists.txt | 29 +++++ .../autohidedragndrop/autohidedragndrop.pro | 36 ++++++ examples/autohidedragndrop/droppableitem.cpp | 37 ++++++ examples/autohidedragndrop/droppableitem.h | 19 +++ examples/autohidedragndrop/main.cpp | 10 ++ examples/autohidedragndrop/main.py | 84 +++++++++++++ examples/autohidedragndrop/mainwindow.cpp | 116 ++++++++++++++++++ examples/autohidedragndrop/mainwindow.h | 43 +++++++ examples/autohidedragndrop/mainwindow.ui | 47 +++++++ 12 files changed, 425 insertions(+), 3 deletions(-) create mode 100644 examples/autohidedragndrop/CMakeLists.txt create mode 100644 examples/autohidedragndrop/autohidedragndrop.pro create mode 100644 examples/autohidedragndrop/droppableitem.cpp create mode 100644 examples/autohidedragndrop/droppableitem.h create mode 100644 examples/autohidedragndrop/main.cpp create mode 100644 examples/autohidedragndrop/main.py create mode 100644 examples/autohidedragndrop/mainwindow.cpp create mode 100644 examples/autohidedragndrop/mainwindow.h create mode 100644 examples/autohidedragndrop/mainwindow.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 29ca64f..00d0f0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.5) - +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if (POLICY CMP0091) cmake_policy(SET CMP0091 NEW) endif (POLICY CMP0091) diff --git a/doc/user-guide.md b/doc/user-guide.md index 4edf7a6..024c5e4 100644 --- a/doc/user-guide.md +++ b/doc/user-guide.md @@ -712,7 +712,7 @@ If this flag is set (disabled by default), then holding a dragging cursor hover ![AutoHideOpenOnDragHover](cfg_flag_AutoHideOpenOnDragHover.gif) -Said dock must be set to accept drops to hide when cursor leaves its scope. +Said dock must be set to accept drops to hide when cursor leaves its scope. See `AutoHideDragNDropExample` for more details. ## DockWidget Feature Flags diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ba2a064..8da1f33 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -6,5 +6,6 @@ add_subdirectory(sidebar) add_subdirectory(deleteonclose) add_subdirectory(centralwidget) add_subdirectory(autohide) +add_subdirectory(autohidedragndrop) add_subdirectory(emptydockarea) -add_subdirectory(dockindock) \ No newline at end of file +add_subdirectory(dockindock) diff --git a/examples/autohidedragndrop/CMakeLists.txt b/examples/autohidedragndrop/CMakeLists.txt new file mode 100644 index 0000000..3b8f077 --- /dev/null +++ b/examples/autohidedragndrop/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required(VERSION 3.5) +project(ads_example_autohide_dragndrop VERSION ${VERSION_SHORT}) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +add_executable(AutoHideDragNDropExample WIN32 + main.cpp + mainwindow.cpp + mainwindow.ui + droppableitem.cpp +) +target_include_directories(AutoHideDragNDropExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") +target_link_libraries(AutoHideDragNDropExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(AutoHideDragNDropExample PUBLIC Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Widgets) +set_target_properties(AutoHideDragNDropExample PROPERTIES + AUTOMOC ON + AUTORCC ON + AUTOUIC ON + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS OFF + VERSION ${VERSION_SHORT} + EXPORT_NAME "Qt Advanced Docking System Auto Hide With Drag N Drop Example" + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/bin" +) diff --git a/examples/autohidedragndrop/autohidedragndrop.pro b/examples/autohidedragndrop/autohidedragndrop.pro new file mode 100644 index 0000000..ce86127 --- /dev/null +++ b/examples/autohidedragndrop/autohidedragndrop.pro @@ -0,0 +1,36 @@ +ADS_OUT_ROOT = $${OUT_PWD}/../.. + +QT += core gui widgets + +TARGET = AutoHideDragNDropExample +DESTDIR = $${ADS_OUT_ROOT}/lib +TEMPLATE = app +CONFIG += c++14 +CONFIG += debug_and_release +adsBuildStatic { + DEFINES += ADS_STATIC +} + +# The following define makes your compiler emit warnings if you use +# any Qt feature that has been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +SOURCES += \ + main.cpp \ + mainwindow.cpp \ + droppableitem.cpp + +HEADERS += \ + mainwindow.h + droppableitem.h + +FORMS += \ + mainwindow.ui + +LIBS += -L$${ADS_OUT_ROOT}/lib +include(../../ads.pri) +INCLUDEPATH += ../../src +DEPENDPATH += ../../src + diff --git a/examples/autohidedragndrop/droppableitem.cpp b/examples/autohidedragndrop/droppableitem.cpp new file mode 100644 index 0000000..390c1b8 --- /dev/null +++ b/examples/autohidedragndrop/droppableitem.cpp @@ -0,0 +1,37 @@ +#include "droppableitem.h" + +#include +#include +#include +#include +#include + +DroppableItem::DroppableItem(const QString& text, QWidget* parent) + : QPushButton(text, parent) +{ + setAcceptDrops(true); + setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding); +} + +void DroppableItem::dragEnterEvent(QDragEnterEvent* event) +{ + if (event->mimeData()->hasText()) + { + event->acceptProposedAction(); + setCursor(Qt::DragMoveCursor); + } +} + +void DroppableItem::dragLeaveEvent(QDragLeaveEvent* event) +{ + unsetCursor(); +} + +void DroppableItem::dropEvent(QDropEvent* event) +{ + if (event->mimeData()->hasText()) + { + event->acceptProposedAction(); + setText(event->mimeData()->text()); + } +} diff --git a/examples/autohidedragndrop/droppableitem.h b/examples/autohidedragndrop/droppableitem.h new file mode 100644 index 0000000..a8fcd91 --- /dev/null +++ b/examples/autohidedragndrop/droppableitem.h @@ -0,0 +1,19 @@ +#include +#include + +class QDragEnterEvent; +class QDragLeaveEvent; +class QDropEvent; + +class DroppableItem : public QPushButton +{ + Q_OBJECT; + +public: + DroppableItem(const QString& text = QString(), QWidget* parent = nullptr); + +protected: + void dragEnterEvent(QDragEnterEvent* event) override; + void dragLeaveEvent(QDragLeaveEvent* event) override; + void dropEvent(QDropEvent* event) override; +}; diff --git a/examples/autohidedragndrop/main.cpp b/examples/autohidedragndrop/main.cpp new file mode 100644 index 0000000..fa4c4fd --- /dev/null +++ b/examples/autohidedragndrop/main.cpp @@ -0,0 +1,10 @@ +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + CMainWindow w; + w.show(); + return a.exec(); +} diff --git a/examples/autohidedragndrop/main.py b/examples/autohidedragndrop/main.py new file mode 100644 index 0000000..4ec084b --- /dev/null +++ b/examples/autohidedragndrop/main.py @@ -0,0 +1,84 @@ +import os +import sys + +from PyQt5 import uic +from PyQt5.QtCore import Qt, QTimer, QDir, QSignalBlocker +from PyQt5.QtGui import QCloseEvent, QIcon +from PyQt5.QtWidgets import (QApplication, QLabel, QCalendarWidget, QFrame, QTreeView, + QTableWidget, QFileSystemModel, QPlainTextEdit, QToolBar, + QWidgetAction, QComboBox, QAction, QSizePolicy, QInputDialog) + +import PyQtAds as QtAds + +UI_FILE = os.path.join(os.path.dirname(__file__), 'mainwindow.ui') +MainWindowUI, MainWindowBase = uic.loadUiType(UI_FILE) + +class MainWindow(MainWindowUI, MainWindowBase): + + def __init__(self, parent=None): + super().__init__(parent) + + self.setupUi(self) + + QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.OpaqueSplitterResize, True) + QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.XmlCompressionEnabled, False) + QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.FocusHighlighting, True) + QtAds.CDockManager.setAutoHideConfigFlag(QtAds.CDockManager.AutoHideOpenOnDragHover, True); + self.dock_manager = QtAds.CDockManager(self) + + # Set central widget + text_edit = QPlainTextEdit() + text_edit.setPlaceholderText("This is the central editor. Enter your text here.") + central_dock_widget = QtAds.CDockWidget("CentralWidget") + central_dock_widget.setWidget(text_edit) + central_dock_area = self.dock_manager.setCentralWidget(central_dock_widget) + central_dock_area.setAllowedAreas(QtAds.DockWidgetArea.OuterDockAreas) + + + droppable_item = DroppableItem("Drop text here.") + drop_dock_widget = QtAds.CDockWidget("Tab") + drop_dock_widget.setWidget(droppable_item) + drop_dock_widget.setMinimumSizeHintMode(QtAds.CDockWidget.MinimumSizeHintFromDockWidget) + drop_dock_widget.setMinimumSize(200, 150) + drop_dock_widget.setAcceptDrops(True) + drop_area = self.dock_manager.addDockWidget(QtAds.DockWidgetArea.LeftDockWidgetArea, drop_dock_widget) + drop_area.setAcceptDrops(True) + self.menuView.addAction(drop_dock_widget.toggleViewAction()) + + self.create_perspective_ui() + + def create_perspective_ui(self): + save_perspective_action = QAction("Create Perspective", self) + save_perspective_action.triggered.connect(self.save_perspective) + perspective_list_action = QWidgetAction(self) + self.perspective_combobox = QComboBox(self) + self.perspective_combobox.setSizeAdjustPolicy(QComboBox.AdjustToContents) + self.perspective_combobox.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) + self.perspective_combobox.activated[str].connect(self.dock_manager.openPerspective) + perspective_list_action.setDefaultWidget(self.perspective_combobox) + self.toolBar.addSeparator() + self.toolBar.addAction(perspective_list_action) + self.toolBar.addAction(save_perspective_action) + + def save_perspective(self): + perspective_name, ok = QInputDialog.getText(self, "Save Perspective", "Enter Unique name:") + if not ok or not perspective_name: + return + + self.dock_manager.addPerspective(perspective_name) + blocker = QSignalBlocker(self.perspective_combobox) + self.perspective_combobox.clear() + self.perspective_combobox.addItems(self.dock_manager.perspectiveNames()) + self.perspective_combobox.setCurrentText(perspective_name) + + def closeEvent(self, event: QCloseEvent): + self.dock_manager.deleteLater() + super().closeEvent(event) + + +if __name__ == '__main__': + app = QApplication(sys.argv) + + w = MainWindow() + w.show() + app.exec_() diff --git a/examples/autohidedragndrop/mainwindow.cpp b/examples/autohidedragndrop/mainwindow.cpp new file mode 100644 index 0000000..6443b35 --- /dev/null +++ b/examples/autohidedragndrop/mainwindow.cpp @@ -0,0 +1,116 @@ +#include "mainwindow.h" +#include "droppableitem.h" + +#include "ui_mainwindow.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AutoHideDockContainer.h" +#include "DockAreaWidget.h" +#include "DockAreaTitleBar.h" + +using namespace ads; + +CMainWindow::CMainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::CMainWindow) +{ + ui->setupUi(this); + CDockManager::setConfigFlag(CDockManager::OpaqueSplitterResize, true); + CDockManager::setConfigFlag(CDockManager::XmlCompressionEnabled, false); + CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); + CDockManager::setAutoHideConfigFlags(CDockManager::DefaultAutoHideConfig); + CDockManager::setAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover, true); + DockManager = new CDockManager(this); + + // Set central widget + QPlainTextEdit* w = new QPlainTextEdit(); + w->setPlaceholderText("This is the central editor. Enter your text here."); + CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget"); + CentralDockWidget->setWidget(w); + auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget); + CentralDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas); + + DroppableItem* droppableItem = new DroppableItem("Drop text here."); + CDockWidget* dropDockWidget = new CDockWidget("Tab"); + dropDockWidget->setWidget(droppableItem); + dropDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget); + dropDockWidget->setMinimumSize(200,150); + dropDockWidget->setAcceptDrops(true); + const auto autoHideContainer = DockManager->addAutoHideDockWidget(SideBarLocation::SideBarLeft, dropDockWidget); + autoHideContainer->setSize(480); + autoHideContainer->setAcceptDrops(true); + ui->menuView->addAction(dropDockWidget->toggleViewAction()); + + QTableWidget* propertiesTable = new QTableWidget(); + propertiesTable->setColumnCount(3); + propertiesTable->setRowCount(10); + CDockWidget* PropertiesDockWidget = new CDockWidget("Properties"); + PropertiesDockWidget->setWidget(propertiesTable); + PropertiesDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget); + PropertiesDockWidget->resize(250, 150); + PropertiesDockWidget->setMinimumSize(200,150); + DockManager->addDockWidget(DockWidgetArea::RightDockWidgetArea, PropertiesDockWidget, CentralDockArea); + ui->menuView->addAction(PropertiesDockWidget->toggleViewAction()); + + createPerspectiveUi(); +} + +CMainWindow::~CMainWindow() +{ + delete ui; +} + + +void CMainWindow::createPerspectiveUi() +{ + SavePerspectiveAction = new QAction("Create Perspective", this); + connect(SavePerspectiveAction, SIGNAL(triggered()), SLOT(savePerspective())); + PerspectiveListAction = new QWidgetAction(this); + PerspectiveComboBox = new QComboBox(this); + PerspectiveComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); + PerspectiveComboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + connect(PerspectiveComboBox, SIGNAL(currentTextChanged(const QString&)), + DockManager, SLOT(openPerspective(const QString&))); + PerspectiveListAction->setDefaultWidget(PerspectiveComboBox); + ui->toolBar->addSeparator(); + ui->toolBar->addAction(PerspectiveListAction); + ui->toolBar->addAction(SavePerspectiveAction); +} + + +void CMainWindow::savePerspective() +{ + QString PerspectiveName = QInputDialog::getText(this, "Save Perspective", "Enter unique name:"); + if (PerspectiveName.isEmpty()) + { + return; + } + + DockManager->addPerspective(PerspectiveName); + QSignalBlocker Blocker(PerspectiveComboBox); + PerspectiveComboBox->clear(); + PerspectiveComboBox->addItems(DockManager->perspectiveNames()); + PerspectiveComboBox->setCurrentText(PerspectiveName); +} + + +//============================================================================ +void CMainWindow::closeEvent(QCloseEvent* event) +{ + // Delete dock manager here to delete all floating widgets. This ensures + // that all top level windows of the dock manager are properly closed + DockManager->deleteLater(); + QMainWindow::closeEvent(event); +} + + + diff --git a/examples/autohidedragndrop/mainwindow.h b/examples/autohidedragndrop/mainwindow.h new file mode 100644 index 0000000..75869da --- /dev/null +++ b/examples/autohidedragndrop/mainwindow.h @@ -0,0 +1,43 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include + +#include "DockManager.h" +#include "DockAreaWidget.h" +#include "DockWidget.h" + +QT_BEGIN_NAMESPACE +namespace Ui { class CMainWindow; } +QT_END_NAMESPACE + +class CMainWindow : public QMainWindow +{ + Q_OBJECT + +public: + CMainWindow(QWidget *parent = nullptr); + ~CMainWindow(); + +protected: + virtual void closeEvent(QCloseEvent* event) override; + +private: + QAction* SavePerspectiveAction = nullptr; + QWidgetAction* PerspectiveListAction = nullptr; + QComboBox* PerspectiveComboBox = nullptr; + + Ui::CMainWindow *ui; + + ads::CDockManager* DockManager; + ads::CDockAreaWidget* StatusDockArea; + ads::CDockWidget* TimelineDockWidget; + + void createPerspectiveUi(); + +private slots: + void savePerspective(); +}; +#endif // MAINWINDOW_H diff --git a/examples/autohidedragndrop/mainwindow.ui b/examples/autohidedragndrop/mainwindow.ui new file mode 100644 index 0000000..f7d3b09 --- /dev/null +++ b/examples/autohidedragndrop/mainwindow.ui @@ -0,0 +1,47 @@ + + + CMainWindow + + + + 0 + 0 + 1284 + 757 + + + + MainWindow + + + + + + 0 + 0 + 1284 + 21 + + + + + View + + + + + + + toolBar + + + TopToolBarArea + + + false + + + + + + From eb9b439d115e145a89ee8e70b06b916f346d252e Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Mon, 28 Oct 2024 15:30:29 +0100 Subject: [PATCH 07/24] Added support for setting config parameters to CDockManager --- src/DockManager.cpp | 16 ++++++++++++++++ src/DockManager.h | 20 ++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 06ed8cd..e7aabb3 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -48,6 +48,7 @@ #include #include #include +#include #include "FloatingDockContainer.h" #include "DockOverlay.h" @@ -94,6 +95,7 @@ enum eStateFileVersion static CDockManager::ConfigFlags StaticConfigFlags = CDockManager::DefaultNonOpaqueConfig; static CDockManager::AutoHideFlags StaticAutoHideConfigFlags; // auto hide feature is disabled by default +static QVector StaticConfigParams(CDockManager::ConfigParamCount); static QString FloatingContainersTitle; @@ -1475,6 +1477,20 @@ CDockWidget::DockWidgetFeatures CDockManager::globallyLockedDockWidgetFeatures() } +//=========================================================================== +void CDockManager::setConfigParam(CDockManager::eConfigParam Param, QVariant Value) +{ + StaticConfigParams[Param] = Value; +} + + +//=========================================================================== +QVariant CDockManager::configParam(eConfigParam Param, QVariant Default) +{ + return StaticConfigParams[Param].isValid() ? StaticConfigParams[Param] : Default; +} + + } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockManager.h b/src/DockManager.h index e56e9ac..9edb8e8 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -263,6 +263,15 @@ public: }; Q_DECLARE_FLAGS(AutoHideFlags, eAutoHideFlag) + /** + * Global configuration parameters that you can set via setConfigParam() + */ + enum eConfigParam + { + AutoHideOpenOnDragHoverDelay_ms, ///< Delay in ms before the dock opens on drag hover if AutoHideOpenOnDragHover flag is set + ConfigParamCount // just a delimiter to count number of config params + }; + /** * Default Constructor. @@ -324,6 +333,17 @@ public: */ static bool testAutoHideConfigFlag(eAutoHideFlag Flag); + /** + * Sets the value for the given config parameter + */ + static void setConfigParam(eConfigParam Param, QVariant Value); + + /** + * Returns the value for the given config parameter or the default value + * if the parameter is not set. + */ + static QVariant configParam(eConfigParam Param, QVariant Default); + /** * Returns the global icon provider. * The icon provider enables the use of custom icons in case using From f964ce2c68c72f3d54c61d2993346a40cb6bb88e Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Mon, 28 Oct 2024 15:39:29 +0100 Subject: [PATCH 08/24] Refactored, fixed and improved drag hover functionality --- src/AutoHideDockContainer.cpp | 3 +- src/AutoHideTab.cpp | 154 ++++++++++++++++++++-------------- src/AutoHideTab.h | 2 +- 3 files changed, 91 insertions(+), 68 deletions(-) diff --git a/src/AutoHideDockContainer.cpp b/src/AutoHideDockContainer.cpp index 7dabcfe..c073791 100644 --- a/src/AutoHideDockContainer.cpp +++ b/src/AutoHideDockContainer.cpp @@ -660,8 +660,7 @@ bool CAutoHideDockContainer::event(QEvent* event) //============================================================================ void CAutoHideDockContainer::dragLeaveEvent(QDragLeaveEvent*) { - if (CDockManager::testAutoHideConfigFlag( - CDockManager::AutoHideOpenOnDragHover)) + if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) { collapseView(true); } diff --git a/src/AutoHideTab.cpp b/src/AutoHideTab.cpp index c555b10..3b0ee0e 100644 --- a/src/AutoHideTab.cpp +++ b/src/AutoHideTab.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include "AutoHideDockContainer.h" #include "AutoHideSideBar.h" @@ -57,7 +58,7 @@ struct AutoHideTabPrivate CAutoHideSideBar* SideBar = nullptr; Qt::Orientation Orientation{Qt::Vertical}; QElapsedTimer TimeSinceHoverMousePress; - QElapsedTimer TimeSinceDragOver; + QTimer DragOverTimer; bool MousePressed = false; eDragState DragState = DraggingInactive; QPoint GlobalDragStartMousePosition; @@ -258,6 +259,11 @@ CAutoHideTab::CAutoHideTab(QWidget* parent) : if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) { setAcceptDrops(true); } + + d->DragOverTimer.setInterval(CDockManager::configParam( + CDockManager::AutoHideOpenOnDragHoverDelay_ms, 500).toInt()); + d->DragOverTimer.setSingleShot(true); + connect(&d->DragOverTimer, &QTimer::timeout, this, &CAutoHideTab::onDragHoverDelayExpired); } @@ -498,81 +504,76 @@ void CAutoHideTab::mouseReleaseEvent(QMouseEvent* ev) //============================================================================ -void CAutoHideTab::mouseMoveEvent(QMouseEvent* ev) +void CAutoHideTab::mouseMoveEvent(QMouseEvent *ev) { - if (!(ev->buttons() & Qt::LeftButton) || d->isDraggingState(DraggingInactive)) - { - d->DragState = DraggingInactive; - Super::mouseMoveEvent(ev); - return; - } - - // move floating window - if (d->isDraggingState(DraggingFloatingWidget)) - { - d->FloatingWidget->moveFloating(); - Super::mouseMoveEvent(ev); - return; - } - - // move tab - if (d->isDraggingState(DraggingTab)) - { - // Moving the tab is always allowed because it does not mean moving the - // dock widget around - //d->moveTab(ev); - } - - auto MappedPos = mapToParent(ev->pos()); - bool MouseOutsideBar = (MappedPos.x() < 0) || (MappedPos.x() > parentWidget()->rect().right()); - // Maybe a fixed drag distance is better here ? - int DragDistanceY = qAbs(d->GlobalDragStartMousePosition.y() - internal::globalPositionOf(ev).y()); - if (DragDistanceY >= CDockManager::startDragDistance() || MouseOutsideBar) + if (!(ev->buttons() & Qt::LeftButton) + || d->isDraggingState(DraggingInactive)) { - // Floating is only allowed for widgets that are floatable - // We can create the drag preview if the widget is movable. - auto Features = d->DockWidget->features(); - if (Features.testFlag(CDockWidget::DockWidgetFloatable) || (Features.testFlag(CDockWidget::DockWidgetMovable))) - { - d->startFloating(); - } - return; + d->DragState = DraggingInactive; + Super::mouseMoveEvent(ev); + return; } - Super::mouseMoveEvent(ev); + // move floating window + if (d->isDraggingState(DraggingFloatingWidget)) + { + d->FloatingWidget->moveFloating(); + Super::mouseMoveEvent(ev); + return; + } + + // move tab + if (d->isDraggingState(DraggingTab)) + { + // Moving the tab is always allowed because it does not mean moving the + // dock widget around + //d->moveTab(ev); + } + + auto MappedPos = mapToParent(ev->pos()); + bool MouseOutsideBar = (MappedPos.x() < 0) + || (MappedPos.x() > parentWidget()->rect().right()); + // Maybe a fixed drag distance is better here ? + int DragDistanceY = qAbs( + d->GlobalDragStartMousePosition.y() + - internal::globalPositionOf(ev).y()); + if (DragDistanceY >= CDockManager::startDragDistance() || MouseOutsideBar) + { + // Floating is only allowed for widgets that are floatable + // We can create the drag preview if the widget is movable. + auto Features = d->DockWidget->features(); + if (Features.testFlag(CDockWidget::DockWidgetFloatable) + || (Features.testFlag(CDockWidget::DockWidgetMovable))) + { + d->startFloating(); + } + return; + } + + Super::mouseMoveEvent(ev); } //============================================================================ -void CAutoHideTab::dragEnterEvent(QDragEnterEvent* ev) { - if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) { - if (!d->TimeSinceDragOver.isValid()) { - d->TimeSinceDragOver.restart(); - ev->accept(); - } - else if (d->TimeSinceDragOver.hasExpired(500)) { - ev->accept(); - } - } +void CAutoHideTab::dragEnterEvent(QDragEnterEvent *ev) +{ + Q_UNUSED(ev); + if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) + { + d->DragOverTimer.start(); + ev->accept(); + } } //============================================================================ -void CAutoHideTab::dragLeaveEvent(QDragLeaveEvent* ev) { - if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) { - d->TimeSinceDragOver.invalidate(); - d->forwardEventToDockContainer(ev); - } +void CAutoHideTab::dragLeaveEvent(QDragLeaveEvent *ev) +{ + Q_UNUSED(ev); + if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) + { + d->DragOverTimer.stop(); + } } -//============================================================================ -void CAutoHideTab::dragMoveEvent(QDragMoveEvent* ev) { - if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover) - && d->TimeSinceDragOver.isValid() - && d->TimeSinceDragOver.hasExpired(500)) { - d->TimeSinceDragOver.invalidate(); - d->DockWidget->autoHideDockContainer()->collapseView(false); - ev->accept(); - } -} //============================================================================ void CAutoHideTab::requestCloseDockWidget() @@ -580,7 +581,6 @@ void CAutoHideTab::requestCloseDockWidget() d->DockWidget->requestCloseDockWidget(); } - //============================================================================ int CAutoHideTab::tabIndex() const { @@ -593,4 +593,28 @@ int CAutoHideTab::tabIndex() const } +//============================================================================ +void CAutoHideTab::onDragHoverDelayExpired() +{ + static const char* const PropertyId = "ActiveDragOverAutoHideContainer"; + + // First we check if there is an active auto hide container that is visible + // In this case, we collapse it before we open the new one + auto v = d->DockWidget->dockManager()->property(PropertyId); + if (v.isValid()) + { + auto ActiveAutoHideContainer = v.value>(); + if (ActiveAutoHideContainer) + { + ActiveAutoHideContainer->collapseView(true); + } + } + + auto AutoHideContainer = d->DockWidget->autoHideDockContainer(); + AutoHideContainer->collapseView(false); + d->DockWidget->dockManager()->setProperty(PropertyId, + QVariant::fromValue(QPointer(AutoHideContainer))); +} + + } diff --git a/src/AutoHideTab.h b/src/AutoHideTab.h index 07d4344..20ee70a 100644 --- a/src/AutoHideTab.h +++ b/src/AutoHideTab.h @@ -67,6 +67,7 @@ private: private Q_SLOTS: void onAutoHideToActionClicked(); + void onDragHoverDelayExpired(); protected: void setSideBar(CAutoHideSideBar *SideTabBar); @@ -78,7 +79,6 @@ protected: virtual void mouseMoveEvent(QMouseEvent* ev) override; virtual void dragEnterEvent(QDragEnterEvent* ev) override; virtual void dragLeaveEvent(QDragLeaveEvent* ev) override; - virtual void dragMoveEvent(QDragMoveEvent* ev) override; public: using Super = CPushButton; From 8dcdc8fad23dcaaeee08b98a9af9670b1811575e Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Mon, 28 Oct 2024 15:40:32 +0100 Subject: [PATCH 09/24] Improved autohidedragndrop example to check, if it also works when dragging with multiple auto hide tabs --- .../autohidedragndrop/autohidedragndrop.pro | 2 +- examples/autohidedragndrop/droppableitem.cpp | 1 + examples/autohidedragndrop/mainwindow.cpp | 35 +++++++++++++------ examples/examples.pro | 1 + 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/examples/autohidedragndrop/autohidedragndrop.pro b/examples/autohidedragndrop/autohidedragndrop.pro index ce86127..f812355 100644 --- a/examples/autohidedragndrop/autohidedragndrop.pro +++ b/examples/autohidedragndrop/autohidedragndrop.pro @@ -23,7 +23,7 @@ SOURCES += \ droppableitem.cpp HEADERS += \ - mainwindow.h + mainwindow.h \ droppableitem.h FORMS += \ diff --git a/examples/autohidedragndrop/droppableitem.cpp b/examples/autohidedragndrop/droppableitem.cpp index 390c1b8..d7d2add 100644 --- a/examples/autohidedragndrop/droppableitem.cpp +++ b/examples/autohidedragndrop/droppableitem.cpp @@ -24,6 +24,7 @@ void DroppableItem::dragEnterEvent(QDragEnterEvent* event) void DroppableItem::dragLeaveEvent(QDragLeaveEvent* event) { + Q_UNUSED(event); unsetCursor(); } diff --git a/examples/autohidedragndrop/mainwindow.cpp b/examples/autohidedragndrop/mainwindow.cpp index 6443b35..e6d405f 100644 --- a/examples/autohidedragndrop/mainwindow.cpp +++ b/examples/autohidedragndrop/mainwindow.cpp @@ -29,6 +29,7 @@ CMainWindow::CMainWindow(QWidget *parent) CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); CDockManager::setAutoHideConfigFlags(CDockManager::DefaultAutoHideConfig); CDockManager::setAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover, true); + CDockManager::setConfigParam(CDockManager::AutoHideOpenOnDragHoverDelay_ms, 500); DockManager = new CDockManager(this); // Set central widget @@ -39,16 +40,30 @@ CMainWindow::CMainWindow(QWidget *parent) auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget); CentralDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas); - DroppableItem* droppableItem = new DroppableItem("Drop text here."); - CDockWidget* dropDockWidget = new CDockWidget("Tab"); - dropDockWidget->setWidget(droppableItem); - dropDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget); - dropDockWidget->setMinimumSize(200,150); - dropDockWidget->setAcceptDrops(true); - const auto autoHideContainer = DockManager->addAutoHideDockWidget(SideBarLocation::SideBarLeft, dropDockWidget); - autoHideContainer->setSize(480); - autoHideContainer->setAcceptDrops(true); - ui->menuView->addAction(dropDockWidget->toggleViewAction()); + { + DroppableItem* droppableItem = new DroppableItem("Drop text here."); + CDockWidget* dropDockWidget = new CDockWidget("Tab 1"); + dropDockWidget->setWidget(droppableItem); + dropDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget); + dropDockWidget->setMinimumSize(200,150); + dropDockWidget->setAcceptDrops(true); + const auto autoHideContainer = DockManager->addAutoHideDockWidget(SideBarLocation::SideBarLeft, dropDockWidget); + autoHideContainer->setSize(480); + autoHideContainer->setAcceptDrops(true); + ui->menuView->addAction(dropDockWidget->toggleViewAction()); + } + { + DroppableItem* droppableItem = new DroppableItem("Drop text here."); + CDockWidget* dropDockWidget = new CDockWidget("Tab 2"); + dropDockWidget->setWidget(droppableItem); + dropDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget); + dropDockWidget->setMinimumSize(200,150); + dropDockWidget->setAcceptDrops(true); + const auto autoHideContainer = DockManager->addAutoHideDockWidget(SideBarLocation::SideBarRight, dropDockWidget); + autoHideContainer->setSize(480); + autoHideContainer->setAcceptDrops(true); + ui->menuView->addAction(dropDockWidget->toggleViewAction()); + } QTableWidget* propertiesTable = new QTableWidget(); propertiesTable->setColumnCount(3); diff --git a/examples/examples.pro b/examples/examples.pro index e2b0705..05e739a 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -2,6 +2,7 @@ TEMPLATE = subdirs SUBDIRS = \ autohide \ + autohidedragndrop \ centralwidget \ simple \ hideshow \ From e857421fdf32e3dd438a1b5dd73b1ffe837f2ab8 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Mon, 28 Oct 2024 15:41:46 +0100 Subject: [PATCH 10/24] Added all build* subfolders to .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7881b10..2a7ed56 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ ui_* Makefile *.dll *.a -build-* +build* # IDEs .idea From 30b802bd1090ca6450bd62d563d5673541c7a944 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Wed, 20 Nov 2024 15:31:31 +0100 Subject: [PATCH 11/24] Fixed Qt5 build issues --- src/AutoHideTab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AutoHideTab.cpp b/src/AutoHideTab.cpp index 3b0ee0e..66d1277 100644 --- a/src/AutoHideTab.cpp +++ b/src/AutoHideTab.cpp @@ -613,7 +613,7 @@ void CAutoHideTab::onDragHoverDelayExpired() auto AutoHideContainer = d->DockWidget->autoHideDockContainer(); AutoHideContainer->collapseView(false); d->DockWidget->dockManager()->setProperty(PropertyId, - QVariant::fromValue(QPointer(AutoHideContainer))); + QVariant::fromValue(QPointer(AutoHideContainer))); } From 509b2356d13cb21aa3370766cd770fa38fed7e5f Mon Sep 17 00:00:00 2001 From: Federico Fuga Date: Fri, 8 Nov 2024 11:23:28 +0100 Subject: [PATCH 12/24] Fix missing declarations --- src/DockAreaWidget.h | 1 + src/DockWidgetTab.h | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/DockAreaWidget.h b/src/DockAreaWidget.h index 30701fb..e0c39c7 100644 --- a/src/DockAreaWidget.h +++ b/src/DockAreaWidget.h @@ -38,6 +38,7 @@ QT_FORWARD_DECLARE_CLASS(QXmlStreamWriter) QT_FORWARD_DECLARE_CLASS(QAbstractButton) +QT_FORWARD_DECLARE_CLASS(QMenu) namespace ads { diff --git a/src/DockWidgetTab.h b/src/DockWidgetTab.h index 973a1ad..9db1495 100644 --- a/src/DockWidgetTab.h +++ b/src/DockWidgetTab.h @@ -35,6 +35,8 @@ #include "ads_globals.h" +QT_FORWARD_DECLARE_CLASS(QMenu) + namespace ads { class CDockWidget; From f2378636e2a6a7ec0f8124fbe5d0770bce5bec0f Mon Sep 17 00:00:00 2001 From: Federico Fuga Date: Fri, 8 Nov 2024 10:38:51 +0100 Subject: [PATCH 13/24] Add ability to customize the DockArea Title Bar and DockWidget Tab context menu --- demo/MainWindow.cpp | 17 ++++++++--------- demo/MyDockAreaTitleBar.h | 34 ++++++++++++++++++++++++++++++++++ src/DockAreaTitleBar.cpp | 36 +++++++++++++++++++++++------------- src/DockAreaTitleBar.h | 14 ++++++++++++++ src/DockWidgetTab.cpp | 27 +++++++++++++++++---------- src/DockWidgetTab.h | 14 ++++++++++++++ 6 files changed, 110 insertions(+), 32 deletions(-) create mode 100644 demo/MyDockAreaTitleBar.h diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index cde5492..55bb6ef 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -75,18 +75,17 @@ #endif #endif -#include "DockManager.h" -#include "DockWidget.h" -#include "DockAreaWidget.h" -#include "DockAreaTitleBar.h" #include "DockAreaTabBar.h" -#include "FloatingDockContainer.h" +#include "DockAreaTitleBar.h" +#include "DockAreaWidget.h" #include "DockComponentsFactory.h" -#include "StatusDialog.h" +#include "DockManager.h" #include "DockSplitter.h" +#include "DockWidget.h" +#include "FloatingDockContainer.h" #include "ImageViewer.h" - - +#include "MyDockAreaTitleBar.h" +#include "StatusDialog.h" /** * Returns a random number from 0 to highest - 1 @@ -147,7 +146,7 @@ public: using Super = ads::CDockComponentsFactory; ads::CDockAreaTitleBar* createDockAreaTitleBar(ads::CDockAreaWidget* DockArea) const override { - auto TitleBar = new ads::CDockAreaTitleBar(DockArea); + auto TitleBar = new MyDockAreaTitleBar(DockArea); auto CustomButton = new QToolButton(DockArea); CustomButton->setToolTip(QObject::tr("Help")); CustomButton->setIcon(svgIcon(":/adsdemo/images/help_outline.svg")); diff --git a/demo/MyDockAreaTitleBar.h b/demo/MyDockAreaTitleBar.h new file mode 100644 index 0000000..074cc79 --- /dev/null +++ b/demo/MyDockAreaTitleBar.h @@ -0,0 +1,34 @@ +// +// Created by fuga on 08 nov 2024. +// + +#ifndef QTADS_MYDOCKAREATITLEBAR_H +#define QTADS_MYDOCKAREATITLEBAR_H + +#include + +class MyDockAreaTitleBar : public ads::CDockAreaTitleBar { +public: + explicit MyDockAreaTitleBar(ads::CDockAreaWidget* parent) + : CDockAreaTitleBar(parent) + {} + + QMenu* buildContextMenu(QMenu*) override + { + auto menu = ads::CDockAreaTitleBar::buildContextMenu(nullptr); + menu->addSeparator(); + auto action = menu->addAction(tr("Format HardDrive")); + + connect(action, &QAction::triggered, this, [this](){ + QMessageBox msgBox; + msgBox.setText("No, just kidding"); + msgBox.setStandardButtons(QMessageBox::Abort); + msgBox.setDefaultButton(QMessageBox::Abort); + msgBox.exec(); + }); + + return menu; + } +}; + +#endif // QTADS_MYDOCKAREATITLEBAR_H diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index 32a1d1a..8c19cfd 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -765,24 +765,35 @@ void CDockAreaTitleBar::contextMenuEvent(QContextMenuEvent* ev) return; } - const bool isAutoHide = d->DockArea->isAutoHide(); + auto Menu = buildContextMenu(nullptr); + Menu->exec(ev->globalPos()); + delete Menu; +} + +QMenu* CDockAreaTitleBar::buildContextMenu(QMenu *Menu) +{ + const bool isAutoHide = d->DockArea->isAutoHide(); const bool isTopLevelArea = d->DockArea->isTopLevelArea(); QAction* Action; - QMenu Menu(this); - if (!isTopLevelArea) + if (Menu == nullptr) + { + Menu = new QMenu(this); + } + + if (!isTopLevelArea) { - Action = Menu.addAction(isAutoHide ? tr("Detach") : tr("Detach Group"), + Action = Menu->addAction(isAutoHide ? tr("Detach") : tr("Detach Group"), this, SLOT(onUndockButtonClicked())); Action->setEnabled(d->DockArea->features().testFlag(CDockWidget::DockWidgetFloatable)); if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideFeatureEnabled)) { - Action = Menu.addAction(isAutoHide ? tr("Unpin (Dock)") : tr("Pin Group"), this, SLOT(onAutoHideDockAreaActionClicked())); + Action = Menu->addAction(isAutoHide ? tr("Unpin (Dock)") : tr("Pin Group"), this, SLOT(onAutoHideDockAreaActionClicked())); auto AreaIsPinnable = d->DockArea->features().testFlag(CDockWidget::DockWidgetPinnable); Action->setEnabled(AreaIsPinnable); if (!isAutoHide) { - auto menu = Menu.addMenu(tr("Pin Group To...")); + auto menu = Menu->addMenu(tr("Pin Group To...")); menu->setEnabled(AreaIsPinnable); d->createAutoHideToAction(tr("Top"), SideBarTop, menu); d->createAutoHideToAction(tr("Left"), SideBarLeft, menu); @@ -790,28 +801,27 @@ void CDockAreaTitleBar::contextMenuEvent(QContextMenuEvent* ev) d->createAutoHideToAction(tr("Bottom"), SideBarBottom, menu); } } - Menu.addSeparator(); + Menu->addSeparator(); } if (isAutoHide) { - Action = Menu.addAction(tr("Minimize"), this, SLOT(minimizeAutoHideContainer())); - Action = Menu.addAction(tr("Close"), this, SLOT(onAutoHideCloseActionTriggered())); + Action = Menu->addAction(tr("Minimize"), this, SLOT(minimizeAutoHideContainer())); + Action = Menu->addAction(tr("Close"), this, SLOT(onAutoHideCloseActionTriggered())); } else { - Action = Menu.addAction(isAutoHide ? tr("Close") : tr("Close Group"), this, SLOT(onCloseButtonClicked())); + Action = Menu->addAction(isAutoHide ? tr("Close") : tr("Close Group"), this, SLOT(onCloseButtonClicked())); } Action->setEnabled(d->DockArea->features().testFlag(CDockWidget::DockWidgetClosable)); if (!isAutoHide && !isTopLevelArea) { - Action = Menu.addAction(tr("Close Other Groups"), d->DockArea, SLOT(closeOtherAreas())); + Action = Menu->addAction(tr("Close Other Groups"), d->DockArea, SLOT(closeOtherAreas())); } - Menu.exec(ev->globalPos()); + return Menu; } - //============================================================================ void CDockAreaTitleBar::insertWidget(int index, QWidget *widget) { diff --git a/src/DockAreaTitleBar.h b/src/DockAreaTitleBar.h index 6f07eea..56820c4 100644 --- a/src/DockAreaTitleBar.h +++ b/src/DockAreaTitleBar.h @@ -249,6 +249,20 @@ public: */ bool isAutoHide() const; + /** + * Fills the provided menu with standard entries. If a nullptr is passed, a + * new menu is created and filled with standard entries. + * This function is called from the actual version of contextMenuEvent, but + * can be called from any code. Caller is responsible of deleting the created + * object. + * + * @param menu The QMenu to fill with standard entries. If nullptr, a new + * QMenu will be created. + * @return The filled QMenu, either the provided one or a newly created one if + * nullptr was passed. + */ + virtual QMenu *buildContextMenu(QMenu *); + Q_SIGNALS: /** * This signal is emitted if a tab in the tab bar is clicked by the user diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 654c000..1380288 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -529,26 +529,34 @@ void CDockWidgetTab::contextMenuEvent(QContextMenuEvent* ev) return; } + auto Menu = buildContextMenu(nullptr); d->saveDragStartMousePosition(ev->globalPos()); + Menu->exec(ev->globalPos()); +} +QMenu* CDockWidgetTab::buildContextMenu(QMenu *Menu) +{ + if (Menu == nullptr) { + Menu = new QMenu(this); + } + const bool isFloatable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetFloatable); const bool isNotOnlyTabInContainer = !d->DockArea->dockContainer()->hasTopLevelDockWidget(); const bool isTopLevelArea = d->DockArea->isTopLevelArea(); const bool isDetachable = isFloatable && isNotOnlyTabInContainer; QAction* Action; - QMenu Menu(this); if (!isTopLevelArea) { - Action = Menu.addAction(tr("Detach"), this, SLOT(detachDockWidget())); + Action = Menu->addAction(tr("Detach"), this, SLOT(detachDockWidget())); Action->setEnabled(isDetachable); if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideFeatureEnabled)) { - Action = Menu.addAction(tr("Pin"), this, SLOT(autoHideDockWidget())); + Action = Menu->addAction(tr("Pin"), this, SLOT(autoHideDockWidget())); auto IsPinnable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetPinnable); Action->setEnabled(IsPinnable); - auto menu = Menu.addMenu(tr("Pin To...")); + auto menu = Menu->addMenu(tr("Pin To...")); menu->setEnabled(IsPinnable); d->createAutoHideToAction(tr("Top"), SideBarTop, menu); d->createAutoHideToAction(tr("Left"), SideBarLeft, menu); @@ -557,17 +565,16 @@ void CDockWidgetTab::contextMenuEvent(QContextMenuEvent* ev) } } - Menu.addSeparator(); - Action = Menu.addAction(tr("Close"), this, SIGNAL(closeRequested())); + Menu->addSeparator(); + Action = Menu->addAction(tr("Close"), this, SIGNAL(closeRequested())); Action->setEnabled(isClosable()); if (d->DockArea->openDockWidgetsCount() > 1) { - Action = Menu.addAction(tr("Close Others"), this, SIGNAL(closeOtherTabsRequested())); + Action = Menu->addAction(tr("Close Others"), this, SIGNAL(closeOtherTabsRequested())); } - Menu.exec(ev->globalPos()); + + return Menu; } - - //============================================================================ bool CDockWidgetTab::isActiveTab() const { diff --git a/src/DockWidgetTab.h b/src/DockWidgetTab.h index 9db1495..02781af 100644 --- a/src/DockWidgetTab.h +++ b/src/DockWidgetTab.h @@ -186,6 +186,20 @@ public: */ eDragState dragState() const; + /** + * Fills the provided menu with standard entries. If a nullptr is passed, a + * new menu is created and filled with standard entries. + * This function is called from the actual version of contextMenuEvent, but + * can be called from any code. Caller is responsible of deleting the created + * object. + * + * @param menu The QMenu to fill with standard entries. If nullptr, a new + * QMenu will be created. + * @return The filled QMenu, either the provided one or a newly created one if + * nullptr was passed. + */ + virtual QMenu *buildContextMenu(QMenu *); + public Q_SLOTS: virtual void setVisible(bool visible) override; From 1f21eb0200adf1a480913add64cd56f4ecdec6e0 Mon Sep 17 00:00:00 2001 From: Ivan Ugryumov Date: Thu, 12 Dec 2024 15:13:01 +0300 Subject: [PATCH 14/24] Improved tab bar scrolling (#678) * Improved tab bar scrolling * Fix: tab bar scroll for mouse --- src/DockAreaTabBar.cpp | 14 ++------------ src/DockAreaTabBar.h | 3 +-- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/DockAreaTabBar.cpp b/src/DockAreaTabBar.cpp index cf1cb09..724aedc 100644 --- a/src/DockAreaTabBar.cpp +++ b/src/DockAreaTabBar.cpp @@ -160,19 +160,9 @@ CDockAreaTabBar::~CDockAreaTabBar() //============================================================================ void CDockAreaTabBar::wheelEvent(QWheelEvent* Event) { - Event->accept(); - const int direction = Event->angleDelta().y(); - if (direction < 0) - { - horizontalScrollBar()->setValue(horizontalScrollBar()->value() + 20); - } - else - { - horizontalScrollBar()->setValue(horizontalScrollBar()->value() - 20); - } + QCoreApplication::sendEvent(horizontalScrollBar(), Event); } - //============================================================================ void CDockAreaTabBar::setCurrentIndex(int index) { @@ -356,7 +346,7 @@ void CDockAreaTabBar::onCloseOtherTabsRequested() CDockWidget::DockWidgetDeleteOnClose) ? 1 : 0; closeTab(i); - // If the the dock widget blocks closing, i.e. if the flag + // If 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()) diff --git a/src/DockAreaTabBar.h b/src/DockAreaTabBar.h index 2d57009..60557fe 100644 --- a/src/DockAreaTabBar.h +++ b/src/DockAreaTabBar.h @@ -65,8 +65,7 @@ private Q_SLOTS: void onTabWidgetMoved(const QPoint& GlobalPos); protected: - virtual void wheelEvent(QWheelEvent* Event) override; - + virtual void wheelEvent(QWheelEvent* Event) override; public: using Super = QScrollArea; From e2f611ea9a5cd9c94da4743ba4eb5c4370bcd9ca Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Thu, 12 Dec 2024 14:53:24 +0100 Subject: [PATCH 15/24] CDockAreaTitleBar::resizeEvent function to fix issue #656 --- examples/emptydockarea/mainwindow.cpp | 13 ++++++++++--- src/DockAreaTitleBar.cpp | 5 ++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/examples/emptydockarea/mainwindow.cpp b/examples/emptydockarea/mainwindow.cpp index 2dbe99c..37994e6 100644 --- a/examples/emptydockarea/mainwindow.cpp +++ b/examples/emptydockarea/mainwindow.cpp @@ -32,9 +32,11 @@ CMainWindow::CMainWindow(QWidget *parent) , ui(new Ui::CMainWindow) { ui->setupUi(this); - CDockManager::setConfigFlag(CDockManager::OpaqueSplitterResize, true); - CDockManager::setConfigFlag(CDockManager::XmlCompressionEnabled, false); - CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); + ads::CDockManager::setConfigFlag( ads::CDockManager::DockAreaHasCloseButton, false ); + ads::CDockManager::setConfigFlag( ads::CDockManager::AllTabsHaveCloseButton, true ); + ads::CDockManager::setConfigFlag( ads::CDockManager::DockAreaHasUndockButton, false ); + ads::CDockManager::setConfigFlag( ads::CDockManager::DockAreaDynamicTabsMenuButtonVisibility, true ); + ads::CDockManager::setConfigFlag( ads::CDockManager::DisableTabTextEliding, true ); DockManager = new CDockManager(this); // Set central widget @@ -98,8 +100,13 @@ void CMainWindow::createPerspectiveUi() PerspectiveComboBox = new QComboBox(this); PerspectiveComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); PerspectiveComboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + connect(PerspectiveComboBox, &QComboBox::textActivated, + DockManager, &CDockManager::openPerspective); +#else connect(PerspectiveComboBox, SIGNAL(activated(const QString&)), DockManager, SLOT(openPerspective(const QString&))); +#endif PerspectiveListAction->setDefaultWidget(PerspectiveComboBox); ui->toolBar->addSeparator(); ui->toolBar->addAction(PerspectiveListAction); diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index 8c19cfd..141c920 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -385,7 +385,10 @@ void CDockAreaTitleBar::resizeEvent(QResizeEvent *event) if (CDockManager::testConfigFlag(CDockManager::DockAreaDynamicTabsMenuButtonVisibility) && CDockManager::testConfigFlag(CDockManager::DisableTabTextEliding)) { - markTabsMenuOutdated(); + // Use queued connection to ensure that the resizing and relayouting has + // finished to ensure that the d->TabBar->areTabsOverflowing() function + // returns the correct value + QMetaObject::invokeMethod(this, "markTabsMenuOutdated", Qt::QueuedConnection); } } From 7245dced8452ad8aa62297b9a00d47ffe43c4a5e Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Thu, 12 Dec 2024 15:38:29 +0100 Subject: [PATCH 16/24] Added new config flag DoubleClickUndocksWidget to configure if double clicking a DockWidget tab or titlebar undocks the widget --- examples/emptydockarea/mainwindow.cpp | 1 + src/DockAreaTitleBar.cpp | 5 +++++ src/DockManager.h | 5 ++++- src/DockWidgetTab.cpp | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/emptydockarea/mainwindow.cpp b/examples/emptydockarea/mainwindow.cpp index 37994e6..c8b4bf7 100644 --- a/examples/emptydockarea/mainwindow.cpp +++ b/examples/emptydockarea/mainwindow.cpp @@ -37,6 +37,7 @@ CMainWindow::CMainWindow(QWidget *parent) ads::CDockManager::setConfigFlag( ads::CDockManager::DockAreaHasUndockButton, false ); ads::CDockManager::setConfigFlag( ads::CDockManager::DockAreaDynamicTabsMenuButtonVisibility, true ); ads::CDockManager::setConfigFlag( ads::CDockManager::DisableTabTextEliding, true ); + ads::CDockManager::setConfigFlag( ads::CDockManager::DoubleClickUndocksWidget, false ); DockManager = new CDockManager(this); // Set central widget diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index 141c920..ebc0074 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -733,6 +733,11 @@ void CDockAreaTitleBar::mouseDoubleClickEvent(QMouseEvent *event) return; } + if (!CDockManager::testConfigFlag(CDockManager::DoubleClickUndocksWidget)) + { + return; + } + d->makeAreaFloating(event->pos(), DraggingInactive); } diff --git a/src/DockManager.h b/src/DockManager.h index 9edb8e8..291ab68 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -215,6 +215,8 @@ public: MiddleMouseButtonClosesTab = 0x2000000, //! If the flag is set, the user can use the mouse middle button to close the tab under the mouse DisableTabTextEliding = 0x4000000, //! Set this flag to disable eliding of tab texts in dock area tabs ShowTabTextOnlyForActiveTab =0x8000000, //! Set this flag to show label texts in dock area tabs only for active tabs + DoubleClickUndocksWidget = 0x10000000, //!< If the flag is set, a double click on a tab undocks the widget + DefaultDockAreaButtons = DockAreaHasCloseButton | DockAreaHasUndockButton @@ -223,7 +225,8 @@ public: DefaultBaseConfig = DefaultDockAreaButtons | ActiveTabHasCloseButton | XmlCompressionEnabled - | FloatingContainerHasWidgetTitle, ///< default base configuration settings + | FloatingContainerHasWidgetTitle + | DoubleClickUndocksWidget, ///< default base configuration settings DefaultOpaqueConfig = DefaultBaseConfig | OpaqueSplitterResize diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 1380288..572b781 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -699,7 +699,7 @@ QString CDockWidgetTab::text() const //============================================================================ void CDockWidgetTab::mouseDoubleClickEvent(QMouseEvent *event) { - if (event->button() == Qt::LeftButton) + if (event->button() == Qt::LeftButton && CDockManager::testConfigFlag(CDockManager::DoubleClickUndocksWidget)) { // If this is the last dock area in a dock container it does not make // sense to move it to a new floating widget and leave this one From 0be5ba8cf616f5832abc7100011748d1143a6f3d Mon Sep 17 00:00:00 2001 From: Nolan Kramer <160380770+nolankramer@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:57:00 -0800 Subject: [PATCH 17/24] Fix issue with windeployqt (#683) * Fix issue with windeployqt * Rename library to requested format --- demo/CMakeLists.txt | 2 +- examples/autohide/CMakeLists.txt | 2 +- examples/autohidedragndrop/CMakeLists.txt | 2 +- examples/centralwidget/CMakeLists.txt | 2 +- examples/configflags/CMakeLists.txt | 2 +- examples/deleteonclose/CMakeLists.txt | 2 +- examples/dockindock/CMakeLists.txt | 2 +- examples/emptydockarea/CMakeLists.txt | 2 +- examples/hideshow/CMakeLists.txt | 2 +- examples/sidebar/CMakeLists.txt | 2 +- examples/simple/CMakeLists.txt | 2 +- src/CMakeLists.txt | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/demo/CMakeLists.txt b/demo/CMakeLists.txt index f40bfc9..6d865dd 100644 --- a/demo/CMakeLists.txt +++ b/demo/CMakeLists.txt @@ -27,7 +27,7 @@ target_link_libraries(AdvancedDockingSystemDemo PUBLIC Qt${QT_VERSION_MAJOR}::Co if(WIN32 AND QT_VERSION_MAJOR LESS 6) target_link_libraries(AdvancedDockingSystemDemo PUBLIC Qt${QT_VERSION_MAJOR}::AxContainer) endif() -target_link_libraries(AdvancedDockingSystemDemo PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(AdvancedDockingSystemDemo PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) set_target_properties(AdvancedDockingSystemDemo PROPERTIES AUTOMOC ON AUTORCC ON diff --git a/examples/autohide/CMakeLists.txt b/examples/autohide/CMakeLists.txt index 3379067..753ec6b 100644 --- a/examples/autohide/CMakeLists.txt +++ b/examples/autohide/CMakeLists.txt @@ -9,7 +9,7 @@ add_executable(AutoHideExample WIN32 mainwindow.ui ) target_include_directories(AutoHideExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(AutoHideExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(AutoHideExample PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(AutoHideExample PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/examples/autohidedragndrop/CMakeLists.txt b/examples/autohidedragndrop/CMakeLists.txt index 3b8f077..1a1c0f2 100644 --- a/examples/autohidedragndrop/CMakeLists.txt +++ b/examples/autohidedragndrop/CMakeLists.txt @@ -10,7 +10,7 @@ add_executable(AutoHideDragNDropExample WIN32 droppableitem.cpp ) target_include_directories(AutoHideDragNDropExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(AutoHideDragNDropExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(AutoHideDragNDropExample PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(AutoHideDragNDropExample PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/examples/centralwidget/CMakeLists.txt b/examples/centralwidget/CMakeLists.txt index ae42cdf..5932750 100644 --- a/examples/centralwidget/CMakeLists.txt +++ b/examples/centralwidget/CMakeLists.txt @@ -9,7 +9,7 @@ add_executable(CentralWidgetExample WIN32 mainwindow.ui ) target_include_directories(CentralWidgetExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(CentralWidgetExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(CentralWidgetExample PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(CentralWidgetExample PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/examples/configflags/CMakeLists.txt b/examples/configflags/CMakeLists.txt index c231ee7..24bf011 100644 --- a/examples/configflags/CMakeLists.txt +++ b/examples/configflags/CMakeLists.txt @@ -9,7 +9,7 @@ add_executable(configFlagsExample WIN32 mainwindow.ui ) target_include_directories(CentralWidgetExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(CentralWidgetExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(CentralWidgetExample PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(CentralWidgetExample PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/examples/deleteonclose/CMakeLists.txt b/examples/deleteonclose/CMakeLists.txt index 98557a6..789d449 100644 --- a/examples/deleteonclose/CMakeLists.txt +++ b/examples/deleteonclose/CMakeLists.txt @@ -7,7 +7,7 @@ add_executable(DeleteOnCloseTest WIN32 main.cpp ) target_include_directories(DeleteOnCloseTest PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(DeleteOnCloseTest PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(DeleteOnCloseTest PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(DeleteOnCloseTest PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/examples/dockindock/CMakeLists.txt b/examples/dockindock/CMakeLists.txt index 39ba98c..168f971 100644 --- a/examples/dockindock/CMakeLists.txt +++ b/examples/dockindock/CMakeLists.txt @@ -12,7 +12,7 @@ add_executable(DockInDockExample WIN32 mainframe.cpp ) target_include_directories(DockInDockExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(DockInDockExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(DockInDockExample PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(DockInDockExample PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/examples/emptydockarea/CMakeLists.txt b/examples/emptydockarea/CMakeLists.txt index c9b02f2..c8f53df 100644 --- a/examples/emptydockarea/CMakeLists.txt +++ b/examples/emptydockarea/CMakeLists.txt @@ -9,7 +9,7 @@ add_executable(EmptyDockAreaExample WIN32 mainwindow.ui ) target_include_directories(EmptyDockAreaExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(EmptyDockAreaExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(EmptyDockAreaExample PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(EmptyDockAreaExample PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/examples/hideshow/CMakeLists.txt b/examples/hideshow/CMakeLists.txt index becab35..3c7d4da 100644 --- a/examples/hideshow/CMakeLists.txt +++ b/examples/hideshow/CMakeLists.txt @@ -9,7 +9,7 @@ add_executable(HideShowExample WIN32 MainWindow.ui ) target_include_directories(HideShowExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(HideShowExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(HideShowExample PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(HideShowExample PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/examples/sidebar/CMakeLists.txt b/examples/sidebar/CMakeLists.txt index a2e05e6..50bf9da 100644 --- a/examples/sidebar/CMakeLists.txt +++ b/examples/sidebar/CMakeLists.txt @@ -9,7 +9,7 @@ add_executable(SidebarExample WIN32 MainWindow.ui ) target_include_directories(SidebarExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(SidebarExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(SidebarExample PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(SidebarExample PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/examples/simple/CMakeLists.txt b/examples/simple/CMakeLists.txt index 99f42a3..7883580 100644 --- a/examples/simple/CMakeLists.txt +++ b/examples/simple/CMakeLists.txt @@ -9,7 +9,7 @@ add_executable(SimpleExample WIN32 MainWindow.ui ) target_include_directories(SimpleExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src") -target_link_libraries(SimpleExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking) +target_link_libraries(SimpleExample PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR}) target_link_libraries(SimpleExample PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9690be7..dbe3b7a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -71,7 +71,7 @@ if (UNIX AND NOT APPLE) set(ads_HEADERS linux/FloatingWidgetTitleBar.h ${ads_HEADERS}) endif() -set(library_name "qt${QT_VERSION_MAJOR}advanceddocking") +set(library_name "qtadvanceddocking-qt${QT_VERSION_MAJOR}") if(BUILD_STATIC) add_library(${library_name} STATIC ${ads_SRCS} ${ads_HEADERS}) target_compile_definitions( ${library_name} PUBLIC ADS_STATIC) From 1bec4234c37af07632c562203b2b290e88fa8e32 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 20 Dec 2024 10:12:46 +0100 Subject: [PATCH 18/24] Added support for componentsFactory per dock manager --- demo/MainWindow.cpp | 4 ++-- src/AutoHideDockContainer.cpp | 17 ++++++++++++++++- src/DockAreaTitleBar.cpp | 8 ++++++++ src/DockAreaWidget.cpp | 8 ++++++++ src/DockComponentsFactory.cpp | 12 +++++++++--- src/DockComponentsFactory.h | 15 ++++----------- src/DockManager.cpp | 25 +++++++++++++++++++++++++ src/DockManager.h | 18 ++++++++++++++++++ src/DockWidget.cpp | 23 ++++++++++++++++++++--- src/DockWidget.h | 12 +++++++++++- 10 files changed, 121 insertions(+), 21 deletions(-) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index 55bb6ef..9503ceb 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -470,12 +470,12 @@ void MainWindowPrivate::createContent() appendFeaturStringToWindowTitle(FileSystemWidget); // Test custom factory - we inject a help button into the title bar - ads::CDockComponentsFactory::setFactory(new CCustomComponentsFactory()); + DockManager->setComponentsFactory(new CCustomComponentsFactory()); auto TopDockArea = DockManager->addDockWidget(ads::TopDockWidgetArea, FileSystemWidget); // Uncomment the next line if you would like to test the // HideSingleWidgetTitleBar functionality // TopDockArea->setDockAreaFlag(ads::CDockAreaWidget::HideSingleWidgetTitleBar, true); - ads::CDockComponentsFactory::resetDefaultFactory(); + DockManager->setComponentsFactory(ads::CDockComponentsFactory::factory()); // We create a calendar widget and clear all flags to prevent the dock area // from closing diff --git a/src/AutoHideDockContainer.cpp b/src/AutoHideDockContainer.cpp index c073791..7cb20b2 100644 --- a/src/AutoHideDockContainer.cpp +++ b/src/AutoHideDockContainer.cpp @@ -124,6 +124,21 @@ struct AutoHideDockContainerPrivate */ AutoHideDockContainerPrivate(CAutoHideDockContainer *_public); + /** + * Convenience function to ease access to dock manager components factory + */ + QSharedPointer componentsFactory() const + { + if (!DockWidget || !DockWidget->dockManager()) + { + return CDockComponentsFactory::factory(); + } + else + { + return DockWidget->dockManager()->componentsFactory(); + } + } + /** * Convenience function to get a dock widget area */ @@ -199,7 +214,7 @@ CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, SideBarL { hide(); // auto hide dock container is initially always hidden d->SideTabBarArea = area; - d->SideTab = componentsFactory()->createDockWidgetSideTab(nullptr); + d->SideTab = d->componentsFactory()->createDockWidgetSideTab(nullptr); connect(d->SideTab, &CAutoHideTab::pressed, this, &CAutoHideDockContainer::toggleCollapseState); d->DockArea = new CDockAreaWidget(DockWidget->dockManager(), parent); d->DockArea->setObjectName("autoHideDockArea"); diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index ebc0074..9470682 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -114,6 +114,14 @@ struct DockAreaTitleBarPrivate return DockArea->dockManager(); } + /** + * Convenience function for access to dock manager components factory + */ + QSharedPointer componentsFactory() const + { + return dockManager()->componentsFactory(); + } + /** * Returns true if the given config flag is set * Convenience function to ease config flag testing diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index b3828d3..cba0650 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -269,6 +269,14 @@ struct DockAreaWidgetPrivate */ DockAreaWidgetPrivate(CDockAreaWidget* _public); + /** + * Convencience function to ease components factory access + */ + QSharedPointer componentsFactory() const + { + return DockManager->componentsFactory(); + } + /** * Creates the layout for top area with tabs and close button */ diff --git a/src/DockComponentsFactory.cpp b/src/DockComponentsFactory.cpp index 05259d7..874bf11 100644 --- a/src/DockComponentsFactory.cpp +++ b/src/DockComponentsFactory.cpp @@ -21,7 +21,8 @@ namespace ads { -static std::unique_ptr DefaultFactory(new CDockComponentsFactory()); + +static QSharedPointer DefaultFactory; //============================================================================ @@ -52,9 +53,13 @@ CDockAreaTitleBar* CDockComponentsFactory::createDockAreaTitleBar(CDockAreaWidge //============================================================================ -const CDockComponentsFactory* CDockComponentsFactory::factory() +QSharedPointer CDockComponentsFactory::factory() { - return DefaultFactory.get(); + if (!DefaultFactory) + { + DefaultFactory.reset(new CDockComponentsFactory()); + } + return DefaultFactory; } @@ -70,6 +75,7 @@ void CDockComponentsFactory::resetDefaultFactory() { DefaultFactory.reset(new CDockComponentsFactory()); } + } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockComponentsFactory.h b/src/DockComponentsFactory.h index 0d2b7d4..28d15a6 100644 --- a/src/DockComponentsFactory.h +++ b/src/DockComponentsFactory.h @@ -66,9 +66,11 @@ public: virtual CDockAreaTitleBar* createDockAreaTitleBar(CDockAreaWidget* DockArea) const; /** - * Returns the default components factory + * This returns the default dock components factory instance. + * If no components factory is assigned to a specifc dock manager, this + * global factory instance will be used. */ - static const CDockComponentsFactory* factory(); + static QSharedPointer factory(); /** * Sets a new default factory for creation of GUI elements. @@ -82,15 +84,6 @@ public: static void resetDefaultFactory(); }; - -/** - * Convenience function to ease factory instance access - */ -inline const CDockComponentsFactory* componentsFactory() -{ - return CDockComponentsFactory::factory(); -} - } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockManager.cpp b/src/DockManager.cpp index e7aabb3..2834455 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -60,6 +60,8 @@ #include "DockAreaTitleBar.h" #include "DockFocusController.h" #include "DockSplitter.h" +#include "DockComponentsFactory.h" + #if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS) #include "linux/FloatingWidgetTitleBar.h" @@ -125,6 +127,7 @@ struct DockManagerPrivate QSize ToolBarIconSizeDocked = QSize(16, 16); QSize ToolBarIconSizeFloating = QSize(24, 24); CDockWidget::DockWidgetFeatures LockedDockWidgetFeatures; + QSharedPointer ComponentFactory {ads::CDockComponentsFactory::factory()}; /** * Private data constructor @@ -581,6 +584,28 @@ CDockManager::~CDockManager() delete d; } + +//============================================================================ +QSharedPointer CDockManager::componentsFactory() const +{ + return d->ComponentFactory; +} + + +//============================================================================ +void CDockManager::setComponentsFactory(ads::CDockComponentsFactory* factory) +{ + setComponentsFactory(QSharedPointer(factory)); +} + + +//============================================================================ +void CDockManager::setComponentsFactory(QSharedPointer factory) +{ + d->ComponentFactory = factory; +} + + //============================================================================ #if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS) bool CDockManager::eventFilter(QObject *obj, QEvent *e) diff --git a/src/DockManager.h b/src/DockManager.h index 291ab68..4ac6ae4 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -290,6 +290,24 @@ public: */ virtual ~CDockManager() override; + /** + * Returns the dock manager specific factory for creating components of + * fock widgets + */ + QSharedPointer componentsFactory() const; + + /** + * Sets a custom factory for creating components of dock widgets. + * The pointer is stored internally into a shared pointer so you should not + * delete the given factory object as long as it is used by the dock manager. + */ + void setComponentsFactory(ads::CDockComponentsFactory* Factory); + + /** + * Sets a custom factory for creating components of dock widgets. + */ + void setComponentsFactory(QSharedPointer); + /** * This function returns the global configuration flags */ diff --git a/src/DockWidget.cpp b/src/DockWidget.cpp index 4bb8ea4..23b493d 100644 --- a/src/DockWidget.cpp +++ b/src/DockWidget.cpp @@ -102,6 +102,14 @@ struct DockWidgetPrivate */ DockWidgetPrivate(CDockWidget* _public); + /** + * Convenience function to ease components factory access + */ + QSharedPointer componentsFactory() const + { + return DockManager ? DockManager->componentsFactory() : CDockComponentsFactory::factory(); + } + /** * Show dock widget */ @@ -358,9 +366,17 @@ void DockWidgetPrivate::setToolBarStyleFromDockManager() //============================================================================ CDockWidget::CDockWidget(const QString &title, QWidget *parent) : - QFrame(parent), - d(new DockWidgetPrivate(this)) + CDockWidget(nullptr, title, parent) { +} + + +//============================================================================ +CDockWidget::CDockWidget(CDockManager *manager, const QString &title, QWidget* parent) + : QFrame(parent), + d(new DockWidgetPrivate(this)) +{ + d->DockManager = manager; d->Layout = new QBoxLayout(QBoxLayout::TopToBottom); d->Layout->setContentsMargins(0, 0, 0, 0); d->Layout->setSpacing(0); @@ -368,7 +384,7 @@ CDockWidget::CDockWidget(const QString &title, QWidget *parent) : setWindowTitle(title); setObjectName(title); - d->TabWidget = componentsFactory()->createDockWidgetTab(this); + d->TabWidget = d->componentsFactory()->createDockWidgetTab(this); d->ToggleViewAction = new QAction(title, this); d->ToggleViewAction->setCheckable(true); @@ -382,6 +398,7 @@ CDockWidget::CDockWidget(const QString &title, QWidget *parent) : } } + //============================================================================ CDockWidget::~CDockWidget() { diff --git a/src/DockWidget.h b/src/DockWidget.h index 0d6b88c..3dc1a9a 100644 --- a/src/DockWidget.h +++ b/src/DockWidget.h @@ -256,8 +256,18 @@ public: * during runtime, you need to set a unique object name explicitly * by calling setObjectName() after construction. * Use the layoutFlags to configure the layout of the dock widget. + * \note If you would like to use custom TabWidget implementations, you need + * to use the constructor with the CDockManager argument. */ - CDockWidget(const QString &title, QWidget* parent = nullptr); + explicit CDockWidget(const QString &title, QWidget* parent = nullptr); + + /** + * Creates a dock widget and assigns the dock manager that manages this + * widget. + * This allows the dock widget to use the componentsFactory() of the dock + * manager in the constructot to create its components. + */ + CDockWidget(CDockManager *manager, const QString &title, QWidget* parent = nullptr); /** * Virtual Destructor From fcad7763ffc0942e87c18665746b5f397fe8816f Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 20 Dec 2024 10:21:57 +0100 Subject: [PATCH 19/24] Add factory method to Dock manager as an alternative method to create DockWidget, supporting custom factory --- demo/MainWindow.cpp | 16 ++++++++-------- src/DockManager.cpp | 7 +++++++ src/DockManager.h | 15 +++++++++++++++ src/DockWidget.h | 27 ++++++++++++++++++++++----- 4 files changed, 52 insertions(+), 13 deletions(-) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index 9503ceb..b75276a 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -236,7 +236,7 @@ struct MainWindowPrivate m->setRootPath(QDir::currentPath()); w->setModel(m); w->setRootIndex(m->index(QDir::currentPath())); - ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Filesystem %1") + ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Filesystem %1") .arg(FileSystemCount++)); DockWidget->setWidget(w); DockWidget->setIcon(svgIcon(":/adsdemo/images/folder_open.svg")); @@ -257,7 +257,7 @@ struct MainWindowPrivate { static int CalendarCount = 0; QCalendarWidget* w = new QCalendarWidget(); - ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Calendar %1").arg(CalendarCount++)); + ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Calendar %1").arg(CalendarCount++)); // The following lines are for testing the setWidget() and takeWidget() // functionality DockWidget->setWidget(w); @@ -302,7 +302,7 @@ struct MainWindowPrivate .arg(LabelCount) .arg(QTime::currentTime().toString("hh:mm:ss:zzz"))); - ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Label %1").arg(LabelCount++)); + ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Label %1").arg(LabelCount++)); DockWidget->setWidget(l); DockWidget->setIcon(svgIcon(":/adsdemo/images/font_download.svg")); ui.menuView->addAction(DockWidget->toggleViewAction()); @@ -320,7 +320,7 @@ struct MainWindowPrivate w->setPlaceholderText("This is an editor. If you close the editor, it will be " "deleted. Enter your text here."); w->setStyleSheet("border: none"); - ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Editor %1").arg(EditorCount++)); + ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Editor %1").arg(EditorCount++)); DockWidget->setWidget(w); DockWidget->setIcon(svgIcon(":/adsdemo/images/edit.svg")); DockWidget->setFeature(ads::CDockWidget::CustomCloseHandling, true); @@ -363,7 +363,7 @@ struct MainWindowPrivate auto Result = w->loadFile(FileName); qDebug() << "loadFile result: " << Result; - ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Image Viewer %1").arg(ImageViewerCount++)); + ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Image Viewer %1").arg(ImageViewerCount++)); DockWidget->setIcon(svgIcon(":/adsdemo/images/photo.svg")); DockWidget->setWidget(w,ads:: CDockWidget::ForceNoScrollArea); auto ToolBar = DockWidget->createDefaultToolBar(); @@ -378,7 +378,7 @@ struct MainWindowPrivate { static int TableCount = 0; auto w = new CMinSizeTableWidget(); - ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Table %1").arg(TableCount++)); + ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Table %1").arg(TableCount++)); static int colCount = 5; static int rowCount = 30; w->setColumnCount(colCount); @@ -417,7 +417,7 @@ struct MainWindowPrivate ads::CDockWidget *createQQuickWidget() { QQuickWidget *widget = new QQuickWidget(); - ads::CDockWidget *dockWidget = new ads::CDockWidget("Quick"); + ads::CDockWidget *dockWidget = DockManager->createDockWidget("Quick"); dockWidget->setWidget(widget); return dockWidget; } @@ -432,7 +432,7 @@ struct MainWindowPrivate { static int ActiveXCount = 0; QAxWidget* w = new QAxWidget("{6bf52a52-394a-11d3-b153-00c04f79faa6}", parent); - ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Active X %1").arg(ActiveXCount++)); + ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Active X %1").arg(ActiveXCount++)); DockWidget->setWidget(w); ui.menuView->addAction(DockWidget->toggleViewAction()); return DockWidget; diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 2834455..6b99334 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -585,6 +585,13 @@ CDockManager::~CDockManager() } +//============================================================================ +CDockWidget* CDockManager::createDockWidget(const QString &title, QWidget* parent) +{ + return new CDockWidget(this, title, parent); +} + + //============================================================================ QSharedPointer CDockManager::componentsFactory() const { diff --git a/src/DockManager.h b/src/DockManager.h index 4ac6ae4..3eab946 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -290,6 +290,21 @@ public: */ virtual ~CDockManager() override; + /** + * Creates a new dock widget with the specified title and optional parent + * widget. + * + * The new dock widget will be managed by the dock manager, and its lifetime + * will be tied to the dock manager. If a parent widget is provided, the dock + * widget will be created as a child of the parent widget. If no parent widget + * is provided, the dock widget will be created as a top-level widget. + * + * @param title The title of the dock widget. + * @param parent The parent widget, if any. Defaults to nullptr. + * @return Returns a pointer to the created CDockWidget. + */ + CDockWidget *createDockWidget(const QString &title, QWidget* parent = nullptr); + /** * Returns the dock manager specific factory for creating components of * fock widgets diff --git a/src/DockWidget.h b/src/DockWidget.h index 3dc1a9a..04d10f8 100644 --- a/src/DockWidget.h +++ b/src/DockWidget.h @@ -259,13 +259,30 @@ public: * \note If you would like to use custom TabWidget implementations, you need * to use the constructor with the CDockManager argument. */ - explicit CDockWidget(const QString &title, QWidget* parent = nullptr); + Q_DECL_DEPRECATED explicit CDockWidget(const QString &title, QWidget* parent = nullptr); /** - * Creates a dock widget and assigns the dock manager that manages this - * widget. - * This allows the dock widget to use the componentsFactory() of the dock - * manager in the constructot to create its components. + * This constructor creates a dock widget for the given dock manager with the + * provided title. + * + * @param manager Pointer to the dock manager that owns the dock widget. + * @param 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. + * @param parent Pointer to the parent widget, defaults to nullptr. + * + * @note 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 + * the title is not unique or if you would like to change the title during + * runtime, you need to set a unique object name explicitly by calling + * setObjectName() after construction. Use the layoutFlags to configure the + * layout of the dock widget. + * + * @note this constructor is preferred over the two argument version, especially + * when custom factories are in use. Indeed, it will use the Dock Manager factory, + * and not the default factory. For this reason, the original constructor should + * be deprecated in favour of this version. */ CDockWidget(CDockManager *manager, const QString &title, QWidget* parent = nullptr); From 349d5842281e18a6cb445b85c8c2e05b74b1e0b0 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 20 Dec 2024 10:26:59 +0100 Subject: [PATCH 20/24] Adjusted MyDockAreaTitleBar source code style --- demo/MyDockAreaTitleBar.h | 74 ++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/demo/MyDockAreaTitleBar.h b/demo/MyDockAreaTitleBar.h index 074cc79..e5ed06d 100644 --- a/demo/MyDockAreaTitleBar.h +++ b/demo/MyDockAreaTitleBar.h @@ -1,34 +1,58 @@ -// -// Created by fuga on 08 nov 2024. -// - #ifndef QTADS_MYDOCKAREATITLEBAR_H #define QTADS_MYDOCKAREATITLEBAR_H +/******************************************************************************* +** Qt Advanced Docking System +** Copyright (C) 2017 Uwe Kindler +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License as published by the Free Software Foundation; either +** version 2.1 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public +** License along with this library; If not, see . +******************************************************************************/ + +//============================================================================ +// INCLUDES +//============================================================================ #include -class MyDockAreaTitleBar : public ads::CDockAreaTitleBar { -public: - explicit MyDockAreaTitleBar(ads::CDockAreaWidget* parent) - : CDockAreaTitleBar(parent) - {} - QMenu* buildContextMenu(QMenu*) override - { - auto menu = ads::CDockAreaTitleBar::buildContextMenu(nullptr); - menu->addSeparator(); - auto action = menu->addAction(tr("Format HardDrive")); - - connect(action, &QAction::triggered, this, [this](){ - QMessageBox msgBox; - msgBox.setText("No, just kidding"); - msgBox.setStandardButtons(QMessageBox::Abort); - msgBox.setDefaultButton(QMessageBox::Abort); - msgBox.exec(); - }); - - return menu; - } +/** + * Custom DockAreaTitleBar that adds a custom context menu + */ +class MyDockAreaTitleBar : public ads::CDockAreaTitleBar +{ +public: + explicit MyDockAreaTitleBar(ads::CDockAreaWidget *parent) : + CDockAreaTitleBar(parent) + { + } + + QMenu* buildContextMenu(QMenu*) override + { + auto menu = ads::CDockAreaTitleBar::buildContextMenu(nullptr); + menu->addSeparator(); + auto action = menu->addAction(tr("Format HardDrive")); + + connect(action, &QAction::triggered, this, [this]() + { + QMessageBox msgBox; + msgBox.setText("No, just kidding"); + msgBox.setStandardButtons(QMessageBox::Abort); + msgBox.setDefaultButton(QMessageBox::Abort); + msgBox.exec(); + }); + + return menu; + } }; #endif // QTADS_MYDOCKAREATITLEBAR_H From 0a55bcd586fb45f2280d4c050a512984ff26cfef Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 20 Dec 2024 10:35:22 +0100 Subject: [PATCH 21/24] Updated README.md to use the new factory function CDockManager::createDockWidget() --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ca76dba..bbdd05c 100644 --- a/README.md +++ b/README.md @@ -462,7 +462,7 @@ MainWindow::MainWindow(QWidget *parent) : // Create the dock manager after the ui is setup. Because the // parent parameter is a QMainWindow the dock manager registers // itself as the central widget as such the ui must be set up first. - m_DockManager = new ads::CDockManager(this); + DockManager = new ads::CDockManager(this); // Create example content label - this can be any application specific // widget @@ -473,7 +473,7 @@ MainWindow::MainWindow(QWidget *parent) : // Create a dock widget with the title Label 1 and set the created label // as the dock widget content - ads::CDockWidget* DockWidget = new ads::CDockWidget("Label 1"); + ads::CDockWidget* DockWidget = DockManager->createDockWidget("Label 1"); DockWidget->setWidget(l); // Add the toggleViewAction of the dock widget to the menu to give @@ -481,7 +481,7 @@ MainWindow::MainWindow(QWidget *parent) : ui->menuView->addAction(DockWidget->toggleViewAction()); // Add the dock widget to the top dock widget area - m_DockManager->addDockWidget(ads::TopDockWidgetArea, DockWidget); + DockManager->addDockWidget(ads::TopDockWidgetArea, DockWidget); } MainWindow::~MainWindow() From 979d76aa47a5e4e9925d58be3b7bf9948a822364 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 20 Dec 2024 11:09:11 +0100 Subject: [PATCH 22/24] Imporved user guide - added documentation for some undocumented flags. --- doc/user-guide.md | 103 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 4 deletions(-) diff --git a/doc/user-guide.md b/doc/user-guide.md index 024c5e4..482bbf3 100644 --- a/doc/user-guide.md +++ b/doc/user-guide.md @@ -29,8 +29,8 @@ - [`MiddleMouseButtonClosesTab`](#middlemousebuttonclosestab) - [`DisableTabTextEliding`](#disabletabtexteliding) - [`ShowTabTextOnlyForActiveTab`](#showtabtextonlyforactivetab) -- [Auto-Hide Configuration Flags](#auto-hide-configuration-flags) - - [Auto Hide Dock Widgets](#auto-hide-dock-widgets) + - [`DoubleClickUndocksWidget`](#doubleclickundockswidget) +- [Auto Hide Dock Widgets](#auto-hide-dock-widgets) - [Pinning Auto-Hide Widgets to a certain border](#pinning-auto-hide-widgets-to-a-certain-border) - [Show / Hide Auto-Hide Widgets via Mouse Over](#show--hide-auto-hide-widgets-via-mouse-over) - [Drag \& Drop to Auto-Hide](#drag--drop-to-auto-hide) @@ -39,6 +39,7 @@ - [Auto-Hide Drag to Float / Dock](#auto-hide-drag-to-float--dock) - [Auto-Hide Context Menu](#auto-hide-context-menu) - [Adding Auto Hide Widgets](#adding-auto-hide-widgets) +- [Auto-Hide Configuration Flags](#auto-hide-configuration-flags) - [Setting Auto-Hide Flags](#setting-auto-hide-flags) - [`AutoHideFeatureEnabled`](#autohidefeatureenabled) - [`DockAreaHasAutoHideButton`](#dockareahasautohidebutton) @@ -63,6 +64,8 @@ - [Central Widget](#central-widget) - [Empty Dock Area](#empty-dock-area) - [Custom Close Handling](#custom-close-handling) +- [Globally Lock Docking Features](#globally-lock-docking-features) +- [Dock Widget Size / Minimum Size Handling](#dock-widget-size--minimum-size-handling) - [Styling](#styling) - [Disabling the Internal Style Sheet](#disabling-the-internal-style-sheet) @@ -496,9 +499,12 @@ for active tabs. Inactive tabs only show their icon: ![MShowTabTextOnlyForActiveTab true](cfg_flag_ShowTabTextOnlyForActiveTab_true.png) -## Auto-Hide Configuration Flags +### `DoubleClickUndocksWidget` -### Auto Hide Dock Widgets +If the flag is set (default), a double click on a tab undocks the dock widget. +If you would like to disable undocking, just clear this flag. + +## Auto Hide Dock Widgets The Advanced Docking System supports "Auto-Hide" functionality for **all** dock containers. The "Auto Hide" feature allows to display more information @@ -599,6 +605,8 @@ DockManager->addAutoHideDockWidget(SideBarLeft, TableDockWidget); See `autohide` example or the demo application to learn how it works. +## Auto-Hide Configuration Flags + ### Setting Auto-Hide Flags The Advanced Docking System has a number of global configuration flags to @@ -835,6 +843,93 @@ Normally clicking the close button of a dock widget will just hide the widget an When an entire area is closed, the default behavior is to hide the dock widgets it contains regardless of the `DockWidgetDeleteOnClose` flag except if there is only one dock widget. In this special case, the `DockWidgetDeleteOnClose` flag is followed. This behavior can be changed by setting the `DockWidgetForceCloseWithArea` flag to all the dock widgets that needs to be closed with their area. +## Globally Lock Docking Features + +It is possible to globally lock features of all dock widgets to "freeze" the +current workspace layout. That means, you can now lock your workspace +to avoid accidentally dragging a docked view. When locking was't possible, +users had to manually dock it back to the desired place after each accidental +undock. + +You can use a combination of the following feature flags to define which features +shall get locked: + +- CDockWidget::DockWidgetClosable +- CDockWidget::DockWidgetMovable +- CDockWidget::DockWidgetFloatable +- CDockWidget::DockWidgetPinable + +To clear the locked features, you can use CDockWidget::NoDockWidgetFeatures +The following code shows how to lock and unlock all dock widget features +globally. + +```c++ +DockManager->lockDockWidgetFeaturesGlobally(); +DockManager->lockDockWidgetFeaturesGlobally(CDockWidget::NoDockWidgetFeatures); +``` + +## Dock Widget Size / Minimum Size Handling + +There are several `CDockWidget` mode enums to control how a `CDockWidget` is +resized and how the docking system handles the minimum size of a dockwidget. + +The first one is the `eInsertMode` enum: + +```c++ +enum eInsertMode +{ + AutoScrollArea, + ForceScrollArea, + ForceNoScrollArea +}; +``` + +The InsertMode defines how the widget is inserted into the dock widget, when you +call the `CDockWidget::setWidget` method: + +```c++ +DockWidget->setWidget(widget, CDockWidget::AutoScrollArea); +``` + +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 (such as an `QAbstractItemView`) +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`. In this case a scroll area will also be created for content +widgets that are derived from `QScrollArea` To prevent insertion into a scroll +area, you can provide the InsertMode `ForceNoScrollArea`. In this case, the +content widget is always inserted directly. + +A second enum, the `eMinimumSizeHintMode` defines, which value will be returned +from the `CDockWidget::minimumSizeHint()` function: + +```c++ +enum eMinimumSizeHintMode +{ + MinimumSizeHintFromDockWidget, + MinimumSizeHintFromContent, + MinimumSizeHintFromDockWidgetMinimumSize, + MinimumSizeHintFromContentMinimumSize, +}; +``` + +To ensure, that a dock widget does not block resizing, the dock widget +reimplements `minimumSizeHint()` function to return a very small minimum +size hint. If you would like to adhere the `minimumSizeHint()` from the +content widget, then set the `minimumSizeHintMode()` to +`MinimumSizeHintFromContent`. If you would like to use the `minimumSize()` +value of the content widget or the dock widget, then you can use the +`MinimumSizeHintFromDockWidgetMinimumSize` or +`MinimumSizeHintFromContentMinimumSize` modes. + ## Styling The Advanced Docking System supports styling via [Qt Style Sheets](https://doc.qt.io/qt-5/stylesheet.html). All components like splitters, tabs, buttons, titlebar and From faf24cd5319918077870bb50047409e290b41c44 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Wed, 15 Jan 2025 08:37:43 +0100 Subject: [PATCH 23/24] Implemented issue #694 - added auto hide configuration flag AutoHideCloseOnOutsideMouseClick --- demo/MainWindow.cpp | 3 +++ doc/user-guide.md | 8 +++++++- src/AutoHideDockContainer.cpp | 8 ++++++-- src/DockManager.h | 2 ++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index b75276a..77c3af2 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -769,6 +769,9 @@ CMainWindow::CMainWindow(QWidget *parent) : // uncomment if you would like to enable dock widget auto hiding CDockManager::setAutoHideConfigFlags({CDockManager::DefaultAutoHideConfig}); + // uncomment if you would like to disable closing auto hide widget with mouse click outside of auto hide container + //CDockManager::setAutoHideConfigFlag(CDockManager::AutoHideCloseOnOutsideMouseClick, false); + // uncomment if you would like to enable an equal distribution of the // available size of a splitter to all contained dock widgets // CDockManager::setConfigFlag(CDockManager::EqualSplitOnInsertion, true); diff --git a/doc/user-guide.md b/doc/user-guide.md index 482bbf3..66bada3 100644 --- a/doc/user-guide.md +++ b/doc/user-guide.md @@ -51,6 +51,7 @@ - [`AutoHideHasCloseButton`](#autohidehasclosebutton) - [`AutoHideHasMinimizeButton`](#autohidehasminimizebutton) - [`AutoHideOpenOnDragHover`](#autohideopenondraghover) + - [`AutoHideCloseOnOutsideMouseClick`](#autohidecloseonoutsidemouseclick) - [DockWidget Feature Flags](#dockwidget-feature-flags) - [`DockWidgetClosable`](#dockwidgetclosable) - [`DockWidgetMovable`](#dockwidgetmovable) @@ -713,7 +714,6 @@ If this flag is set (disabled by default), then each auto hide widget has a mini ![AutoHideHasMinimizeButton](cfg_flag_AutoHideHasMinimizeButton.png) - ### `AutoHideOpenOnDragHover` If this flag is set (disabled by default), then holding a dragging cursor hover an auto-hide collapsed dock's tab will open said dock: @@ -722,6 +722,12 @@ If this flag is set (disabled by default), then holding a dragging cursor hover Said dock must be set to accept drops to hide when cursor leaves its scope. See `AutoHideDragNDropExample` for more details. +### `AutoHideCloseOnOutsideMouseClick` + +If this flag is set (default), the auto hide dock container will collapse if the +user clicks outside of the container. If not set, the auto hide container can be +closed only via click on auto hide sidebar tab. + ## DockWidget Feature Flags ### `DockWidgetClosable` diff --git a/src/AutoHideDockContainer.cpp b/src/AutoHideDockContainer.cpp index 7cb20b2..75c1409 100644 --- a/src/AutoHideDockContainer.cpp +++ b/src/AutoHideDockContainer.cpp @@ -602,8 +602,12 @@ bool CAutoHideDockContainer::eventFilter(QObject* watched, QEvent* event) return Super::eventFilter(watched, event); } - // user clicked into container - collapse the auto hide widget - collapseView(true); + // user clicked outside of autohide container - collapse the auto hide widget + if (CDockManager::testAutoHideConfigFlag( + CDockManager::AutoHideCloseOnOutsideMouseClick)) + { + collapseView(true); + } } else if (event->type() == internal::FloatingWidgetDragStartEvent) { diff --git a/src/DockManager.h b/src/DockManager.h index 3eab946..08897bd 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -258,10 +258,12 @@ public: AutoHideHasCloseButton = 0x80, //< If the flag is set an auto hide title bar has a close button AutoHideHasMinimizeButton = 0x100, ///< if this flag is set, the auto hide title bar has a minimize button to collapse the dock widget AutoHideOpenOnDragHover = 0x200, ///< if this flag is set, dragging hover the tab bar will open the dock + AutoHideCloseOnOutsideMouseClick = 0x400, ///< if this flag is set, the auto hide dock container will collapse if the user clicks outside of the container, if not set, the auto hide container can be closed only via click on sidebar tab DefaultAutoHideConfig = AutoHideFeatureEnabled | DockAreaHasAutoHideButton | AutoHideHasMinimizeButton + | AutoHideCloseOnOutsideMouseClick }; Q_DECLARE_FLAGS(AutoHideFlags, eAutoHideFlag) From a16d17a8bf375127847ac8f40af1ebcdb841b13c Mon Sep 17 00:00:00 2001 From: luzpaz Date: Wed, 15 Jan 2025 03:00:47 -0500 Subject: [PATCH 24/24] Fix various typos (#692) * Fix various typos Found via `codespell -q 3 -L te,ridiculus,varius` * Add another typo fix --- README.md | 2 +- doc/user-guide.md | 2 +- src/DockAreaWidget.cpp | 8 ++++---- src/DockComponentsFactory.h | 2 +- src/DockManager.cpp | 2 +- src/ads_globals.cpp | 2 +- src/ads_globals.h | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index bbdd05c..a16f4f8 100644 --- a/README.md +++ b/README.md @@ -582,7 +582,7 @@ highlights are: - Simple Drag & Drop user interface. - Load data from file. - Connect to live streaming of data. -- Save the visualization layout and configurations to re-use them later. +- Save the visualization layout and configurations to reuse them later. - Fast OpenGL visualization. - Can handle thousands of timeseries and millions of data points. - Transform your data using a simple editor: derivative, moving average, integral, etc… diff --git a/doc/user-guide.md b/doc/user-guide.md index 66bada3..9832d35 100644 --- a/doc/user-guide.md +++ b/doc/user-guide.md @@ -853,7 +853,7 @@ When an entire area is closed, the default behavior is to hide the dock widgets It is possible to globally lock features of all dock widgets to "freeze" the current workspace layout. That means, you can now lock your workspace -to avoid accidentally dragging a docked view. When locking was't possible, +to avoid accidentally dragging a docked view. When locking wasn't possible, users had to manually dock it back to the desired place after each accidental undock. diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index cba0650..ddd514a 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -270,7 +270,7 @@ struct DockAreaWidgetPrivate DockAreaWidgetPrivate(CDockAreaWidget* _public); /** - * Convencience function to ease components factory access + * Convenience function to ease components factory access */ QSharedPointer componentsFactory() const { @@ -379,10 +379,10 @@ void DockAreaWidgetPrivate::updateTitleBarButtonStates() if (_this->isAutoHide()) { - if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideHasCloseButton)) - { + if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideHasCloseButton)) + { TitleBar->button(TitleBarButtonClose)->setEnabled( - _this->features().testFlag(CDockWidget::DockWidgetClosable)); + _this->features().testFlag(CDockWidget::DockWidgetClosable)); } } else diff --git a/src/DockComponentsFactory.h b/src/DockComponentsFactory.h index 28d15a6..6ea8818 100644 --- a/src/DockComponentsFactory.h +++ b/src/DockComponentsFactory.h @@ -67,7 +67,7 @@ public: /** * This returns the default dock components factory instance. - * If no components factory is assigned to a specifc dock manager, this + * If no components factory is assigned to a specific dock manager, this * global factory instance will be used. */ static QSharedPointer factory(); diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 6b99334..99b432c 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -555,7 +555,7 @@ CDockManager::~CDockManager() { if (!area || area->dockManager() != this) continue; - // QPointer delete safety - just in case some dock wigdet in destruction + // QPointer delete safety - just in case some dock widget in destruction // deletes another related/twin or child dock widget. std::vector> deleteWidgets; for ( auto widget : area->dockWidgets() ) diff --git a/src/ads_globals.cpp b/src/ads_globals.cpp index 7d3cf7e..b019318 100644 --- a/src/ads_globals.cpp +++ b/src/ads_globals.cpp @@ -283,7 +283,7 @@ QString detectWindowManagerX11() } if(sup_windows.length() == 0) { - ADS_PRINT("Failed to get the supporting window on non EWMH comform WM."); + ADS_PRINT("Failed to get the supporting window on non EWMH conform WM."); return "UNKNOWN"; } support_win = sup_windows[0]; diff --git a/src/ads_globals.h b/src/ads_globals.h index 83deecc..f7ccc8e 100644 --- a/src/ads_globals.h +++ b/src/ads_globals.h @@ -236,7 +236,7 @@ SideBarLocation toSideBarLocation(DockWidgetArea Area); /** - * Returns true for the top or bottom side bar ansd false for the + * Returns true for the top or bottom side bar and false for the * left and right side bar */ bool isHorizontalSideBarLocation(SideBarLocation Location);