18#include <QElapsedTimer>
19#include <QApplication>
24class DockSideTabPrivate
30 void updateOrientation();
32 DockContainer *dockContainer()
const;
33 void forwardEventToDockContainer(QEvent *event);
34 QAction *createAutoHideToAction(
const QString &title,
Qx::DockSideBarArea area, QMenu *menu);
35 void saveDragStartMousePosition(
const QPoint &globalPos);
39 template <
typename T> DockFloatingWidget *createFloatingWidget(T *widget)
42 auto w =
new DockFloatingPreview(widget);
43 q->connect(w, &DockFloatingPreview::draggingCanceled, [=]() {
49 DockSideBar *m_sideBar =
nullptr;
50 DockWidget *m_dockWidget =
nullptr;
51 Qt::Orientation m_orientation{Qt::Vertical};
52 QElapsedTimer m_timeSinceHoverMousePress;
53 bool m_mousePressed =
false;
55 QPoint m_globalDragStartMousePosition;
56 QPoint m_dragStartMousePosition;
57 DockFloatingWidget *m_floatingWidget =
nullptr;
58 Qt::Orientation m_dragStartOrientation;
61DockSideTabPrivate::DockSideTabPrivate()
65void DockSideTabPrivate::updateOrientation()
68 bool IconOnly = DockManager::testAutoHideConfigFlag(DockManager::AutoHideSideBarsIconOnly);
69 if (IconOnly && !q->icon().isNull()) {
71 q->setOrientation(Qt::Horizontal);
73 auto area = m_sideBar->sideBarArea();
79DockContainer *DockSideTabPrivate::dockContainer()
const
81 return m_dockWidget ? m_dockWidget->dockContainer() :
nullptr;
84void DockSideTabPrivate::forwardEventToDockContainer(QEvent *event)
87 auto container = dockContainer();
89 container->handleAutoHideWidgetEvent(event, q);
93QAction *DockSideTabPrivate::createAutoHideToAction(
const QString &title,
Qx::DockSideBarArea area, QMenu *menu)
96 auto action = menu->addAction(title);
97 action->setProperty(internal::LocationProperty, area);
98 QObject::connect(action, &QAction::triggered, q, &DockSideTab::onAutoHideToActionClicked);
99 action->setEnabled(area != q->sideBarArea());
103void DockSideTabPrivate::saveDragStartMousePosition(
const QPoint &globalPos)
106 m_globalDragStartMousePosition = globalPos;
107 m_dragStartMousePosition = q->mapFromGlobal(globalPos);
112 return this->m_dragState == dragState;
118 auto panel = m_dockWidget->dockPanel();
119 m_dragState = draggingState;
120 DockFloatingWidget *floatingWidget =
nullptr;
121 floatingWidget = createFloatingWidget(panel);
122 auto size = panel->size();
123 auto startPos = m_dragStartMousePosition;
124 auto autoHideContainer = m_dockWidget->autoHideContainer();
125 m_dragStartOrientation = autoHideContainer->orientation();
126 switch (m_sideBar->sideBarArea()) {
128 startPos.rx() = autoHideContainer->rect().left() + 10;
132 startPos.rx() = autoHideContainer->rect().right() - 10;
136 startPos.ry() = autoHideContainer->rect().top() + 10;
140 startPos.ry() = autoHideContainer->rect().bottom() - 10;
147 auto dockWindow = m_dockWidget->dockWindow();
148 auto Overlay = dockWindow->containerOverlay();
150 this->m_floatingWidget = floatingWidget;
151 qApp->postEvent(m_dockWidget,
new QEvent((QEvent::Type)internal::DockedWidgetDragStartEvent));
156DockSideTab::DockSideTab(QWidget *parent)
160 setAttribute(Qt::WA_NoMousePropagation);
161 setFocusPolicy(Qt::NoFocus);
172 return d->m_dockWidget;
182 setText(w->windowTitle());
183 setIcon(d->m_dockWidget->icon());
184 setToolTip(w->windowTitle());
190 return d->m_orientation;
201 setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
203 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
220 return d->m_sideBar->sideBarArea();
233 if (d->m_dockWidget && d->m_dockWidget->autoHideContainer()) {
234 return d->m_dockWidget->autoHideContainer()->isVisible();
269 return d->m_sideBar->indexOfTab(*
this);
275 d->m_dockWidget->setFloating();
281 d->m_dockWidget->setAutoHide(
false);
287 d->m_dockWidget->requestCloseDockWidget();
293 int location = sender()->property(internal::LocationProperty).toInt();
302 d->updateOrientation();
309 if (d->m_sideBar ==
nullptr) {
312 d->m_sideBar->removeTab(
this);
320 return Super::event(e);
326 d->forwardEventToDockContainer(e);
332 return Super::event(e);
342 if (!e->spontaneous()) {
343 d->m_timeSinceHoverMousePress.restart();
344 d->forwardEventToDockContainer(e);
345 }
else if (d->m_timeSinceHoverMousePress.hasExpired(500)) {
346 d->forwardEventToDockContainer(e);
349 if (e->button() == Qt::LeftButton) {
351 d->m_mousePressed =
true;
355 Super::mousePressEvent(e);
361 if (e->button() == Qt::LeftButton) {
362 d->m_mousePressed =
false;
363 auto currentDragState = d->m_dragState;
364 d->m_globalDragStartMousePosition = QPoint();
365 d->m_dragStartMousePosition = QPoint();
368 switch (currentDragState) {
374 d->m_floatingWidget->finishDragging();
375 if (d->m_dockWidget->autoHideContainer() && d->m_dragStartOrientation !=
orientation()) {
376 d->m_dockWidget->autoHideContainer()->resetToInitialDockWidgetSize();
385 Super::mouseReleaseEvent(e);
393 Super::mouseMoveEvent(e);
399 d->m_floatingWidget->moveFloating();
400 Super::mouseMoveEvent(e);
411 auto mappedPos = mapToParent(e->pos());
412 bool mouseOutsideBar = (mappedPos.x() < 0) || (mappedPos.x() > parentWidget()->rect().right());
418 auto Features = d->m_dockWidget->features();
425 Super::mouseMoveEvent(e);
432 d->saveDragStartMousePosition(e->globalPos());
439 action->setEnabled(isFloatable);
441 action->setEnabled(IsPinnable);
443 auto pinMenu = menu.addMenu(tr(
"Pin To..."));
444 pinMenu->setEnabled(IsPinnable);
450 action = menu.addAction(tr(
"Unpin (Dock)"),
this, SLOT(
unpinDockWidget()));
455 menu.exec(e->globalPos());
@ AutoHideSideBarsIconOnly
@ AutoHideShowOnMouseOver
static bool testAutoHideConfigFlag(AutoHideFlag flag)
static int startDragDistance()
The distance the user needs to move the mouse with the left button hold down before a dock widget sta...
A dock widget Side tab that shows a title or an icon.
bool iconOnly() const
Returns true if the auto hide config flag AutoHideSideBarsIconOnly is set and if the tab has an icon ...
virtual void mouseMoveEvent(QMouseEvent *e) override
bool isActiveTab() const
Returns true, if this is the active tab.
virtual void contextMenuEvent(QContextMenuEvent *e) override
void setOrientation(Qt::Orientation orientation)
Set orientation vertical or horizontal
Qt::Orientation orientation() const
void onAutoHideToActionClicked()
int tabIndex() const
Returns the index of this tab in the sideBar
void setDockWidget(DockWidget *w)
virtual void mousePressEvent(QMouseEvent *e) override
void requestCloseDockWidget()
DockWidget * dockWidget() const
DockSideBar * sideBar() const
Returns the side bar that contains this tab or a nullptr if the tab is not in a side bar
Qx::DockSideBarArea sideBarArea() const
void setDockWidgetFloating()
virtual void mouseReleaseEvent(QMouseEvent *e) override
void setSideBar(DockSideBar *sideBar)
virtual bool event(QEvent *e) override
void repolishStyle(QWidget *w, RepolishChildOptions options)
Calls unpolish() / polish for the style of the given widget to update stylesheet if a property change...
QPoint globalPositionOf(QMouseEvent *e)
@ DockDraggingFloatingWidget
@ DockDraggingMousePressed
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE