Skip to content

Commit f69af82

Browse files
author
Uwe Kindler
committed
Implemented context menu for dock widget tab to close or detach tab or to close all other tabs
1 parent 854f542 commit f69af82

File tree

7 files changed

+86
-14
lines changed

7 files changed

+86
-14
lines changed

demo/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ int main(int argc, char *argv[])
4242
std::shared_ptr<int> b;
4343
QApplication a(argc, argv);
4444
a.setQuitOnLastWindowClosed(true);
45-
//qInstallMessageHandler(myMessageOutput);
45+
qInstallMessageHandler(myMessageOutput);
4646
qDebug() << "Message handler test";
4747

4848
CMainWindow mw;

src/DockAreaTabBar.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
#include <QScrollBar>
3434
#include <QDebug>
3535
#include <QBoxLayout>
36-
#include <QMenu>
3736
#include <QApplication>
3837

3938
#include "FloatingDockContainer.h"
@@ -43,6 +42,8 @@
4342
#include "DockWidget.h"
4443
#include "DockWidgetTab.h"
4544

45+
#include <iostream>
46+
4647

4748
namespace ads
4849
{
@@ -288,7 +289,8 @@ void CDockAreaTabBar::insertTab(int Index, CDockWidgetTab* Tab)
288289
{
289290
d->TabsLayout->insertWidget(Index, Tab);
290291
connect(Tab, SIGNAL(clicked()), this, SLOT(onTabClicked()));
291-
connect(Tab, SIGNAL(closeButtonClicked()), this, SLOT(onTabCloseButtonClicked()));
292+
connect(Tab, SIGNAL(closeRequested()), this, SLOT(onTabCloseRequested()));
293+
connect(Tab, SIGNAL(closeOtherTabsRequested()), this, SLOT(onCloseOtherTabsRequested()));
292294
connect(Tab, SIGNAL(moved(const QPoint&)), this, SLOT(onTabWidgetMoved(const QPoint&)));
293295
Tab->installEventFilter(this);
294296
emit tabInserted(Index);
@@ -402,9 +404,26 @@ void CDockAreaTabBar::onTabClicked()
402404

403405

404406
//===========================================================================
405-
void CDockAreaTabBar::onTabCloseButtonClicked()
407+
void CDockAreaTabBar::onTabCloseRequested()
406408
{
407-
closeTab(currentIndex());
409+
CDockWidgetTab* Tab = qobject_cast<CDockWidgetTab*>(sender());
410+
int Index = d->TabsLayout->indexOf(Tab);
411+
closeTab(Index);
412+
}
413+
414+
415+
//===========================================================================
416+
void CDockAreaTabBar::onCloseOtherTabsRequested()
417+
{
418+
auto Sender = qobject_cast<CDockWidgetTab*>(sender());
419+
for (int i = 0; i < count(); ++i)
420+
{
421+
auto Tab = tab(i);
422+
if (Tab->isClosable() && !Tab->isHidden() && Tab != Sender)
423+
{
424+
closeTab(i);
425+
}
426+
}
408427
}
409428

410429

@@ -532,6 +551,7 @@ bool CDockAreaTabBar::isTabOpen(int Index) const
532551

533552
return !tab(Index)->isHidden();
534553
}
554+
535555
} // namespace ads
536556

537557
//---------------------------------------------------------------------------

src/DockAreaTabBar.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ class CDockAreaTabBar : public QScrollArea
5454

5555
private slots:
5656
void onTabClicked();
57-
void onTabCloseButtonClicked();
57+
void onTabCloseRequested();
58+
void onCloseOtherTabsRequested();
5859
void onTabWidgetMoved(const QPoint& GlobalPos);
5960

6061
protected:

src/DockAreaTitleBar.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ void DockAreaTitleBarPrivate::createButtons()
120120
QMenu* TabsMenu = new QMenu(TabsMenuButton);
121121
_this->connect(TabsMenu, SIGNAL(aboutToShow()), SLOT(onTabsMenuAboutToShow()));
122122
TabsMenuButton->setMenu(TabsMenu);
123+
TabsMenuButton->setToolTip(QObject::tr("List all tabs"));
123124
TabsMenuButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
124125
TopLayout->addWidget(TabsMenuButton, 0);
125126
_this->connect(TabsMenuButton->menu(), SIGNAL(triggered(QAction*)),
@@ -129,6 +130,7 @@ void DockAreaTitleBarPrivate::createButtons()
129130
UndockButton = new tTileBarButton();
130131
UndockButton->setObjectName("undockButton");
131132
UndockButton->setAutoRaise(true);
133+
UndockButton->setToolTip(QObject::tr("Detach Group"));
132134
UndockButton->setIcon(_this->style()->standardIcon(QStyle::SP_TitleBarNormalButton));
133135
UndockButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
134136
TopLayout->addWidget(UndockButton, 0);
@@ -145,7 +147,14 @@ void DockAreaTitleBarPrivate::createButtons()
145147
CloseIcon.addPixmap(disabledPixmap, QIcon::Disabled);
146148

147149
CloseButton->setIcon(CloseIcon);
148-
CloseButton->setToolTip(QObject::tr("Close all tabs"));
150+
if (testConfigFlag(CDockManager::DockAreaCloseButtonClosesTab))
151+
{
152+
CloseButton->setToolTip(QObject::tr("Close Active Tab"));
153+
}
154+
else
155+
{
156+
CloseButton->setToolTip(QObject::tr("Close Group"));
157+
}
149158
CloseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
150159
TopLayout->addWidget(CloseButton, 0);
151160
_this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked()));

