Krita Source Code Documentation
Loading...
Searching...
No Matches
SvgInlineSizeChangeStrategy Class Reference

#include <SvgInlineSizeChangeStrategy.h>

+ Inheritance diagram for SvgInlineSizeChangeStrategy:

Public Member Functions

void cancelInteraction () override
 
KUndo2CommandcreateCommand () override
 
void finishInteraction (Qt::KeyboardModifiers modifiers) override
 
void handleMouseMove (const QPointF &mouseLocation, Qt::KeyboardModifiers modifiers) override
 
 SvgInlineSizeChangeStrategy (KoToolBase *tool, KoSvgTextShape *shape, const QPointF &clicked, bool start)
 
 ~SvgInlineSizeChangeStrategy () override=default
 
- Public Member Functions inherited from KoInteractionStrategy
 KoInteractionStrategy (KoToolBase *parent)
 constructor
 
virtual void paint (QPainter &painter, const KoViewConverter &converter)
 
KoToolBasetool () const
 
virtual ~KoInteractionStrategy ()
 Destructor.
 

Private Attributes

SvgInlineSizeHelper::VisualAnchor m_anchor
 
QPointF m_anchorOffset
 
QPointF m_dragStart
 
int m_finalAnchor
 
double m_finalInlineSize
 
QPointF m_finalPos
 
SvgInlineSizeHelper::Side m_handleSide
 
double m_initialInlineSize
 
QPointF m_initialPosition
 
int m_originalAnchor
 
KoSvgTextShapem_shape
 
QPointF m_snapDelta
 
bool m_startHandle
 

Additional Inherited Members

- Protected Member Functions inherited from KoInteractionStrategy
uint decorationThickness () const
 
uint grabSensitivity () const
 Convenience function to get the global grab sensitivity.
 
uint handleRadius () const
 Convenience function to get the global handle radius.
 
 KoInteractionStrategy (KoInteractionStrategyPrivate &)
 constructor
 
- Protected Attributes inherited from KoInteractionStrategy
KoInteractionStrategyPrivated_ptr
 

Detailed Description

Definition at line 23 of file SvgInlineSizeChangeStrategy.h.

Constructor & Destructor Documentation

◆ SvgInlineSizeChangeStrategy()

SvgInlineSizeChangeStrategy::SvgInlineSizeChangeStrategy ( KoToolBase * tool,
KoSvgTextShape * shape,
const QPointF & clicked,
bool start )

Definition at line 26 of file SvgInlineSizeChangeStrategy.cpp.

30 , m_shape(shape)
31 , m_dragStart(clicked)
35 , m_startHandle(start)
36{
40 if (std::optional<InlineSizeInfo> info = InlineSizeInfo::fromShape(shape)) {
41 m_initialInlineSize = m_finalInlineSize = info->inlineSize;
42 m_anchor = info->anchor;
43 m_handleSide = m_startHandle? info->startLineSide(): info->endLineSide();
44 QPointF handleLocation = m_startHandle? info->startLine().p1(): info->endLine().p1();
45 QTransform invTransform = (info->editorTransform * info->shapeTransform).inverted();
46 QPointF initPos = info->editorTransform.inverted().map(m_shape->initialTextPosition());
47 m_snapDelta = invTransform.inverted().map(QPointF(invTransform.map(handleLocation).x(), initPos.y())) - m_dragStart;
48 } else {
49 // We cannot bail out, so just pretend to be doing something :(
51 m_anchor = VisualAnchor::LeftOrTop;
52 m_handleSide = m_startHandle? Side::LeftOrTop: Side::RightOrBottom;
53 }
54}
KoSnapGuide * snapGuide
KoInteractionStrategy(KoToolBase *parent)
constructor
QPointF absolutePosition(KoFlake::AnchorPosition anchor=KoFlake::Center) const
Definition KoShape.cpp:653
QTransform absoluteTransformation() const
Definition KoShape.cpp:382
static QList< KoShape * > linearizeSubtree(const QList< KoShape * > &shapes)
Definition KoShape.cpp:1381
void setIgnoredShapes(const QList< KoShape * > &ignoredShapes)
Sets list of ignored shapes.
@ TextAnchorId
KoSvgText::TextAnchor.
QVariant propertyOrDefault(PropertyId id) const
QPointF initialTextPosition
KoSvgTextProperties textProperties() const
KoCanvasBase * canvas() const
Returns the canvas the tool is working on.
SvgInlineSizeHelper::VisualAnchor m_anchor
SvgInlineSizeHelper::Side m_handleSide
@ TopLeft
Definition KoFlake.h:86
TextAnchor
Where the text is anchored for SVG 1.1 text and 'inline-size'.
Definition KoSvgText.h:79
static double getInlineSizePt(const KoSvgTextShape *const shape)

