Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_duplicateop_settings.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2002 Patrick Julien <freak@codepimps.org>
3 * SPDX-FileCopyrightText: 2004-2008 Boudewijn Rempt <boud@valdyas.org>
4 * SPDX-FileCopyrightText: 2004 Clarence Dang <dang@kde.org>
5 * SPDX-FileCopyrightText: 2004 Adrian Page <adrian@pagenet.plus.com>
6 * SPDX-FileCopyrightText: 2004 Cyrille Berger <cberger@cberger.net>
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
14
15#include <QDomElement>
16#include <QDomDocument>
17
18#include <KoPointerEvent.h>
20
21#include <kis_image.h>
24#include <kis_dom_utils.h>
26
28 : KisBrushBasedPaintOpSettings(resourcesInterface),
29 m_isOffsetNotUptodate(false),
30 m_duringPaintingStroke(false)
31{
32}
33
37
39{
40 return false;
41}
42
47
49{
50 return m_offset;
51}
52
54{
55 return m_position;
56}
57
58bool KisDuplicateOpSettings::mousePressEvent(const KisPaintInformation &info, Qt::KeyboardModifiers modifiers, KisNodeWSP currentNode)
59{
60 bool ignoreEvent = true;
61
62 if (modifiers & Qt::ControlModifier) {
63 if (!m_sourceNode || !(modifiers & Qt::AltModifier)) {
64 m_sourceNode = currentNode;
65 }
66 m_position = info.pos();
68 ignoreEvent = false;
69 }
70 else {
71 bool resetOrigin = getBool(DUPLICATE_RESET_SOURCE_POINT);
72 if (m_isOffsetNotUptodate || resetOrigin) {
73 m_offset = info.pos() - m_position;
75 }
77 ignoreEvent = true;
78 }
79
80 return ignoreEvent;
81}
82
84{
86 bool ignoreEvent = true;
87 return ignoreEvent;
88}
89
90
95
99
100void KisDuplicateOpSettings::fromXML(const QDomElement& elt)
101{
102 // First, call the parent class fromXML to make sure all the
103 // properties are saved to the map
105
106 m_offset.setX(KisDomUtils::toDouble(elt.attribute("OffsetX", "0.0")));
107 m_offset.setY(KisDomUtils::toDouble(elt.attribute("OffsetY", "0.0")));
108 m_isOffsetNotUptodate = false;
109}
110
111void KisDuplicateOpSettings::toXML(QDomDocument& doc, QDomElement& rootElt) const
112{
113 // Then call the parent class fromXML
115
116 rootElt.setAttribute("OffsetX", QString::number(m_offset.x()));
117 rootElt.setAttribute("OffsetY", QString::number(m_offset.y()));
118}
119
120
133
135{
137
138 OutlineMode forcedMode = mode;
139
140 if (!forcedMode.isVisible) {
141 forcedMode.isVisible = true;
142 forcedMode.forceCircle = true;
143 }
144
145 // clone tool should always show an outline
146 path = KisBrushBasedPaintOpSettings::brushOutlineImpl(info, forcedMode, alignForZoom, 1.0);
147
148 KisOptimizedBrushOutline copy(path);
149 QRectF rect2 = copy.boundingRect();
150 bool shouldStayInOrigin = m_isOffsetNotUptodate // the clone brush right now waits for first stroke with a new origin, so stays at origin point
151 || !getBool(DUPLICATE_MOVE_SOURCE_POINT) // the brush always use the same source point, so stays at origin point
152 || (!m_duringPaintingStroke && getBool(DUPLICATE_RESET_SOURCE_POINT)); // during the stroke, with reset Origin selected, outline should stay at origin point
153
154 if (shouldStayInOrigin) {
155 copy.translate(m_position - info.pos());
156 }
157 else {
158 copy.translate(-m_offset);
159 }
160
161 path.addPath(copy);
162
163 qreal dx = rect2.width() / 4.0;
164 qreal dy = rect2.height() / 4.0;
165 rect2.adjust(dx, dy, -dx, -dy);
166
167 QPainterPath crossIcon;
168
169 crossIcon.moveTo(rect2.topLeft());
170 crossIcon.lineTo(rect2.bottomRight());
171
172 crossIcon.moveTo(rect2.topRight());
173 crossIcon.lineTo(rect2.bottomLeft());
174
175 path.addPath(crossIcon);
176
177 return path;
178}
179
180
182#include "kis_paintop_preset.h"
186
187
189{
192
193 if (props.isEmpty()) {
194 {
196 new KisUniformPaintOpPropertyCallback(KisUniformPaintOpPropertyCallback::Bool, KoID("clone_healing", i18n("Healing")), settings, 0);
197
198 prop->setReadCallback(
199 [](KisUniformPaintOpProperty *prop) {
200 KisDuplicateOptionData optionData;
201 optionData.read(prop->settings().data());
202
203 prop->setValue(optionData.healing);
204 });
205 prop->setWriteCallback(
206 [](KisUniformPaintOpProperty *prop) {
207 KisDuplicateOptionData optionData;
208 optionData.read(prop->settings().data());
209 optionData.healing = prop->value().toBool();
210 optionData.write(prop->settings().data());
211 });
212
213 QObject::connect(updateProxy, SIGNAL(sigSettingsChanged()), prop, SLOT(requestReadValue()));
214 prop->requestReadValue();
215 props << toQShared(prop);
216 }
217 {
219 new KisUniformPaintOpPropertyCallback(KisUniformPaintOpPropertyCallback::Bool, KoID("clone_movesource", i18n("Move Source")), settings, 0);
220
221 prop->setReadCallback(
222 [](KisUniformPaintOpProperty *prop) {
223 KisDuplicateOptionData optionData;
224 optionData.read(prop->settings().data());
225
226 prop->setValue(optionData.moveSourcePoint);
227 });
228 prop->setWriteCallback(
229 [](KisUniformPaintOpProperty *prop) {
230 KisDuplicateOptionData optionData;
231 optionData.read(prop->settings().data());
232 optionData.moveSourcePoint = prop->value().toBool();
233 optionData.write(prop->settings().data());
234 });
235
236 QObject::connect(updateProxy, SIGNAL(sigSettingsChanged()), prop, SLOT(requestReadValue()));
237 prop->requestReadValue();
238 props << toQShared(prop);
239 }
240 }
241
242 return KisPaintOpSettings::uniformProperties(settings, updateProxy) + props;
243}
244
245
const QString DUPLICATE_RESET_SOURCE_POINT
const QString DUPLICATE_MOVE_SOURCE_POINT
const QString COMPOSITE_COPY
KisPaintOpSettingsSP clone() const override
KisOptimizedBrushOutline brushOutlineImpl(const KisPaintInformation &info, const OutlineMode &mode, qreal alignForZoom, qreal additionalScale)
void fromXML(const QDomElement &elt) override
QList< KisUniformPaintOpPropertyWSP > m_uniformProperties
KisDuplicateOpSettings(KisResourcesInterfaceSP resourcesInterface)
bool mousePressEvent(const KisPaintInformation &pos, Qt::KeyboardModifiers modifiers, KisNodeWSP currentNode) override
KisPaintOpSettingsSP clone() const override
QString indirectPaintingCompositeOp() const override
bool paintIncremental() override
Reimplemented.
KisOptimizedBrushOutline brushOutline(const KisPaintInformation &info, const OutlineMode &mode, qreal alignForZoom) override
const QPointF & pos() const
Definition KoID.h:30
QSharedPointer< T > toQShared(T *ptr)
Container< QSharedPointer< T > > listWeakToStrong(const Container< QWeakPointer< T > > &container, bool allOrNothing=true)
KisCallbackBasedPaintopProperty< KisUniformPaintOpProperty > KisUniformPaintOpPropertyCallback
double toDouble(const QString &str, bool *ok=nullptr)
bool read(const KisPropertiesConfiguration *setting)
void write(KisPropertiesConfiguration *setting) const
QList< KisUniformPaintOpPropertyWSP > uniformProperties
bool fromXML(const QString &xml, bool clear=true) override
bool getBool(const QString &name, bool def=false) const