]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/zoomwidgetaction.cpp
Add margins to the zoom menu entry
[dolphin.git] / src / views / zoomwidgetaction.cpp
1 /*
2 * SPDX-FileCopyrightText: 2025 Gleb Kasachou <gkosachov99@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "zoomwidgetaction.h"
8
9 #include <KLocalizedString>
10
11 #include <QEvent>
12 #include <QHBoxLayout>
13 #include <QKeyEvent>
14 #include <QMenu>
15 #include <QPaintEvent>
16 #include <QStyleOptionMenuItem>
17 #include <QStylePainter>
18 #include <QToolBar>
19 #include <QToolButton>
20
21 class ZoomWidget : public QWidget
22 {
23 public:
24 ZoomWidget(QWidget *parent)
25 : QWidget(parent)
26 {
27 }
28
29 protected:
30 void paintEvent(QPaintEvent *event) override
31 {
32 Q_UNUSED(event);
33
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;
43
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;
48 break;
49 }
50 }
51
52 painter.drawControl(QStyle::CE_MenuItem, option);
53 }
54 };
55
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)
61 {
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});
67 }
68
69 bool ZoomWidgetAction::eventFilter(QObject *object, QEvent *event)
70 {
71 if (event->type() != QEvent::KeyPress) {
72 return false;
73 }
74
75 QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
76 QWidget *widget = qobject_cast<QWidget *>(object);
77
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()) {
82 return false;
83 }
84
85 previous->setFocus(Qt::BacktabFocusReason);
86 event->accept();
87 return true;
88 }
89
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()) {
93 return false;
94 }
95
96 next->setFocus(Qt::TabFocusReason);
97 event->accept();
98 return true;
99 }
100
101 return false;
102 }
103
104 QWidget *ZoomWidgetAction::createWidget(QWidget *parent)
105 {
106 if (qobject_cast<QToolBar *>(parent)) {
107 return KToolBarPopupAction::createWidget(parent);
108 }
109
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);
115
116 QSpacerItem *zoomSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
117 zoomWidgetLayout->addSpacerItem(zoomSpacer);
118
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;
125
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);
132
133 QIcon zoomOutIcon;
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);
142
143 QToolButton *zoomResetButton = new QToolButton(zoomWidget);
144 zoomResetButton->setMaximumSize(maxButtonSize, maxButtonSize);
145 zoomResetButton->setDefaultAction(m_zoomResetAction);
146 zoomResetButton->installEventFilter(this);
147 zoomWidgetLayout->addWidget(zoomResetButton);
148
149 QIcon zoomResetIcon;
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);
158
159 QToolButton *zoomInButton = new QToolButton(zoomWidget);
160 zoomInButton->setMaximumSize(maxButtonSize, maxButtonSize);
161 zoomInButton->setDefaultAction(m_zoomInAction);
162 zoomInButton->installEventFilter(this);
163 zoomWidgetLayout->addWidget(zoomInButton);
164
165 QIcon zoomInIcon;
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);
174
175 return zoomWidget;
176 }