References KoToolBase::canvas(), SvgInlineSizeHelper::getInlineSizePt(), KoSvgTextShape::initialTextPosition, KoShape::linearizeSubtree(), m_anchor, m_dragStart, m_finalAnchor, m_finalInlineSize, m_handleSide, m_initialInlineSize, m_originalAnchor, m_shape, m_snapDelta, m_startHandle, KoSvgTextProperties::propertyOrDefault(), KoSnapGuide::setIgnoredShapes(), KoCanvasBase::snapGuide, KoSvgTextProperties::TextAnchorId, KoSvgTextShape::textProperties(), and KoInteractionStrategy::tool().

◆ ~SvgInlineSizeChangeStrategy()

SvgInlineSizeChangeStrategy::~SvgInlineSizeChangeStrategy ( )
overridedefault

Member Function Documentation

◆ cancelInteraction()

◆ createCommand()

KUndo2Command * SvgInlineSizeChangeStrategy::createCommand ( )
overridevirtual

For interactions that are undo-able this method should be implemented to return such a command. Implementations should return 0 otherwise.

Returns
a command, or 0.

Implements KoInteractionStrategy.

Definition at line 149 of file SvgInlineSizeChangeStrategy.cpp.

References KoToolBase::canvas(), m_finalAnchor, m_finalInlineSize, m_finalPos, m_initialInlineSize, m_initialPosition, m_originalAnchor, m_shape, qFuzzyCompare(), KoSnapGuide::reset(), KoCanvasBase::snapGuide, and KoInteractionStrategy::tool().

◆ finishInteraction()

void SvgInlineSizeChangeStrategy::finishInteraction ( Qt::KeyboardModifiers modifiers)
overridevirtual

Override to make final changes to the data on the end of an interaction.

Implements KoInteractionStrategy.

Definition at line 173 of file SvgInlineSizeChangeStrategy.cpp.

174{
175}

◆ handleMouseMove()

void SvgInlineSizeChangeStrategy::handleMouseMove ( const QPointF & mouseLocation,
Qt::KeyboardModifiers modifiers )
overridevirtual

Extending classes should implement this method to update the selectedShapes based on the new mouse position.

Parameters
mouseLocationthe new location in pt
modifiersOR-ed set of keys pressed.

Implements KoInteractionStrategy.

Definition at line 56 of file SvgInlineSizeChangeStrategy.cpp.

57{
58 QTransform invTransform{};
59 QPointF initPos;
60 if (std::optional<InlineSizeInfo> info = InlineSizeInfo::fromShape(m_shape)) {
61 invTransform = (info->editorTransform * info->shapeTransform).inverted();
62 initPos = info->editorTransform.inverted().map(m_shape->initialTextPosition());
63 }
64
65 double newInlineSize = 0.0;
66
67 QPointF snapDelta = invTransform.inverted().map(QPointF(invTransform.map(mouseLocation + m_snapDelta).x(), initPos.y())) - mouseLocation;
68 QPointF snappedLocation = tool()->canvas()->snapGuide()->snap(mouseLocation + snapDelta, modifiers) - snapDelta;
69 const double mouseDelta = invTransform.map(QLineF(m_dragStart, snappedLocation)).dx();
70 QPointF newPosition = m_shape->absolutePosition(KoFlake::TopLeft);
71
72 // The anchor pos is mostly to determine the transformed origin so that moving the position stays consistent.
73 QPointF anchorPos = m_shape->absoluteTransformation().map(QPointF());
74 QPointF anchorDiff = anchorPos - m_anchorOffset;
75 QPointF diff = (invTransform.inverted().map(QPointF(mouseDelta, 0)) - anchorPos) - anchorDiff;
76
77
78 switch (m_anchor) {
79 case VisualAnchor::LeftOrTop:
80 if (m_handleSide == Side::RightOrBottom) {
81 newInlineSize = m_initialInlineSize + mouseDelta;
82 } else {
83 newInlineSize = m_initialInlineSize - mouseDelta;
84 }
85 break;
86 case VisualAnchor::Mid:
87 if (modifiers.testFlag(Qt::ControlModifier)) {
88 if (m_handleSide == Side::RightOrBottom) {
89 newInlineSize = m_initialInlineSize + 2.0 * mouseDelta;
90 } else {
91 newInlineSize = m_initialInlineSize - 2.0 * mouseDelta;
92 }
93 diff = QPointF();
94 newPosition -= anchorDiff;
95 } else {
96 if (m_handleSide == Side::RightOrBottom) {
97 newInlineSize = m_initialInlineSize + mouseDelta;
98 newPosition += ((invTransform.inverted().map(QPointF(0.5 * mouseDelta, 0)) - anchorPos)) - anchorDiff;
99 } else {
100 newInlineSize = m_initialInlineSize - mouseDelta;
101 diff = ((invTransform.inverted().map(QPointF(0.5 * mouseDelta, 0)) - anchorPos)) - anchorDiff;
102 }
103 }
104 break;
105 case VisualAnchor::RightOrBottom:
106 if (m_handleSide == Side::LeftOrTop) {
107 newInlineSize = m_initialInlineSize - mouseDelta;
108 } else {
109 newInlineSize = m_initialInlineSize + mouseDelta;
110 }
111 break;
112 }
113
114 if (m_startHandle) {
115 newPosition += diff;
116 }
117
118 const bool flip = newInlineSize < -1.0;
119 if (newInlineSize >= -1.0 && newInlineSize < 1.0) {
120 newInlineSize = 1.0;
121 } else {
122 newInlineSize = qRound(newInlineSize * 100.0) / 100.0;
123
124 }
125
127 if (flip) {
128 newInlineSize = fabs(newInlineSize);
129 if (newAnchor == KoSvgText::AnchorStart) {
130 newAnchor = KoSvgText::AnchorEnd;
131 } else if (newAnchor == KoSvgText::AnchorEnd) {
132 newAnchor = KoSvgText::AnchorStart;
133 }
134 }
135 if (qFuzzyCompare(m_finalInlineSize, newInlineSize)
136 && m_initialPosition == newPosition
137 && m_originalAnchor == newAnchor) {
138 return;
139 }
141 newPosition, m_initialPosition).redo();
142
143 m_finalInlineSize = newInlineSize;
144 m_finalAnchor = newAnchor;
145 m_finalPos = newPosition;
147}
QPointF snap(const QPointF &mousePosition, Qt::KeyboardModifiers modifiers)
snaps the mouse position, returns if mouse was snapped
@ AnchorEnd
Anchor right for LTR, left for RTL.
Definition KoSvgText.h:82
@ AnchorStart
Anchor left for LTR, right for RTL.
Definition KoSvgText.h:80

