From 0eefc5b70ddf20139e56e2b13ccd0aedf27b0d91 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 16 Jun 2020 15:56:47 +0200 Subject: [PATCH] Add a menu to Debug mode that switches perspectives Set a menu for switching perspectives on the debug mode icon. When icons & text are shown for the modes, there is an additional arrow to the right of the mode that can be clicked to open the menu. This functionality was added in 4.1 for that purpose, finally use it. Do not show and arrow in "Icons Only" mode, so it stays small, but make it available on right-click as well. Change-Id: If19877b5231b7f01f0b3fd98cf65e8eaf9da1a5f Reviewed-by: hjk --- src/plugins/coreplugin/fancytabwidget.cpp | 7 +++--- src/plugins/debugger/debuggermainwindow.cpp | 24 +++++++++++++++++++-- src/plugins/debugger/debuggermainwindow.h | 1 + src/plugins/debugger/debuggerplugin.cpp | 2 ++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/plugins/coreplugin/fancytabwidget.cpp b/src/plugins/coreplugin/fancytabwidget.cpp index 1bc2ab50897..6c0def6e3ca 100644 --- a/src/plugins/coreplugin/fancytabwidget.cpp +++ b/src/plugins/coreplugin/fancytabwidget.cpp @@ -211,8 +211,9 @@ void FancyTabBar::mousePressEvent(QMouseEvent *event) if (rect.contains(event->pos())) { if (isTabEnabled(index)) { if (m_tabs.at(index)->hasMenu - && rect.right() - event->pos().x() <= kMenuButtonWidth) { - // menu arrow clicked + && ((!m_iconsOnly && rect.right() - event->pos().x() <= kMenuButtonWidth) + || event->button() == Qt::RightButton)) { + // menu arrow clicked or right-click emit menuTriggered(index, event); } else { if (index != m_currentIndex) { @@ -387,7 +388,7 @@ void FancyTabBar::paintTab(QPainter *painter, int tabIndex) const paintIconAndText(painter, rect, tab->icon, tab->text, enabled, selected); // menu arrow - if (tab->hasMenu) { + if (tab->hasMenu && !m_iconsOnly) { QStyleOption opt; opt.initFrom(this); opt.rect = rect.adjusted(rect.width() - kMenuButtonWidth, 0, -8, 0); diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index 53e37ecc1a4..91166875475 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -158,6 +158,7 @@ public: DebuggerMainWindow *q = nullptr; QPointer m_currentPerspective = nullptr; QComboBox *m_perspectiveChooser = nullptr; + QMenu *m_perspectiveMenu; QStackedWidget *m_centralWidgetStack = nullptr; QHBoxLayout *m_subPerspectiveSwitcherLayout = nullptr; QHBoxLayout *m_innerToolsLayout = nullptr; @@ -186,8 +187,7 @@ DebuggerMainWindowPrivate::DebuggerMainWindowPrivate(DebuggerMainWindow *parent) m_perspectiveChooser->setObjectName("PerspectiveChooser"); m_perspectiveChooser->setProperty("panelwidget", true); m_perspectiveChooser->setSizeAdjustPolicy(QComboBox::AdjustToContents); - connect(m_perspectiveChooser, QOverload::of(&QComboBox::activated), - this, [this](int item) { + connect(m_perspectiveChooser, QOverload::of(&QComboBox::activated), this, [this](int item) { Perspective *perspective = Perspective::findPerspective(m_perspectiveChooser->itemData(item).toString()); QTC_ASSERT(perspective, return); if (auto subPerspective = Perspective::findPerspective(perspective->d->m_lastActiveSubPerspectiveId)) @@ -196,6 +196,20 @@ DebuggerMainWindowPrivate::DebuggerMainWindowPrivate(DebuggerMainWindow *parent) perspective->select(); }); + m_perspectiveMenu = new QMenu; + connect(m_perspectiveMenu, &QMenu::aboutToShow, this, [this] { + m_perspectiveMenu->clear(); + for (Perspective *perspective : qAsConst(m_perspectives)) { + m_perspectiveMenu->addAction(perspective->d->m_name, perspective, [perspective] { + if (auto subPerspective = Perspective::findPerspective( + perspective->d->m_lastActiveSubPerspectiveId)) + subPerspective->select(); + else + perspective->select(); + }); + } + }); + auto viewButton = new QToolButton; viewButton->setText(DebuggerMainWindow::tr("&Views")); @@ -263,6 +277,7 @@ DebuggerMainWindowPrivate::DebuggerMainWindowPrivate(DebuggerMainWindow *parent) DebuggerMainWindowPrivate::~DebuggerMainWindowPrivate() { delete m_editorPlaceHolder; + delete m_perspectiveMenu; } DebuggerMainWindow::DebuggerMainWindow() @@ -511,6 +526,11 @@ void DebuggerMainWindow::addSubPerspectiveSwitcher(QWidget *widget) d->m_subPerspectiveSwitcherLayout->addWidget(widget); } +QMenu *DebuggerMainWindow::perspectiveMenu() +{ + return theMainWindow ? theMainWindow->d->m_perspectiveMenu : nullptr; +} + DebuggerMainWindow *DebuggerMainWindow::instance() { return theMainWindow; diff --git a/src/plugins/debugger/debuggermainwindow.h b/src/plugins/debugger/debuggermainwindow.h index 14f2a8bbe1f..ec7722c4028 100644 --- a/src/plugins/debugger/debuggermainwindow.h +++ b/src/plugins/debugger/debuggermainwindow.h @@ -140,6 +140,7 @@ public: static QWidget *centralWidgetStack(); void addSubPerspectiveSwitcher(QWidget *widget); + static QMenu *perspectiveMenu(); static Perspective *currentPerspective(); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 06067439111..5fd844d83da 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -547,6 +547,8 @@ public: mainWindow->addSubPerspectiveSwitcher(EngineManager::engineChooser()); setWidget(splitter); + + setMenu(DebuggerMainWindow::perspectiveMenu()); } ~DebugMode() { delete widget(); }