Krita Source Code Documentation
Loading...
Searching...
No Matches
KoZoomAction.cpp
Go to the documentation of this file.
1/* This file is part of the KDE libraries
2 SPDX-FileCopyrightText: 2004 Ariya Hidayat <ariya@kde.org>
3 SPDX-FileCopyrightText: 2006 Peter Simonsson <peter.simonsson@gmail.com>
4 SPDX-FileCopyrightText: 2006-2007 C. Boemann <cbo@boemann.dk>
5
6 SPDX-License-Identifier: LGPL-2.0-only
7*/
8#include "KoZoomAction.h"
9#include "KoZoomMode.h"
10#include "KoZoomState.h"
11#include "KoZoomWidget.h"
12
13#include <KoIcon.h>
14
15#include <QString>
16#include <QLocale>
17#include <QStringList>
18#include <QList>
19#include <QButtonGroup>
20
21#include <klocalizedstring.h>
23#include <KoZoomActionState.h>
24#include <KisPortingUtils.h>
25
26class Q_DECL_HIDDEN KoZoomAction::Private
27{
28public:
29
31 : parent(_parent)
32 , guiUpdateCompressor(200, KisSignalCompressor::FIRST_ACTIVE)
33 , currentActionState(currentZoomState)
34 {}
35
36 KoZoomAction *parent {nullptr};
37
40
42};
43
44
45KoZoomAction::KoZoomAction(const QString& text, QObject *parent)
46 : KSelectAction(text, parent)
47 , d(new Private(this))
48{
49 setIcon(koIcon("zoom-original"));
50 setEditable( true );
51 setMaxComboViewCount( 15 );
52
54 connect(&d->guiUpdateCompressor, SIGNAL(timeout()), SLOT(slotUpdateGuiAfterZoom()));
55}
56
58{
59 delete d;
60}
61
63{
64 d->currentZoomState = zoomState;
65 d->currentActionState.setZoomState(zoomState);
66
67 d->guiUpdateCompressor.start();
68}
69
71{
72 // HACK ALERT: all items in predefined zooms are handled by
73 // slotZoomLevelChangedIndex(), which comes first;
74 // this implementation is for explicitly entered
75 // values only.
76
77 bool isValid = false;
78 qreal zoom = QLocale().toDouble(value, &isValid);
79
80 if (!isValid) {
83
84 QString trimmedValue = value.trimmed();
85 if (trimmedValue.endsWith('%')) {
86 stringRemoveLast(trimmedValue);
87 } else if (trimmedValue.startsWith('%')) {
92 stringRemoveFirst(trimmedValue);
93 }
94 zoom = QLocale().toDouble(trimmedValue, &isValid);
95 }
96
97 if (isValid) {
103 const KoZoomState &zoomState = d->currentActionState.zoomState;
104 if (zoomState.mode != KoZoomMode::ZOOM_CONSTANT ||
105 qRound(zoomState.zoom * 1000.0) != qRound(zoom * 10.0)) {
106
107 Q_EMIT zoomChanged(KoZoomMode::ZOOM_CONSTANT, zoom / 100.0);
108 }
109
110 }
111}
112
114{
115 if (index < 0 || index >= d->currentActionState.realGuiLevels.size()) return;
116 if (index == d->currentActionState.currentRealLevelIndex) return;
117
118 KoZoomMode::Mode mode = std::get<KoZoomMode::Mode>(d->currentActionState.realGuiLevels[index]);
119 qreal zoom = std::get<qreal>(d->currentActionState.realGuiLevels[index]);
120
121 Q_EMIT zoomChanged(mode, zoom);
122}
123
125{
126 QStringList values;
127
128 std::transform(d->currentActionState.realGuiLevels.begin(),
129 d->currentActionState.realGuiLevels.end(),
130 std::back_inserter(values),
131 [](const auto &item) {
132 return std::get<QString>(item);
133 });
134
135 {
136 QSignalBlocker b(this);
137 setItems(values);
138 setCurrentItem(d->currentActionState.currentRealLevelIndex);
139 }
140
142 values,
143 d->currentActionState.currentRealLevelIndex,
144 d->currentActionState.currentRealLevelText);
145}
146
148{
149 if (value < 0 || value >= d->currentActionState.standardLevels.size()) return;
150
152 qreal zoom = d->currentActionState.standardLevels[value];
153
154 Q_EMIT zoomChanged(mode, zoom);
155}
156
157QWidget * KoZoomAction::createWidget(QWidget *parent)
158{
159 KoZoomWidget* zoomWidget = new KoZoomWidget(parent, d->currentActionState.standardLevels.size());
160
164
165 connect(zoomWidget, SIGNAL(zoomLevelChanged(QString)), this, SLOT(slotTextZoomChanged(QString)));
166 connect(zoomWidget, SIGNAL(sliderValueChanged(int)), this, SLOT(sliderValueChanged(int)));
167 connect(zoomWidget, SIGNAL(zoomLevelChangedIndex(int)), this, SLOT(slotZoomLevelChangedIndex(int)));
168 connect(zoomWidget, SIGNAL(sigUsePrintResolutionModeChanged(bool)), this, SIGNAL(sigUsePrintResolutionModeChanged(bool)));
169
172
173 return zoomWidget;
174}
175
181
186
188{
189 const int index = d->currentActionState.calcNearestStandardLevel();
190 Q_EMIT sigInternalUpdateZoomLevelsSliderState(d->currentActionState.standardLevels.size(), index);
191}
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KoZoomAction * parent
Private *const d
void syncSliderWithZoom()
void slotZoomLevelChangedIndex(int index)
QWidget * createWidget(QWidget *parent) override
~KoZoomAction() override
KoZoomAction(const QString &text, QObject *parent)
KisSignalCompressor guiUpdateCompressor
void zoomChanged(KoZoomMode::Mode mode, qreal zoom)
void sigInternalUpdateUsePrintResolutionMode(bool value)
void regenerateItems()
Private(KoZoomAction *_parent)
KoZoomActionState currentActionState
void sliderValueChanged(int value)
void sigUsePrintResolutionModeChanged(bool value)
void setUsePrintResolutionMode(bool value)
void slotTextZoomChanged(const QString &value)
void sigInternalUpdateZoomLevelsSliderState(int size, int index)
void sigInternalUpdateZoomLevelsComboState(const QStringList &values, int index, const QString &activeText)
void slotUpdateGuiAfterZoom()
void slotZoomStateChanged(const KoZoomState &zoomState)
KoZoomState currentZoomState
@ ZOOM_CONSTANT
zoom x %
Definition KoZoomMode.h:24
KoZoomMode::Mode mode
Definition KoZoomState.h:24
void setZoomLevelsState(const QStringList &values, int index, const QString &activeText)
void setUsePrintResolutionMode(bool value)
void setSliderState(int size, int index)
#define koIcon(name)
Use these macros for icons without any issues.
Definition kis_icon.h:25
void stringRemoveFirst(QString &str)
void stringRemoveLast(QString &str)