References KoShape::absolutePosition(), KoShape::absoluteTransformation(), KoSvgText::AnchorEnd, KoSvgText::AnchorStart, KoToolBase::canvas(), KoSvgTextShape::initialTextPosition, m_anchor, m_anchorOffset, m_dragStart, m_finalAnchor, m_finalInlineSize, m_finalPos, m_handleSide, m_initialInlineSize, m_initialPosition, m_originalAnchor, m_shape, m_snapDelta, m_startHandle, qFuzzyCompare(), SvgInlineSizeChangeCommand::redo(), KoToolBase::repaintDecorations(), KoSnapGuide::snap(), KoCanvasBase::snapGuide, KoInteractionStrategy::tool(), and KoFlake::TopLeft.

Member Data Documentation

◆ m_anchor

SvgInlineSizeHelper::VisualAnchor SvgInlineSizeChangeStrategy::m_anchor
private

Definition at line 45 of file SvgInlineSizeChangeStrategy.h.

◆ m_anchorOffset

QPointF SvgInlineSizeChangeStrategy::m_anchorOffset
private

Definition at line 43 of file SvgInlineSizeChangeStrategy.h.

◆ m_dragStart

QPointF SvgInlineSizeChangeStrategy::m_dragStart
private

Definition at line 38 of file SvgInlineSizeChangeStrategy.h.

◆ m_finalAnchor

int SvgInlineSizeChangeStrategy::m_finalAnchor
private

Definition at line 40 of file SvgInlineSizeChangeStrategy.h.

◆ m_finalInlineSize

double SvgInlineSizeChangeStrategy::m_finalInlineSize
private

Definition at line 37 of file SvgInlineSizeChangeStrategy.h.

◆ m_finalPos

QPointF SvgInlineSizeChangeStrategy::m_finalPos
private

Definition at line 42 of file SvgInlineSizeChangeStrategy.h.

◆ m_handleSide

SvgInlineSizeHelper::Side SvgInlineSizeChangeStrategy::m_handleSide
private

Definition at line 46 of file SvgInlineSizeChangeStrategy.h.

◆ m_initialInlineSize

double SvgInlineSizeChangeStrategy::m_initialInlineSize
private

Definition at line 36 of file SvgInlineSizeChangeStrategy.h.

◆ m_initialPosition

QPointF SvgInlineSizeChangeStrategy::m_initialPosition
private

Definition at line 41 of file SvgInlineSizeChangeStrategy.h.

◆ m_originalAnchor

int SvgInlineSizeChangeStrategy::m_originalAnchor
private

Definition at line 39 of file SvgInlineSizeChangeStrategy.h.

◆ m_shape

KoSvgTextShape* SvgInlineSizeChangeStrategy::m_shape
private

Definition at line 35 of file SvgInlineSizeChangeStrategy.h.

◆ m_snapDelta

QPointF SvgInlineSizeChangeStrategy::m_snapDelta
private

Definition at line 44 of file SvgInlineSizeChangeStrategy.h.

◆ m_startHandle

bool SvgInlineSizeChangeStrategy::m_startHandle
private

Definition at line 47 of file SvgInlineSizeChangeStrategy.h.


The documentation for this class was generated from the following files: