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, 0, 0, 0);
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 int maxButtonSize
= parent
->style()->pixelMetric(QStyle::PM_ButtonIconSize
) + 10;
121 QToolButton
*zoomOutButton
= new QToolButton(zoomWidget
);
122 zoomOutButton
->setMaximumSize(maxButtonSize
, maxButtonSize
);
123 zoomOutButton
->setDefaultAction(m_zoomOutAction
);
124 zoomOutButton
->installEventFilter(this);
125 zoomWidgetLayout
->addWidget(zoomOutButton
);
126 zoomWidget
->setFocusProxy(zoomOutButton
);
129 QPixmap zoomOutPixmapNormal
= m_zoomOutAction
->icon().pixmap(zoomOutButton
->iconSize(), QIcon::Normal
);
130 QPixmap zoomOutPixmapDisabled
= m_zoomOutAction
->icon().pixmap(zoomOutButton
->iconSize(), QIcon::Disabled
);
131 QPixmap zoomOutPixmapActive
= m_zoomOutAction
->icon().pixmap(zoomOutButton
->iconSize(), QIcon::Active
);
132 zoomOutIcon
.addPixmap(zoomOutPixmapNormal
, QIcon::Normal
);
133 zoomOutIcon
.addPixmap(zoomOutPixmapDisabled
, QIcon::Disabled
);
134 zoomOutIcon
.addPixmap(zoomOutPixmapActive
, QIcon::Active
);
135 zoomOutIcon
.addPixmap(zoomOutPixmapNormal
, QIcon::Selected
);
136 m_zoomOutAction
->setIcon(zoomOutIcon
);
138 QToolButton
*zoomResetButton
= new QToolButton(zoomWidget
);
139 zoomResetButton
->setMaximumSize(maxButtonSize
, maxButtonSize
);
140 zoomResetButton
->setDefaultAction(m_zoomResetAction
);
141 zoomResetButton
->installEventFilter(this);
142 zoomWidgetLayout
->addWidget(zoomResetButton
);
145 QPixmap zoomResetPixmapNormal
= m_zoomResetAction
->icon().pixmap(zoomResetButton
->iconSize(), QIcon::Normal
);
146 QPixmap zoomResetPixmapDisabled
= m_zoomResetAction
->icon().pixmap(zoomResetButton
->iconSize(), QIcon::Disabled
);
147 QPixmap zoomResetPixmapActive
= m_zoomResetAction
->icon().pixmap(zoomResetButton
->iconSize(), QIcon::Active
);
148 zoomResetIcon
.addPixmap(zoomResetPixmapNormal
, QIcon::Normal
);
149 zoomResetIcon
.addPixmap(zoomResetPixmapDisabled
, QIcon::Disabled
);
150 zoomResetIcon
.addPixmap(zoomResetPixmapActive
, QIcon::Active
);
151 zoomResetIcon
.addPixmap(zoomResetPixmapNormal
, QIcon::Selected
);
152 m_zoomResetAction
->setIcon(zoomResetIcon
);
154 QToolButton
*zoomInButton
= new QToolButton(zoomWidget
);
155 zoomInButton
->setMaximumSize(maxButtonSize
, maxButtonSize
);
156 zoomInButton
->setDefaultAction(m_zoomInAction
);
157 zoomInButton
->installEventFilter(this);
158 zoomWidgetLayout
->addWidget(zoomInButton
);
161 QPixmap zoomInPixmapNormal
= m_zoomInAction
->icon().pixmap(zoomInButton
->iconSize(), QIcon::Normal
);
162 QPixmap zoomInPixmapDisabled
= m_zoomInAction
->icon().pixmap(zoomInButton
->iconSize(), QIcon::Disabled
);
163 QPixmap zoomInPixmapActive
= m_zoomInAction
->icon().pixmap(zoomInButton
->iconSize(), QIcon::Active
);
164 zoomInIcon
.addPixmap(zoomInPixmapNormal
, QIcon::Normal
);
165 zoomInIcon
.addPixmap(zoomInPixmapDisabled
, QIcon::Disabled
);
166 zoomInIcon
.addPixmap(zoomInPixmapActive
, QIcon::Active
);
167 zoomInIcon
.addPixmap(zoomInPixmapNormal
, QIcon::Selected
);
168 m_zoomInAction
->setIcon(zoomInIcon
);