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

#include <KoPathTool.h>

+ Inheritance diagram for KoPathTool:

Classes

struct  PathSegment
 

Public Slots

void canvasResourceChanged (int key, const QVariant &res) override
 
- Public Slots inherited from KoToolBase
virtual void canvasResourceChanged (int key, const QVariant &res)
 
virtual void documentResourceChanged (int key, const QVariant &res)
 
virtual void requestRedoDuringStroke ()
 
void setStatusText (const QString &statusText)
 
void updateOptionsWidgetIcons ()
 

Signals

void singleShapeChanged (KoPathShape *path)
 
void typeChanged (int types)
 
- Signals inherited from KoToolBase
void activateTool (const QString &id)
 
void cursorChanged (const QCursor &cursor)
 
void selectionChanged (bool hasSelection)
 
void statusTextChanged (const QString &statusText)
 
void textModeChanged (bool inTextMode)
 

Public Member Functions

void activate (const QSet< KoShape * > &shapes) override
 
void deactivate () override
 
QRectF decorationsRect () const override
 
void deleteSelection () override
 
void deselect () override
 deselect the tool should clear the selection if it has one.
 
void explicitUserStrokeEndRequest () override
 explicitUserStrokeEndRequest is called by the input manager when the user presses Enter key or any equivalent. This callback comes before requestStrokeEnd(), which comes from a different source.
 
void keyPressEvent (QKeyEvent *event) override
 
void keyReleaseEvent (QKeyEvent *event) override
 
 KoPathTool (KoCanvasBase *canvas)
 
void mouseDoubleClickEvent (KoPointerEvent *event) override
 
void mouseMoveEvent (KoPointerEvent *event) override
 
void mousePressEvent (KoPointerEvent *event) override
 
void mouseReleaseEvent (KoPointerEvent *event) override
 
void notifyPathPointsChanged (KoPathShape *shape)
 
void paint (QPainter &painter, const KoViewConverter &converter) override
 
QMenu * popupActionsMenu () override
 
void repaintDecorations () override
 
void requestStrokeCancellation () override
 
void requestStrokeEnd () override
 
void requestUndoDuringStroke () override
 
bool selectAll () override
 selectAll select all data the tool can select.
 
KoToolSelectionselection () override
 
 ~KoPathTool () override
 
- Public Member Functions inherited from KoToolBase
QAction * action (const QString &name) const
 
KoCanvasBasecanvas () const
 Returns the canvas the tool is working on.
 
virtual void copy () const
 
QCursor cursor () const
 return the last emitted cursor
 
virtual void customMoveEvent (KoPointerEvent *event)
 
virtual void customPressEvent (KoPointerEvent *event)
 
virtual void customReleaseEvent (KoPointerEvent *event)
 
virtual void cut ()
 
int decorationThickness () const
 decorationThickness The minimum thickness for tool decoration lines, this is derived from the screen magnification, thus the HiDPI settings. Note: to use this effectively, also set the pen to isCosmetic(true);
 
virtual void dragLeaveEvent (QDragLeaveEvent *event)
 
virtual void dragMoveEvent (QDragMoveEvent *event, const QPointF &point)
 
virtual void dropEvent (QDropEvent *event, const QPointF &point)
 
KoToolFactoryBasefactory () const
 
virtual void focusInEvent (QFocusEvent *event)
 
virtual void focusOutEvent (QFocusEvent *event)
 
virtual bool hasSelection ()
 
virtual void inputMethodEvent (QInputMethodEvent *event)
 
virtual QVariant inputMethodQuery (Qt::InputMethodQuery query) const
 
bool isInTextMode () const
 
bool isOpacityPresetMode () const
 
 KoToolBase (KoCanvasBase *canvas)
 
bool maskSyntheticEvents () const
 
virtual void mouseTripleClickEvent (KoPointerEvent *event)
 
QList< QPointer< QWidget > > optionWidgets ()
 
virtual bool paste ()
 
virtual KisPopupWidgetInterfacepopupWidget ()
 
Q_INVOKABLE QString toolId () const
 
virtual bool wantsAutoScroll () const
 
 ~KoToolBase () override
 

Protected Member Functions

QList< QPointer< QWidget > > createOptionWidgets () override
 reimplemented
 
- Protected Member Functions inherited from KoToolBase
virtual QWidget * createOptionWidget ()
 
int grabSensitivity () const
 Convenience function to get the current grab sensitivity.
 
qreal handleDocRadius () const
 
QRectF handleGrabRect (const QPointF &position) const
 
QRectF handlePaintRect (const QPointF &position) const
 
int handleRadius () const
 Convenience function to get the current handle radius.
 
bool isActivated () const
 
 KoToolBase (KoToolBasePrivate &dd)
 
KoPointerEventlastDeliveredPointerEvent () const
 
void setAbstractResource (KoAbstractCanvasResourceInterfaceSP abstractResource)
 
void setConverter (KoDerivedResourceConverterSP converter)
 
void setIsOpacityPresetMode (bool value)
 
void setMaskSyntheticEvents (bool value)
 
void setTextMode (bool value)
 
QHash< int, KoAbstractCanvasResourceInterfaceSPtoolAbstractResources ()
 
QHash< int, KoDerivedResourceConverterSPtoolConverters ()
 
void useCursor (const QCursor &cursor)
 

Protected Attributes

KoPathToolSelection m_pointSelection
 the point selection
 
QCursor m_selectCursor
 
- Protected Attributes inherited from KoToolBase
KoToolBasePrivated_ptr
 

Private Slots

void breakAtPoint ()
 
void breakAtSegment ()
 
void breakAtSelection ()
 
void convertToPath ()
 
void insertPoints ()
 
void joinPoints ()
 
void mergePoints ()
 
void pointSelectionChanged ()
 
void pointToCurve ()
 
void pointToLine ()
 
void pointTypeChanged (KoPathPointTypeCommand::PointType type)
 
void pointTypeChangedCorner ()
 
void pointTypeChangedSmooth ()
 
void pointTypeChangedSymmetric ()
 
void removePoints ()
 
void segmentToCurve ()
 
void segmentToLine ()
 
void slotSelectionChanged ()
 
void updateActions ()
 

Private Member Functions

void clearActivePointSelectionReferences ()
 
KUndo2CommandcreatePointToCurveCommand (const QList< KoPathPointData > &points)
 
void initializeWithShapes (const QList< KoShape * > shapes)
 
void mergePointsImpl (bool doJoin)
 
PathSegmentsegmentAtPoint (const QPointF &point)
 
void updateOptionsWidget ()
 

Private Attributes

QAction * m_actionAddPoint
 
QAction * m_actionBreakPoint
 
QAction * m_actionBreakSegment
 
QAction * m_actionBreakSelection
 
QAction * m_actionConvertToPath
 
QAction * m_actionCurvePoint
 
QAction * m_actionCurveSegment
 
QAction * m_actionJoinSegment
 
QAction * m_actionLinePoint
 
QAction * m_actionLineSegment
 
QAction * m_actionMergePoints
 
QAction * m_actionPathPointCorner
 
QAction * m_actionPathPointSmooth
 
QAction * m_actionPathPointSymmetric
 
QAction * m_actionRemovePoint
 
QScopedPointer< KoPathToolHandlem_activeHandle
 the currently active handle
 
QScopedPointer< PathSegmentm_activeSegment
 
KisSignalAutoConnectionsStore m_canvasConnections
 
QScopedPointer< QMenu > m_contextMenu
 
QScopedPointer< KoInteractionStrategym_currentStrategy
 the rubber selection strategy
 
QPointF m_lastPoint
 needed for interaction strategy
 
QCursor m_moveCursor
 
KoShapeFillResourceConnector m_shapeFillResourceConnector
 

Friends

class TestPathTool
 

Detailed Description

The tool for editing a KoPathShape or a KoParameterShape. See KoCreatePathTool for code handling the initial path creation.

Definition at line 35 of file KoPathTool.h.

Constructor & Destructor Documentation

◆ KoPathTool()

KoPathTool::KoPathTool ( KoCanvasBase * canvas)
explicit

Definition at line 86 of file KoPathTool.cpp.

88 , m_pointSelection(this)
89{
90 m_actionPathPointCorner = action("pathpoint-corner");
91 m_actionPathPointSmooth = action("pathpoint-smooth");
92 m_actionPathPointSymmetric = action("pathpoint-symmetric");
93 m_actionCurvePoint = action("pathpoint-curve");
94 m_actionLinePoint = action("pathpoint-line");
95 m_actionLineSegment = action("pathsegment-line");
96 m_actionCurveSegment = action("pathsegment-curve");
97 m_actionAddPoint = action("pathpoint-insert");
98 m_actionRemovePoint = action("pathpoint-remove");
99 m_actionBreakPoint = action("path-break-point");
100 m_actionBreakSegment = action("path-break-segment");
101 m_actionBreakSelection = action("path-break-selection");
102 m_actionJoinSegment = action("pathpoint-join");
103 m_actionMergePoints = action("pathpoint-merge");
104 m_actionConvertToPath = action("convert-to-path");
105
106 m_contextMenu.reset(new QMenu());
107
108 m_selectCursor = QCursor(QIcon(":/cursor-needle.svg").pixmap(32), 0, 0);
109 m_moveCursor = QCursor(QIcon(":/cursor-needle-move.svg").pixmap(32), 0, 0);
110
112}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
QAction * m_actionJoinSegment
Definition KoPathTool.h:138
QCursor m_selectCursor
Definition KoPathTool.h:114
QAction * m_actionCurvePoint
Definition KoPathTool.h:129
QAction * m_actionLinePoint
Definition KoPathTool.h:130
QAction * m_actionRemovePoint
Definition KoPathTool.h:134
KoPathToolSelection m_pointSelection
the point selection
Definition KoPathTool.h:113
QAction * m_actionLineSegment
Definition KoPathTool.h:131
QScopedPointer< QMenu > m_contextMenu
Definition KoPathTool.h:142
QAction * m_actionPathPointSymmetric
Definition KoPathTool.h:128
QAction * m_actionBreakSegment
Definition KoPathTool.h:136
QAction * m_actionAddPoint
Definition KoPathTool.h:133
QAction * m_actionPathPointSmooth
Definition KoPathTool.h:127
QAction * m_actionCurveSegment
Definition KoPathTool.h:132
QCursor m_moveCursor
Definition KoPathTool.h:141
QAction * m_actionMergePoints
Definition KoPathTool.h:139
QAction * m_actionBreakPoint
Definition KoPathTool.h:135
QAction * m_actionConvertToPath
Definition KoPathTool.h:140
void repaintDecorations() override
QAction * m_actionPathPointCorner
Definition KoPathTool.h:126
QAction * m_actionBreakSelection
Definition KoPathTool.h:137
KoCanvasBase * canvas() const
Returns the canvas the tool is working on.
void selectionChanged(bool hasSelection)
QAction * action(const QString &name) const

