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
 
QScopedPointer< KoSvgTextShapeOutlineHelperm_textOutlineHelper
 

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 36 of file KoPathTool.h.

Constructor & Destructor Documentation

◆ KoPathTool()

KoPathTool::KoPathTool ( KoCanvasBase * canvas)
explicit

Definition at line 87 of file KoPathTool.cpp.

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

References KoToolBase::action(), 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, m_textOutlineHelper, repaintDecorations(), and KoToolBase::selectionChanged().

◆ ~KoPathTool()

KoPathTool::~KoPathTool ( )
override

Definition at line 118 of file KoPathTool.cpp.

119{
120}

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 875 of file KoPathTool.cpp.

876{
877 KoToolBase::activate(shapes);
878
879 Q_D(KoToolBase);
880
881 d->canvas->snapGuide()->reset();
882
884 m_canvasConnections.addConnection(d->canvas->selectedShapesProxy(), SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()));
885 m_canvasConnections.addConnection(d->canvas->selectedShapesProxy(), SIGNAL(selectionContentChanged()), this, SLOT(updateActions()));
886
887 m_canvasConnections.addConnection(d->canvas->selectedShapesProxy(), SIGNAL(selectionChanged()), this, SLOT(repaintDecorations()));
888 m_canvasConnections.addConnection(d->canvas->selectedShapesProxy(), SIGNAL(selectionContentChanged()), this, SLOT(repaintDecorations()));
890 initializeWithShapes(QList<KoShape*>(shapes.begin(), shapes.end()));
891 connect(m_actionCurvePoint, SIGNAL(triggered()), this, SLOT(pointToCurve()), Qt::UniqueConnection);
892 connect(m_actionLinePoint, SIGNAL(triggered()), this, SLOT(pointToLine()), Qt::UniqueConnection);
893 connect(m_actionLineSegment, SIGNAL(triggered()), this, SLOT(segmentToLine()), Qt::UniqueConnection);
894 connect(m_actionCurveSegment, SIGNAL(triggered()), this, SLOT(segmentToCurve()), Qt::UniqueConnection);
895 connect(m_actionAddPoint, SIGNAL(triggered()), this, SLOT(insertPoints()), Qt::UniqueConnection);
896 connect(m_actionRemovePoint, SIGNAL(triggered()), this, SLOT(removePoints()), Qt::UniqueConnection);
897 connect(m_actionBreakPoint, SIGNAL(triggered()), this, SLOT(breakAtPoint()), Qt::UniqueConnection);
898 connect(m_actionBreakSegment, SIGNAL(triggered()), this, SLOT(breakAtSegment()), Qt::UniqueConnection);
899 connect(m_actionBreakSelection, SIGNAL(triggered()), this, SLOT(breakAtSelection()), Qt::UniqueConnection);
900 connect(m_actionJoinSegment, SIGNAL(triggered()), this, SLOT(joinPoints()), Qt::UniqueConnection);
901 connect(m_actionMergePoints, SIGNAL(triggered()), this, SLOT(mergePoints()), Qt::UniqueConnection);
902 connect(m_actionConvertToPath, SIGNAL(triggered()), this, SLOT(convertToPath()), Qt::UniqueConnection);
903 connect(m_actionPathPointCorner, SIGNAL(triggered()), this, SLOT(pointTypeChangedCorner()), Qt::UniqueConnection);
904 connect(m_actionPathPointSmooth, SIGNAL(triggered()), this, SLOT(pointTypeChangedSmooth()), Qt::UniqueConnection);
905 connect(m_actionPathPointSymmetric, SIGNAL(triggered()), this, SLOT(pointTypeChangedSymmetric()), Qt::UniqueConnection);
906 connect(&m_pointSelection, SIGNAL(selectionChanged()), this, SLOT(pointSelectionChanged()), Qt::UniqueConnection);
907
908}
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:145
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:146
void insertPoints()
void useCursor(const QCursor &cursor)
virtual void activate(const QSet< KoShape * > &shapes)

References KoToolBase::activate(), KisSignalAutoConnectionsStore::addConnection(), breakAtPoint(), breakAtSegment(), breakAtSelection(), 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 407 of file KoPathTool.cpp.

408{
409 Q_D(KoToolBase);
412 }
413}
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 429 of file KoPathTool.cpp.

430{
431 Q_D(KoToolBase);
432 // only try to break a segment when 2 points of the same object are selected
433 if (m_pointSelection.objectCount() == 1 && m_pointSelection.size() == 2) {
435 if (segments.size() == 1) {
436 d->canvas->addCommand(new KoPathSegmentBreakCommand(segments.at(0)));
437 }
438 }
439}
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 1109 of file KoPathTool.cpp.

1110{
1113 }
1114}
@ 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 930 of file KoPathTool.cpp.

931{
932 m_activeHandle.reset();
933 m_activeSegment.reset();
935}
void clear()
Clear the selection.
QScopedPointer< PathSegment > m_activeSegment
Definition KoPathTool.h:120
QScopedPointer< KoPathToolHandle > m_activeHandle
the currently active handle
Definition KoPathTool.h:118

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

◆ convertToPath

void KoPathTool::convertToPath ( )
privateslot

Definition at line 288 of file KoPathTool.cpp.