src/DockAreaWidget.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -336,10 +336,6 @@ void DockAreaWidgetPrivate::updateCloseButtonState()
336336
return;
337337
}
338338

339-
if (!UpdateCloseButton)
340-
{
341-
return;
342-
}
343339
TitleBar->button(TitleBarButtonClose)->setEnabled(
344340
_this->features().testFlag(CDockWidget::DockWidgetClosable));
345341
UpdateCloseButton = false;
@@ -768,7 +764,10 @@ void CDockAreaWidget::toggleView(bool Open)
768764
void CDockAreaWidget::setVisible(bool Visible)
769765
{
770766
Super::setVisible(Visible);
771-
d->updateCloseButtonState();
767+
if (d->UpdateCloseButton)
768+
{
769+
d->updateCloseButtonState();
770+
}
772771
}
773772

774773

src/DockWidgetTab.cpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include <QDebug>
4141
#include <QToolButton>
4242
#include <QPushButton>
43+
#include <QMenu>
4344

4445
#include "ads_globals.h"
4546
#include "DockWidget.h"
@@ -163,7 +164,7 @@ void DockWidgetTabPrivate::createLayout()
163164
CloseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
164165
CloseButton->setVisible(false);
165166
CloseButton->setToolTip(QObject::tr("Close Tab"));
166-
_this->connect(CloseButton, SIGNAL(clicked()), SIGNAL(closeButtonClicked()));
167+
_this->connect(CloseButton, SIGNAL(clicked()), SIGNAL(closeRequested()));
167168

168169
QFontMetrics fm(TitleLabel->font());
169170
int Spacing = qRound(fm.height() / 4.0);
@@ -345,6 +346,23 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev)
345346
}
346347

347348

349+
//============================================================================
350+
void CDockWidgetTab::contextMenuEvent(QContextMenuEvent* ev)
351+
{
352+
ev->accept();
353+
std::cout << "CDockAreaTabBar::onTabContextMenuRequested" << std::endl;
354+
355+
d->DragStartMousePosition = ev->pos();
356+
QMenu Menu(this);
357+
Menu.addAction(tr("Detach"), this, SLOT(onDetachActionTriggered()));
358+
Menu.addSeparator();
359+
auto Action = Menu.addAction(tr("Close"), this, SIGNAL(closeRequested()));
360+
Action->setEnabled(isClosable());
361+
Menu.addAction(tr("Close Others"), this, SIGNAL(closeOtherTabsRequested()));
362+
Menu.exec(mapToGlobal(ev->pos()));
363+
}
364+
365+
348366
//============================================================================
349367
bool CDockWidgetTab::isActiveTab() const
350368
{
@@ -433,6 +451,7 @@ void CDockWidgetTab::mouseDoubleClickEvent(QMouseEvent *event)
433451
// empty
434452
if (!d->DockArea->dockContainer()->isFloating() || d->DockArea->dockWidgetsCount() > 1)
435453
{
454+
d->DragStartMousePosition = event->pos();
436455
d->startFloating();
437456
}
438457

@@ -448,6 +467,20 @@ void CDockWidgetTab::setVisible(bool visible)
448467
}
449468

450469

470+
//============================================================================
471+
bool CDockWidgetTab::isClosable() const
472+
{
473+
return d->DockWidget && d->DockWidget->features().testFlag(CDockWidget::DockWidgetClosable);
474+
}
475+
476+
477+
//===========================================================================
478+
void CDockWidgetTab::onDetachActionTriggered()
479+
{
480+
d->DragStartMousePosition = mapFromGlobal(QCursor::pos());
481+
d->startFloating();
482+
}
483+
451484
} // namespace ads
452485

453486
//---------------------------------------------------------------------------

src/DockWidgetTab.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,14 @@ class ADS_EXPORT CDockWidgetTab : public QFrame
5454
DockWidgetTabPrivate* d; ///< private data (pimpl)
5555
friend struct DockWidgetTabPrivate;
5656

57+
private slots:
58+
void onDetachActionTriggered();
59+
5760
protected:
5861
virtual void mousePressEvent(QMouseEvent* ev) override;
5962
virtual void mouseReleaseEvent(QMouseEvent* ev) override;
6063
virtual void mouseMoveEvent(QMouseEvent* ev) override;
64+
virtual void contextMenuEvent(QContextMenuEvent* ev) override;
6165

6266
/**
6367
* Double clicking the tab widget makes the assigned dock widget floating
@@ -121,13 +125,19 @@ class ADS_EXPORT CDockWidgetTab : public QFrame
121125
*/
122126
QString text() const;
123127

128+
/**
129+
* This function returns true if the assigned dock widget is closeable
130+
*/
131+
bool isClosable() const;
132+
124133
public slots:
125134
virtual void setVisible(bool visible);
126135

127136
signals:
128137
void activeTabChanged();
129138
void clicked();
130-
void closeButtonClicked();
139+
void closeRequested();
140+
void closeOtherTabsRequested();
131141
void moved(const QPoint& GlobalPos);
132142
}; // class DockWidgetTab
133143
}

0 commit comments

Comments
 (0)