References KoToolBase::action(), connect(), m_actionAddPoint, m_actionBreakPoint, m_actionBreakSegment, m_actionBreakSelection, m_actionConvertToPath, m_actionCurvePoint, m_actionCurveSegment, m_actionJoinSegment, m_actionLinePoint, m_actionLineSegment, m_actionMergePoints, m_actionPathPointCorner, m_actionPathPointSmooth, m_actionPathPointSymmetric, m_actionRemovePoint, m_contextMenu, m_moveCursor, m_pointSelection, m_selectCursor, repaintDecorations(), and KoToolBase::selectionChanged().

◆ ~KoPathTool()

KoPathTool::~KoPathTool ( )
override

Definition at line 114 of file KoPathTool.cpp.

115{
116}

Member Function Documentation

◆ activate()

void KoPathTool::activate ( const QSet< KoShape * > & shapes)
overridevirtual

This method is called when this tool instance is activated. For any main window there is only one tool active at a time, which then gets all user input. Switching between tools will call deactivate on one and activate on the new tool allowing the tool to flush items (like a selection) when it is not in use.

Parameters
shapesthe set of shapes that are selected or suggested for editing by a selected shape for the tool to work on. Not all shapes will be meant for this tool.
See also
deactivate()

Reimplemented from KoToolBase.

Definition at line 861 of file KoPathTool.cpp.

862{
863 KoToolBase::activate(shapes);
864
865 Q_D(KoToolBase);
866
867 d->canvas->snapGuide()->reset();
868
870 m_canvasConnections.addConnection(d->canvas->selectedShapesProxy(), SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()));
871 m_canvasConnections.addConnection(d->canvas->selectedShapesProxy(), SIGNAL(selectionContentChanged()), this, SLOT(updateActions()));
872
873 m_canvasConnections.addConnection(d->canvas->selectedShapesProxy(), SIGNAL(selectionChanged()), this, SLOT(repaintDecorations()));
874 m_canvasConnections.addConnection(d->canvas->selectedShapesProxy(), SIGNAL(selectionContentChanged()), this, SLOT(repaintDecorations()));
876 initializeWithShapes(QList<KoShape*>(shapes.begin(), shapes.end()));
877 connect(m_actionCurvePoint, SIGNAL(triggered()), this, SLOT(pointToCurve()), Qt::UniqueConnection);
878 connect(m_actionLinePoint, SIGNAL(triggered()), this, SLOT(pointToLine()), Qt::UniqueConnection);
879 connect(m_actionLineSegment, SIGNAL(triggered()), this, SLOT(segmentToLine()), Qt::UniqueConnection);
880 connect(m_actionCurveSegment, SIGNAL(triggered()), this, SLOT(segmentToCurve()), Qt::UniqueConnection);
881 connect(m_actionAddPoint, SIGNAL(triggered()), this, SLOT(insertPoints()), Qt::UniqueConnection);
882 connect(m_actionRemovePoint, SIGNAL(triggered()), this, SLOT(removePoints()), Qt::UniqueConnection);
883 connect(m_actionBreakPoint, SIGNAL(triggered()), this, SLOT(breakAtPoint()), Qt::UniqueConnection);
884 connect(m_actionBreakSegment, SIGNAL(triggered()), this, SLOT(breakAtSegment()), Qt::UniqueConnection);
885 connect(m_actionBreakSelection, SIGNAL(triggered()), this, SLOT(breakAtSelection()), Qt::UniqueConnection);
886 connect(m_actionJoinSegment, SIGNAL(triggered()), this, SLOT(joinPoints()), Qt::UniqueConnection);
887 connect(m_actionMergePoints, SIGNAL(triggered()), this, SLOT(mergePoints()), Qt::UniqueConnection);
888 connect(m_actionConvertToPath, SIGNAL(triggered()), this, SLOT(convertToPath()), Qt::UniqueConnection);
889 connect(m_actionPathPointCorner, SIGNAL(triggered()), this, SLOT(pointTypeChangedCorner()), Qt::UniqueConnection);
890 connect(m_actionPathPointSmooth, SIGNAL(triggered()), this, SLOT(pointTypeChangedSmooth()), Qt::UniqueConnection);
891 connect(m_actionPathPointSymmetric, SIGNAL(triggered()), this, SLOT(pointTypeChangedSymmetric()), Qt::UniqueConnection);
892 connect(&m_pointSelection, SIGNAL(selectionChanged()), this, SLOT(pointSelectionChanged()), Qt::UniqueConnection);
893
894}
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
void updateActions()
void pointTypeChangedSmooth()
void breakAtSelection()
void segmentToCurve()
void breakAtPoint()
void pointToLine()
void convertToPath()
void joinPoints()
KisSignalAutoConnectionsStore m_canvasConnections
Definition KoPathTool.h:143
void pointSelectionChanged()
void segmentToLine()
void pointToCurve()
void pointTypeChangedCorner()
void slotSelectionChanged()
void breakAtSegment()
void pointTypeChangedSymmetric()
void removePoints()
void initializeWithShapes(const QList< KoShape * > shapes)
void mergePoints()
KoShapeFillResourceConnector m_shapeFillResourceConnector
Definition KoPathTool.h:144
void insertPoints()
void useCursor(const QCursor &cursor)
virtual void activate(const QSet< KoShape * > &shapes)

References KoToolBase::activate(), KisSignalAutoConnectionsStore::addConnection(), breakAtPoint(), breakAtSegment(), breakAtSelection(), connect(), KoShapeFillResourceConnector::connectToCanvas(), convertToPath(), initializeWithShapes(), insertPoints(), joinPoints(), m_actionAddPoint, m_actionBreakPoint, m_actionBreakSegment, m_actionBreakSelection, m_actionConvertToPath, m_actionCurvePoint, m_actionCurveSegment, m_actionJoinSegment, m_actionLinePoint, m_actionLineSegment, m_actionMergePoints, m_actionPathPointCorner, m_actionPathPointSmooth, m_actionPathPointSymmetric, m_actionRemovePoint, m_canvasConnections, m_pointSelection, m_selectCursor, m_shapeFillResourceConnector, mergePoints(), pointSelectionChanged(), pointToCurve(), pointToLine(), pointTypeChangedCorner(), pointTypeChangedSmooth(), pointTypeChangedSymmetric(), removePoints(), repaintDecorations(), segmentToCurve(), segmentToLine(), KoToolBase::selectionChanged(), slotSelectionChanged(), updateActions(), and KoToolBase::useCursor().

◆ breakAtPoint

void KoPathTool::breakAtPoint ( )
privateslot

Definition at line 403 of file KoPathTool.cpp.

404{
405 Q_D(KoToolBase);
408 }
409}
Command to break a subpath at points.
bool hasSelection() override
reimplemented from KoToolSelection
QList< KoPathPointData > selectedPointsData() const
Get the point data of all selected points.

References KoPathToolSelection::hasSelection(), m_pointSelection, and KoPathToolSelection::selectedPointsData().

◆ breakAtSegment

void KoPathTool::breakAtSegment ( )
privateslot

Definition at line 425 of file KoPathTool.cpp.

426{
427 Q_D(KoToolBase);
428 // only try to break a segment when 2 points of the same object are selected
429 if (m_pointSelection.objectCount() == 1 && m_pointSelection.size() == 2) {
431 if (segments.size() == 1) {
432 d->canvas->addCommand(new KoPathSegmentBreakCommand(segments.at(0)));
433 }
434 }
435}
The undo / redo command for breaking a subpath by removing the segment.
int objectCount() const
Get the number of path objects in the selection.
int size() const
Get the number of path points in the selection.
QList< KoPathPointData > selectedSegmentsData() const
Get the point data of all selected segments.

References m_pointSelection, KoPathToolSelection::objectCount(), KoPathToolSelection::selectedSegmentsData(), and KoPathToolSelection::size().

◆ breakAtSelection

void KoPathTool::breakAtSelection ( )
privateslot

◆ canvasResourceChanged

void KoPathTool::canvasResourceChanged ( int key,
const QVariant & res )
overrideslot

Definition at line 1095 of file KoPathTool.cpp.

1096{
1099 }
1100}
@ DecorationThickness
Integer, the thickness of single px decorations, will be adjusted by HiDPI settings....
@ HandleRadius
The handle radius used for drawing handles of any kind.

References KoCanvasResource::DecorationThickness, KoCanvasResource::HandleRadius, and repaintDecorations().

◆ clearActivePointSelectionReferences()

void KoPathTool::clearActivePointSelectionReferences ( )
private

Definition at line 916 of file KoPathTool.cpp.

917{
918 m_activeHandle.reset();
919 m_activeSegment.reset();
921}
void clear()
Clear the selection.
QScopedPointer< PathSegment > m_activeSegment
Definition KoPathTool.h:119
QScopedPointer< KoPathToolHandle > m_activeHandle
the currently active handle
Definition KoPathTool.h:117