289{
290 Q_D(KoToolBase);
291
293
294 QList<KoParameterShape*> parameterShapes;
295
296 Q_FOREACH (KoShape *shape, m_pointSelection.selectedShapes()) {
297 KoParameterShape * parametric = dynamic_cast<KoParameterShape*>(shape);
298 if (parametric && parametric->isParametricShape()) {
299 parameterShapes.append(parametric);
300 }
301 }
302
303 if (!parameterShapes.isEmpty()) {
304 d->canvas->addCommand(new KoParameterToPathCommand(parameterShapes));
305 }
306
307 QList<KoSvgTextShape*> textShapes;
308 Q_FOREACH (KoShape *shape, selection->selectedEditableShapes()) {
309 if (KoSvgTextShape *text = dynamic_cast<KoSvgTextShape*>(shape)) {
310 textShapes.append(text);
311 }
312 }
313
314 if (!textShapes.isEmpty()) {
315 KUndo2Command *cmd = new KUndo2Command(kundo2_i18n("Convert to Path")); // TODO: reuse the text from KoParameterToPathCommand
316 const QList<KoShape*> oldSelectedShapes = implicitCastList<KoShape*>(textShapes);
317
318
319 new KoKeepShapesSelectedCommand(oldSelectedShapes, {}, canvas()->selectedShapesProxy(),
321
322 QList<KoShape*> newSelectedShapes;
323 Q_FOREACH (KoSvgTextShape *shape, textShapes) {
324 KoShape *outlineShape = shape->textOutline();
325
326 KoShapeContainer *parent = shape->parent();
327 canvas()->shapeController()->addShapeDirect(outlineShape, parent, cmd);
328
329 newSelectedShapes << outlineShape;
330 }
331
332 canvas()->shapeController()->removeShapes(oldSelectedShapes, cmd);
333
334 new KoKeepShapesSelectedCommand({}, newSelectedShapes, canvas()->selectedShapesProxy(),
336
337 canvas()->addCommand(cmd);
338 }
339
341}
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:857
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 122 of file KoPathTool.cpp.

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

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

◆ createPointToCurveCommand()

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

Definition at line 247 of file KoPathTool.cpp.

248{
249 KUndo2Command *command = 0;
250 QList<KoPathPointData> pointToChange;
251
252 QList<KoPathPointData>::const_iterator it(points.constBegin());
253 for (; it != points.constEnd(); ++it) {
254 KoPathPoint *point = it->pathShape->pointByIndex(it->pointIndex);
255 if (point && (! point->activeControlPoint1() || ! point->activeControlPoint2()))
256 pointToChange.append(*it);
257 }
258
259 if (!pointToChange.isEmpty()) {
260 command = new KoPathPointTypeCommand(pointToChange, KoPathPointTypeCommand::Curve);
261 }
262
263 return command;
264}
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 1076 of file KoPathTool.cpp.

1077{
1078 Q_D(KoToolBase);
1079
1084 m_activeHandle.reset();
1085 m_activeSegment.reset();
1086 m_currentStrategy.reset();
1087 d->canvas->snapGuide()->reset();
1088
1089 disconnect(m_actionCurvePoint, 0, this, 0);
1090 disconnect(m_actionLinePoint, 0, this, 0);
1091 disconnect(m_actionLineSegment, 0, this, 0);
1092 disconnect(m_actionCurveSegment, 0, this, 0);
1093 disconnect(m_actionAddPoint, 0, this, 0);
1094 disconnect(m_actionRemovePoint, 0, this, 0);
1095 disconnect(m_actionBreakPoint, 0, this, 0);
1096 disconnect(m_actionBreakSegment, 0, this, 0);
1097 disconnect(m_actionBreakSelection, 0, this, 0);
1098 disconnect(m_actionJoinSegment, 0, this, 0);
1099 disconnect(m_actionMergePoints, 0, this, 0);
1100 disconnect(m_actionConvertToPath, 0, this, 0);
1101 disconnect(m_actionPathPointCorner, 0, this, 0);
1102 disconnect(m_actionPathPointSmooth, 0, this, 0);
1103 disconnect(m_actionPathPointSymmetric, 0, this, 0);
1104 disconnect(&m_pointSelection, 0, this, 0);
1105
1107}
void setSelectedShapes(const QList< KoPathShape * > shapes)
Sets list of selected shapes.
QScopedPointer< KoInteractionStrategy > m_currentStrategy
the rubber selection strategy
Definition KoPathTool.h:125
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 517 of file KoPathTool.cpp.

518{
520
521 QRectF newDecorationsRect;
522
523 Q_FOREACH (KoShape *shape, m_pointSelection.selectedShapes()) {
524 newDecorationsRect |= kisGrowRect(shape->boundingRect(), handleDocRadius());
525 }
526
527 Q_FOREACH(const KoPathPoint *point, m_pointSelection.selectedPoints()) {
528 newDecorationsRect |= kisGrowRect(point->boundingRect(false), handleDocRadius());
529 }
530
531 if (m_activeHandle) {
532 newDecorationsRect |= kisGrowRect(m_activeHandle->boundingRect(), handleDocRadius());
533 }
534
535 if (m_activeSegment) {
536 KoPathPointIndex index = m_activeSegment->path->pathPointIndex(m_activeSegment->segmentStart);
537 KoPathSegment segment = m_activeSegment->path->segmentByIndex(index);
538
539 QRectF rect = segment.boundingRect();
540 rect = m_activeSegment->path->shapeToDocument(rect);
541
542 newDecorationsRect |= kisGrowRect(rect, handleDocRadius());
543 }
544
545 newDecorationsRect |= m_textOutlineHelper->decorationRect();
546
547 return newDecorationsRect;
548}
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:300
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, m_textOutlineHelper, 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 1195 of file KoPathTool.cpp.

1196{
1197 removePoints();
1198}

References removePoints().

◆ deselect()

void KoPathTool::deselect ( )
overridevirtual

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

Reimplemented from KoToolBase.

Definition at line 1232 of file KoPathTool.cpp.

1233{
1236}
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 1220 of file KoPathTool.cpp.

1221{
1222 KoToolManager::instance()->switchToolRequested("InteractionTool");
1223}
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 937 of file KoPathTool.cpp.

938{
939 QList<KoPathShape*> selectedShapes;
940 Q_FOREACH (KoShape *shape, shapes) {
941 KoPathShape *pathShape = dynamic_cast<KoPathShape*>(shape);
942
943 if (pathShape && pathShape->isShapeEditable()) {
944 selectedShapes.append(pathShape);
945 }
946 }
947
948 if (selectedShapes != m_pointSelection.selectedShapes()) {
950 m_pointSelection.setSelectedShapes(selectedShapes);
952 }
953
956}
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:965

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

◆ insertPoints

void KoPathTool::insertPoints ( )
privateslot

Definition at line 177 of file KoPathTool.cpp.

178{
179 Q_D(KoToolBase);
181 if (segments.size() == 1) {
182 qreal positionInSegment = 0.5;
183 if (m_activeSegment && m_activeSegment->isValid()) {
184 positionInSegment = m_activeSegment->positionOnSegment;
185 }
186
187 KoPathPointInsertCommand *cmd = new KoPathPointInsertCommand(segments, positionInSegment);
188 d->canvas->addCommand(cmd);
189
190 // TODO: this construction is dangerous. The canvas can remove the command right after
191 // it has been added to it!
193 foreach (KoPathPoint * p, cmd->insertedPoints()) {
194 m_pointSelection.add(p, false);
195 }
196 }
197}
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 397 of file KoPathTool.cpp.

398{
399 mergePointsImpl(true);
400}
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 763 of file KoPathTool.cpp.

764{
765 if (m_currentStrategy) {
766 switch (event->key()) {
767 case Qt::Key_Control:
768 case Qt::Key_Alt:
769 case Qt::Key_Shift:
770 case Qt::Key_Meta:
771 if (! event->isAutoRepeat()) {
772 m_currentStrategy->handleMouseMove(m_lastPoint, event->modifiers());
773 }
774 break;
775 case Qt::Key_Escape:
776 m_currentStrategy->cancelInteraction();
777 m_currentStrategy.reset();
778 break;
779 default:
780 event->ignore();
781 return;
782 }
783 } else {
784 switch (event->key()) {
785#ifndef NDEBUG
786// case Qt::Key_D:
787// if (m_pointSelection.objectCount() == 1) {
788// QList<KoPathPointData> selectedPoints = m_pointSelection.selectedPointsData();
789// KoPathShapePrivate *p = static_cast<KoPathShapePrivate*>(selectedPoints[0].pathShape->priv());
790// p->debugPath();
791// }
792// break;
793#endif
794 default:
795 event->ignore();
796 return;
797 }
798 }
799 event->accept();
800}
QPointF m_lastPoint
needed for interaction strategy
Definition KoPathTool.h:119

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 802 of file KoPathTool.cpp.

803{
804 if (m_currentStrategy) {
805 switch (event->key()) {
806 case Qt::Key_Control:
807 case Qt::Key_Alt:
808 case Qt::Key_Shift:
809 case Qt::Key_Meta:
810 if (! event->isAutoRepeat()) {
811 m_currentStrategy->handleMouseMove(m_lastPoint, Qt::NoModifier);
812 }
813 break;
814 default:
815 break;
816 }
817 }
818 event->accept();
819}

References m_currentStrategy, and m_lastPoint.

◆ mergePoints

void KoPathTool::mergePoints ( )
privateslot

Definition at line 402 of file KoPathTool.cpp.

403{
404 mergePointsImpl(false);
405}

References mergePointsImpl().

◆ mergePointsImpl()

void KoPathTool::mergePointsImpl ( bool doJoin)
private

Definition at line 368 of file KoPathTool.cpp.

369{
370 Q_D(KoToolBase);
371
372 if (m_pointSelection.size() != 2)
373 return;
374
376 if (pointData.size() != 2) return;
377
378 const KoPathPointData & pd1 = pointData.at(0);
379 const KoPathPointData & pd2 = pointData.at(1);
380
381 if (!checkCanJoinToPoints(pd1, pd2)) {
382 return;
383 }
384
386
387 KUndo2Command *cmd = 0;
388
389 if (doJoin) {
390 cmd = new KoMultiPathPointJoinCommand(pd1, pd2, d->canvas->shapeController()->documentBase(), d->canvas->shapeManager()->selection());
391 } else {
392 cmd = new KoMultiPathPointMergeCommand(pd1, pd2, d->canvas->shapeController()->documentBase(), d->canvas->shapeManager()->selection());
393 }
394 d->canvas->addCommand(cmd);
395}
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 821 of file KoPathTool.cpp.

822{
823 Q_D(KoToolBase);
824 // check if we are doing something else at the moment
825 if (m_currentStrategy) return;
826
827 if (!m_activeHandle && m_activeSegment && m_activeSegment->isValid()) {
828 QList<KoPathPointData> segments;
829 segments.append(
831 m_activeSegment->path->pathPointIndex(m_activeSegment->segmentStart)));
832
833 KoPathPointInsertCommand *cmd = new KoPathPointInsertCommand(segments, m_activeSegment->positionOnSegment);
834 d->canvas->addCommand(cmd);
835
837 foreach (KoPathPoint * p, cmd->insertedPoints()) {
838 m_pointSelection.add(p, false);
839 }
841
842 // Call a mouse move event to update the cursor and allow the user to drag the new point immediately
843 mouseMoveEvent(event);
844 } else if (!m_activeHandle && !m_activeSegment) {
846 }
847}
void mouseMoveEvent(KoPointerEvent *event) override
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, mouseMoveEvent(), 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 619 of file KoPathTool.cpp.

620{
621 if (event->button() & Qt::RightButton)
622 return;
623
624 if (m_currentStrategy) {
625 m_lastPoint = event->point;
626 m_currentStrategy->handleMouseMove(event->point, event->modifiers());
627
629
630 return;
631 }
632
633 if (m_activeSegment) {
634 m_activeSegment.reset();
636 }
637
638 Q_FOREACH (KoPathShape *shape, m_pointSelection.selectedShapes()) {
639 QRectF roi = shape->documentToShape(handleGrabRect(event->point));
640 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
641 if (parameterShape && parameterShape->isParametricShape()) {
642 int handleId = parameterShape->handleIdAt(roi);
643 if (handleId != -1) {
645 Q_EMIT statusTextChanged(i18n("Drag to move handle."));
646
647 m_activeHandle.reset(new ParameterHandle(this, parameterShape, handleId));
649 return;
650 }
651 } else {
652 QList<KoPathPoint*> points = shape->pointsAt(roi, true);
653 if (! points.empty()) {
654 // find the nearest control point from all points within the roi
655 KoPathPoint * bestPoint = 0;
657 qreal minDistance = HUGE_VAL;
658 Q_FOREACH (KoPathPoint *p, points) {
659 // the node point must be hit if the point is not selected yet
660 if (! m_pointSelection.contains(p) && ! roi.contains(p->point()))
661 continue;
662
663 // check for the control points first as otherwise it is no longer
664 // possible to change the control points when they are the same as the point
665 if (p->activeControlPoint1() && roi.contains(p->controlPoint1())) {
666 qreal dist = squaredDistance(roi.center(), p->controlPoint1());
667 if (dist < minDistance) {
668 bestPoint = p;
669 bestPointType = KoPathPoint::ControlPoint1;
670 minDistance = dist;
671 }
672 }
673
674 if (p->activeControlPoint2() && roi.contains(p->controlPoint2())) {
675 qreal dist = squaredDistance(roi.center(), p->controlPoint2());
676 if (dist < minDistance) {
677 bestPoint = p;
678 bestPointType = KoPathPoint::ControlPoint2;
679 minDistance = dist;
680 }
681 }
682
683 // check the node point at last
684 qreal dist = squaredDistance(roi.center(), p->point());
685 if (dist < minDistance) {
686 bestPoint = p;
687 bestPointType = KoPathPoint::Node;
688 minDistance = dist;
689 }
690 }
691
692 if (! bestPoint) {
694 return;
695 }
696
698 if (bestPointType == KoPathPoint::Node)
699 Q_EMIT statusTextChanged(i18n("Drag to move point. Shift click to change point type."));
700 else
701 Q_EMIT statusTextChanged(i18n("Drag to move control point."));
702
703 PointHandle *prev = dynamic_cast<PointHandle*>(m_activeHandle.data());
704 if (prev && prev->activePoint() == bestPoint && prev->activePointType() == bestPointType)
705 return; // no change;
706
707 m_activeHandle.reset(new PointHandle(this, bestPoint, bestPointType));
709 return;
710 }
711 }
712 }
713
715
716 if (m_activeHandle) {
717 m_activeHandle.reset();
719 }
720
721 PathSegment *hoveredSegment = segmentAtPoint(event->point);
722 if(hoveredSegment) {
723 useCursor(Qt::PointingHandCursor);
724 Q_EMIT statusTextChanged(i18n("Drag to change curve directly. Double click to insert new path point."));
725 m_activeSegment.reset(hoveredSegment);
727 } else {
728 uint selectedPointCount = m_pointSelection.size();
729 if (selectedPointCount == 0)
730 Q_EMIT statusTextChanged(QString());
731 else {
732 if (!m_actionBreakSelection->shortcut().isEmpty()) {
733 if (selectedPointCount == 1)
734 Q_EMIT statusTextChanged(i18nc("%1 is a shortcut to be pressed", "Press %1 to break path at selected point.", m_actionBreakSelection->shortcut().toString()));
735 else
736 Q_EMIT statusTextChanged(i18nc("%1 is a shortcut to be pressed", "Press %1 to break path at selected segments.", m_actionBreakSelection->shortcut().toString()));
737 } else {
738 Q_EMIT statusTextChanged(QString());
739 }
740 }
741 }
742}
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:1011
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 556 of file KoPathTool.cpp.

557{
558 // When using touch drawing, we only ever receive move events after the
559 // finger has pressed down. We have to issue an artificial move here so that
560 // the tool's state is updated properly to handle the press.
561 if (event->isTouchEvent()) {
562 mouseMoveEvent(event);
563 }
564
565 if (KoSvgTextShape *shape = m_textOutlineHelper->contourModeButtonHovered(event->point)) {
566 m_textOutlineHelper->toggleTextContourMode(shape);
567 event->accept();
568 }
569 // we are moving if we hit a point and use the left mouse button
570 if (m_activeHandle) {
571 m_currentStrategy.reset(m_activeHandle->handleMousePress(event));
572 } else {
573
574 if (event->button() & Qt::LeftButton) {
575
576 bool shift_pressed = (event->modifiers() & Qt::ShiftModifier);
577
578 // check if we hit a path segment
579 if (m_activeSegment && m_activeSegment->isValid()) {
580
581 KoPathShape *shape = m_activeSegment->path;
582 KoPathPointIndex index = shape->pathPointIndex(m_activeSegment->segmentStart);
583 KoPathSegment segment = shape->segmentByIndex(index);
584
585 // The segment is selected so now need to deselect it
587 && shift_pressed) {
588 m_pointSelection.remove(segment.first());
589 m_pointSelection.remove(segment.second());
590 } else {
591 m_pointSelection.add(segment.first(), !shift_pressed);
592 m_pointSelection.add(segment.second(), false);
593 }
594
595 KoPathPointData data(shape, index);
596 m_currentStrategy.reset(new KoPathSegmentChangeStrategy(this, event->point, data, m_activeSegment->positionOnSegment));
597 } else {
598
599 KoShapeManager *shapeManager = canvas()->shapeManager();
600 KoSelection *selection = shapeManager->selection();
601 KoShape *shape = shapeManager->shapeAt(event->point, KoFlake::ShapeOnTop);
602
603 if (shape && !selection->isSelected(shape)) {
604
605 if (!shift_pressed) {
606 selection->deselectAll();
607 }
608
609 selection->select(shape);
610 } else {
613 }
614 }
615 }
616 }
617}
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.
void remove(KoPathPoint *point)
Remove a point form the selection.
bool isTouchEvent() const
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(), KoPathToolSelection::contains(), KoPathSegment::first, KoPointerEvent::isTouchEvent(), KIS_ASSERT_RECOVER_RETURN, m_activeHandle, m_activeSegment, m_currentStrategy, m_pointSelection, m_textOutlineHelper, mouseMoveEvent(), KoPathShape::pathPointIndex(), KoPointerEvent::point, KoPathToolSelection::remove(), 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 744 of file KoPathTool.cpp.

