2 * SPDX-FileCopyrightText: 2025 Gleb Kasachou <gkosachov99@gmail.com>
4 * SPDX-License-Identifier: GPL-2.0-or-later
7 #include "zoomwidgetaction.h"
9 #include <KLocalizedString>
12 #include <QHBoxLayout>
15 #include <QPaintEvent>
16 #include <QStyleOptionMenuItem>
17 #include <QStylePainter>
19 #include <QToolButton>
21 class ZoomWidget
: public QWidget
24 ZoomWidget(QWidget
*parent
)
30 void paintEvent(QPaintEvent
*event
) override
34 QStylePainter
painter(this);
35 QStyleOptionMenuItem option
;
36 option
.initFrom(this);
37 option
.menuHasCheckableItems
= true;
38 option
.checkType
= QStyleOptionMenuItem::NotCheckable
;
39 option
.text
= i18nc("@action:inmenu", "Zoom");
40 option
.icon
= QIcon::fromTheme(QStringLiteral("zoom"));
41 option
.reservedShortcutWidth
= 0;
42 option
.menuItemType
= QStyleOptionMenuItem::Normal
;
44 option
.maxIconWidth
= 0;
45 for (QAction
*action
: qobject_cast
<QMenu
*>(parent())->actions()) {
46 if (!action
->icon().isNull()) {
47 option
.maxIconWidth
= style()->pixelMetric(QStyle::PM_SmallIconSize
) + 4;
52 painter
.drawControl(QStyle::CE_MenuItem
, option
);
56 ZoomWidgetAction::ZoomWidgetAction(QAction
*zoomInAction
, QAction
*zoomResetAction
, QAction
*zoomOutAction
, QObject
*parent
)
57 : KToolBarPopupAction(QIcon::fromTheme(QStringLiteral("zoom")), i18nc("@action:intoolbar", "Zoom"), parent
)
58 , m_zoomInAction(zoomInAction
)
59 , m_zoomResetAction(zoomResetAction
)
60 , m_zoomOutAction(zoomOutAction
)
62 // This is a property that KXMLGui reads to determine whether this action
63 // should be included in the shortcut configuration UI
64 setProperty("isShortcutConfigurable", false);
65 setPopupMode(InstantPopup
);
66 popupMenu()->addActions({zoomInAction
, zoomResetAction
, zoomOutAction
});
69 bool ZoomWidgetAction::eventFilter(QObject
*object
, QEvent
*event
)
71 if (event
->type() != QEvent::KeyPress
) {
75 QKeyEvent
*keyEvent
= static_cast<QKeyEvent
*>(event
);
76 QWidget
*widget
= qobject_cast
<QWidget
*>(object
);
78 if (keyEvent
->keyCombination() == QKeyCombination(Qt::Modifier::SHIFT
, Qt::Key_Backtab
) || keyEvent
->key() == Qt::Key_Left
79 || keyEvent
->key() == Qt::Key_Up
) {
80 QWidget
*previous
= widget
->previousInFocusChain();
81 if (previous
== widget
->parentWidget() || !qobject_cast
<QToolButton
*>(previous
)->isEnabled()) {
85 previous
->setFocus(Qt::BacktabFocusReason
);
90 if (keyEvent
->keyCombination() == QKeyCombination(Qt::Key_Tab
) || keyEvent
->key() == Qt::Key_Right
|| keyEvent
->key() == Qt::Key_Down
) {
91 QWidget
*next
= widget
->nextInFocusChain();
92 if (next
->parentWidget() != widget
->parentWidget() || !qobject_cast
<QToolButton
*>(next
)->isEnabled()) {
96 next
->setFocus(Qt::TabFocusReason
);
104 QWidget
*ZoomWidgetAction::createWidget(QWidget
*parent
)
106 if (qobject_cast
<QToolBar
*>(parent
)) {
107 return KToolBarPopupAction::createWidget(parent
);
110 ZoomWidget
*zoomWidget
= new ZoomWidget(parent
);
111 QHBoxLayout
*zoomWidgetLayout
= new QHBoxLayout
;
112 zoomWidgetLayout
->setContentsMargins(0, 2, 0, 2);
113 zoomWidget
->setLayout(zoomWidgetLayout
);
114 zoomWidget
->setFocusPolicy(Qt::StrongFocus
);
116 QSpacerItem
*zoomSpacer
= new QSpacerItem(0, 0, QSizePolicy::Expanding
, QSizePolicy::Minimum
);
117 zoomWidgetLayout
->addSpacerItem(zoomSpacer
);
119 QStyleOptionMenuItem option
;
120 option
.initFrom(zoomWidget
);
121 option
.menuItemType
= QStyleOptionMenuItem::Normal
;
122 option
.icon
= icon();
123 option
.text
= text();
124 int maxButtonSize
= parent
->style()->sizeFromContents(QStyle::CT_MenuItem
, &option
, QSize()).height() - 4;
126 QToolButton
*zoomOutButton
= new QToolButton(zoomWidget
);
127 zoomOutButton
->setMaximumSize(maxButtonSize
, maxButtonSize
);
128 zoomOutButton
->setDefaultAction(m_zoomOutAction
);
129 zoomOutButton
->installEventFilter(this);
130 zoomWidgetLayout
->addWidget(zoomOutButton
);
131 zoomWidget
->setFocusProxy(zoomOutButton
);
134 QPixmap zoomOutPixmapNormal
= m_zoomOutAction
->icon().pixmap(zoomOutButton
->iconSize(), QIcon::Normal
);
135 QPixmap zoomOutPixmapDisabled
= m_zoomOutAction
->icon().pixmap(zoomOutButton
->iconSize(), QIcon::Disabled
);
136 QPixmap zoomOutPixmapActive
= m_zoomOutAction
->icon().pixmap(zoomOutButton
->iconSize(), QIcon::Active
);
137 zoomOutIcon
.addPixmap(zoomOutPixmapNormal
, QIcon::Normal
);
138 zoomOutIcon
.addPixmap(zoomOutPixmapDisabled
, QIcon::Disabled
);
139 zoomOutIcon
.addPixmap(zoomOutPixmapActive
, QIcon::Active
);
140 zoomOutIcon
.addPixmap(zoomOutPixmapNormal
, QIcon::Selected
);
141 m_zoomOutAction
->setIcon(zoomOutIcon
);
143 QToolButton
*zoomResetButton
= new QToolButton(zoomWidget
);
144 zoomResetButton
->setMaximumSize(maxButtonSize
, maxButtonSize
);
145 zoomResetButton
->setDefaultAction(m_zoomResetAction
);
146 zoomResetButton
->installEventFilter(this);
147 zoomWidgetLayout
->addWidget(zoomResetButton
);
150 QPixmap zoomResetPixmapNormal
= m_zoomResetAction
->icon().pixmap(zoomResetButton
->iconSize(), QIcon::Normal
);
151 QPixmap zoomResetPixmapDisabled
= m_zoomResetAction
->icon().pixmap(zoomResetButton
->iconSize(), QIcon::Disabled
);
152 QPixmap zoomResetPixmapActive
= m_zoomResetAction
->icon().pixmap(zoomResetButton
->iconSize(), QIcon::Active
);
153 zoomResetIcon
.addPixmap(zoomResetPixmapNormal
, QIcon::Normal
);
154 zoomResetIcon
.addPixmap(zoomResetPixmapDisabled
, QIcon::Disabled
);
155 zoomResetIcon
.addPixmap(zoomResetPixmapActive
, QIcon::Active
);
156 zoomResetIcon
.addPixmap(zoomResetPixmapNormal
, QIcon::Selected
);
157 m_zoomResetAction
->setIcon(zoomResetIcon
);
159 QToolButton
*zoomInButton
= new QToolButton(zoomWidget
);
160 zoomInButton
->setMaximumSize(maxButtonSize
, maxButtonSize
);
161 zoomInButton
->setDefaultAction(m_zoomInAction
);
162 zoomInButton
->installEventFilter(this);
163 zoomWidgetLayout
->addWidget(zoomInButton
);
166 QPixmap zoomInPixmapNormal
= m_zoomInAction
->icon().pixmap(zoomInButton
->iconSize(), QIcon::Normal
);
167 QPixmap zoomInPixmapDisabled
= m_zoomInAction
->icon().pixmap(zoomInButton
->iconSize(), QIcon::Disabled
);
168 QPixmap zoomInPixmapActive
= m_zoomInAction
->icon().pixmap(zoomInButton
->iconSize(), QIcon::Active
);
169 zoomInIcon
.addPixmap(zoomInPixmapNormal
, QIcon::Normal
);
170 zoomInIcon
.addPixmap(zoomInPixmapDisabled
, QIcon::Disabled
);
171 zoomInIcon
.addPixmap(zoomInPixmapActive
, QIcon::Active
);
172 zoomInIcon
.addPixmap(zoomInPixmapNormal
, QIcon::Selected
);
173 m_zoomInAction
->setIcon(zoomInIcon
);