References KoPathToolSelection::clear(), m_activeHandle, m_activeSegment, and m_pointSelection.

◆ convertToPath

void KoPathTool::convertToPath ( )
privateslot

Definition at line 284 of file KoPathTool.cpp.

285{
286 Q_D(KoToolBase);
287
289
290 QList<KoParameterShape*> parameterShapes;
291
292 Q_FOREACH (KoShape *shape, m_pointSelection.selectedShapes()) {
293 KoParameterShape * parametric = dynamic_cast<KoParameterShape*>(shape);
294 if (parametric && parametric->isParametricShape()) {
295 parameterShapes.append(parametric);
296 }
297 }
298
299 if (!parameterShapes.isEmpty()) {
300 d->canvas->addCommand(new KoParameterToPathCommand(parameterShapes));
301 }
302
303 QList<KoSvgTextShape*> textShapes;
304 Q_FOREACH (KoShape *shape, selection->selectedEditableShapes()) {
305 if (KoSvgTextShape *text = dynamic_cast<KoSvgTextShape*>(shape)) {
306 textShapes.append(text);
307 }
308 }
309
310 if (!textShapes.isEmpty()) {
311 KUndo2Command *cmd = new KUndo2Command(kundo2_i18n("Convert to Path")); // TODO: reuse the text from KoParameterToPathCommand
312 const QList<KoShape*> oldSelectedShapes = implicitCastList<KoShape*>(textShapes);
313
314
315 new KoKeepShapesSelectedCommand(oldSelectedShapes, {}, canvas()->selectedShapesProxy(),
317
318 QList<KoShape*> newSelectedShapes;
319 Q_FOREACH (KoSvgTextShape *shape, textShapes) {
320 KoShape *outlineShape = shape->textOutline();
321
322 KoShapeContainer *parent = shape->parent();
323 canvas()->shapeController()->addShapeDirect(outlineShape, parent, cmd);
324
325 newSelectedShapes << outlineShape;
326 }
327
328 canvas()->shapeController()->removeShapes(oldSelectedShapes, cmd);
329
330 new KoKeepShapesSelectedCommand({}, newSelectedShapes, canvas()->selectedShapesProxy(),
332
333 canvas()->addCommand(cmd);
334 }
335
337}
QPointer< KoShapeController > shapeController
virtual void addCommand(KUndo2Command *command)=0
virtual KoSelectedShapesProxy * selectedShapesProxy() const =0
selectedShapesProxy() is a special interface for keeping a persistent connections to selectionChanged...
bool isParametricShape() const
Check if object is a parametric shape.
The undo / redo command for changing a KoParameterShape into a KoPathShape.
QList< KoPathShape * > selectedShapes() const
Returns list of selected shapes.
void updateOptionsWidget()
KoToolSelection * selection() override
virtual KoSelection * selection()=0
KoShapeContainer * parent() const
Definition KoShape.cpp:1039
KoShape * textOutline() const
textOutline This turns the text object into non-text KoShape(s) to the best of its abilities.
KUndo2MagicString kundo2_i18n(const char *text)
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327

References KoCanvasBase::addCommand(), KoToolBase::canvas(), KisCommandUtils::FlipFlopCommand::FINALIZING, KisCommandUtils::FlipFlopCommand::INITIALIZING, KoParameterShape::isParametricShape(), kundo2_i18n(), m_pointSelection, KoShape::parent(), KoPathToolSelection::selectedShapes(), KoCanvasBase::selectedShapesProxy(), selection(), KoSelectedShapesProxy::selection(), KoCanvasBase::shapeController, KoSvgTextShape::textOutline(), and updateOptionsWidget().

◆ createOptionWidgets()

QList< QPointer< QWidget > > KoPathTool::createOptionWidgets ( )
overrideprotectedvirtual

reimplemented

Reimplemented from KoToolBase.

Definition at line 118 of file KoPathTool.cpp.

119{
121
122 PathToolOptionWidget * toolOptions = new PathToolOptionWidget(this);
123 connect(this, SIGNAL(typeChanged(int)), toolOptions, SLOT(setSelectionType(int)));
124 connect(this, SIGNAL(singleShapeChanged(KoPathShape*)), toolOptions, SLOT(setCurrentShape(KoPathShape*)));
125 connect(toolOptions, SIGNAL(sigRequestUpdateActions()), this, SLOT(updateActions()));
127 toolOptions->setWindowTitle(i18n("Edit Shape"));
128 list.append(toolOptions);
129
130 return list;
131}
The position of a path point within a path shape.
Definition KoPathShape.h:63
void singleShapeChanged(KoPathShape *path)
void typeChanged(int types)

References connect(), singleShapeChanged(), typeChanged(), updateActions(), and updateOptionsWidget().

◆ createPointToCurveCommand()

KUndo2Command * KoPathTool::createPointToCurveCommand ( const QList< KoPathPointData > & points)
private

Definition at line 243 of file KoPathTool.cpp.

244{
245 KUndo2Command *command = 0;
246 QList<KoPathPointData> pointToChange;
247
248 QList<KoPathPointData>::const_iterator it(points.constBegin());
249 for (; it != points.constEnd(); ++it) {
250 KoPathPoint *point = it->pathShape->pointByIndex(it->pointIndex);
251 if (point && (! point->activeControlPoint1() || ! point->activeControlPoint2()))
252 pointToChange.append(*it);
253 }
254
255 if (!pointToChange.isEmpty()) {
256 command = new KoPathPointTypeCommand(pointToChange, KoPathPointTypeCommand::Curve);
257 }
258
259 return command;
260}
The undo / redo command for changing the path point type.
A KoPathPoint represents a point in a path.
bool activeControlPoint1
bool activeControlPoint2

References KoPathPoint::activeControlPoint1, KoPathPoint::activeControlPoint2, and KoPathPointTypeCommand::Curve.

◆ deactivate()

void KoPathTool::deactivate ( )
overridevirtual

This method is called whenever this tool is no longer the active tool

See also
activate()

Reimplemented from KoToolBase.

Definition at line 1062 of file KoPathTool.cpp.

1063{
1064 Q_D(KoToolBase);
1065
1070 m_activeHandle.reset();
1071 m_activeSegment.reset();
1072 m_currentStrategy.reset();
1073 d->canvas->snapGuide()->reset();
1074
1075 disconnect(m_actionCurvePoint, 0, this, 0);
1076 disconnect(m_actionLinePoint, 0, this, 0);
1077 disconnect(m_actionLineSegment, 0, this, 0);
1078 disconnect(m_actionCurveSegment, 0, this, 0);
1079 disconnect(m_actionAddPoint, 0, this, 0);
1080 disconnect(m_actionRemovePoint, 0, this, 0);
1081 disconnect(m_actionBreakPoint, 0, this, 0);
1082 disconnect(m_actionBreakSegment, 0, this, 0);
1083 disconnect(m_actionBreakSelection, 0, this, 0);
1084 disconnect(m_actionJoinSegment, 0, this, 0);
1085 disconnect(m_actionMergePoints, 0, this, 0);
1086 disconnect(m_actionConvertToPath, 0, this, 0);
1087 disconnect(m_actionPathPointCorner, 0, this, 0);
1088 disconnect(m_actionPathPointSmooth, 0, this, 0);
1089 disconnect(m_actionPathPointSymmetric, 0, this, 0);
1090 disconnect(&m_pointSelection, 0, this, 0);
1091
1093}
void setSelectedShapes(const QList< KoPathShape * > shapes)
Sets list of selected shapes.
QScopedPointer< KoInteractionStrategy > m_currentStrategy
the rubber selection strategy
Definition KoPathTool.h:124
virtual void deactivate()

References KoPathToolSelection::clear(), KisSignalAutoConnectionsStore::clear(), KoToolBase::deactivate(), KoShapeFillResourceConnector::disconnect(), m_actionAddPoint, m_actionBreakPoint, m_actionBreakSegment, m_actionBreakSelection, m_actionConvertToPath, m_actionCurvePoint, m_actionCurveSegment, m_actionJoinSegment, m_actionLinePoint, m_actionLineSegment, m_actionMergePoints, m_actionPathPointCorner, m_actionPathPointSmooth, m_actionPathPointSymmetric, m_actionRemovePoint, m_activeHandle, m_activeSegment, m_canvasConnections, m_currentStrategy, m_pointSelection, m_shapeFillResourceConnector, and KoPathToolSelection::setSelectedShapes().

◆ decorationsRect()

QRectF KoPathTool::decorationsRect ( ) const
overridevirtual

Reimplemented from KoToolBase.

Definition at line 508 of file KoPathTool.cpp.

509{
511
512 QRectF newDecorationsRect;
513
514 Q_FOREACH (KoShape *shape, m_pointSelection.selectedShapes()) {
515 newDecorationsRect |= kisGrowRect(shape->boundingRect(), handleDocRadius());
516 }
517
518 Q_FOREACH(const KoPathPoint *point, m_pointSelection.selectedPoints()) {
519 newDecorationsRect |= kisGrowRect(point->boundingRect(false), handleDocRadius());
520 }
521
522 if (m_activeHandle) {
523 newDecorationsRect |= kisGrowRect(m_activeHandle->boundingRect(), handleDocRadius());
524 }
525
526 if (m_activeSegment) {
527 KoPathPointIndex index = m_activeSegment->path->pathPointIndex(m_activeSegment->segmentStart);
528 KoPathSegment segment = m_activeSegment->path->segmentByIndex(index);
529
530 QRectF rect = segment.boundingRect();
531 rect = m_activeSegment->path->shapeToDocument(rect);
532
533 newDecorationsRect |= kisGrowRect(rect, handleDocRadius());
534 }
535
536 return newDecorationsRect;
537}
QPair< int, int > KoPathPointIndex
Definition KoPathShape.h:28
QRectF boundingRect(bool active=true) const
Get the bounding rect of the point.
A KoPathSegment consist of two neighboring KoPathPoints.
QRectF boundingRect() const
Returns the axis aligned tight bounding rect.
Handle the selection of points.
const QSet< KoPathPoint * > & selectedPoints() const
Get all selected points.
virtual QRectF boundingRect() const
Get the bounding box of the shape.
Definition KoShape.cpp:335
qreal handleDocRadius() const
T kisGrowRect(const T &rect, U offset)
Definition kis_global.h:186
bool update(QSpinBox *spinBox)

References KoPathSegment::boundingRect(), KoShape::boundingRect(), KoPathPoint::boundingRect(), KoToolBase::handleDocRadius(), kisGrowRect(), m_activeHandle, m_activeSegment, m_pointSelection, KoPathToolSelection::selectedPoints(), and KoPathToolSelection::selectedShapes().

◆ deleteSelection()

void KoPathTool::deleteSelection ( )
overridevirtual

Delete the tools selection. The default implementation is empty to aid tools that don't have any selection.

See also
selection()

Reimplemented from KoToolBase.

Definition at line 1181 of file KoPathTool.cpp.

1182{
1183 removePoints();
1184}

References removePoints().

◆ deselect()

void KoPathTool::deselect ( )
overridevirtual

deselect the tool should clear the selection if it has one.

Reimplemented from KoToolBase.

Definition at line 1218 of file KoPathTool.cpp.

1219{
1222}
void clearActivePointSelectionReferences()

References clearActivePointSelectionReferences(), and repaintDecorations().

◆ explicitUserStrokeEndRequest()

void KoPathTool::explicitUserStrokeEndRequest ( )
overridevirtual

explicitUserStrokeEndRequest is called by the input manager when the user presses Enter key or any equivalent. This callback comes before requestStrokeEnd(), which comes from a different source.

Reimplemented from KoToolBase.

Definition at line 1206 of file KoPathTool.cpp.

1207{
1208 KoToolManager::instance()->switchToolRequested("InteractionTool");
1209}
void switchToolRequested(const QString &id)
static KoToolManager * instance()
Return the toolmanager singleton.

References KoToolManager::instance(), and KoToolManager::switchToolRequested().

◆ initializeWithShapes()

void KoPathTool::initializeWithShapes ( const QList< KoShape * > shapes)
private

Definition at line 923 of file KoPathTool.cpp.

924{
925 QList<KoPathShape*> selectedShapes;
926 Q_FOREACH (KoShape *shape, shapes) {
927 KoPathShape *pathShape = dynamic_cast<KoPathShape*>(shape);
928
929 if (pathShape && pathShape->isShapeEditable()) {
930 selectedShapes.append(pathShape);
931 }
932 }
933
934 if (selectedShapes != m_pointSelection.selectedShapes()) {
936 m_pointSelection.setSelectedShapes(selectedShapes);
938 }
939
942}
virtual bool isShapeEditable(bool recursive=true) const
checks recursively if the shape or one of its parents is not visible or locked
Definition KoShape.cpp:1165

References clearActivePointSelectionReferences(), KoShape::isShapeEditable(), m_pointSelection, repaintDecorations(), KoPathToolSelection::selectedShapes(), KoPathToolSelection::setSelectedShapes(), updateActions(), and updateOptionsWidget().

◆ insertPoints

void KoPathTool::insertPoints ( )
privateslot

Definition at line 173 of file KoPathTool.cpp.

174{
175 Q_D(KoToolBase);
177 if (segments.size() == 1) {
178 qreal positionInSegment = 0.5;
179 if (m_activeSegment && m_activeSegment->isValid()) {
180 positionInSegment = m_activeSegment->positionOnSegment;
181 }
182
183 KoPathPointInsertCommand *cmd = new KoPathPointInsertCommand(segments, positionInSegment);
184 d->canvas->addCommand(cmd);
185
186 // TODO: this construction is dangerous. The canvas can remove the command right after
187 // it has been added to it!
189 foreach (KoPathPoint * p, cmd->insertedPoints()) {
190 m_pointSelection.add(p, false);
191 }
192 }
193}
const Params2D p
The undo / redo command for inserting path points.
QList< KoPathPoint * > insertedPoints() const
Returns list of inserted points.
void add(KoPathPoint *point, bool clear)
Add a point to the selection.

References KoPathToolSelection::add(), KoPathToolSelection::clear(), KoPathPointInsertCommand::insertedPoints(), m_activeSegment, m_pointSelection, p, and KoPathToolSelection::selectedSegmentsData().

◆ joinPoints

void KoPathTool::joinPoints ( )
privateslot

Definition at line 393 of file KoPathTool.cpp.

394{
395 mergePointsImpl(true);
396}
void mergePointsImpl(bool doJoin)

References mergePointsImpl().

◆ keyPressEvent()

void KoPathTool::keyPressEvent ( QKeyEvent * event)
overridevirtual

Called when a key is pressed. Implementors should call event->ignore() if they do not actually use the event. Default implementation ignores this event.

Parameters
eventstate and reason of this key press

Reimplemented from KoToolBase.

Definition at line 731 of file KoPathTool.cpp.

732{
733 if (m_currentStrategy) {
734 switch (event->key()) {
735 case Qt::Key_Control:
736 case Qt::Key_Alt:
737 case Qt::Key_Shift:
738 case Qt::Key_Meta:
739 if (! event->isAutoRepeat()) {
740 m_currentStrategy->handleMouseMove(m_lastPoint, event->modifiers());
741 }
742 break;
743 case Qt::Key_Escape:
744 m_currentStrategy->cancelInteraction();
745 m_currentStrategy.reset();
746 break;
747 default:
748 event->ignore();
749 return;
750 }
751 } else {
752 switch (event->key()) {
753#ifndef NDEBUG
754// case Qt::Key_D:
755// if (m_pointSelection.objectCount() == 1) {
756// QList<KoPathPointData> selectedPoints = m_pointSelection.selectedPointsData();
757// KoPathShapePrivate *p = static_cast<KoPathShapePrivate*>(selectedPoints[0].pathShape->priv());
758// p->debugPath();
759// }
760// break;
761#endif
762 default:
763 event->ignore();
764 return;
765 }
766 }
767 event->accept();
768}
QPointF m_lastPoint
needed for interaction strategy
Definition KoPathTool.h:118

References m_currentStrategy, and m_lastPoint.

◆ keyReleaseEvent()

void KoPathTool::keyReleaseEvent ( QKeyEvent * event)
overridevirtual

Called when a key is released Implementors should call event->ignore() if they do not actually use the event. Default implementation ignores this event.

Parameters
eventstate and reason of this key release

Reimplemented from KoToolBase.

Definition at line 770 of file KoPathTool.cpp.

771{
772 if (m_currentStrategy) {
773 switch (event->key()) {
774 case Qt::Key_Control:
775 case Qt::Key_Alt:
776 case Qt::Key_Shift:
777 case Qt::Key_Meta:
778 if (! event->isAutoRepeat()) {
779 m_currentStrategy->handleMouseMove(m_lastPoint, Qt::NoModifier);
780 }
781 break;
782 default:
783 break;
784 }
785 }
786 event->accept();
787}

References m_currentStrategy, and m_lastPoint.

◆ mergePoints

void KoPathTool::mergePoints ( )
privateslot

Definition at line 398 of file KoPathTool.cpp.

399{
400 mergePointsImpl(false);
401}

References mergePointsImpl().

◆ mergePointsImpl()

void KoPathTool::mergePointsImpl ( bool doJoin)
private

Definition at line 364 of file KoPathTool.cpp.

365{
366 Q_D(KoToolBase);
367
368 if (m_pointSelection.size() != 2)
369 return;
370
372 if (pointData.size() != 2) return;
373
374 const KoPathPointData & pd1 = pointData.at(0);
375 const KoPathPointData & pd2 = pointData.at(1);
376
377 if (!checkCanJoinToPoints(pd1, pd2)) {
378 return;
379 }
380
382
383 KUndo2Command *cmd = 0;
384
385 if (doJoin) {
386 cmd = new KoMultiPathPointJoinCommand(pd1, pd2, d->canvas->shapeController()->documentBase(), d->canvas->shapeManager()->selection());
387 } else {
388 cmd = new KoMultiPathPointMergeCommand(pd1, pd2, d->canvas->shapeController()->documentBase(), d->canvas->shapeManager()->selection());
389 }
390 d->canvas->addCommand(cmd);
391}
Describe a KoPathPoint by a KoPathShape and its indices.

References clearActivePointSelectionReferences(), m_pointSelection, KoPathToolSelection::selectedPointsData(), and KoPathToolSelection::size().

◆ mouseDoubleClickEvent()

void KoPathTool::mouseDoubleClickEvent ( KoPointerEvent * event)
overridevirtual

Called when (one of) the mouse or stylus buttons is double clicked. Implementors should call event->ignore() if they do not actually use the event. Default implementation ignores this event.

Parameters
eventstate and reason of this mouse or stylus press

Reimplemented from KoToolBase.

Definition at line 789 of file KoPathTool.cpp.

790{
791 Q_D(KoToolBase);
792 // check if we are doing something else at the moment
793 if (m_currentStrategy) return;
794
795 if (!m_activeHandle && m_activeSegment && m_activeSegment->isValid()) {
796 QList<KoPathPointData> segments;
797 segments.append(
799 m_activeSegment->path->pathPointIndex(m_activeSegment->segmentStart)));
800
801 KoPathPointInsertCommand *cmd = new KoPathPointInsertCommand(segments, m_activeSegment->positionOnSegment);
802 d->canvas->addCommand(cmd);
803
805 foreach (KoPathPoint * p, cmd->insertedPoints()) {
806 m_pointSelection.add(p, false);
807 }
809 } else if (!m_activeHandle && !m_activeSegment) {
811 }
812}
void explicitUserStrokeEndRequest() override
explicitUserStrokeEndRequest is called by the input manager when the user presses Enter key or any eq...

References KoPathToolSelection::add(), KoPathToolSelection::clear(), explicitUserStrokeEndRequest(), KoPathPointInsertCommand::insertedPoints(), m_activeHandle, m_activeSegment, m_currentStrategy, m_pointSelection, p, and updateActions().

◆ mouseMoveEvent()

void KoPathTool::mouseMoveEvent ( KoPointerEvent * event)
overridevirtual

Called when the mouse or stylus moved over the canvas. Implementors should call event->ignore() if they do not actually use the event.

Parameters
eventstate and reason of this mouse or stylus move

Implements KoToolBase.

Definition at line 587 of file KoPathTool.cpp.

588{
589 if (event->button() & Qt::RightButton)
590 return;
591
592 if (m_currentStrategy) {
593 m_lastPoint = event->point;
594 m_currentStrategy->handleMouseMove(event->point, event->modifiers());
595
597
598 return;
599 }
600
601 if (m_activeSegment) {
602 m_activeSegment.reset();
604 }
605
606 Q_FOREACH (KoPathShape *shape, m_pointSelection.selectedShapes()) {
607 QRectF roi = shape->documentToShape(handleGrabRect(event->point));
608 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
609 if (parameterShape && parameterShape->isParametricShape()) {
610 int handleId = parameterShape->handleIdAt(roi);
611 if (handleId != -1) {
613 Q_EMIT statusTextChanged(i18n("Drag to move handle."));
614
615 m_activeHandle.reset(new ParameterHandle(this, parameterShape, handleId));
617 return;
618 }
619 } else {
620 QList<KoPathPoint*> points = shape->pointsAt(roi, true);
621 if (! points.empty()) {
622 // find the nearest control point from all points within the roi
623 KoPathPoint * bestPoint = 0;
625 qreal minDistance = HUGE_VAL;
626 Q_FOREACH (KoPathPoint *p, points) {
627 // the node point must be hit if the point is not selected yet
628 if (! m_pointSelection.contains(p) && ! roi.contains(p->point()))
629 continue;
630
631 // check for the control points first as otherwise it is no longer
632 // possible to change the control points when they are the same as the point
633 if (p->activeControlPoint1() && roi.contains(p->controlPoint1())) {
634 qreal dist = squaredDistance(roi.center(), p->controlPoint1());
635 if (dist < minDistance) {
636 bestPoint = p;
637 bestPointType = KoPathPoint::ControlPoint1;
638 minDistance = dist;
639 }
640 }
641
642 if (p->activeControlPoint2() && roi.contains(p->controlPoint2())) {
643 qreal dist = squaredDistance(roi.center(), p->controlPoint2());
644 if (dist < minDistance) {
645 bestPoint = p;
646 bestPointType = KoPathPoint::ControlPoint2;
647 minDistance = dist;
648 }
649 }
650
651 // check the node point at last
652 qreal dist = squaredDistance(roi.center(), p->point());
653 if (dist < minDistance) {
654 bestPoint = p;
655 bestPointType = KoPathPoint::Node;
656 minDistance = dist;
657 }
658 }
659
660 if (! bestPoint) {
662 return;
663 }
664
666 if (bestPointType == KoPathPoint::Node)
667 Q_EMIT statusTextChanged(i18n("Drag to move point. Shift click to change point type."));
668 else
669 Q_EMIT statusTextChanged(i18n("Drag to move control point."));
670
671 PointHandle *prev = dynamic_cast<PointHandle*>(m_activeHandle.data());
672 if (prev && prev->activePoint() == bestPoint && prev->activePointType() == bestPointType)
673 return; // no change;
674
675 m_activeHandle.reset(new PointHandle(this, bestPoint, bestPointType));
677 return;
678 }
679 }
680 }
681
683
684 if (m_activeHandle) {
685 m_activeHandle.reset();
687 }
688
689 PathSegment *hoveredSegment = segmentAtPoint(event->point);
690 if(hoveredSegment) {
691 useCursor(Qt::PointingHandCursor);
692 Q_EMIT statusTextChanged(i18n("Drag to change curve directly. Double click to insert new path point."));
693 m_activeSegment.reset(hoveredSegment);
695 } else {
696 uint selectedPointCount = m_pointSelection.size();
697 if (selectedPointCount == 0)
698 Q_EMIT statusTextChanged(QString());
699 else {
700 if (!m_actionBreakSelection->shortcut().isEmpty()) {
701 if (selectedPointCount == 1)
702 Q_EMIT statusTextChanged(i18nc("%1 is a shortcut to be pressed", "Press %1 to break path at selected point.", m_actionBreakSelection->shortcut().toString()));
703 else
704 Q_EMIT statusTextChanged(i18nc("%1 is a shortcut to be pressed", "Press %1 to break path at selected segments.", m_actionBreakSelection->shortcut().toString()));
705 } else {
706 Q_EMIT statusTextChanged(QString());
707 }
708 }
709 }
710}
unsigned int uint
qreal squaredDistance(const QPointF &p1, const QPointF &p2)
int handleIdAt(const QRectF &rect) const
Get the id of the handle within the given rect.
PointType
the type for identifying part of a KoPathPoint
Definition KoPathPoint.h:47
@ ControlPoint2
the second control point
Definition KoPathPoint.h:51
@ ControlPoint1
the first control point
Definition KoPathPoint.h:50
@ Node
the node point
Definition KoPathPoint.h:49
QList< KoPathPoint * > pointsAt(const QRectF &rect, const bool useControlPoints=false) const
Returns the path points within the given rectangle.
bool contains(KoPathPoint *point)
Check if a point is in the selection.
PathSegment * segmentAtPoint(const QPointF &point)
Qt::MouseButton button() const
return button pressed (see QMouseEvent::button());
Qt::KeyboardModifiers modifiers() const
QPointF point
The point in document coordinates.
QPointF documentToShape(const QPointF &point) const
Transforms point from document coordinates to shape coordinates.
Definition KoShape.cpp:1211
void statusTextChanged(const QString &statusText)
QRectF handleGrabRect(const QPointF &position) const
KoPathPoint * activePoint() const
KoPathPoint::PointType activePointType() const

References PointHandle::activePoint(), PointHandle::activePointType(), KoPointerEvent::button(), KoPathToolSelection::contains(), KoPathPoint::ControlPoint1, KoPathPoint::ControlPoint2, KoShape::documentToShape(), KoToolBase::handleGrabRect(), KoParameterShape::handleIdAt(), KoParameterShape::isParametricShape(), m_actionBreakSelection, m_activeHandle, m_activeSegment, m_currentStrategy, m_lastPoint, m_moveCursor, m_pointSelection, m_selectCursor, KoPointerEvent::modifiers(), KoPathPoint::Node, p, KoPointerEvent::point, KoPathShape::pointsAt(), repaintDecorations(), segmentAtPoint(), KoPathToolSelection::selectedShapes(), KoPathToolSelection::size(), squaredDistance(), KoToolBase::statusTextChanged(), and KoToolBase::useCursor().

◆ mousePressEvent()

void KoPathTool::mousePressEvent ( KoPointerEvent * event)
overridevirtual

Called when (one of) the mouse or stylus buttons is pressed. Implementors should call event->ignore() if they do not actually use the event.

Parameters
eventstate and reason of this mouse or stylus press

Implements KoToolBase.

Definition at line 545 of file KoPathTool.cpp.

546{
547 // we are moving if we hit a point and use the left mouse button
548 if (m_activeHandle) {
549 m_currentStrategy.reset(m_activeHandle->handleMousePress(event));
550 } else {
551 if (event->button() & Qt::LeftButton) {
552
553 // check if we hit a path segment
554 if (m_activeSegment && m_activeSegment->isValid()) {
555
556 KoPathShape *shape = m_activeSegment->path;
557 KoPathPointIndex index = shape->pathPointIndex(m_activeSegment->segmentStart);
558 KoPathSegment segment = shape->segmentByIndex(index);
559
560 m_pointSelection.add(segment.first(), !(event->modifiers() & Qt::ShiftModifier));
561 m_pointSelection.add(segment.second(), false);
562
563 KoPathPointData data(shape, index);
564 m_currentStrategy.reset(new KoPathSegmentChangeStrategy(this, event->point, data, m_activeSegment->positionOnSegment));
565 } else {
566
567 KoShapeManager *shapeManager = canvas()->shapeManager();
568 KoSelection *selection = shapeManager->selection();
569 KoShape *shape = shapeManager->shapeAt(event->point, KoFlake::ShapeOnTop);
570
571 if (shape && !selection->isSelected(shape)) {
572
573 if (!(event->modifiers() & Qt::ShiftModifier)) {
574 selection->deselectAll();
575 }
576
577 selection->select(shape);
578 } else {
581 }
582 }
583 }
584 }
585}
virtual KoShapeManager * shapeManager() const =0
Strategy to rubber select points of a path shape.
Strategy for deforming a segment of a path shape.
KoPathPoint * first
KoPathPoint * second
KoPathSegment segmentByIndex(const KoPathPointIndex &pointIndex) const
Returns the segment specified by a path point index.
KoPathPointIndex pathPointIndex(const KoPathPoint *point) const
Returns the path point index of a given path point.
KoShape * shapeAt(const QPointF &position, KoFlake::ShapeSelection selection=KoFlake::ShapeOnTop, bool omitHiddenShapes=true)
KoSelection * selection
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
@ ShapeOnTop
return the shape highest z-ordering, regardless of selection.
Definition KoFlake.h:74

References KoPathToolSelection::add(), KoPointerEvent::button(), KoToolBase::canvas(), KoPathSegment::first, KIS_ASSERT_RECOVER_RETURN, m_activeHandle, m_activeSegment, m_currentStrategy, m_pointSelection, KoPointerEvent::modifiers(), KoPathShape::pathPointIndex(), KoPointerEvent::point, KoPathSegment::second, KoPathShape::segmentByIndex(), KoShapeManager::selection, selection(), KoShapeManager::shapeAt(), KoCanvasBase::shapeManager(), and KoFlake::ShapeOnTop.

◆ mouseReleaseEvent()

void KoPathTool::mouseReleaseEvent ( KoPointerEvent * event)
overridevirtual

Called when (one of) the mouse or stylus buttons is released. Implementors should call event->ignore() if they do not actually use the event.

Parameters
eventstate and reason of this mouse or stylus release

Implements KoToolBase.

Definition at line 712 of file KoPathTool.cpp.

713{
714 Q_D(KoToolBase);
715 if (m_currentStrategy) {
716 const bool hadNoSelection = !m_pointSelection.hasSelection();
717 m_currentStrategy->finishInteraction(event->modifiers());
718 KUndo2Command *command = m_currentStrategy->createCommand();
719 if (command)
720 d->canvas->addCommand(command);
721 if (hadNoSelection && dynamic_cast<KoPathPointRubberSelectStrategy*>(m_currentStrategy.data())
723 // the click didn't do anything at all. Allow it to be used by others.
724 event->ignore();
725 }
726 m_currentStrategy.reset();
728 }
729}

References KoPathToolSelection::hasSelection(), m_currentStrategy, m_pointSelection, KoPointerEvent::modifiers(), and repaintDecorations().

◆ notifyPathPointsChanged()

void KoPathTool::notifyPathPointsChanged ( KoPathShape * shape)

Definition at line 905 of file KoPathTool.cpp.

906{
907 Q_UNUSED(shape);
908
909 // active handle and selection might have already become invalid, so just
910 // delete them without dereferencing anything...
911
912 m_activeHandle.reset();
913 m_activeSegment.reset();
914}

References m_activeHandle, and m_activeSegment.

◆ paint()

void KoPathTool::paint ( QPainter & painter,
const KoViewConverter & converter )
overridevirtual

Called by the canvas to paint any decorations that the tool deems needed. The painter has the top left of the canvas as its origin.

Parameters
painterused for painting the shape
converterto convert between internal and view coordinates.

Implements KoToolBase.

Definition at line 437 of file KoPathTool.cpp.

438{
439 Q_D(KoToolBase);
440
441 Q_FOREACH (KoPathShape *shape, m_pointSelection.selectedShapes()) {
445
446 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
447 if (parameterShape && parameterShape->isParametricShape()) {
448 parameterShape->paintHandles(helper);
449 } else {
450 shape->paintPoints(helper);
451 }
452
453 if (!shape->stroke() || !shape->stroke()->isVisible()) {
455 helper.drawPath(shape->outline());
456 }
457 }
458
459 if (m_currentStrategy) {
460 painter.save();
461 m_currentStrategy->paint(painter, converter);
462 painter.restore();
463 }
464
465 m_pointSelection.paint(painter, converter, handleRadius());
466
467 if (m_activeHandle) {
469 m_activeHandle->paint(painter, converter, handleRadius(), decorationThickness());
470 } else {
471 m_activeHandle.reset();
472 }
473 } else if (m_activeSegment && m_activeSegment->isValid()) {
474
475 KoPathShape *shape = m_activeSegment->path;
476
477 // if the stroke is invisible, then we already painted the outline of the shape!
478 if (shape->stroke() && shape->stroke()->isVisible()) {
479 KoPathPointIndex index = shape->pathPointIndex(m_activeSegment->segmentStart);
480 KoPathSegment segment = shape->segmentByIndex(index).toCubic();
481
483
487
488 QPainterPath path;
489 path.moveTo(segment.first()->point());
490 path.cubicTo(segment.first()->controlPoint2(),
491 segment.second()->controlPoint1(),
492 segment.second()->point());
493
494 helper.drawPath(path);
495 }
496 }
497
498
499
500 if (m_currentStrategy) {
501 painter.save();
502 painter.setTransform(converter.documentToView(), true);
503 d->canvas->snapGuide()->paint(painter, converter);
504 painter.restore();
505 }
506}
The KisHandlePainterHelper class is a special helper for painting handles around objects....
void drawPath(const QPainterPath &path)
void setHandleStyle(const KisHandleStyle &style)
static KisHandleStyle & secondarySelection()
static KisHandleStyle & primarySelection()
void paintHandles(KisHandlePainterHelper &handlesHelper)
Paint the handles.
QPointF point
QPointF controlPoint1
QPointF controlPoint2
bool isValid() const
Returns if segment is valid, e.g. has two valid points.
KoPathSegment toCubic() const
Returns cubic bezier curve segment of this segment.
QPainterPath outline() const override
reimplemented
virtual void paintPoints(KisHandlePainterHelper &handlesHelper)
void paint(QPainter &painter, const KoViewConverter &converter, qreal handleRadius)
Draw the selected points.
virtual KoShapeStrokeModelSP stroke() const
Definition KoShape.cpp:1067
static KisHandlePainterHelper createHandlePainterHelperView(QPainter *painter, KoShape *shape, const KoViewConverter &converter, qreal handleRadius=0.0, int decorationThickness=1)
Definition KoShape.cpp:1177
int handleRadius() const
Convenience function to get the current handle radius.
int decorationThickness() const
decorationThickness The minimum thickness for tool decoration lines, this is derived from the screen ...
virtual QPointF documentToView(const QPointF &documentPoint) const
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References KoPathPoint::controlPoint1, KoPathPoint::controlPoint2, KoShape::createHandlePainterHelperView(), KoToolBase::decorationThickness(), KoViewConverter::documentToView(), KisHandlePainterHelper::drawPath(), KoPathSegment::first, KoToolBase::handleRadius(), KoParameterShape::isParametricShape(), KoPathSegment::isValid(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_activeHandle, m_activeSegment, m_currentStrategy, m_pointSelection, KoPathShape::outline(), KoPathToolSelection::paint(), KoParameterShape::paintHandles(), KoPathShape::paintPoints(), KoPathShape::pathPointIndex(), KoPathPoint::point, KisHandleStyle::primarySelection(), KoPathSegment::second, KisHandleStyle::secondarySelection(), KoPathShape::segmentByIndex(), KoPathToolSelection::selectedShapes(), KisHandlePainterHelper::setHandleStyle(), KoShape::stroke(), and KoPathSegment::toCubic().

◆ pointSelectionChanged

void KoPathTool::pointSelectionChanged ( )
privateslot

◆ pointToCurve

void KoPathTool::pointToCurve ( )
privateslot

Definition at line 229 of file KoPathTool.cpp.

230{
231 Q_D(KoToolBase);
234
235 KUndo2Command *command = createPointToCurveCommand(selectedPoints);
236
237 if (command) {
238 d->canvas->addCommand(command);
239 }
240 }
241}
KUndo2Command * createPointToCurveCommand(const QList< KoPathPointData > &points)