745{
746 Q_D(KoToolBase);
747 if (m_currentStrategy) {
748 const bool hadNoSelection = !m_pointSelection.hasSelection();
749 m_currentStrategy->finishInteraction(event->modifiers());
750 KUndo2Command *command = m_currentStrategy->createCommand();
751 if (command)
752 d->canvas->addCommand(command);
753 if (hadNoSelection && dynamic_cast<KoPathPointRubberSelectStrategy*>(m_currentStrategy.data())
755 // the click didn't do anything at all. Allow it to be used by others.
756 event->ignore();
757 }
758 m_currentStrategy.reset();
760 }
761}

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

◆ notifyPathPointsChanged()

void KoPathTool::notifyPathPointsChanged ( KoPathShape * shape)

Definition at line 919 of file KoPathTool.cpp.

920{
921 Q_UNUSED(shape);
922
923 // active handle and selection might have already become invalid, so just
924 // delete them without dereferencing anything...
925
926 m_activeHandle.reset();
927 m_activeSegment.reset();
928}

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 441 of file KoPathTool.cpp.

442{
443 Q_D(KoToolBase);
444 m_textOutlineHelper->setDecorationThickness(decorationThickness());
445 m_textOutlineHelper->setHandleRadius(handleRadius());
446 m_textOutlineHelper->paint(&painter, converter);
447
449
450 Q_FOREACH (KoPathShape *shape, m_pointSelection.selectedShapes()) {
454
455 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
456 if (parameterShape && parameterShape->isParametricShape()) {
457 parameterShape->paintHandles(helper);
458 } else {
459 shape->paintPoints(helper);
460 }
461
462 if (!shape->stroke() || !shape->stroke()->isVisible()) {
464 helper.drawPath(shape->outline());
465 }
466 }
467
468 if (m_currentStrategy) {
469 painter.save();
470 m_currentStrategy->paint(painter, converter, canvas()->displayRendererInterface());
471 painter.restore();
472 }
473
475
476 if (m_activeHandle) {
479 } else {
480 m_activeHandle.reset();
481 }
482 } else if (m_activeSegment && m_activeSegment->isValid()) {
483
484 KoPathShape *shape = m_activeSegment->path;
485
486 // if the stroke is invisible, then we already painted the outline of the shape!
487 if (shape->stroke() && shape->stroke()->isVisible()) {
488 KoPathPointIndex index = shape->pathPointIndex(m_activeSegment->segmentStart);
489 KoPathSegment segment = shape->segmentByIndex(index).toCubic();
490
492
496
497 QPainterPath path;
498 path.moveTo(segment.first()->point());
499 path.cubicTo(segment.first()->controlPoint2(),
500 segment.second()->controlPoint1(),
501 segment.second()->point());
502
503 helper.drawPath(path);
504 }
505 }
506
507
508
509 if (m_currentStrategy) {
510 painter.save();
511 painter.setTransform(converter.documentToView(), true);
512 d->canvas->snapGuide()->paint(painter, converter, canvas()->displayRendererInterface());
513 painter.restore();
514 }
515}
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(KisHandlePalette palette=KisHandlePalette())
static KisHandleStyle & primarySelection(KisHandlePalette palette=KisHandlePalette())
virtual KoColorDisplayRendererInterface * displayRendererInterface() const
displayRendererInterface The display renderer interface has a number of color conversion functions wh...
virtual KisHandlePalette handlePaletteForDisplayColorSpace() const =0
handlePaletteForDisplayColorSpace
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, KoColorDisplayRendererInterface *renderInterface)
Draw the selected points.
virtual KoShapeStrokeModelSP stroke() const
Definition KoShape.cpp:885
static KisHandlePainterHelper createHandlePainterHelperView(QPainter *painter, KoShape *shape, const KoViewConverter &converter, qreal handleRadius=0.0, int decorationThickness=1)
Definition KoShape.cpp:977
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 KoToolBase::canvas(), KoPathPoint::controlPoint1, KoPathPoint::controlPoint2, KoShape::createHandlePainterHelperView(), KoToolBase::decorationThickness(), KoCanvasBase::displayRendererInterface(), KoViewConverter::documentToView(), KisHandlePainterHelper::drawPath(), KoPathSegment::first, KoColorDisplayRendererInterface::handlePaletteForDisplayColorSpace(), KoToolBase::handleRadius(), KoParameterShape::isParametricShape(), KoPathSegment::isValid(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_activeHandle, m_activeSegment, m_currentStrategy, m_pointSelection, m_textOutlineHelper, 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 233 of file KoPathTool.cpp.

234{
235 Q_D(KoToolBase);
238
239 KUndo2Command *command = createPointToCurveCommand(selectedPoints);
240
241 if (command) {
242 d->canvas->addCommand(command);
243 }
244 }
245}
KUndo2Command * createPointToCurveCommand(const QList< KoPathPointData > &points)

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

