Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_guides_config.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 SPDX-FileCopyrightText: 2006 Laurent Montel <montel@kde.org>
3 SPDX-FileCopyrightText: 2008 Jan Hambrecht <jaham@gmx.net>
4 SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
5
6 SPDX-License-Identifier: LGPL-2.0-or-later
7*/
8
9#include "kis_guides_config.h"
10
11#include <QDomDocument>
12#include <QColor>
13#include <QPen>
14
15#include "kis_config.h"
16#include "kis_dom_utils.h"
17#include "kis_algebra_2d.h"
18#include "kis_global.h"
20
22 qRegisterMetaType<KisGuidesConfig>("KisGuidesConfig");
23}
24
25class Q_DECL_HIDDEN KisGuidesConfig::Private
26{
27public:
28
29 bool operator==(const Private &rhs) {
30 return horzGuideLines == rhs.horzGuideLines &&
31 vertGuideLines == rhs.vertGuideLines &&
32 showGuides == rhs.showGuides &&
33 snapToGuides == rhs.snapToGuides &&
34 lockGuides == rhs.lockGuides &&
35 guidesColor == rhs.guidesColor &&
36 guidesLineType == rhs.guidesLineType &&
37 rulersMultiple2 == rhs.rulersMultiple2 &&
38 unitType == rhs.unitType;
39 }
40
43
44 bool showGuides {false};
45 bool snapToGuides {false};
46 bool lockGuides {false};
47 bool rulersMultiple2 {false};
48
50
52 LineTypeInternal guidesLineType {LINE_SOLID};
53
54 Qt::PenStyle toPenStyle(LineTypeInternal type);
55};
56
62
66
68 : d(new Private(*rhs.d))
69{
70}
71
73{
74 if (&rhs != this) {
75 *d = *rhs.d;
76 }
77
78 return *this;
79}
80
82{
83 return *d == *rhs.d;
84}
85
91
93{
94 d->horzGuideLines = lines;
95}
96
98{
99 d->vertGuideLines = lines;
100}
101
102void KisGuidesConfig::addGuideLine(Qt::Orientation o, qreal pos)
103{
104 if (o == Qt::Horizontal) {
105 d->horzGuideLines.append(pos);
106 } else {
107 d->vertGuideLines.append(pos);
108 }
109}
110
112{
113 QList<qreal> emptyGuides ;
114 setVerticalGuideLines(emptyGuides);
115 setHorizontalGuideLines(emptyGuides);
116}
117
119{
120 return d->showGuides;
121}
122
124{
125 d->showGuides = value;
126}
127
129{
130 return d->lockGuides;
131}
132
134{
135 d->lockGuides = value;
136}
137
139{
140 return d->snapToGuides;
141}
142
144{
145 d->snapToGuides = value;
146}
147
149{
150 return d->rulersMultiple2;
151}
152
154{
155 d->rulersMultiple2 = value;
156}
157
159{
160 return d->unitType;
161}
162
164{
165 d->unitType = type;
166}
167
170{
171 return d->guidesLineType;
172}
173
175{
176 d->guidesLineType = value;
177}
178
179
180QColor KisGuidesConfig::guidesColor() const
181{
182 return d->guidesColor;
183}
184
186{
187 d->guidesColor = value;
188}
189
190 Qt::PenStyle KisGuidesConfig::Private::toPenStyle(LineTypeInternal type) {
191 return type == LINE_SOLID ? Qt::SolidLine :
192 type == LINE_DASHED ? Qt::DashLine :
193 type == LINE_DOTTED ? Qt::DotLine :
194 Qt::DashDotDotLine;
195}
196
198{
199 return QPen(d->guidesColor, 0, d->toPenStyle(d->guidesLineType));
200}
201
203{
204 return d->horzGuideLines;
205}
206
208{
209 return d->vertGuideLines;
210}
211
213{
214 return !d->horzGuideLines.isEmpty() || !d->vertGuideLines.isEmpty();
215}
216
218{
219 KisConfig cfg(true);
220 d->guidesLineType = LineTypeInternal(cfg.guidesLineStyle());
221 d->guidesColor = cfg.guidesColor();
222}
223
225{
226 KisConfig cfg(false);
227 cfg.setGuidesLineStyle(d->guidesLineType);
228 cfg.setGuidesColor(d->guidesColor);
229}
230
231QDomElement KisGuidesConfig::saveToXml(QDomDocument& doc, const QString &tag) const
232{
233 QDomElement guidesElement = doc.createElement(tag);
234 KisDomUtils::saveValue(&guidesElement, "showGuides", d->showGuides);
235 KisDomUtils::saveValue(&guidesElement, "snapToGuides", d->snapToGuides);
236 KisDomUtils::saveValue(&guidesElement, "lockGuides", d->lockGuides);
237 KisDomUtils::saveValue(&guidesElement, "colorGuides", d->guidesColor);
238 KisDomUtils::saveValue(&guidesElement, "lineTypeGuides", d->guidesLineType);
239
240 KisDomUtils::saveValue(&guidesElement, "horizontalGuides", d->horzGuideLines.toVector());
241 KisDomUtils::saveValue(&guidesElement, "verticalGuides", d->vertGuideLines.toVector());
242
243 KisDomUtils::saveValue(&guidesElement, "rulersMultiple2", d->rulersMultiple2);
244 KoUnit tmp(d->unitType);
245 KisDomUtils::saveValue(&guidesElement, "unit", tmp.symbol());
246
247 return guidesElement;
248}
249
250bool KisGuidesConfig::loadFromXml(const QDomElement &parent)
251{
252 KisConfig cfg(false);
253 bool result = true;
254
255 result &= KisDomUtils::loadValue(parent, "showGuides", &d->showGuides);
256 result &= KisDomUtils::loadValue(parent, "snapToGuides", &d->snapToGuides);
257 result &= KisDomUtils::loadValue(parent, "lockGuides", &d->lockGuides);
258
259 QVector<qreal> hGuides;
260 QVector<qreal> vGuides;
261
262 result &= KisDomUtils::loadValue(parent, "horizontalGuides", &hGuides);
263 result &= KisDomUtils::loadValue(parent, "verticalGuides", &vGuides);
264
265 d->horzGuideLines = QList<qreal>::fromVector(hGuides);
266 d->vertGuideLines = QList<qreal>::fromVector(vGuides);
267
268 result &= KisDomUtils::loadValue(parent, "rulersMultiple2", &d->rulersMultiple2);
269 QString unit;
270 result &= KisDomUtils::loadValue(parent, "unit", &unit);
271 bool ok = false;
272 KoUnit tmp = KoUnit::fromSymbol(unit, &ok);
273 if (ok) {
274 d->unitType = tmp.type();
275 }
276 result &= ok;
277
278 // following variables may not be present in older files; do not update result variable
280 KisDomUtils::loadValue(parent, "lineTypeGuides", &guidesLineType);
281 d->guidesLineType = LineTypeInternal(guidesLineType);
282
283 d->guidesColor = cfg.guidesColor();
284 KisDomUtils::loadValue(parent, "colorGuides", &d->guidesColor);
285
286 return result;
287}
288
290{
291 KisGuidesConfig defaultObject;
292 defaultObject.loadStaticData();
293
294 return *this == defaultObject;
295}
296
297void KisGuidesConfig::transform(const QTransform &transform)
298{
299 if (transform.type() >= QTransform::TxShear) return;
300
302
303 QTransform t = m.scaleTransform();
304
305 const qreal eps = 1e-3;
306 int numWraps = 0;
307 const qreal wrappedRotation = KisAlgebra2D::wrapValue(m.angle, 90.0);
308 if (wrappedRotation <= eps || wrappedRotation >= 90.0 - eps) {
309 t *= m.rotateTransform();
310 numWraps = qRound(normalizeAngleDegrees(m.angle) / 90.0);
311 }
312
313 t *= m.translateTransform();
314
315
316 QList<qreal> newHorzGuideLines;
317 QList<qreal> newVertGuideLines;
318
319 Q_FOREACH (qreal hRuler, d->horzGuideLines) {
320 const QPointF pt = t.map(QPointF(0, hRuler));
321
322 if (numWraps & 0x1) {
323 newVertGuideLines << pt.x();
324 } else {
325 newHorzGuideLines << pt.y();
326 }
327 }
328
329 Q_FOREACH (qreal vRuler, d->vertGuideLines) {
330 const QPointF pt = t.map(QPointF(vRuler, 0));
331
332 if (!(numWraps & 0x1)) {
333 newVertGuideLines << pt.x();
334 } else {
335 newHorzGuideLines << pt.y();
336 }
337 }
338
339 d->horzGuideLines = newHorzGuideLines;
340 d->vertGuideLines = newVertGuideLines;
341}
float value(const T *src, size_t ch)
quint32 guidesLineStyle(bool defaultValue=false) const
QColor guidesColor(bool defaultValue=false) const
void setGuidesLineStyle(quint32 v) const
void setGuidesColor(const QColor &v) const
Qt::PenStyle toPenStyle(LineTypeInternal type)
void setUnitType(KoUnit::Type type)
void setHorizontalGuideLines(const QList< qreal > &lines)
Set the positions of the horizontal guide lines.
void setShowGuides(bool value)
bool operator==(const Private &rhs)
QList< qreal > vertGuideLines
void setSnapToGuides(bool value)
void setGuidesColor(const QColor &value)
const QList< qreal > & verticalGuideLines() const
Returns the list of vertical guide lines.
void setLockGuides(bool value)
void setRulersMultiple2(bool value)
void saveStaticData() const
QDomElement saveToXml(QDomDocument &doc, const QString &tag) const
bool loadFromXml(const QDomElement &parent)
void setVerticalGuideLines(const QList< qreal > &lines)
Set the positions of the vertical guide lines.
bool hasSamePositionAs(const KisGuidesConfig &rhs) const
void addGuideLine(Qt::Orientation orientation, qreal position)
Add a guide line to the canvas.
QList< qreal > horzGuideLines
const QScopedPointer< Private > d
const QList< qreal > & horizontalGuideLines() const
Returns the list of horizontal guide lines.
LineTypeInternal guidesLineType
void setGuidesLineType(LineTypeInternal value)
void transform(const QTransform &transform)
KisGuidesConfig & operator=(const KisGuidesConfig &rhs)
static KoUnit fromSymbol(const QString &symbol, bool *ok=0)
Definition KoUnit.cpp:271
@ Pixel
Definition KoUnit.h:82
const qreal eps
std::enable_if< std::is_floating_point< T >::value, T >::type normalizeAngleDegrees(T a)
Definition kis_global.h:132
KIS_DECLARE_STATIC_INITIALIZER
T wrapValue(T value, T wrapBounds)
void saveValue(QDomElement *parent, const QString &tag, const QSize &size)
bool loadValue(const QDomElement &e, float *v)
QTransform rotateTransform() const
QTransform scaleTransform() const
QTransform translateTransform() const