References createPointToCurveCommand(), KoPathToolSelection::hasSelection(), m_pointSelection, and KoPathToolSelection::selectedPointsData().

◆ pointToLine

void KoPathTool::pointToLine ( )
privateslot

Definition at line 209 of file KoPathTool.cpp.

210{
211 Q_D(KoToolBase);
214 QList<KoPathPointData> pointToChange;
215
216 QList<KoPathPointData>::const_iterator it(selectedPoints.constBegin());
217 for (; it != selectedPoints.constEnd(); ++it) {
218 KoPathPoint *point = it->pathShape->pointByIndex(it->pointIndex);
219 if (point && (point->activeControlPoint1() || point->activeControlPoint2()))
220 pointToChange.append(*it);
221 }
222
223 if (! pointToChange.isEmpty()) {
224 d->canvas->addCommand(new KoPathPointTypeCommand(pointToChange, KoPathPointTypeCommand::Line));
225 }
226 }
227}

References KoPathPoint::activeControlPoint1, KoPathPoint::activeControlPoint2, KoPathToolSelection::hasSelection(), KoPathPointTypeCommand::Line, m_pointSelection, and KoPathToolSelection::selectedPointsData().

◆ pointTypeChanged

void KoPathTool::pointTypeChanged ( KoPathPointTypeCommand::PointType type)
privateslot

