]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/zoomwidgetaction.cpp
7bd66e300c56aa0040ac043dd1f418ee5980c3a4
[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, 0, 0, 0);
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 int maxButtonSize = parent->style()->pixelMetric(QStyle::PM_ButtonIconSize) + 10;
120
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);
127
128 QIcon zoomOutIcon;
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);
137
138 QToolButton *zoomResetButton = new QToolButton(zoomWidget);
139 zoomResetButton->setMaximumSize(maxButtonSize, maxButtonSize);
140 zoomResetButton->setDefaultAction(m_zoomResetAction);
141 zoomResetButton->installEventFilter(this);
142 zoomWidgetLayout->addWidget(zoomResetButton);
143
144 QIcon zoomResetIcon;
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);
153
154 QToolButton *zoomInButton = new QToolButton(zoomWidget);
155 zoomInButton->setMaximumSize(maxButtonSize, maxButtonSize);
156 zoomInButton->setDefaultAction(m_zoomInAction);
157 zoomInButton->installEventFilter(this);
158 zoomWidgetLayout->addWidget(zoomInButton);
159
160 QIcon zoomInIcon;
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);
169
170 return zoomWidget;
171 }