◆ pointToLine

void KoPathTool::pointToLine ( )
privateslot

Definition at line 213 of file KoPathTool.cpp.

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

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 147 of file KoPathTool.cpp.

148{
149 Q_D(KoToolBase);
152
153 KUndo2Command *initialConversionCommand = createPointToCurveCommand(selectedPoints);
154
155 // conversion should happen before the c-tor
156 // of KoPathPointTypeCommand is executed!
157 if (initialConversionCommand) {
158 initialConversionCommand->redo();
159 }
160
161 KUndo2Command *command =
162 new KoPathPointTypeCommand(selectedPoints, type);
163
164 if (initialConversionCommand) {
165 using namespace KisCommandUtils;
167 parent->setText(command->text());
168 parent->addCommand(new SkipFirstRedoWrapper(initialConversionCommand));
169 parent->addCommand(command);
170 command = parent;
171 }
172
173 d->canvas->addCommand(command);
174 }
175}
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 137 of file KoPathTool.cpp.

137 {
139}
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 1145 of file KoPathTool.cpp.

1146{
1147 if (m_activeHandle) {
1148 m_activeHandle->trySelectHandle();
1149 }
1150
1151 if (m_activeSegment && m_activeSegment->isValid()) {
1152 KoPathShape *shape = m_activeSegment->path;
1153 KoPathSegment segment = shape->segmentByIndex(shape->pathPointIndex(m_activeSegment->segmentStart));
1154
1155 m_pointSelection.add(segment.first(), true);
1156 m_pointSelection.add(segment.second(), false);
1157 }
1158
1159 if (m_contextMenu) {
1160 m_contextMenu->clear();
1161
1162 addActionsGroupIfEnabled(m_contextMenu.data(),
1166
1167 addActionsGroupIfEnabled(m_contextMenu.data(),
1170
1171 addActionsGroupIfEnabled(m_contextMenu.data(),
1174
1175 addActionsGroupIfEnabled(m_contextMenu.data(),
1178
1179 addActionsGroupIfEnabled(m_contextMenu.data(),
1182
1183 addActionsGroupIfEnabled(m_contextMenu.data(),
1186
1188
1189 m_contextMenu->addSeparator();
1190 }
1191
1192 return m_contextMenu.data();
1193}

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 199 of file KoPathTool.cpp.

200{
201 Q_D(KoToolBase);
202 if (m_pointSelection.size() > 0) {
204 PointHandle *pointHandle = dynamic_cast<PointHandle*>(m_activeHandle.data());
205 if (pointHandle && m_pointSelection.contains(pointHandle->activePoint())) {
206 m_activeHandle.reset();
207 }
209 d->canvas->addCommand(cmd);
210 }
211}
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 550 of file KoPathTool.cpp.

551{
554}
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 1210 of file KoPathTool.cpp.

1211{
1213}

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 1215 of file KoPathTool.cpp.

1216{
1217 // noop!
1218}

◆ 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 1205 of file KoPathTool.cpp.

1206{
1207 // noop!
1208}

◆ segmentAtPoint()

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

Definition at line 849 of file KoPathTool.cpp.

850{
851 // the max allowed distance from a segment
852 const QRectF grabRoi = handleGrabRect(point);
853 std::unique_ptr<PathSegment> segment(new PathSegment);
854
855 Q_FOREACH (KoPathShape *shape, m_pointSelection.selectedShapes()) {
856 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
857 if (parameterShape && parameterShape->isParametricShape())
858 continue;
859
860 const KoPathSegment s = shape->segmentAtPoint(point, grabRoi);
861 if (s.isValid()) {
862 segment->path = shape;
863 segment->segmentStart = s.first();
864 segment->positionOnSegment = s.nearestPoint(shape->documentToShape(point));
865 }
866 }
867
868 if (!segment->isValid()) {
869 segment.reset();
870 }
871
872 return segment.release();
873}
qreal nearestPoint(const QPointF &point) const
KoPathSegment segmentAtPoint(const QPointF &point, const QRectF &grabRoi) const

References KoShape::documentToShape(), KoPathSegment::first, KoToolBase::handleGrabRect(), KoParameterShape::isParametricShape(), KoPathSegment::isValid(), m_pointSelection, KoPathSegment::nearestPoint(), KoPathShape::segmentAtPoint(), and KoPathToolSelection::selectedShapes().

◆ segmentToCurve

void KoPathTool::segmentToCurve ( )
privateslot

Definition at line 277 of file KoPathTool.cpp.

278{
279 Q_D(KoToolBase);
280 if (m_pointSelection.size() > 1) {
282 if (segments.size() > 0) {
283 d->canvas->addCommand(new KoPathSegmentTypeCommand(segments, KoPathSegmentTypeCommand::Curve));
284 }
285 }
286}
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 1225 of file KoPathTool.cpp.

1226{
1229 return true;
1230}

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 1200 of file KoPathTool.cpp.

1201{
1202 return &m_pointSelection;
1203}

References m_pointSelection.

◆ singleShapeChanged

void KoPathTool::singleShapeChanged ( KoPathShape * path)
signal

◆ slotSelectionChanged

void KoPathTool::slotSelectionChanged ( )
privateslot

Definition at line 910 of file KoPathTool.cpp.

911{
912 Q_D(KoToolBase);
913 QList<KoShape*> shapes =
914 d->canvas->selectedShapesProxy()->selection()->selectedEditableShapesAndDelegates();
915
916 initializeWithShapes(shapes);
917}

References initializeWithShapes().

◆ typeChanged

void KoPathTool::typeChanged ( int types)
signal

◆ updateActions

void KoPathTool::updateActions ( )
privateslot

Definition at line 972 of file KoPathTool.cpp.

973{
975
976 bool canBreakAtPoint = false;
977
978 bool hasNonSmoothPoints = false;
979 bool hasNonSymmetricPoints = false;
980 bool hasNonSplitPoints = false;
981
982 bool hasNonLinePoints = false;
983 bool hasNonCurvePoints = false;
984
985 bool canJoinSubpaths = false;
986
987 if (!pointData.isEmpty()) {
988 Q_FOREACH (const KoPathPointData &pd, pointData) {
989 const int subpathIndex = pd.pointIndex.first;
990 const int pointIndex = pd.pointIndex.second;
991
992 canBreakAtPoint |= pd.pathShape->isClosedSubpath(subpathIndex) ||
993 (pointIndex > 0 && pointIndex < pd.pathShape->subpathPointCount(subpathIndex) - 1);
994
996
997 hasNonSmoothPoints |= !(point->properties() & KoPathPoint::IsSmooth);
998 hasNonSymmetricPoints |= !(point->properties() & KoPathPoint::IsSymmetric);
999 hasNonSplitPoints |=
1002
1003 hasNonLinePoints |= point->activeControlPoint1() || point->activeControlPoint2();
1004 hasNonCurvePoints |= !point->activeControlPoint1() && !point->activeControlPoint2();
1005 }
1006
1007 if (pointData.size() == 2) {
1008 const KoPathPointData & pd1 = pointData.at(0);
1009 const KoPathPointData & pd2 = pointData.at(1);
1010
1011 canJoinSubpaths = checkCanJoinToPoints(pd1, pd2);
1012 }
1013 }
1014
1015 m_actionPathPointCorner->setEnabled(hasNonSplitPoints);
1016 m_actionPathPointSmooth->setEnabled(hasNonSmoothPoints);
1017 m_actionPathPointSymmetric->setEnabled(hasNonSymmetricPoints);
1018
1019 m_actionRemovePoint->setEnabled(!pointData.isEmpty());
1020
1021 m_actionBreakPoint->setEnabled(canBreakAtPoint);
1022
1023 m_actionCurvePoint->setEnabled(hasNonCurvePoints);
1024 m_actionLinePoint->setEnabled(hasNonLinePoints);
1025
1026 m_actionJoinSegment->setEnabled(canJoinSubpaths);
1027 m_actionMergePoints->setEnabled(canJoinSubpaths);
1028
1030
1031
1032 bool canSplitAtSegment = false;
1033 bool canConvertSegmentToLine = false;
1034 bool canConvertSegmentToCurve= false;
1035
1036 if (!segments.isEmpty()) {
1037
1038 canSplitAtSegment = segments.size() == 1;
1039
1040 bool hasLines = false;
1041 bool hasCurves = false;
1042
1043 Q_FOREACH (const KoPathPointData &pd, segments) {
1045 hasLines |= segment.degree() == 1;
1046 hasCurves |= segment.degree() > 1;
1047 }
1048
1049 canConvertSegmentToLine = !segments.isEmpty() && hasCurves;
1050 canConvertSegmentToCurve= !segments.isEmpty() && hasLines;
1051 }
1052
1053 m_actionAddPoint->setEnabled(canSplitAtSegment);
1054
1055 m_actionLineSegment->setEnabled(canConvertSegmentToLine);
1056 m_actionCurveSegment->setEnabled(canConvertSegmentToCurve);
1057
1058 m_actionBreakSegment->setEnabled(canSplitAtSegment);
1059 m_actionBreakSelection->setEnabled(canSplitAtSegment | canBreakAtPoint);
1060
1062 bool haveConvertibleShapes = false;
1063 Q_FOREACH (KoShape *shape, selection->selectedEditableShapes()) {
1064 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
1065 KoSvgTextShape *textShape = dynamic_cast<KoSvgTextShape*>(shape);
1066 if (textShape ||
1067 (parameterShape && parameterShape->isParametricShape())) {
1068
1069 haveConvertibleShapes = true;
1070 break;
1071 }
1072 }
1073 m_actionConvertToPath->setEnabled(haveConvertibleShapes);
1074}
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 958 of file KoPathTool.cpp.

959{
960 PathToolOptionWidget::Types type;
962 Q_FOREACH (KoPathShape *shape, selectedShapes) {
963 KoParameterShape * parameterShape = dynamic_cast<KoParameterShape*>(shape);
964 type |= parameterShape && parameterShape->isParametricShape() ?
966 }
967
968 Q_EMIT singleShapeChanged(selectedShapes.size() == 1 ? selectedShapes.first() : 0);
969 Q_EMIT typeChanged(type);
970}

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 123 of file KoPathTool.h.

Member Data Documentation

◆ m_actionAddPoint

QAction* KoPathTool::m_actionAddPoint
private

Definition at line 134 of file KoPathTool.h.

◆ m_actionBreakPoint

QAction* KoPathTool::m_actionBreakPoint
private

Definition at line 136 of file KoPathTool.h.

◆ m_actionBreakSegment

QAction* KoPathTool::m_actionBreakSegment
private

Definition at line 137 of file KoPathTool.h.

◆ m_actionBreakSelection

QAction* KoPathTool::m_actionBreakSelection
private

Definition at line 138 of file KoPathTool.h.

◆ m_actionConvertToPath

QAction* KoPathTool::m_actionConvertToPath
private

Definition at line 141 of file KoPathTool.h.

◆ m_actionCurvePoint

QAction* KoPathTool::m_actionCurvePoint
private

Definition at line 130 of file KoPathTool.h.

◆ m_actionCurveSegment

QAction* KoPathTool::m_actionCurveSegment
private

Definition at line 133 of file KoPathTool.h.

◆ m_actionJoinSegment

QAction* KoPathTool::m_actionJoinSegment
private

Definition at line 139 of file KoPathTool.h.

◆ m_actionLinePoint

QAction* KoPathTool::m_actionLinePoint
private

Definition at line 131 of file KoPathTool.h.

◆ m_actionLineSegment

QAction* KoPathTool::m_actionLineSegment
private

Definition at line 132 of file KoPathTool.h.

◆ m_actionMergePoints

QAction* KoPathTool::m_actionMergePoints
private

Definition at line 140 of file KoPathTool.h.

◆ m_actionPathPointCorner

QAction* KoPathTool::m_actionPathPointCorner
private

Definition at line 127 of file KoPathTool.h.

◆ m_actionPathPointSmooth

QAction* KoPathTool::m_actionPathPointSmooth
private

Definition at line 128 of file KoPathTool.h.

◆ m_actionPathPointSymmetric

QAction* KoPathTool::m_actionPathPointSymmetric
private

Definition at line 129 of file KoPathTool.h.

◆ m_actionRemovePoint

QAction* KoPathTool::m_actionRemovePoint
private

Definition at line 135 of file KoPathTool.h.

◆ m_activeHandle

QScopedPointer<KoPathToolHandle> KoPathTool::m_activeHandle
private

the currently active handle

Definition at line 118 of file KoPathTool.h.

◆ m_activeSegment

QScopedPointer<PathSegment> KoPathTool::m_activeSegment
private

Definition at line 120 of file KoPathTool.h.

◆ m_canvasConnections

KisSignalAutoConnectionsStore KoPathTool::m_canvasConnections
private

Definition at line 145 of file KoPathTool.h.

◆ m_contextMenu

QScopedPointer<QMenu> KoPathTool::m_contextMenu
private

Definition at line 143 of file KoPathTool.h.

◆ m_currentStrategy

QScopedPointer<KoInteractionStrategy> KoPathTool::m_currentStrategy
private

the rubber selection strategy

Definition at line 125 of file KoPathTool.h.

◆ m_lastPoint

QPointF KoPathTool::m_lastPoint
private

needed for interaction strategy

Definition at line 119 of file KoPathTool.h.

◆ m_moveCursor

QCursor KoPathTool::m_moveCursor
private

Definition at line 142 of file KoPathTool.h.

◆ m_pointSelection

KoPathToolSelection KoPathTool::m_pointSelection
protected

the point selection

Definition at line 114 of file KoPathTool.h.

◆ m_selectCursor

QCursor KoPathTool::m_selectCursor
protected

Definition at line 115 of file KoPathTool.h.

◆ m_shapeFillResourceConnector

KoShapeFillResourceConnector KoPathTool::m_shapeFillResourceConnector
private

Definition at line 146 of file KoPathTool.h.

◆ m_textOutlineHelper

QScopedPointer<KoSvgTextShapeOutlineHelper> KoPathTool::m_textOutlineHelper
private

Definition at line 144 of file KoPathTool.h.


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