Definition at line 143 of file KoPathTool.cpp.

144{
145 Q_D(KoToolBase);
148
149 KUndo2Command *initialConversionCommand = createPointToCurveCommand(selectedPoints);
150
151 // conversion should happen before the c-tor
152 // of KoPathPointTypeCommand is executed!
153 if (initialConversionCommand) {
154 initialConversionCommand->redo();
155 }
156
157 KUndo2Command *command =
158 new KoPathPointTypeCommand(selectedPoints, type);
159
160 if (initialConversionCommand) {
161 using namespace KisCommandUtils;
163 parent->setText(command->text());
164 parent->addCommand(new SkipFirstRedoWrapper(initialConversionCommand));
165 parent->addCommand(command);
166 command = parent;
167 }
168
169 d->canvas->addCommand(command);
170 }
171}
KUndo2MagicString text() const
virtual void redo()

References createPointToCurveCommand(), KoPathToolSelection::hasSelection(), m_pointSelection, KUndo2Command::redo(), KoPathToolSelection::selectedPointsData(), and KUndo2Command::text().

◆ pointTypeChangedCorner

void KoPathTool::pointTypeChangedCorner ( )
privateslot

Definition at line 133 of file KoPathTool.cpp.

133 {
135}
void pointTypeChanged(KoPathPointTypeCommand::PointType type)

