From b1b3c74fcf1ac21c68e7773f1765766eb024dc81 Mon Sep 17 00:00:00 2001 From: Serge45 Date: Fri, 7 Aug 2020 17:00:37 +0800 Subject: [PATCH] feat(ui): add menu button for zoom actions An event filter was also added to prevent pop-up menu closing while zoom in/out actions triggered. --- src/libs/ui/browsertab.cpp | 49 ++++++++++++++++++++++++++++++++++++++ src/libs/ui/browsertab.h | 5 ++++ src/libs/ui/mainwindow.cpp | 13 +++++----- src/libs/ui/mainwindow.ui | 20 +++++++++++++++- 4 files changed, 80 insertions(+), 7 deletions(-) diff --git a/src/libs/ui/browsertab.cpp b/src/libs/ui/browsertab.cpp index 9f618151d..4d6a4013f 100644 --- a/src/libs/ui/browsertab.cpp +++ b/src/libs/ui/browsertab.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -124,6 +125,28 @@ BrowserTab::BrowserTab(QWidget *parent) label->setText(title); }); + m_browserActionButton = new QToolButton(); + m_browserActionButton->setAutoRaise(true); + m_browserActionButton->setText(QStringLiteral("⋮")); + m_browserActionButton->setArrowType(Qt::NoArrow); + m_browserActionButton->setPopupMode(QToolButton::InstantPopup); + + auto browserActionsMenu = new QMenu(m_browserActionButton); + + m_browserZoomInAction = browserActionsMenu->addAction(tr("Zoom In"), [this] () { + m_webControl->zoomIn(); + }); + + m_browserZoomOutAction = browserActionsMenu->addAction(tr("Zoom Out"), [this] () { + m_webControl->zoomOut(); + }); + + m_browserResetZoomAction = browserActionsMenu->addAction(tr("Reset Zoom"), [this] () { + m_webControl->resetZoom(); + }); + + m_browserActionButton->setMenu(browserActionsMenu); + browserActionsMenu->installEventFilter(this); auto toolBarLayout = new QHBoxLayout(); toolBarLayout->setContentsMargins(4, 0, 4, 0); @@ -132,6 +155,7 @@ BrowserTab::BrowserTab(QWidget *parent) toolBarLayout->addWidget(m_backButton); toolBarLayout->addWidget(m_forwardButton); toolBarLayout->addWidget(label, 1); + toolBarLayout->addWidget(m_browserActionButton); auto toolBarFrame = new ToolBarFrame(); toolBarFrame->setLayout(toolBarLayout); @@ -222,3 +246,28 @@ QIcon BrowserTab::docsetIcon(const QUrl &url) const Registry::Docset *docset = Core::Application::instance()->docsetRegistry()->docsetForUrl(url); return docset ? docset->icon() : QIcon(QStringLiteral(":/icons/logo/icon.png")); } + +bool BrowserTab::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == m_browserActionButton->menu()) { + QAction *triggeredAction = nullptr; + + if (event->type() == QEvent::MouseButtonRelease) { + triggeredAction = m_browserActionButton->menu()->activeAction(); + } else if (event->type() == QEvent::KeyPress) { + const auto *keyEvent = static_cast(event); + + if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) { + triggeredAction = m_browserActionButton->menu()->activeAction(); + } + } + + if (triggeredAction + && (triggeredAction == m_browserZoomInAction || triggeredAction == m_browserZoomOutAction)) { + triggeredAction->trigger(); + return true; + } + } + + return false; +} diff --git a/src/libs/ui/browsertab.h b/src/libs/ui/browsertab.h index 35adf927d..824079e6a 100644 --- a/src/libs/ui/browsertab.h +++ b/src/libs/ui/browsertab.h @@ -66,12 +66,17 @@ public slots: private: Q_DISABLE_COPY(BrowserTab) QIcon docsetIcon(const QUrl &url) const; + bool eventFilter(QObject *watched, QEvent *event) override; // Widgets. SearchSidebar *m_searchSidebar = nullptr; Browser::WebControl *m_webControl = nullptr; + QAction *m_browserZoomInAction = nullptr; + QAction *m_browserZoomOutAction = nullptr; + QAction *m_browserResetZoomAction = nullptr; QToolButton *m_backButton = nullptr; QToolButton *m_forwardButton = nullptr; + QToolButton *m_browserActionButton = nullptr; }; } // namespace WidgetUi diff --git a/src/libs/ui/mainwindow.cpp b/src/libs/ui/mainwindow.cpp index f4daf0f96..f9722714a 100644 --- a/src/libs/ui/mainwindow.cpp +++ b/src/libs/ui/mainwindow.cpp @@ -130,14 +130,15 @@ MainWindow::MainWindow(Core::Application *app, QWidget *parent) connect(ui->actionForward, &QAction::triggered, this, [this]() { currentTab()->webControl()->forward(); }); addAction(ui->actionForward); - shortcut = new QShortcut(QKeySequence::ZoomIn, this); - connect(shortcut, &QShortcut::activated, this, [this]() { currentTab()->webControl()->zoomIn(); }); shortcut = new QShortcut(QStringLiteral("Ctrl+="), this); connect(shortcut, &QShortcut::activated, this, [this]() { currentTab()->webControl()->zoomIn(); }); - shortcut = new QShortcut(QKeySequence::ZoomOut, this); - connect(shortcut, &QShortcut::activated, this, [this]() { currentTab()->webControl()->zoomOut(); }); - shortcut = new QShortcut(QStringLiteral("Ctrl+0"), this); - connect(shortcut, &QShortcut::activated, this, [this]() { currentTab()->webControl()->resetZoom(); }); + + ui->actionResetZoom->setShortcut(QKeySequence(QStringLiteral("Ctrl+0"))); + ui->actionZoomIn->setShortcut(QKeySequence::ZoomIn); + ui->actionZoomOut->setShortcut(QKeySequence::ZoomOut); + connect(ui->actionResetZoom, &QAction::triggered, this, [this] { currentTab()->webControl()->resetZoom(); }); + connect(ui->actionZoomIn, &QAction::triggered, this, [this] { currentTab()->webControl()->zoomIn(); }); + connect(ui->actionZoomOut, &QAction::triggered, this, [this] { currentTab()->webControl()->zoomOut(); }); // Tools Menu connect(ui->actionDocsets, &QAction::triggered, this, [this]() { diff --git a/src/libs/ui/mainwindow.ui b/src/libs/ui/mainwindow.ui index 922938d49..7bae1051c 100644 --- a/src/libs/ui/mainwindow.ui +++ b/src/libs/ui/mainwindow.ui @@ -65,7 +65,7 @@ 0 0 900 - 20 + 23 @@ -91,6 +91,9 @@ &Edit + + + @@ -204,6 +207,21 @@ &Docsets... + + + Zoon &In + + + + + Zoom &Out + + + + + Reset Zoom + +