Skip to content

Commit 24ca95a

Browse files
committed
feat(ui): use QWidgetAction to implement zoom actions
A custom QStyleSheet must be applied to BrowserZoomWidget since QMenu does not handle item highlighting of QWidget in QWidgetAction.
1 parent 1957dd2 commit 24ca95a

8 files changed

+141
-34
lines changed

src/libs/browser/webcontrol.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ int WebControl::zoomLevel() const
7373
return m_webView->zoomLevel();
7474
}
7575

76+
int WebControl::zoomLevelPercentage() const
77+
{
78+
return m_webView->availableZoomLevels().at(zoomLevel());
79+
}
80+
7681
void WebControl::setZoomLevel(int level)
7782
{
7883
m_webView->setZoomLevel(level);

src/libs/browser/webcontrol.h

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class WebControl final : public QWidget
5454
QByteArray saveHistory() const;
5555

5656
int zoomLevel() const;
57+
int zoomLevelPercentage() const;
5758
void setZoomLevel(int level);
5859
void setJavaScriptEnabled(bool enabled);
5960

src/libs/ui/browsertab.cpp

+24-30
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "searchsidebar.h"
2626
#include "widgets/layouthelper.h"
2727
#include "widgets/toolbarframe.h"
28+
#include "widgets/browserzoomwidget.h"
2829

2930
#include <browser/webcontrol.h>
3031
#include <core/application.h>
@@ -37,10 +38,12 @@
3738
#include <QKeyEvent>
3839
#include <QLabel>
3940
#include <QMenu>
41+
#include <QPushButton>
4042
#include <QStyle>
4143
#include <QToolButton>
4244
#include <QVBoxLayout>
4345
#include <QWebEngineHistory>
46+
#include <QWidgetAction>
4447

4548
using namespace Zeal;
4649
using namespace Zeal::WidgetUi;
@@ -131,22 +134,38 @@ BrowserTab::BrowserTab(QWidget *parent)
131134
m_browserActionButton->setArrowType(Qt::NoArrow);
132135
m_browserActionButton->setPopupMode(QToolButton::InstantPopup);
133136

134-
auto browserActionsMenu = new QMenu(m_browserActionButton);
137+
auto zoomActionWidget = new BrowserZoomWidget();
135138

136-
m_browserZoomInAction = browserActionsMenu->addAction(tr("Zoom In"), [this] () {
139+
connect(zoomActionWidget->zoomInButton(), &QPushButton::clicked, [this, zoomActionWidget]() {
137140
m_webControl->zoomIn();
141+
const auto zoomLevel = QString("%1%").arg(m_webControl->zoomLevelPercentage());
142+
zoomActionWidget->zoomLevelLabel()->setText(zoomLevel);
138143
});
139144

140-
m_browserZoomOutAction = browserActionsMenu->addAction(tr("Zoom Out"), [this] () {
145+
connect(zoomActionWidget->zoomOutButton(), &QPushButton::clicked, [this, zoomActionWidget]() {
141146
m_webControl->zoomOut();
147+
const auto zoomLevel = QString("%1%").arg(m_webControl->zoomLevelPercentage());
148+
zoomActionWidget->zoomLevelLabel()->setText(zoomLevel);
142149
});
143150

144-
m_browserResetZoomAction = browserActionsMenu->addAction(tr("Reset Zoom"), [this] () {
151+
connect(zoomActionWidget->resetZoomButton(), &QPushButton::clicked, [this, zoomActionWidget]() {
145152
m_webControl->resetZoom();
153+
const auto zoomLevel = QString("%1%").arg(m_webControl->zoomLevelPercentage());
154+
zoomActionWidget->zoomLevelLabel()->setText(zoomLevel);
155+
});
156+
157+
auto zoomWidgetAction = new QWidgetAction(this);
158+
zoomWidgetAction->setDefaultWidget(zoomActionWidget);
159+
160+
auto browserActionsMenu = new QMenu(m_browserActionButton);
161+
browserActionsMenu->addAction(zoomWidgetAction);
162+
163+
connect(browserActionsMenu, &QMenu::aboutToShow, [this, zoomActionWidget] () {
164+
const auto zoomLevel = QString("%1%").arg(m_webControl->zoomLevelPercentage());
165+
zoomActionWidget->zoomLevelLabel()->setText(zoomLevel);
146166
});
147167

148168
m_browserActionButton->setMenu(browserActionsMenu);
149-
browserActionsMenu->installEventFilter(this);
150169

151170
auto toolBarLayout = new QHBoxLayout();
152171
toolBarLayout->setContentsMargins(4, 0, 4, 0);
@@ -246,28 +265,3 @@ QIcon BrowserTab::docsetIcon(const QUrl &url) const
246265
Registry::Docset *docset = Core::Application::instance()->docsetRegistry()->docsetForUrl(url);
247266
return docset ? docset->icon() : QIcon(QStringLiteral(":/icons/logo/icon.png"));
248267
}
249-
250-
bool BrowserTab::eventFilter(QObject *watched, QEvent *event)
251-
{
252-
if (watched == m_browserActionButton->menu()) {
253-
QAction *triggeredAction = nullptr;
254-
255-
if (event->type() == QEvent::MouseButtonRelease) {
256-
triggeredAction = m_browserActionButton->menu()->activeAction();
257-
} else if (event->type() == QEvent::KeyPress) {
258-
const auto *keyEvent = static_cast<QKeyEvent *>(event);
259-
260-
if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) {
261-
triggeredAction = m_browserActionButton->menu()->activeAction();
262-
}
263-
}
264-
265-
if (triggeredAction
266-
&& (triggeredAction == m_browserZoomInAction || triggeredAction == m_browserZoomOutAction)) {
267-
triggeredAction->trigger();
268-
return true;
269-
}
270-
}
271-
272-
return false;
273-
}

src/libs/ui/browsertab.h

-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ public slots:
6666
private:
6767
Q_DISABLE_COPY(BrowserTab)
6868
QIcon docsetIcon(const QUrl &url) const;
69-
bool eventFilter(QObject *watched, QEvent *event) override;
7069

7170
// Widgets.
7271
SearchSidebar *m_searchSidebar = nullptr;

src/libs/ui/mainwindow.ui

+9-3
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,16 @@
9090
<property name="title">
9191
<string>&amp;Edit</string>
9292
</property>
93+
<widget class="QMenu" name="menu_Zoom">
94+
<property name="title">
95+
<string>&amp;Zoom</string>
96+
</property>
97+
<addaction name="actionZoomIn"/>
98+
<addaction name="actionZoomOut"/>
99+
<addaction name="actionResetZoom"/>
100+
</widget>
93101
<addaction name="actionFind"/>
94-
<addaction name="actionZoomIn"/>
95-
<addaction name="actionZoomOut"/>
96-
<addaction name="actionResetZoom"/>
102+
<addaction name="menu_Zoom"/>
97103
<addaction name="separator"/>
98104
<addaction name="actionPreferences"/>
99105
</widget>

src/libs/ui/widgets/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ add_library(Widgets STATIC
33
searchedit.cpp
44
shortcutedit.cpp
55
toolbarframe.cpp
6+
browserzoomwidget.cpp
67
)
78

89
find_package(Qt5 COMPONENTS Widgets REQUIRED)
+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include "browserzoomwidget.h"
2+
#include <QColor>
3+
#include <QPalette>
4+
#include <QPushButton>
5+
#include <QLabel>
6+
#include <QHBoxLayout>
7+
#include <QString>
8+
9+
BrowserZoomWidget::BrowserZoomWidget(QWidget *parent)
10+
: QWidget(parent)
11+
{
12+
const auto highlightedBackgroundColor = palette().highlight().color().name();
13+
const auto highlightedTextColor = palette().highlightedText().color().name();
14+
const auto styleSheet
15+
= QString("QPushButton:hover { background-color: %1; color: %2; border: none; }").arg(highlightedBackgroundColor)
16+
.arg(highlightedTextColor);
17+
setStyleSheet(styleSheet);
18+
setMouseTracking(true);
19+
auto zoomLabel = new QLabel(tr("Zoom"));
20+
zoomLabel->setMouseTracking(true);
21+
zoomLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
22+
23+
constexpr int maxButtonWidth = 32;
24+
25+
m_zoomOutButton = new QPushButton(QStringLiteral("-"));
26+
m_zoomOutButton->setMouseTracking(true);
27+
m_zoomOutButton->setMaximumWidth(maxButtonWidth);
28+
m_zoomOutButton->setToolTip(tr("Zoom out"));
29+
30+
m_zoomOutButton->setFlat(true);
31+
m_zoomLevelLabel = new QLabel("100%");
32+
m_zoomLevelLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
33+
m_zoomLevelLabel->setMouseTracking(true);
34+
m_zoomLevelLabel->setToolTip(tr("Current zoom level"));
35+
36+
m_zoomInButton = new QPushButton(QStringLiteral("+"));
37+
m_zoomInButton->setFlat(true);
38+
m_zoomInButton->setMouseTracking(true);
39+
m_zoomInButton->setMaximumWidth(maxButtonWidth);
40+
m_zoomInButton->setToolTip(tr("Zoom in"));
41+
42+
m_resetZoomButton = new QPushButton(QStringLiteral(""));
43+
m_resetZoomButton->setFlat(true);
44+
m_resetZoomButton->setMouseTracking(true);
45+
m_resetZoomButton->setMaximumWidth(maxButtonWidth);
46+
m_resetZoomButton->setToolTip(tr("Reset zoom level"));
47+
48+
auto layout = new QHBoxLayout(this);
49+
layout->setSpacing(2);
50+
layout->addWidget(zoomLabel);
51+
layout->addWidget(m_zoomOutButton);
52+
layout->addWidget(m_zoomLevelLabel);
53+
layout->addWidget(m_zoomInButton);
54+
layout->addWidget(m_resetZoomButton);
55+
}
56+
57+
QPushButton *BrowserZoomWidget::zoomOutButton()
58+
{
59+
return m_zoomOutButton;
60+
}
61+
62+
QPushButton *BrowserZoomWidget::zoomInButton()
63+
{
64+
return m_zoomInButton;
65+
}
66+
67+
QPushButton *BrowserZoomWidget::resetZoomButton()
68+
{
69+
return m_resetZoomButton;
70+
}
71+
72+
QLabel *BrowserZoomWidget::zoomLevelLabel()
73+
{
74+
return m_zoomLevelLabel;
75+
}
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#ifndef BROWSERZOOMWIDGET_H
2+
#define BROWSERZOOMWIDGET_H
3+
4+
#include <QWidget>
5+
6+
class QPushButton;
7+
class QLabel;
8+
9+
class BrowserZoomWidget : public QWidget
10+
{
11+
Q_OBJECT
12+
public:
13+
explicit BrowserZoomWidget(QWidget *parent = nullptr);
14+
QPushButton *zoomOutButton();
15+
QPushButton *zoomInButton();
16+
QPushButton *resetZoomButton();
17+
QLabel *zoomLevelLabel();
18+
19+
private:
20+
QPushButton *m_zoomOutButton{nullptr};
21+
QPushButton *m_zoomInButton{nullptr};
22+
QPushButton *m_resetZoomButton{nullptr};
23+
QLabel *m_zoomLevelLabel{nullptr};
24+
};
25+
26+
#endif // BROWSERZOOMWIDGETACTION_H

0 commit comments

Comments
 (0)