References KoPathPointTypeCommand::Corner, and pointTypeChanged().

◆ pointTypeChangedSmooth

void KoPathTool::pointTypeChangedSmooth ( )
privateslot

◆ pointTypeChangedSymmetric

void KoPathTool::pointTypeChangedSymmetric ( )
privateslot

◆ popupActionsMenu()

QMenu * KoPathTool::popupActionsMenu ( )
overridevirtual
Returns
a menu with context-aware actions for the current selection. If the returned value is null, no context menu is shown.

Reimplemented from KoToolBase.

Definition at line 1131 of file KoPathTool.cpp.

1132{
1133 if (m_activeHandle) {
1134 m_activeHandle->trySelectHandle();
1135 }
1136
1137 if (m_activeSegment && m_activeSegment->isValid()) {
1138 KoPathShape *shape = m_activeSegment->path;
1139 KoPathSegment segment = shape->segmentByIndex(shape->pathPointIndex(m_activeSegment->segmentStart));
1140
1141 m_pointSelection.add(segment.first(), true);
1142 m_pointSelection.add(segment.second(), false);
1143 }
1144
1145 if (m_contextMenu) {
1146 m_contextMenu->clear();
1147
1148 addActionsGroupIfEnabled(m_contextMenu.data(),
1152
1153 addActionsGroupIfEnabled(m_contextMenu.data(),
1156
1157 addActionsGroupIfEnabled(m_contextMenu.data(),
1160
1161 addActionsGroupIfEnabled(m_contextMenu.data(),
1164
1165 addActionsGroupIfEnabled(m_contextMenu.data(),
1168
1169 addActionsGroupIfEnabled(m_contextMenu.data(),
1172
1174
1175 m_contextMenu->addSeparator();
1176 }
1177
1178 return m_contextMenu.data();
1179}

References KoPathToolSelection::add(), KoPathSegment::first, m_actionAddPoint, m_actionBreakPoint, m_actionBreakSegment, m_actionConvertToPath, m_actionCurvePoint, m_actionCurveSegment, m_actionJoinSegment, m_actionLinePoint, m_actionLineSegment, m_actionMergePoints, m_actionPathPointCorner, m_actionPathPointSmooth, m_actionPathPointSymmetric, m_actionRemovePoint, m_activeHandle, m_activeSegment, m_contextMenu, m_pointSelection, KoPathShape::pathPointIndex(), KoPathSegment::second, and KoPathShape::segmentByIndex().

◆ removePoints

void KoPathTool::removePoints ( )
privateslot

Definition at line 195 of file KoPathTool.cpp.

196{
197 Q_D(KoToolBase);
198 if (m_pointSelection.size() > 0) {
200 PointHandle *pointHandle = dynamic_cast<PointHandle*>(m_activeHandle.data());
201 if (pointHandle && m_pointSelection.contains(pointHandle->activePoint())) {
202 m_activeHandle.reset();
203 }
205 d->canvas->addCommand(cmd);
206 }
207}
static KUndo2Command * createCommand(const QList< KoPathPointData > &pointDataList, KoShapeController *shapeController, KUndo2Command *parent=0)
Create command for removing points from path shapes.

References PointHandle::activePoint(), clearActivePointSelectionReferences(), KoPathToolSelection::contains(), KoPathPointRemoveCommand::createCommand(), m_activeHandle, m_pointSelection, KoPathToolSelection::selectedPointsData(), and KoPathToolSelection::size().

◆ repaintDecorations()

void KoPathTool::repaintDecorations ( )
overridevirtual

request a repaint of the decorations to be made. This triggers an update call on the canvas, but does not paint directly.

Reimplemented from KoToolBase.

Definition at line 539 of file KoPathTool.cpp.

540{
543}
virtual void repaintDecorations()

References KoToolBase::repaintDecorations(), and updateOptionsWidget().

◆ requestStrokeCancellation()

void KoPathTool::requestStrokeCancellation ( )
overridevirtual

Called when the user requested the cancellation of the current stroke. If you tool supports cancelling, override this method and do the needed work there

Reimplemented from KoToolBase.

Definition at line 1196 of file KoPathTool.cpp.

1197{
1199}

References explicitUserStrokeEndRequest().

◆ requestStrokeEnd()

void KoPathTool::requestStrokeEnd ( )
overridevirtual

Called when the image decided that the stroke should better be ended. If you tool supports long strokes, override this method and do the needed work there

Reimplemented from KoToolBase.

Definition at line 1201 of file KoPathTool.cpp.

1202{
1203 // noop!
1204}

◆ requestUndoDuringStroke()

void KoPathTool::requestUndoDuringStroke ( )
overridevirtual

Called when the user requested undo while the stroke is active. If you tool supports undo of the part of its actions, override this method and do the needed work there.

NOTE: Default implementation forwards this request to requestStrokeCancellation() method, so that the stroke would be cancelled.

Default implementation just cancels the stroke

Reimplemented from KoToolBase.

Definition at line 1191 of file KoPathTool.cpp.

1192{
1193 // noop!
1194}

◆ segmentAtPoint()

KoPathTool::PathSegment * KoPathTool::segmentAtPoint ( const QPointF & point)
private

Definition at line 814 of file KoPathTool.cpp.

815{
816 // the max allowed distance from a segment
817 const QRectF grabRoi = handleGrabRect(point);
818 const qreal distanceThreshold = 0.5 * KisAlgebra2D::maxDimension(grabRoi);
819
820 QScopedPointer<PathSegment> segment(new PathSegment);
821
822 Q_FOREACH (KoPathShape *shape, m_pointSelection.selectedShapes()) {
823 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
824 if (parameterShape && parameterShape->isParametricShape())
825 continue;
826
827 // convert document point to shape coordinates
828 const QPointF p = shape->documentToShape(point);
829 // our region of interest, i.e. a region around our mouse position
830 const QRectF roi = shape->documentToShape(grabRoi);
831
832 qreal minDistance = std::numeric_limits<qreal>::max();
833
834 // check all segments of this shape which intersect the region of interest
835 const QList<KoPathSegment> segments = shape->segmentsAt(roi);
836
837 foreach (const KoPathSegment &s, segments) {
838 const qreal nearestPointParam = s.nearestPoint(p);
839 const QPointF nearestPoint = s.pointAt(nearestPointParam);
840 const qreal distance = kisDistance(p, nearestPoint);
841
842 // are we within the allowed distance ?
843 if (distance > distanceThreshold)
844 continue;
845 // are we closer to the last closest point ?
846 if (distance < minDistance) {
847 segment->path = shape;
848 segment->segmentStart = s.first();
849 segment->positionOnSegment = nearestPointParam;
850 }
851 }
852 }
853
854 if (!segment->isValid()) {
855 segment.reset();
856 }
857
858 return segment.take();
859}
qreal distance(const QPointF &p1, const QPointF &p2)
QPointF pointAt(qreal t) const
Returns point at given t.
qreal nearestPoint(const QPointF &point) const
QList< KoPathSegment > segmentsAt(const QRectF &rect) const
Returns the list of path segments within the given rectangle.
qreal kisDistance(const QPointF &pt1, const QPointF &pt2)
Definition kis_global.h:190
auto maxDimension(Size size) -> decltype(size.width())
qreal nearestPoint(const QList< QPointF > controlPoints, const QPointF &point, qreal *resultDistance, QPointF *resultPoint)

References distance(), KoShape::documentToShape(), KoPathSegment::first, KoToolBase::handleGrabRect(), KoParameterShape::isParametricShape(), kisDistance(), m_pointSelection, KisAlgebra2D::maxDimension(), KoPathSegment::nearestPoint(), p, KoPathSegment::pointAt(), KoPathShape::segmentsAt(), and KoPathToolSelection::selectedShapes().

◆ segmentToCurve

void KoPathTool::segmentToCurve ( )
privateslot

Definition at line 273 of file KoPathTool.cpp.

274{
275 Q_D(KoToolBase);
276 if (m_pointSelection.size() > 1) {
278 if (segments.size() > 0) {
279 d->canvas->addCommand(new KoPathSegmentTypeCommand(segments, KoPathSegmentTypeCommand::Curve));
280 }
281 }
282}
The undo / redo command for changing segments to curves/lines.

References KoPathSegmentTypeCommand::Curve, m_pointSelection, KoPathToolSelection::selectedSegmentsData(), and KoPathToolSelection::size().

◆ segmentToLine

void KoPathTool::segmentToLine ( )
privateslot

◆ selectAll()

bool KoPathTool::selectAll ( )
overridevirtual

selectAll select all data the tool can select.

Returns
true if something happened, false if nothing happened.

Reimplemented from KoToolBase.

Definition at line 1211 of file KoPathTool.cpp.

1212{
1215 return true;
1216}

References m_pointSelection, repaintDecorations(), and KoPathToolSelection::selectAll().

◆ selection()

KoToolSelection * KoPathTool::selection ( )
overridevirtual

Returns the internal selection object of this tool. Each tool can have a selection which is private to that tool and the specified shape that it comes with. The default returns 0.

Reimplemented from KoToolBase.

Definition at line 1186 of file KoPathTool.cpp.

1187{
1188 return &m_pointSelection;
1189}

References m_pointSelection.

◆ singleShapeChanged

void KoPathTool::singleShapeChanged ( KoPathShape * path)
signal

◆ slotSelectionChanged

void KoPathTool::slotSelectionChanged ( )
privateslot

Definition at line 896 of file KoPathTool.cpp.

897{
898 Q_D(KoToolBase);
899 QList<KoShape*> shapes =
900 d->canvas->selectedShapesProxy()->selection()->selectedEditableShapesAndDelegates();
901
902 initializeWithShapes(shapes);
903}

References initializeWithShapes().

◆ typeChanged

void KoPathTool::typeChanged ( int types)
signal

◆ updateActions

void KoPathTool::updateActions ( )
privateslot

Definition at line 958 of file KoPathTool.cpp.

959{
961
962 bool canBreakAtPoint = false;
963
964 bool hasNonSmoothPoints = false;
965 bool hasNonSymmetricPoints = false;
966 bool hasNonSplitPoints = false;
967
968 bool hasNonLinePoints = false;
969 bool hasNonCurvePoints = false;
970
971 bool canJoinSubpaths = false;
972
973 if (!pointData.isEmpty()) {
974 Q_FOREACH (const KoPathPointData &pd, pointData) {
975 const int subpathIndex = pd.pointIndex.first;
976 const int pointIndex = pd.pointIndex.second;
977
978 canBreakAtPoint |= pd.pathShape->isClosedSubpath(subpathIndex) ||
979 (pointIndex > 0 && pointIndex < pd.pathShape->subpathPointCount(subpathIndex) - 1);
980
982
983 hasNonSmoothPoints |= !(point->properties() & KoPathPoint::IsSmooth);
984 hasNonSymmetricPoints |= !(point->properties() & KoPathPoint::IsSymmetric);
985 hasNonSplitPoints |=
988
989 hasNonLinePoints |= point->activeControlPoint1() || point->activeControlPoint2();
990 hasNonCurvePoints |= !point->activeControlPoint1() && !point->activeControlPoint2();
991 }
992
993 if (pointData.size() == 2) {
994 const KoPathPointData & pd1 = pointData.at(0);
995 const KoPathPointData & pd2 = pointData.at(1);
996
997 canJoinSubpaths = checkCanJoinToPoints(pd1, pd2);
998 }
999 }
1000
1001 m_actionPathPointCorner->setEnabled(hasNonSplitPoints);
1002 m_actionPathPointSmooth->setEnabled(hasNonSmoothPoints);
1003 m_actionPathPointSymmetric->setEnabled(hasNonSymmetricPoints);
1004
1005 m_actionRemovePoint->setEnabled(!pointData.isEmpty());
1006
1007 m_actionBreakPoint->setEnabled(canBreakAtPoint);
1008
1009 m_actionCurvePoint->setEnabled(hasNonCurvePoints);
1010 m_actionLinePoint->setEnabled(hasNonLinePoints);
1011
1012 m_actionJoinSegment->setEnabled(canJoinSubpaths);
1013 m_actionMergePoints->setEnabled(canJoinSubpaths);
1014
1016
1017
1018 bool canSplitAtSegment = false;
1019 bool canConvertSegmentToLine = false;
1020 bool canConvertSegmentToCurve= false;
1021
1022 if (!segments.isEmpty()) {
1023
1024 canSplitAtSegment = segments.size() == 1;
1025
1026 bool hasLines = false;
1027 bool hasCurves = false;
1028
1029 Q_FOREACH (const KoPathPointData &pd, segments) {
1031 hasLines |= segment.degree() == 1;
1032 hasCurves |= segment.degree() > 1;
1033 }
1034
1035 canConvertSegmentToLine = !segments.isEmpty() && hasCurves;
1036 canConvertSegmentToCurve= !segments.isEmpty() && hasLines;
1037 }
1038
1039 m_actionAddPoint->setEnabled(canSplitAtSegment);
1040
1041 m_actionLineSegment->setEnabled(canConvertSegmentToLine);
1042 m_actionCurveSegment->setEnabled(canConvertSegmentToCurve);
1043
1044 m_actionBreakSegment->setEnabled(canSplitAtSegment);
1045 m_actionBreakSelection->setEnabled(canSplitAtSegment | canBreakAtPoint);
1046
1048 bool haveConvertibleShapes = false;
1049 Q_FOREACH (KoShape *shape, selection->selectedEditableShapes()) {
1050 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
1051 KoSvgTextShape *textShape = dynamic_cast<KoSvgTextShape*>(shape);
1052 if (textShape ||
1053 (parameterShape && parameterShape->isParametricShape())) {
1054
1055 haveConvertibleShapes = true;
1056 break;
1057 }
1058 }
1059 m_actionConvertToPath->setEnabled(haveConvertibleShapes);
1060}
KoPathPointIndex pointIndex
position of the point in the path shape
KoPathShape * pathShape
path shape the path point belongs too
PointProperties properties
@ IsSmooth
it is smooth, both control points on a line through the point
Definition KoPathPoint.h:41
@ IsSymmetric
it is symmetric, like smooth but control points have same distance to point
Definition KoPathPoint.h:42
int degree() const
Returns the degree of the segment: 1 = line, 2 = quadratic, 3 = cubic, -1 = invalid.
int subpathPointCount(int subpathIndex) const
Returns the number of points in a subpath.
bool isClosedSubpath(int subpathIndex) const
Checks if a subpath is closed.
KoPathPoint * pointByIndex(const KoPathPointIndex &pointIndex) const
Returns the path point specified by a path point index.

References KoPathPoint::activeControlPoint1, KoPathPoint::activeControlPoint2, KoToolBase::canvas(), KoPathSegment::degree(), KoPathShape::isClosedSubpath(), KoParameterShape::isParametricShape(), KoPathPoint::IsSmooth, KoPathPoint::IsSymmetric, m_actionAddPoint, m_actionBreakPoint, m_actionBreakSegment, m_actionBreakSelection, m_actionConvertToPath, m_actionCurvePoint, m_actionCurveSegment, m_actionJoinSegment, m_actionLinePoint, m_actionLineSegment, m_actionMergePoints, m_actionPathPointCorner, m_actionPathPointSmooth, m_actionPathPointSymmetric, m_actionRemovePoint, m_pointSelection, KoPathPointData::pathShape, KoPathShape::pointByIndex(), KoPathPointData::pointIndex, KoPathPoint::properties, KoPathShape::segmentByIndex(), KoPathToolSelection::selectedPointsData(), KoPathToolSelection::selectedSegmentsData(), KoCanvasBase::selectedShapesProxy(), selection(), KoSelectedShapesProxy::selection(), and KoPathShape::subpathPointCount().

◆ updateOptionsWidget()

void KoPathTool::updateOptionsWidget ( )
private

Definition at line 944 of file KoPathTool.cpp.

945{
946 PathToolOptionWidget::Types type;
948 Q_FOREACH (KoPathShape *shape, selectedShapes) {
949 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
950 type |= parameterShape && parameterShape->isParametricShape() ?
952 }
953
954 Q_EMIT singleShapeChanged(selectedShapes.size() == 1 ? selectedShapes.first() : 0);
955 Q_EMIT typeChanged(type);
956}

References KoParameterShape::isParametricShape(), m_pointSelection, PathToolOptionWidget::ParametricShape, PathToolOptionWidget::PlainPath, KoPathToolSelection::selectedShapes(), singleShapeChanged(), and typeChanged().

Friends And Related Symbol Documentation

◆ TestPathTool

friend class TestPathTool
friend

Definition at line 122 of file KoPathTool.h.

Member Data Documentation

◆ m_actionAddPoint

QAction* KoPathTool::m_actionAddPoint
private

Definition at line 133 of file KoPathTool.h.

◆ m_actionBreakPoint

QAction* KoPathTool::m_actionBreakPoint
private

Definition at line 135 of file KoPathTool.h.

◆ m_actionBreakSegment

QAction* KoPathTool::m_actionBreakSegment
private

Definition at line 136 of file KoPathTool.h.

◆ m_actionBreakSelection

QAction* KoPathTool::m_actionBreakSelection
private

Definition at line 137 of file KoPathTool.h.

◆ m_actionConvertToPath

QAction* KoPathTool::m_actionConvertToPath
private

Definition at line 140 of file KoPathTool.h.

◆ m_actionCurvePoint

QAction* KoPathTool::m_actionCurvePoint
private

Definition at line 129 of file KoPathTool.h.

◆ m_actionCurveSegment

QAction* KoPathTool::m_actionCurveSegment
private

Definition at line 132 of file KoPathTool.h.

◆ m_actionJoinSegment

QAction* KoPathTool::m_actionJoinSegment
private

Definition at line 138 of file KoPathTool.h.

◆ m_actionLinePoint

QAction* KoPathTool::m_actionLinePoint
private

Definition at line 130 of file KoPathTool.h.

◆ m_actionLineSegment

QAction* KoPathTool::m_actionLineSegment
private

Definition at line 131 of file KoPathTool.h.

◆ m_actionMergePoints

QAction* KoPathTool::m_actionMergePoints
private

Definition at line 139 of file KoPathTool.h.

◆ m_actionPathPointCorner

QAction* KoPathTool::m_actionPathPointCorner
private

Definition at line 126 of file KoPathTool.h.

◆ m_actionPathPointSmooth

QAction* KoPathTool::m_actionPathPointSmooth
private

Definition at line 127 of file KoPathTool.h.

◆ m_actionPathPointSymmetric

QAction* KoPathTool::m_actionPathPointSymmetric
private

Definition at line 128 of file KoPathTool.h.

◆ m_actionRemovePoint

QAction* KoPathTool::m_actionRemovePoint
private

Definition at line 134 of file KoPathTool.h.

◆ m_activeHandle

QScopedPointer<KoPathToolHandle> KoPathTool::m_activeHandle
private

the currently active handle

Definition at line 117 of file KoPathTool.h.

◆ m_activeSegment

QScopedPointer<PathSegment> KoPathTool::m_activeSegment
private

Definition at line 119 of file KoPathTool.h.

◆ m_canvasConnections

KisSignalAutoConnectionsStore KoPathTool::m_canvasConnections
private

Definition at line 143 of file KoPathTool.h.

◆ m_contextMenu

QScopedPointer<QMenu> KoPathTool::m_contextMenu
private

Definition at line 142 of file KoPathTool.h.

◆ m_currentStrategy

QScopedPointer<KoInteractionStrategy> KoPathTool::m_currentStrategy
private

the rubber selection strategy

Definition at line 124 of file KoPathTool.h.

◆ m_lastPoint

QPointF KoPathTool::m_lastPoint
private

needed for interaction strategy

Definition at line 118 of file KoPathTool.h.

◆ m_moveCursor

QCursor KoPathTool::m_moveCursor
private

Definition at line 141 of file KoPathTool.h.

◆ m_pointSelection

KoPathToolSelection KoPathTool::m_pointSelection
protected

the point selection

Definition at line 113 of file KoPathTool.h.

◆ m_selectCursor

QCursor KoPathTool::m_selectCursor
protected

Definition at line 114 of file KoPathTool.h.

◆ m_shapeFillResourceConnector

KoShapeFillResourceConnector KoPathTool::m_shapeFillResourceConnector
private

Definition at line 144 of file KoPathTool.h.


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