QtCanpool 3.3.0
载入中...
搜索中...
未找到
docktitlebar.cpp
浏览该文件的文档.
1
6#include "docktitlebar.h"
7#include "docktitlebar_p.h"
8#include "dockpanel.h"
9#include "docktabbar.h"
10#include "docktab.h"
11#include "dockutils.h"
12#include "dockmanager.h"
14#include "dockfloatingpreview.h"
15#include "dockcontainer.h"
16#include "dockwindow.h"
17#include "dockoverlay.h"
18#include "dockfocuscontroller.h"
19#include "docklabel.h"
21
22#include <QBoxLayout>
23#include <QMenu>
24#include <QMouseEvent>
25#include <QApplication>
26#include <QPointer>
27
29
30TitleBarButton::TitleBarButton(bool showInTitleBar, bool hideWhenDisabled, Qx::DockTitleBarButton id, QWidget *parent)
31 : QToolButton(parent)
32 , m_id(id)
33 , m_showInTitleBar(showInTitleBar)
34 , m_hideWhenDisabled(DockManager::testConfigFlag(DockManager::DockAreaHideDisabledButtons) && hideWhenDisabled)
35{
36 setFocusPolicy(Qt::NoFocus);
37}
38
40{
41 this->m_showInTitleBar = show;
42 if (!show) {
43 setVisible(false);
44 }
45}
46
48{
49 return qobject_cast<DockTitleBar *>(parentWidget());
50}
51
53{
54 auto titleBar = this->titleBar();
55 return titleBar && titleBar->isAutoHide();
56}
57
62{
63 // 'visible' can stay 'true' if and only if this button is configured to generally visible:
64 visible = visible && this->m_showInTitleBar;
65
66 // 'visible' can stay 'true' unless: this button is configured to be invisible when it is disabled and it is
67 // currently disabled:
68 if (visible && m_hideWhenDisabled) {
69 visible = isEnabled();
70 }
71
72 Super::setVisible(visible);
73}
74
78bool TitleBarButton::event(QEvent *e)
79{
80 if (QEvent::EnabledChange != e->type() || !m_hideWhenDisabled || !m_showInTitleBar) {
81 return Super::event(e);
82 }
83
84 bool show = true;
85 if (isInAutoHideArea()) {
86 switch (m_id) {
89 break;
91 show = false;
92 break;
93 default:
94 break;
95 }
96 }
97
98 // force setVisible() call - Calling setVisible() directly here doesn't
99 // work well when button is expected to be shown first time
100 QMetaObject::invokeMethod(this, "setVisible", Qt::QueuedConnection,
101 Q_ARG(bool, isEnabledTo(this->parentWidget()) & show));
102
103 return Super::event(e);
104}
105
107 : QWidget(parent)
108{
109 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
110 setStyleSheet("border: none; background: none;");
111}
112
113class DockTitleBarPrivate
114{
115public:
117public:
118 DockTitleBarPrivate();
119
120 void init();
121 void createTabBar();
122 void createButtons();
123 void createAutoHideTitleLabel();
124
125 DockWindow *dockWindow() const;
126
127 bool isDraggingState(Qx::DockDragState dragState) const;
128 void startFloating(const QPoint &offset);
129 DockFloatingWidget *makeAreaFloating(const QPoint &offset, Qx::DockDragState dragState);
130
131 static bool testConfigFlag(DockManager::ConfigFlag flag);
132 static bool testAutoHideConfigFlag(DockManager::AutoHideFlag flag);
133 QAction *createAutoHideToAction(const QString &title, Qx::DockSideBarArea area, QMenu *menu);
134public:
135 DockPanel *m_panel = nullptr;
136 QBoxLayout *m_layout = nullptr;
137 DockTabBar *m_tabBar = nullptr;
138
139 QPointer<TitleBarButton> m_tabsMenuButton;
140 QPointer<TitleBarButton> m_undockButton;
141 QPointer<TitleBarButton> m_closeButton;
142 QPointer<TitleBarButton> m_autoHideButton;
143 QPointer<TitleBarButton> m_minimizeButton;
144
145 QList<TitleBarButton *> m_dockWidgetActionsButtons;
146 bool m_menuOutdated = true;
147
149 QPoint m_dragStartMousePos;
150 DockFloatingWidget *m_floatingWidget = nullptr;
151 DockLabel *m_autoHideTitleLabel = nullptr;
152};
153
154DockTitleBarPrivate::DockTitleBarPrivate()
155{
156}
157
158void DockTitleBarPrivate::init()
159{
160 Q_Q(DockTitleBar);
161
162 m_layout = new QBoxLayout(QBoxLayout::LeftToRight);
163 m_layout->setContentsMargins(0, 0, 0, 0);
164 m_layout->setSpacing(0);
165 q->setLayout(m_layout);
166
167 createTabBar();
168 createButtons();
169 createAutoHideTitleLabel();
170}
171
172void DockTitleBarPrivate::createTabBar()
173{
174 Q_Q(DockTitleBar);
175 m_tabBar = new DockTabBar(m_panel);
176 // The horizontal direction uses Expanding instead of Maximum to maximize expansion
177 // I don't know why QSizePolicy::Maximum doesn't work good
178 m_tabBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
179 m_layout->addWidget(m_tabBar);
180 q->connect(m_tabBar, SIGNAL(tabClosed(int)), SLOT(markTabsMenuOutdated()));
181 q->connect(m_tabBar, SIGNAL(tabOpened(int)), SLOT(markTabsMenuOutdated()));
182 q->connect(m_tabBar, SIGNAL(tabInserted(int)), SLOT(markTabsMenuOutdated()));
183 q->connect(m_tabBar, SIGNAL(tabMoved(int, int)), SLOT(markTabsMenuOutdated()));
184 q->connect(m_tabBar, SIGNAL(removingTab(int)), SLOT(markTabsMenuOutdated()));
185 q->connect(m_tabBar, SIGNAL(currentChanged(int)), SLOT(onCurrentTabChanged(int)));
186 q->connect(m_tabBar, SIGNAL(tabBarClicked(int)), SIGNAL(tabBarClicked(int)));
187 q->connect(m_tabBar, SIGNAL(elidedChanged(bool)), SLOT(markTabsMenuOutdated()));
188}
189
190void DockTitleBarPrivate::createButtons()
191{
192 Q_Q(DockTitleBar);
193
194 QSizePolicy sp(QSizePolicy::Fixed, QSizePolicy::Expanding);
195
196 // Tabs menu button
197 m_tabsMenuButton =
198 new TitleBarButton(testConfigFlag(DockManager::DockAreaHasTabsMenuButton), false, Qx::TitleBarButtonTabsMenu);
199 m_tabsMenuButton->setObjectName("dockTabsMenuButton");
200 m_tabsMenuButton->setAutoRaise(true);
201 m_tabsMenuButton->setPopupMode(QToolButton::InstantPopup);
202 internal::setButtonIcon(m_tabsMenuButton, QStyle::SP_TitleBarUnshadeButton, Qx::DockPanelMenuIcon);
203 QMenu *tabsMenu = new QMenu(m_tabsMenuButton);
204#ifndef QT_NO_TOOLTIP
205 tabsMenu->setToolTipsVisible(true);
206#endif
207 q->connect(tabsMenu, SIGNAL(aboutToShow()), SLOT(onTabsMenuAboutToShow()));
208 q->connect(tabsMenu, SIGNAL(triggered(QAction *)), SLOT(onTabsMenuActionTriggered(QAction *)));
209 m_tabsMenuButton->setMenu(tabsMenu);
210 internal::setToolTip(m_tabsMenuButton, QObject::tr("List All Tabs"));
211 m_tabsMenuButton->setSizePolicy(sp);
212 m_layout->addWidget(m_tabsMenuButton, 0);
213
214 // Undock button
215 m_undockButton =
216 new TitleBarButton(testConfigFlag(DockManager::DockAreaHasUndockButton), true, Qx::TitleBarButtonUndock);
217 m_undockButton->setObjectName("dockDetachGroupButton");
218 m_undockButton->setAutoRaise(true);
219 internal::setToolTip(m_undockButton, QObject::tr("Detach Group"));
220 internal::setButtonIcon(m_undockButton, QStyle::SP_TitleBarNormalButton, Qx::DockPanelUndockIcon);
221 m_undockButton->setSizePolicy(sp);
222 m_layout->addWidget(m_undockButton, 0);
223 q->connect(m_undockButton, SIGNAL(clicked()), SLOT(onUndockButtonClicked()));
224
225 // AutoHide Button
226 const auto autoHideEnabled = testAutoHideConfigFlag(DockManager::AutoHideFeatureEnabled);
227 m_autoHideButton =
228 new TitleBarButton(testAutoHideConfigFlag(DockManager::DockAreaHasAutoHideButton) && autoHideEnabled, true,
230 m_autoHideButton->setObjectName("dockPanelAutoHideButton");
231 m_autoHideButton->setAutoRaise(true);
232 internal::setToolTip(m_autoHideButton, q->titleBarButtonToolTip(Qx::TitleBarButtonAutoHide));
233 internal::setButtonIcon(m_autoHideButton, QStyle::SP_DialogOkButton, Qx::DockAutoHideIcon);
234 m_autoHideButton->setSizePolicy(sp);
235 m_autoHideButton->setCheckable(testAutoHideConfigFlag(DockManager::AutoHideButtonCheckable));
236 m_autoHideButton->setChecked(false);
237 m_layout->addWidget(m_autoHideButton, 0);
238 q->connect(m_autoHideButton, SIGNAL(clicked()), SLOT(onAutoHideButtonClicked()));
239
240 // Minimize button
241 m_minimizeButton = new TitleBarButton(testAutoHideConfigFlag(DockManager::AutoHideHasMinimizeButton), false,
243 m_minimizeButton->setObjectName("dockPanelMinimizeButton");
244 m_minimizeButton->setAutoRaise(true);
245 m_minimizeButton->setVisible(false);
246 internal::setButtonIcon(m_minimizeButton, QStyle::SP_TitleBarMinButton, Qx::DockPanelMinimizeIcon);
247 internal::setToolTip(m_minimizeButton, QObject::tr("Minimize"));
248 m_minimizeButton->setSizePolicy(sp);
249 m_layout->addWidget(m_minimizeButton, 0);
250 q->connect(m_minimizeButton, SIGNAL(clicked()), SLOT(minimizeAutoHideContainer()));
251
252 // Close button
253 m_closeButton =
254 new TitleBarButton(testConfigFlag(DockManager::DockAreaHasCloseButton), true, Qx::TitleBarButtonClose);
255 m_closeButton->setObjectName("dockPanelCloseButton");
256 m_closeButton->setAutoRaise(true);
257 internal::setButtonIcon(m_closeButton, QStyle::SP_TitleBarCloseButton, Qx::DockPanelCloseIcon);
258 internal::setToolTip(m_closeButton, q->titleBarButtonToolTip(Qx::TitleBarButtonClose));
259 m_closeButton->setSizePolicy(sp);
260 m_closeButton->setIconSize(QSize(16, 16));
261 m_layout->addWidget(m_closeButton, 0);
262 q->connect(m_closeButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked()));
263}
264
265void DockTitleBarPrivate::createAutoHideTitleLabel()
266{
267 Q_Q(DockTitleBar);
268 m_autoHideTitleLabel = new DockLabel("");
269 m_autoHideTitleLabel->setObjectName("dockAutoHideTitleLabel");
270 // At position 0 is the tab bar - insert behind tab bar
271 m_layout->insertWidget(1, m_autoHideTitleLabel);
272 m_autoHideTitleLabel->setVisible(false); // Default hidden
273 m_layout->insertWidget(2, new SpacerWidget(q));
274}
275
276DockWindow *DockTitleBarPrivate::dockWindow() const
277{
278 return m_panel->dockWindow();
279}
280
281bool DockTitleBarPrivate::isDraggingState(Qx::DockDragState dragState) const
282{
283 return m_dragState == dragState;
284}
285
286void DockTitleBarPrivate::startFloating(const QPoint &offset)
287{
288 if (m_panel->autoHideContainer()) {
289 m_panel->autoHideContainer()->hide();
290 }
291 m_floatingWidget = makeAreaFloating(offset, Qx::DockDraggingFloatingWidget);
292 qApp->postEvent(m_panel, new QEvent((QEvent::Type)internal::DockedWidgetDragStartEvent));
293}
294
298DockFloatingWidget *DockTitleBarPrivate::makeAreaFloating(const QPoint &offset, Qx::DockDragState dragState)
299{
300 QSize sz = m_panel->size();
301 m_dragState = dragState;
302 bool needCreateFloatingContainer = (dragState != Qx::DockDraggingFloatingWidget);
303 DockFloatingContainer *floatingContainer = nullptr;
304 DockFloatingWidget *floatingWidget;
305 if (needCreateFloatingContainer) {
306 if (m_panel->autoHideContainer()) {
307 // detach sidetab should clean the auto hide container
308 m_panel->autoHideContainer()->cleanupAndDelete();
309 }
310 floatingWidget = floatingContainer = new DockFloatingContainer(m_panel);
311 } else {
312 auto w = new DockFloatingPreview(m_panel);
313 QObject::connect(w, &DockFloatingPreview::draggingCanceled, [=]() {
314 this->m_dragState = Qx::DockDraggingInactive;
315 });
316 floatingWidget = w;
317 }
318 floatingWidget->startFloating(offset, sz, dragState, nullptr);
319 if (floatingContainer) {
320 auto topLevelWidget = floatingContainer->topLevelDockWidget();
321 if (topLevelWidget) {
322 topLevelWidget->emitTopLevelChanged(true);
323 }
324 }
325 return floatingWidget;
326}
327
328bool DockTitleBarPrivate::testConfigFlag(DockManager::ConfigFlag flag)
329{
330 return DockManager::testConfigFlag(flag);
331}
332
333bool DockTitleBarPrivate::testAutoHideConfigFlag(DockManager::AutoHideFlag flag)
334{
336}
337
342QAction *DockTitleBarPrivate::createAutoHideToAction(const QString &title, Qx::DockSideBarArea area, QMenu *menu)
343{
344 Q_Q(DockTitleBar);
345 auto action = menu->addAction(title);
346 action->setProperty(internal::LocationProperty, area);
347 QObject::connect(action, &QAction::triggered, q, &DockTitleBar::onAutoHideToActionClicked);
348 return action;
349}
350
352 : Super(parent)
353{
355 Q_D(DockTitleBar);
356 d->m_panel = parent;
357 d->init();
358
359 setObjectName("dockTitleBar");
360 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
361 setFocusPolicy(Qt::NoFocus);
362}
363
368
370{
371 Q_D(const DockTitleBar);
372 return d->m_tabBar;
373}
374
376{
377 Q_D(const DockTitleBar);
378 return d->m_panel;
379}
380
381QAbstractButton *DockTitleBar::button(Qx::DockTitleBarButton which) const
382{
383 Q_D(const DockTitleBar);
384
385 switch (which) {
387 return d->m_tabsMenuButton;
389 return d->m_undockButton;
391 return d->m_closeButton;
393 return d->m_autoHideButton;
395 return d->m_minimizeButton;
396 default:
397 return nullptr;
398 }
399}
400
405{
406 Q_D(const DockTitleBar);
407 return d->m_autoHideTitleLabel;
408}
409
414{
415 Q_D(DockTitleBar);
416 d->m_tabBar->setVisible(!show); // Auto hide toolbar never has tabs
417 d->m_minimizeButton->setVisible(show);
418 d->m_autoHideTitleLabel->setVisible(show);
419}
420
425{
426 Q_D(DockTitleBar);
427 auto tab = d->m_tabBar->currentTab();
428 if (!tab) {
429 return;
430 }
431 DockWidget *w = tab->dockWidget();
432 // clear old buttons
433 if (!d->m_dockWidgetActionsButtons.isEmpty()) {
434 for (auto b : d->m_dockWidgetActionsButtons) {
435 d->m_layout->removeWidget(b);
436 delete b;
437 }
438 d->m_dockWidgetActionsButtons.clear();
439 }
440 auto actions = w->titleBarActions();
441 if (actions.isEmpty()) {
442 return;
443 }
444 int insertIndex = indexOf(d->m_tabsMenuButton);
445 for (auto a : actions) {
446 auto btn = new TitleBarButton(true, false, Qx::TitleBarButtonTabsMenu, this);
447 btn->setDefaultAction(a);
448 btn->setAutoRaise(true);
449 btn->setPopupMode(QToolButton::InstantPopup);
450 btn->setObjectName(a->objectName());
451 d->m_layout->insertWidget(insertIndex++, btn, 0);
452 d->m_dockWidgetActionsButtons.append(btn);
453 }
454}
455
460void DockTitleBar::setVisible(bool visible)
461{
462 Super::setVisible(visible);
464}
465
471void DockTitleBar::insertWidget(int index, QWidget *widget)
472{
473 Q_D(DockTitleBar);
474 d->m_layout->insertWidget(index, widget);
475}
476
486int DockTitleBar::indexOf(QWidget *widget) const
487{
488 Q_D(const DockTitleBar);
489 return d->m_layout->indexOf(widget);
490}
491
497{
498 Q_D(const DockTitleBar);
499 switch (id) {
501 if (d->m_panel->isAutoHide()) {
502 return tr("Unpin (Dock)");
503 }
504
506 return tr("Pin Group");
507 } else {
508 return tr("Pin Active Tab (Press Ctrl to Pin Group)");
509 }
510 break;
511
513 if (d->m_panel->isAutoHide()) {
515 return minimize ? tr("Minimize") : tr("Close");
516 }
517
519 return tr("Close Active Tab");
520 } else {
521 return tr("Close Group");
522 }
523 break;
524
525 default:
526 break;
527 }
528 return QString();
529}
530
532{
533 Q_D(const DockTitleBar);
534 return d->m_panel && d->m_panel->isAutoHide();
535}
536
542{
543 Q_D(DockTitleBar);
544 // If this is the last dock panel in a dock container it does not make
545 // sense to move it to a new floating widget and leave this one empty.
546 auto container = d->m_panel->dockContainer();
547 if (container->isFloating() && container->dockPanelCount() == 1 && !d->m_panel->isAutoHide()) {
548 return;
549 }
550
551 if (!d->m_panel->features().testFlag(DockWidget::DockWidgetFloatable)) {
552 return;
553 }
554
555 d->makeAreaFloating(mapFromGlobal(QCursor::pos()), Qx::DockDraggingInactive);
556}
557
563{
564 Q_D(DockTitleBar);
566 bool tabsMenuButtonVisible = false;
568 tabsMenuButtonVisible = d->m_tabBar->areTabsOverflowing();
569 } else {
570 bool hasElidedTabTitle = false;
571 for (int i = 0; i < d->m_tabBar->count(); ++i) {
572 if (!d->m_tabBar->isTabOpen(i)) {
573 continue;
574 }
575 DockTab *tab = d->m_tabBar->tab(i);
576 if (tab->isTitleElided()) {
577 hasElidedTabTitle = true;
578 break;
579 }
580 }
581 tabsMenuButtonVisible = (hasElidedTabTitle && (d->m_tabBar->count() > 1));
582 }
583 QMetaObject::invokeMethod(d->m_tabsMenuButton, "setVisible", Qt::QueuedConnection,
584 Q_ARG(bool, tabsMenuButtonVisible));
585 }
586 d->m_menuOutdated = true;
587}
588
590{
591 Q_D(DockTitleBar);
592 if (!d->m_menuOutdated) {
593 return;
594 }
595 QMenu *menu = d->m_tabsMenuButton->menu();
596 menu->clear();
597 for (int i = 0; i < d->m_tabBar->count(); ++i) {
598 if (!d->m_tabBar->isTabOpen(i)) {
599 continue;
600 }
601 auto tab = d->m_tabBar->tab(i);
602 QAction *action = menu->addAction(tab->icon(), tab->text());
603 internal::setToolTip(action, tab->toolTip());
604 action->setData(i);
605 }
606 d->m_menuOutdated = false;
607}
608
610{
611 Q_D(DockTitleBar);
612 int index = a->data().toInt();
613 d->m_tabBar->setCurrentIndex(index);
614 Q_EMIT tabBarClicked(index);
615}
616
618{
619 if (index < 0) {
620 return;
621 }
622 Q_D(DockTitleBar);
623 if (d->testConfigFlag(DockManager::DockAreaCloseButtonClosesTab)) {
624 DockWidget *w = d->m_tabBar->tab(index)->dockWidget();
625 d->m_closeButton->setEnabled(w->features().testFlag(DockWidget::DockWidgetClosable));
626 }
628}
629
631{
632 Q_D(DockTitleBar);
633 QX_DOCK_PRINT("");
635 d->m_panel->autoHideContainer()) {
636 d->m_panel->autoHideContainer()->collapseView(true);
637 } else if (d->testConfigFlag(DockManager::DockAreaCloseButtonClosesTab)) {
638 d->m_tabBar->closeTab(d->m_tabBar->currentIndex());
639 } else {
640 d->m_panel->closeArea();
641 }
642}
643
645{
646 Q_D(DockTitleBar);
647 if (d->m_panel->features().testFlag(DockWidget::DockWidgetFloatable)) {
648 d->makeAreaFloating(mapFromGlobal(QCursor::pos()), Qx::DockDraggingInactive);
649 }
650}
651
653{
654 Q_D(DockTitleBar);
656 qApp->keyboardModifiers().testFlag(Qt::ControlModifier)) {
657 d->m_panel->toggleAutoHide();
658 } else {
659 d->m_panel->currentDockWidget()->toggleAutoHide();
660 }
661}
662
664{
665 Q_D(DockTitleBar);
666 auto autoHideContainer = d->m_panel->autoHideContainer();
667 if (autoHideContainer) {
668 autoHideContainer->collapseView(true);
669 }
670}
671
673{
674 Q_D(DockTitleBar);
675 d->m_panel->toggleAutoHide();
676}
677
679{
680 Q_D(DockTitleBar);
681 int location = sender()->property(internal::LocationProperty).toInt();
682 d->m_panel->toggleAutoHide((Qx::DockSideBarArea)location);
683}
684
686{
687 Q_D(DockTitleBar);
688 d->m_panel->closeArea();
689}
690
692{
693 Q_D(DockTitleBar);
694 if (e->button() == Qt::LeftButton) {
695 e->accept();
696 d->m_dragStartMousePos = e->pos();
697 d->m_dragState = Qx::DockDraggingMousePressed;
699 d->dockWindow()->dockFocusController()->setDockWidgetTabFocused(d->m_tabBar->currentTab());
700 }
701 return;
702 }
703 Super::mousePressEvent(e);
704}
705
707{
708 Q_D(DockTitleBar);
709 if (e->button() == Qt::LeftButton) {
710 e->accept();
711 auto currentDragState = d->m_dragState;
712 d->m_dragStartMousePos = QPoint();
713 d->m_dragState = Qx::DockDraggingInactive;
714 if (Qx::DockDraggingFloatingWidget == currentDragState) {
715 d->m_floatingWidget->finishDragging();
716 }
717
718 return;
719 }
720 Super::mouseReleaseEvent(e);
721}
722
724{
725 Q_D(DockTitleBar);
726 Super::mouseMoveEvent(e);
727 if (!(e->buttons() & Qt::LeftButton) || d->isDraggingState(Qx::DockDraggingInactive)) {
728 d->m_dragState = Qx::DockDraggingInactive;
729 return;
730 }
731
732 // move floating window
733 if (d->isDraggingState(Qx::DockDraggingFloatingWidget)) {
734 d->m_floatingWidget->moveFloating();
735 return;
736 }
737
738 // If this is the last dock area in a floating dock container it does not make
739 // sense to move it to a new floating widget and leave this one empty
740 if (d->m_panel->dockContainer()->isFloating() && d->m_panel->dockContainer()->visibleDockPanelCount() == 1 &&
741 !d->m_panel->isAutoHide()) {
742 return;
743 }
744
745 // If one single dock widget in this area is not floatable then the whole
746 // area is not floatable
747 // We can create the floating drag preview if the dock widget is movable
748 auto features = d->m_panel->features();
749 if (!features.testFlag(DockWidget::DockWidgetFloatable) && !(features.testFlag(DockWidget::DockWidgetMovable))) {
750 return;
751 }
752
753 int dragDistance = (d->m_dragStartMousePos - e->pos()).manhattanLength();
754 if (dragDistance >= DockManager::startDragDistance()) {
755 QX_DOCK_PRINT("startFloating");
756 d->startFloating(d->m_dragStartMousePos);
757 auto overlay = d->m_panel->dockWindow()->containerOverlay();
758 overlay->setAllowedAreas(Qx::OuterDockAreas);
759 }
760
761 return;
762}
763
765{
766 Q_D(DockTitleBar);
767 // If this is the last dock area in a dock container it does not make
768 // sense to move it to a new floating widget and leave this one empty
769 if (d->m_panel->dockContainer()->isFloating() && d->m_panel->dockContainer()->dockPanelCount() == 1) {
770 return;
771 }
772
773 if (!d->m_panel->features().testFlag(DockWidget::DockWidgetFloatable)) {
774 return;
775 }
776
777 d->makeAreaFloating(e->pos(), Qx::DockDraggingInactive);
778}
779
780void DockTitleBar::contextMenuEvent(QContextMenuEvent *e)
781{
782 Q_D(DockTitleBar);
783 e->accept();
784 if (d->isDraggingState(Qx::DockDraggingFloatingWidget)) {
785 return;
786 }
787
788 const bool isAutoHide = d->m_panel->isAutoHide();
789 const bool isTopLevelArea = d->m_panel->isTopLevelArea();
790 QAction *action;
791 QMenu menu(this);
792 if (!isTopLevelArea) {
793 action = menu.addAction(isAutoHide ? tr("Detach") : tr("Detach Group"), this, SLOT(onUndockButtonClicked()));
794 action->setEnabled(d->m_panel->features().testFlag(DockWidget::DockWidgetFloatable));
796 action = menu.addAction(isAutoHide ? tr("Unpin (Dock)") : tr("Pin Group"), this,
798 auto areaIsPinnable = d->m_panel->features().testFlag(DockWidget::DockWidgetPinnable);
799 action->setEnabled(areaIsPinnable);
800
801 if (!isAutoHide) {
802 auto pinMenu = menu.addMenu(tr("Pin Group To..."));
803 pinMenu->setEnabled(areaIsPinnable);
804 d->createAutoHideToAction(tr("Top"), Qx::DockSideBarTop, pinMenu);
805 d->createAutoHideToAction(tr("Left"), Qx::DockSideBarLeft, pinMenu);
806 d->createAutoHideToAction(tr("Right"), Qx::DockSideBarRight, pinMenu);
807 d->createAutoHideToAction(tr("Bottom"), Qx::DockSideBarBottom, pinMenu);
808 }
809 }
810 menu.addSeparator();
811 }
812
813 if (isAutoHide) {
814 action = menu.addAction(tr("Minimize"), this, SLOT(minimizeAutoHideContainer()));
815 action = menu.addAction(tr("Close"), this, SLOT(onAutoHideCloseActionTriggered()));
816 } else {
817 action = menu.addAction(isAutoHide ? tr("Close") : tr("Close Group"), this, SLOT(onCloseButtonClicked()));
818 }
819
820 action->setEnabled(d->m_panel->features().testFlag(DockWidget::DockWidgetClosable));
821 if (!isAutoHide && !isTopLevelArea) {
822 action = menu.addAction(tr("Close Other Groups"), d->m_panel, SLOT(closeOtherAreas()));
823 }
824 menu.exec(e->globalPos());
825}
826
835
Pure virtual interface for floating widgets.
The dock manager that maintains the complete docking system.
Definition dockmanager.h:20
ConfigFlag
These global configuration flags configure some global dock manager settings.
Definition dockmanager.h:26
@ DockAreaDynamicTabsMenuButtonVisibility
Definition dockmanager.h:68
static bool testConfigFlag(ConfigFlag flag)
AutoHideFlag
These global configuration flags configure some dock manager auto hide settings Set the dock manager ...
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...
DockPanel manages multiple instances of DockWidgets.
Definition dockpanel.h:31
Custom tabbar implementation for tab area that is shown on top of a dock panel widget.
Definition docktabbar.h:27
DockWidget * dockWidget() const
Definition docktab.cpp:360
bool isTitleElided() const
Definition docktab.cpp:424
Title bar of a dock panel.
void tabBarClicked(int index)
void showAutoHideControls(bool show)
Call this function, to create all the required auto hide controls
void insertWidget(int index, QWidget *widget)
Inserts a custom widget at position index into this title bar.
void updateDockWidgetActionsButtons()
Updates the visibility of the dock widget actions in the title bar
void onCurrentTabChanged(int index)
void onTabsMenuActionTriggered(QAction *a)
virtual void mousePressEvent(QMouseEvent *e) override
void onAutoHideCloseActionTriggered()
virtual void mouseReleaseEvent(QMouseEvent *e) override
DockPanel * dockPanel() const
DockTitleBar(DockPanel *parent=nullptr)
QString titleBarButtonToolTip(Qx::DockTitleBarButton id) const
Close group tool tip based on the current state Auto hide widgets can only have one dock widget so it...
void setAreaFloating()
Moves the dock panel into its own floating widget if the area DockWidgetFloatable flag is true
virtual void resizeEvent(QResizeEvent *e) override
void onAutoHideDockAreaActionClicked()
int indexOf(QWidget *widget) const
Searches for widget in this title bar.
virtual void mouseMoveEvent(QMouseEvent *e) override
virtual void contextMenuEvent(QContextMenuEvent *e) override
virtual void mouseDoubleClickEvent(QMouseEvent *e) override
DockTabBar * tabBar() const
void markTabsMenuOutdated()
Call this slot to tell the title bar that it should update the tabs menu the next time it is shown.
DockLabel * autoHideTitleLabel() const
Returns the auto hide title label, used when the dock panel is expanded and auto hidden
virtual void setVisible(bool visible) override
Marks the tabs menu outdated before it calls its base class implementation
QAbstractButton * button(Qx::DockTitleBarButton which) const
The DockWidget class provides a widget that can be docked inside a DockWindow or floated as a top-lev...
Definition dockwidget.h:31
virtual QList< QAction * > titleBarActions() const
DockTab * tab() const
Returns the tab widget of this dock widget that is shown in the dock title bar
DockWidgetFeatures features() const
This property holds whether the dock widget is movable, closable, and floatable.
The central dock window that maintains the complete docking system.
Definition dockwindow.h:36
SpacerWidget(QWidget *parent=nullptr)
Title bar button of a dock area that customizes QToolButton appearance/behaviour according to various...
bool event(QEvent *e) override
Handle EnabledChanged signal to set button invisible if the configured
DockTitleBar * titleBar() const
Qx::DockTitleBarButton m_id
bool isInAutoHideArea() const
virtual void setVisible(bool visible) override
Adjust this visibility change request with our internal settings:
void setShowInTitleBar(bool show)
#define QX_DOCK_PRINT(s)
Copyleft (C) 2024 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
Definition dockutils.h:24
void setButtonIcon(QAbstractButton *b, QStyle::StandardPixmap pixmap, Qx::DockIcon iconId)
Helper function to set the icon of a certain button.
Definition dockutils.cpp:64
const int DockedWidgetDragStartEvent
Definition dockutils.cpp:34
void setToolTip(QObjectPtr obj, const QString &tip)
Definition dockutils.h:56
DockSideBarArea
@ DockSideBarTop
@ DockSideBarBottom
@ DockSideBarLeft
@ DockSideBarRight
@ OuterDockAreas
DockDragState
@ DockDraggingFloatingWidget
@ DockDraggingMousePressed
@ DockDraggingInactive
@ DockAutoHideIcon
@ DockPanelMenuIcon
@ DockPanelUndockIcon
@ DockPanelCloseIcon
@ DockPanelMinimizeIcon
DockTitleBarButton
@ TitleBarButtonClose
@ TitleBarButtonAutoHide
@ TitleBarButtonTabsMenu
@ TitleBarButtonUndock
@ TitleBarButtonMinimize
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE
const char * id
Definition qxtheme.cpp:24