Krita Source Code Documentation
Loading...
Searching...
No Matches
KoZoomInput.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008 Peter Simonsson <peter.simonsson@gmail.com>
2 *
3 * SPDX-License-Identifier: LGPL-2.0-or-later
4 */
5
6#include "KoZoomInput.h"
7
8#include <WidgetsDebug.h>
9#include <klocalizedstring.h>
10
11#include <QComboBox>
12#include <QLabel>
13#include <QHBoxLayout>
14#include <QStyle>
15#include <QStyleOption>
16#include <QPainter>
17#include <QPalette>
18#include <QAbstractItemView>
19#include <QEvent>
20#include <QKeyEvent>
21#include <QLineEdit>
22
24{
25 public:
26 QComboBox* combo;
27 QLabel* label;
28 bool inside;
29 bool isFlat;
30};
31
33 : QStackedWidget(parent), d(new Private)
34{
35#ifdef Q_OS_MACOS
36 setAttribute(Qt::WA_MacMiniSize, true);
37#endif
38
39 QWidget* first = new QWidget(this);
40 QHBoxLayout* layout = new QHBoxLayout(first);
41 layout->setSpacing(0);
42 layout->setContentsMargins(0, 0, 0, 0);
43 d->label = new QLabel(first);
44 d->label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
45 layout->addWidget(d->label, 10);
46 QLabel* icon = new QLabel(first);
47 QStyleOption option;
48 option.state = QStyle::State_Enabled;
49 QPixmap pixmap(16, 16);
50 pixmap.fill(QColor(255, 255, 255, 0));
51 QPainter painter(&pixmap);
52 painter.translate(8, 8);
53 style()->drawPrimitive(QStyle::PE_IndicatorArrowDown, &option, &painter);
54 icon->setPixmap(pixmap);
55 layout->addWidget(icon);
56 addWidget(first);
57 d->combo = new QComboBox(this);
58 d->combo->setMaxVisibleItems(15);
59 d->combo->setEditable(true);
60 d->combo->installEventFilter(this);
61 addWidget(d->combo);
62 d->inside = false;
63 d->isFlat = true;
64
65 connect(d->combo, SIGNAL(textActivated(QString)), this, SIGNAL(zoomLevelChanged(QString)));
66 connect(d->combo, SIGNAL(currentIndexChanged(int)), this, SIGNAL(zoomLevelChangedIndex(int)));
67}
68
70{
71 delete d;
72}
73#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
74void KoZoomInput::enterEvent(QEvent* event)
75#else
76void KoZoomInput::enterEvent(QEnterEvent* event)
77#endif
78{
79 Q_UNUSED(event);
80
81 d->inside = true;
82 if (!isFlat()) {
83 return;
84 }
85
86 if (d->combo->view())
87 {
88 d->combo->view()->removeEventFilter(this);
89 }
90
91 setCurrentIndex(1);
92}
93
94void KoZoomInput::leaveEvent(QEvent* event)
95{
96 Q_UNUSED(event);
97
98 d->inside = false;
99 if (!isFlat()) {
100 return;
101 }
102
103 if(d->combo->view() && d->combo->view()->isVisible())
104 {
105 d->combo->view()->installEventFilter(this);
106 return;
107 }
108
109 if(!d->combo->hasFocus())
110 setCurrentIndex(0);
111}
112
113void KoZoomInput::keyPressEvent(QKeyEvent* event)
114{
115 if (event->key() == Qt::Key_Return ||
116 event->key() == Qt::Key_Enter)
117 {
118 focusNextChild();
119 }
120}
121
123{
124 return d->isFlat;
125}
126
127void KoZoomInput::setFlat(bool flat)
128{
129 if (flat == d->isFlat) {
130 return;
131 }
132
133 d->isFlat = flat;
134
135 if (flat) {
136 d->combo->installEventFilter(this);
137 if (d->inside) {
138 enterEvent(nullptr);
139 } else {
140 leaveEvent(nullptr);
141 }
142 d->combo->setEditable(true);
143 } else {
144 d->combo->removeEventFilter(this);
145 if (d->combo->view()) {
146 d->combo->view()->removeEventFilter(this);
147 }
148 d->combo->setCurrentIndex(d->combo->findText(d->label->text()));
149 d->combo->setEditable(false);
150 setCurrentIndex(1);
151 }
152}
153
155{
156 d->combo->clear();
157 d->combo->addItems(levels);
158}
159
161{
162 setCurrentZoomLevel(index, d->combo->itemText(index));
163}
164
165void KoZoomInput::setCurrentZoomLevel(int index, const QString &activeText)
166{
167 d->combo->setCurrentIndex(index);
168 d->label->setText(activeText);
169}
170
171void KoZoomInput::setCurrentZoomLevel(const QString& level)
172{
173 d->combo->setCurrentIndex(d->combo->findText(level));
174 d->label->setText(level);
175}
176
177bool KoZoomInput::eventFilter(QObject* watched, QEvent* event)
178{
179 if(watched == d->combo->view() && event->type() == QEvent::Hide)
180 {
181 focusNextChild();
182 setCurrentIndex(0);
183 }
184 else if (watched == d->combo && event->type() == QEvent::FocusOut &&
185 (d->combo->view() && !d->combo->view()->hasFocus()) && !d->inside)
186 {
187 setCurrentIndex(0);
188 }
189 return false;
190}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void setFlat(bool flat)
void keyPressEvent(QKeyEvent *event) override
void setCurrentZoomLevel(const QString &level)
void enterEvent(QEnterEvent *e) override
void setZoomLevels(const QStringList &levels)
Private *const d
Definition KoZoomInput.h:44
void zoomLevelChangedIndex(int index)
bool eventFilter(QObject *watched, QEvent *event) override
~KoZoomInput() override
void leaveEvent(QEvent *event) override
void zoomLevelChanged(const QString &level)
KoZoomInput(QWidget *parent=0)
bool isFlat() const