mirror of
https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git
synced 2025-01-24 13:32:06 +08:00
Add open auto-hide dock on hover from drag and drop (#663)
This commit is contained in:
parent
952131a1e9
commit
6ff39bccf8
BIN
doc/cfg_flag_AutoHideOpenOnDragHover.gif
Normal file
BIN
doc/cfg_flag_AutoHideOpenOnDragHover.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 269 KiB |
@ -49,6 +49,7 @@
|
||||
- [`AutoHideCloseButtonCollapsesDock`](#autohideclosebuttoncollapsesdock)
|
||||
- [`AutoHideHasCloseButton`](#autohidehasclosebutton)
|
||||
- [`AutoHideHasMinimizeButton`](#autohidehasminimizebutton)
|
||||
- [`AutoHideOpenOnDragHover`](#autohideopenondraghover)
|
||||
- [DockWidget Feature Flags](#dockwidget-feature-flags)
|
||||
- [`DockWidgetClosable`](#dockwidgetclosable)
|
||||
- [`DockWidgetMovable`](#dockwidgetmovable)
|
||||
@ -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`
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -18,7 +18,6 @@
|
||||
** License along with this library; If not, see <http://www.gnu.org/licenses/>.
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
//============================================================================
|
||||
/// \file AutoHideDockContainer.h
|
||||
/// \author Syarif Fakhri
|
||||
@ -29,10 +28,10 @@
|
||||
//============================================================================
|
||||
// INCLUDES
|
||||
//============================================================================
|
||||
#include "ads_globals.h"
|
||||
|
||||
#include <QSplitter>
|
||||
|
||||
#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
|
||||
|
@ -33,6 +33,8 @@
|
||||
#include <QApplication>
|
||||
#include <QElapsedTimer>
|
||||
#include <QMenu>
|
||||
#include <qevent.h>
|
||||
#include <qnamespace.h>
|
||||
|
||||
#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()
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user