12#include <klocalizedstring.h>
15#include <QPainterPath>
41 , m_subdivisions(rhs.m_subdivisions)
42 , m_minorSubdivisions(rhs.m_minorSubdivisions)
43 , m_hasFixedLength(rhs.m_hasFixedLength)
44 , m_fixedLength(rhs.m_fixedLength)
45 , m_fixedLengthUnit(rhs.m_fixedLengthUnit)
56 QPointF
u = pt2 - pt1;
58 qreal u_norm = sqrt(
u.x() *
u.x() +
u.y() *
u.y());
60 if(u_norm == 0)
return pt;
64 double t = a.x() *
u.x() + a.y() *
u.y();
66 if(t < 0.0)
return pt1;
67 if(t > u_norm)
return pt2;
80 strokeBegin =
project(strokeBegin);
91 QPointF
p1 = document2widget.map(*
handles()[0]);
92 QPointF
p2 = document2widget.map(*
handles()[1]);
94 const qreal scale = 16.0 / 2;
95 const qreal minorScale = scale / 2;
96 const QRectF clipping = QRectF(gc.viewport()).adjusted(-scale, -scale, scale, scale);
100 const qreal threshold = 3.0;
103 QPointF delta =
p2 -
p1;
108 if (stepsize >= threshold) {
109 QPointF normal = QPointF(delta.y(), -delta.x());
119 if (clipping.contains(pos)) {
120 path.moveTo(pos - normal * scale);
121 path.lineTo(pos + normal * scale);
136 if (clipping.contains(mpos)) {
137 path.moveTo(mpos - normal * minorScale);
138 path.lineTo(mpos + normal * minorScale);
155 QPointF center = doc2widget.map(*
handles()[0]);
156 QPointF handle = doc2widget.map(*
handles()[1]);
161 for (
int i = 0; i < 4; ++i) {
162 QTransform rot = QTransform().rotate(i * 90);
164 path.moveTo(center + rot.map(QPointF(12, -3)));
165 path.lineTo(center + rot.map(QPointF(9, 0)));
166 path.lineTo(center + rot.map(QPointF(12, 3)));
170 QRectF
bounds = QRectF(handle, QSizeF(0, 0)).adjusted(-11, -11, 11, 11);
171 for (
int i = 0; i < 2; ++i) {
172 int dir = i == 0 ? 1 : -1;
174 path.moveTo(handle + QPointF(dir * 11, 0));
175 path.arcTo(
bounds, i * 180, -90);
212 gc.setTransform(initialTransform);
278 if (unit.isEmpty()) {
290 QPointF center = *
handles()[0];
291 QPointF handle = *
handles()[1];
292 QPointF direction = handle - center;
295 *
handles()[1] = center + delta;
301 xml->writeStartElement(
"subdivisions");
303 xml->writeEndElement();
304 xml->writeStartElement(
"minorSubdivisions");
306 xml->writeEndElement();
307 xml->writeStartElement(
"fixedLength");
311 xml->writeEndElement();
317 if (xml->name() ==
"subdivisions") {
320 else if (xml->name() ==
"minorSubdivisions") {
323 else if (xml->name() ==
"fixedLength") {
345 return i18n(
"Ruler");
qreal length(const QPointF &vec)
qreal distance(const QPointF &p1, const QPointF &p2)
KisPaintingAssistantsDecorationSP paintingAssistantsDecoration() const
QTransform documentToWidgetTransform() const
bool isSnappingActive() const
void drawPath(QPainter &painter, const QPainterPath &path, bool drawActive=true)
static double norm2(const QPointF &p)
virtual void drawAssistant(QPainter &gc, const QRectF &updateRect, const KisCoordinatesConverter *converter, bool cached, KisCanvas2 *canvas=0, bool assistantVisible=true, bool previewVisible=true)
const QList< KisPaintingAssistantHandleSP > & handles() const
bool isEditingAssistants()
~RulerAssistantFactory() override
QString id() const override
QString name() const override
KisPaintingAssistant * createPaintingAssistant() const override
bool loadCustomXml(QXmlStreamReader *xml) override
void drawCache(QPainter &gc, const KisCoordinatesConverter *converter, bool assistantVisible=true) override
performance layer where the graphics can be drawn from a cache instead of generated every render upda...
void drawHandleAnnotations(QPainter &gc, const KisCoordinatesConverter *converter)
qreal fixedLength() const
void adjustLine(QPointF &point, QPointF &strokeBegin) override
QString m_fixedLengthUnit
void setFixedLength(qreal length)
void setFixedLengthUnit(QString unit)
void setMinorSubdivisions(int subdivisions)
bool isAssistantComplete() const override
void drawAssistant(QPainter &gc, const QRectF &updateRect, const KisCoordinatesConverter *converter, bool cached, KisCanvas2 *canvas, bool assistantVisible=true, bool previewVisible=true) override
QString fixedLengthUnit() const
QPointF adjustPosition(const QPointF &point, const QPointF &strokeBegin, const bool snapToAny, qreal moveThresholdPt) override
bool hasFixedLength() const
void saveCustomXml(QXmlStreamWriter *xml) override
void setSubdivisions(int subdivisions)
QPointF project(const QPointF &pt) const
KisPaintingAssistantSP clone(QMap< KisPaintingAssistantHandleSP, KisPaintingAssistantHandleSP > &handleMap) const override
void enableFixedLength(bool enabled)
int minorSubdivisions() const
QPointF getDefaultEditorPosition() const override
void drawSubdivisions(QPainter &gc, const KisCoordinatesConverter *converter)
QSharedPointer< KisPaintingAssistant > KisPaintingAssistantSP
double toDouble(const QString &str, bool *ok=nullptr)
int toInt(const QString &str, bool *ok=nullptr)
QString toString(const QString &value)