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

#include <kis_tool_line.h>

+ Inheritance diagram for KisToolLine:

Public Member Functions

void activate (const QSet< KoShape * > &shapes) override
 
void beginPrimaryAction (KoPointerEvent *event) override
 
void continuePrimaryAction (KoPointerEvent *event) override
 
void deactivate () override
 
void endPrimaryAction (KoPointerEvent *event) override
 
 KisToolLine (KoCanvasBase *canvas)
 
void paint (QPainter &gc, const KoViewConverter &converter) override
 
bool primaryActionSupportsHiResEvents () const override
 
QString quickHelp () const override
 
void requestStrokeCancellation () override
 
void requestStrokeEnd () override
 
bool supportsPaintingAssistants () const override
 
 ~KisToolLine () override
 
- Public Member Functions inherited from KisToolShape
int flags () const override
 
 KisToolShape (KoCanvasBase *canvas, const QCursor &cursor)
 
 ~KisToolShape () override
 
- Public Member Functions inherited from KisToolPaint
 KisToolPaint (KoCanvasBase *canvas, const QCursor &cursor)
 
void mouseMoveEvent (KoPointerEvent *event) override
 
void mousePressEvent (KoPointerEvent *event) override
 
void mouseReleaseEvent (KoPointerEvent *event) override
 
KisPopupWidgetInterfacepopupWidget () override
 
 ~KisToolPaint () override
 
- Public Member Functions inherited from KisTool
virtual bool alternateActionSupportsHiResEvents (AlternateAction action) const
 
virtual void beginAlternateDoubleClickAction (KoPointerEvent *event, AlternateAction action)
 
virtual void beginPrimaryDoubleClickAction (KoPointerEvent *event)
 
void deleteSelection () override
 
bool isActive () const
 
 KisTool (KoCanvasBase *canvas, const QCursor &cursor)
 
void mouseDoubleClickEvent (KoPointerEvent *event) override
 
void mouseTripleClickEvent (KoPointerEvent *event) override
 
virtual void newActivationWithExternalSource (KisPaintDeviceSP externalSource)
 newActivationWithExternalSource Makes sure that the tool is active and starts a new stroke, which will be able to access the pixels from the specified external source.
 
KisTool::NodePaintAbility nodePaintAbility ()
 
 ~KisTool () override
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- 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 ()
 
virtual QRectF decorationsRect () const
 
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 deselect ()
 deselect the tool should clear the selection if it has one.
 
virtual void dragLeaveEvent (QDragLeaveEvent *event)
 
virtual void dragMoveEvent (QDragMoveEvent *event, const QPointF &point)
 
virtual void dropEvent (QDropEvent *event, const QPointF &point)
 
virtual void explicitUserStrokeEndRequest ()
 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.
 
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
 
virtual void keyPressEvent (QKeyEvent *event)
 
virtual void keyReleaseEvent (QKeyEvent *event)
 
 KoToolBase (KoCanvasBase *canvas)
 
bool maskSyntheticEvents () const
 
QList< QPointer< QWidget > > optionWidgets ()
 
virtual bool paste ()
 
virtual QMenu * popupActionsMenu ()
 
virtual bool selectAll ()
 selectAll select all data the tool can select.
 
virtual KoToolSelectionselection ()
 
Q_INVOKABLE QString toolId () const
 
virtual bool wantsAutoScroll () const
 
 ~KoToolBase () override
 

Protected Slots

void resetCursorStyle () override
 
- Protected Slots inherited from KisTool
virtual void resetCursorStyle ()
 

Private Slots

void setShowGuideline (bool value)
 
void setShowPreview (bool value)
 
void setSnapEraser (bool value)
 
void setSnapToAssistants (bool value)
 
void setUseSensors (bool value)
 
void updateStroke ()
 

Private Member Functions

void cancelStroke ()
 
QWidget * createOptionWidget () override
 
void endStroke ()
 
void paintLine (QPainter &gc, const QRect &rc)
 
void showSize ()
 
QPointF snapToAssistants (QPointF point)
 
QPointF straightLine (QPointF point)
 
void updateGuideline ()
 
void updatePreviewTimer (bool showGuide)
 

Private Attributes

KConfigGroup configGroup
 
QCheckBox * m_chkShowGuideline {nullptr}
 
QCheckBox * m_chkShowPreview {nullptr}
 
QCheckBox * m_chkSnapEraser {nullptr}
 
QCheckBox * m_chkSnapToAssistants {nullptr}
 
QCheckBox * m_chkUseSensors {nullptr}
 
QPointF m_endPoint
 
QScopedPointer< KisToolLineHelperm_helper
 
QScopedPointer< KisPaintingInformationBuilderm_infoBuilder
 
QPointF m_lastUpdatedPoint
 
KisSignalCompressor m_longStrokeUpdateCompressor
 
QPointF m_originalStartPoint
 
bool m_showGuideline {true}
 
QPointF m_startPoint
 
bool m_strokeIsRunning {false}
 
KisSignalCompressor m_strokeUpdateCompressor
 

Additional Inherited Members

- Public Types inherited from KisTool
enum  { FLAG_USES_CUSTOM_PRESET =0x01 , FLAG_USES_CUSTOM_COMPOSITEOP =0x02 , FLAG_USES_CUSTOM_SIZE =0x04 }
 
enum  AlternateAction {
  ChangeSize = AlternateChangeSize , ChangeSizeSnap = AlternateChangeSizeSnap , SampleFgNode = AlternateSampleFgNode , SampleBgNode = AlternateSampleBgNode ,
  SampleFgImage = AlternateSampleFgImage , SampleBgImage = AlternateSampleBgImage , Secondary = AlternateSecondary , Third = AlternateThird ,
  Fourth = AlternateFourth , Fifth = AlternateFifth , NONE = 10000
}
 
enum  NodePaintAbility {
  VECTOR , CLONE , PAINT , UNPAINTABLE ,
  MYPAINTBRUSH_UNPAINTABLE
}
 
enum  ToolAction {
  Primary , AlternateChangeSize , AlternateChangeSizeSnap , AlternateSampleFgNode ,
  AlternateSampleBgNode , AlternateSampleFgImage , AlternateSampleBgImage , AlternateSecondary ,
  AlternateThird , AlternateFourth , AlternateFifth , Alternate_NONE = 10000
}
 
- Public Slots inherited from KisToolShape
void activate (const QSet< KoShape * > &shapes) override
 
virtual void fillSettingChanged (int value)
 
virtual void outlineSettingChanged (int value)
 
virtual void patternRotationSettingChanged (qreal value)
 
virtual void patternScaleSettingChanged (qreal value)
 
- Public Slots inherited from KisToolPaint
void activate (const QSet< KoShape * > &shapes) override
 
void deactivate () override
 
- Public Slots inherited from KisTool
void activate (const QSet< KoShape * > &shapes) override
 
void canvasResourceChanged (int key, const QVariant &res) override
 
void deactivate () override
 
virtual void updateSettingsViews ()
 
- Public Slots inherited from KoToolBase
virtual void documentResourceChanged (int key, const QVariant &res)
 
virtual void repaintDecorations ()
 
virtual void requestRedoDuringStroke ()
 
virtual void requestUndoDuringStroke ()
 
void setStatusText (const QString &statusText)
 
void updateOptionsWidgetIcons ()
 
- Signals inherited from KisToolPaint
void sigPaintingFinished ()
 
- Signals inherited from KisTool
void isActiveChanged (bool isActivated)
 
- 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)
 
- Static Public Member Functions inherited from KisTool
static AlternateAction actionToAlternateAction (ToolAction action)
 
- Public Attributes inherited from KisToolShape
WdgGeometryOptionsm_shapeOptionsWidget
 
- Public Attributes inherited from KisTool
KoColor currentBgColor
 
float currentExposure {1.0}
 
KoColor currentFgColor
 
KisFilterConfigurationSP currentGenerator
 
KoAbstractGradientSP currentGradient
 
KoPatternSP currentPattern
 
QCursor cursor
 
bool m_isActive {false}
 
ToolMode m_mode {HOVER_MODE}
 
QWidget * optionWidget {0}
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Protected Types inherited from KisTool
enum  ToolMode : int {
  HOVER_MODE , PAINT_MODE , SECONDARY_PAINT_MODE , MIRROR_AXIS_SETUP_MODE ,
  GESTURE_MODE , PAN_MODE , OTHER , OTHER_1
}
 
- Protected Member Functions inherited from KisToolShape
void addPathShape (KoPathShape *pathShape, const KUndo2MagicString &name)
 
void addShape (KoShape *shape)
 
virtual void beginShape ()
 
QWidget * createOptionWidget () override
 
qreal currentStrokeWidth () const
 
virtual void endShape ()
 
KisToolShapeUtils::FillStyle fillStyle ()
 
QTransform fillTransform ()
 
ShapeAddInfo shouldAddShape (KisNodeSP currentNode) const
 
KisToolShapeUtils::StrokeStyle strokeStyle ()
 
- Protected Member Functions inherited from KisToolPaint
void activateAlternateAction (AlternateAction action) override
 
void activatePrimaryAction () override
 
void addOptionWidgetLayout (QLayout *layout)
 Add the tool-specific layout to the default option widget layout.
 
virtual void addOptionWidgetOption (QWidget *control, QWidget *label=nullptr)
 Add a widget and a label to the current option widget layout.
 
void beginAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
void canvasResourceChanged (int key, const QVariant &v) override
 
void continueAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
void deactivateAlternateAction (AlternateAction action) override
 
void deactivatePrimaryAction () override
 
void enableControl (QWidget *control, bool value)
 
void endAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
virtual KisOptimizedBrushOutline getOutlinePath (const QPointF &documentPos, const KoPointerEvent *event, KisPaintOpSettings::OutlineMode outlineMode)
 
bool isEraser () const
 
bool isOutlineEnabled () const
 
bool isOutlineVisible () const
 
void paint (QPainter &gc, const KoViewConverter &converter) override
 
virtual void requestUpdateOutline (const QPointF &outlineDocPoint, const KoPointerEvent *event)
 
void setMode (ToolMode mode) override
 
void setOutlineEnabled (bool enabled)
 
void setOutlineVisible (bool visible)
 
void setSupportOutline (bool supportOutline)
 
void showControl (QWidget *control, bool value)
 
- Protected Member Functions inherited from KisTool
bool blockUntilOperationsFinished ()
 
void blockUntilOperationsFinishedForced ()
 
QPointF convertDocumentToWidget (const QPointF &pt)
 
QPoint convertToImagePixelCoordFloored (KoPointerEvent *e)
 
QPointF convertToPixelCoord (const QPointF &pt)
 
QPointF convertToPixelCoord (KoPointerEvent *e)
 
QPointF convertToPixelCoordAndAlignOnWidget (const QPointF &pt)
 
QPointF convertToPixelCoordAndSnap (const QPointF &pt, const QPointF &offset=QPointF())
 
QPointF convertToPixelCoordAndSnap (KoPointerEvent *e, const QPointF &offset=QPointF(), bool useModifiers=true)
 
QRectF convertToPt (const QRectF &rect)
 
qreal convertToPt (qreal value)
 
KoColor currentBgColor ()
 
KoColor currentFgColor ()
 
KisFilterConfigurationSP currentGenerator ()
 
KoAbstractGradientSP currentGradient ()
 
KisImageWSP currentImage ()
 
KisNodeSP currentNode () const
 
KisPaintOpPresetSP currentPaintOpPreset ()
 
KoPatternSP currentPattern ()
 
QCursor cursor () const
 
KisImageWSP image () const
 
virtual bool listeningToModifiers ()
 
virtual void listenToModifiers (bool listen)
 
virtual ToolMode mode () const
 
bool nodeEditable ()
 Checks checks if the current node is editable.
 
bool overrideCursorIfNotEditable ()
 Override the cursor appropriately if current node is not editable.
 
void paintToolOutline (QPainter *painter, const KisOptimizedBrushOutline &path)
 
KisOptimizedBrushOutline pixelToView (const KisOptimizedBrushOutline &path) const
 
QPainterPath pixelToView (const QPainterPath &pixelPath) const
 Convert a pixel path into a view path.
 
QPointF pixelToView (const QPoint &pixelCoord) const
 
QPointF pixelToView (const QPointF &pixelCoord) const
 Convert a floating point pixel coordinate into a view coordinate.
 
QPolygonF pixelToView (const QPolygonF &pixelPolygon) const
 Convert a pixel polygon into a view path.
 
QRectF pixelToView (const QRectF &pixelRect) const
 Convert a pixel rectangle into a view rectangle.
 
KisNodeList selectedNodes () const
 
bool selectionEditable ()
 Checks checks if the selection is editable, only applies to local selection as global selection is always editable.
 
void setCursor (const QCursor &cursor)
 
void updateCanvasPixelRect (const QRectF &pixelRect)
 Update the canvas for the given rectangle in image pixel coordinates.
 
void updateCanvasViewRect (const QRectF &viewRect)
 Update the canvas for the given rectangle in view coordinates.
 
QPointF viewToPixel (const QPointF &viewCoord) const
 
QPointF widgetCenterInWidgetPixels ()
 
- Protected Member Functions inherited from KoToolBase
virtual QList< QPointer< QWidget > > createOptionWidgets ()
 
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 inherited from KisToolShape
KConfigGroup m_configGroup
 
- Protected Attributes inherited from KisToolPaint
KisOptimizedBrushOutline m_currentOutline
 
QRectF m_oldColorPreviewUpdateRect
 
QRectF m_oldOutlineRect
 
QPointF m_outlineDocPoint
 
bool m_paintOutline {false}
 
- Protected Attributes inherited from KoToolBase
KoToolBasePrivated_ptr
 
- Properties inherited from KisTool
bool isActive
 

Detailed Description

Definition at line 34 of file kis_tool_line.h.

Constructor & Destructor Documentation

◆ KisToolLine()

KisToolLine::KisToolLine ( KoCanvasBase * canvas)

Definition at line 46 of file kis_tool_line.cc.

47 : KisToolShape(canvas, KisCursor::load("tool_line_cursor.png", 6, 6)),
48 m_showGuideline(true),
49 m_strokeIsRunning(false),
53 kundo2_i18n("Draw Line"))),
56{
57 setObjectName("tool_line");
58
60
62
63 connect(&m_strokeUpdateCompressor, SIGNAL(timeout()), SLOT(updateStroke()));
64 connect(&m_longStrokeUpdateCompressor, SIGNAL(timeout()), SLOT(updateStroke()));
65
66 KisCanvas2 *kritaCanvas = dynamic_cast<KisCanvas2*>(canvas);
67
68 connect(kritaCanvas->viewManager()->canvasResourceProvider(), SIGNAL(sigEffectiveCompositeOpChanged()), SLOT(resetCursorStyle()));
69}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisViewManager * viewManager() const
static QCursor load(const QString &cursorName, int hotspotX=-1, int hotspotY=-1)
KisSignalCompressor m_strokeUpdateCompressor
bool m_showGuideline
bool m_strokeIsRunning
QScopedPointer< KisToolLineHelper > m_helper
QScopedPointer< KisPaintingInformationBuilder > m_infoBuilder
void resetCursorStyle() override
KisSignalCompressor m_longStrokeUpdateCompressor
void updateStroke()
void setSupportOutline(bool supportOutline)
KisToolShape(KoCanvasBase *canvas, const QCursor &cursor)
KisCanvasResourceProvider * canvasResourceProvider()
QPointer< KoCanvasResourceProvider > resourceManager
void setIsOpacityPresetMode(bool value)
const KisCoordinatesConverter * getCoordinatesConverter(KoCanvasBase *canvas)
KUndo2MagicString kundo2_i18n(const char *text)
KisCanvas2 * canvas

References Private::canvas, KisViewManager::canvasResourceProvider(), connect(), m_longStrokeUpdateCompressor, m_strokeUpdateCompressor, resetCursorStyle(), KoToolBase::setIsOpacityPresetMode(), KisToolPaint::setSupportOutline(), updateStroke(), and KisCanvas2::viewManager().

◆ ~KisToolLine()

KisToolLine::~KisToolLine ( )
override

Definition at line 71 of file kis_tool_line.cc.

72{
73}

Member Function Documentation

◆ activate()

void KisToolLine::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 86 of file kis_tool_line.cc.

87{
89 configGroup = KSharedConfig::openConfig()->group(toolId());
90}
KConfigGroup configGroup
void activate(const QSet< KoShape * > &shapes) override
Q_INVOKABLE QString toolId() const

References KisToolPaint::activate(), configGroup, and KoToolBase::toolId().

◆ beginPrimaryAction()

void KisToolLine::beginPrimaryAction ( KoPointerEvent * event)
overridevirtual

Called by KisToolProxy when a primary action for the tool is started. The event stores the original event that started the stroke. The event is accepted by default. If the tool decides to ignore this particular action (e.g. when the node is not editable), it should call event->ignore(). Then no further continuePrimaryAction() or endPrimaryAction() will be called until the next user action.

Reimplemented from KisTool.

Definition at line 202 of file kis_tool_line.cc.

203{
204 NodePaintAbility nodeAbility = nodePaintAbility();
205 if (nodeAbility == UNPAINTABLE || !nodeEditable()) {
206 event->ignore();
207 return;
208 }
209
210 if (nodeAbility == MYPAINTBRUSH_UNPAINTABLE) {
211 KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas());
212 QString message = i18n("The MyPaint Brush Engine is not available for this colorspace");
213 kiscanvas->viewManager()->showFloatingMessage(message, koIcon("object-locked"));
214 event->ignore();
215 return;
216 }
217
219
220 const KisToolShape::ShapeAddInfo info =
222
223 // Always show guideline on vector layers
224 m_showGuideline = m_chkShowGuideline->isChecked() || nodeAbility != PAINT;
226 m_helper->setEnabled((nodeAbility == PAINT && !info.shouldAddShape) || info.shouldAddSelectionShape);
227 m_helper->setUseSensors(m_chkUseSensors->isChecked());
228 m_helper->start(event, canvas()->resourceManager());
229
234
235 m_strokeIsRunning = true;
236
237 showSize();
238}
QCheckBox * m_chkUseSensors
QPointF m_startPoint
QCheckBox * m_chkShowGuideline
QPointF m_endPoint
QPointF m_originalStartPoint
QPointF m_lastUpdatedPoint
void updatePreviewTimer(bool showGuide)
void setMode(ToolMode mode) override
ShapeAddInfo shouldAddShape(KisNodeSP currentNode) const
void showFloatingMessage(const QString &message, const QIcon &icon, int timeout=4500, KisFloatingMessage::Priority priority=KisFloatingMessage::Medium, int alignment=Qt::AlignCenter|Qt::TextWordWrap)
shows a floating message in the top right corner of the canvas
#define koIcon(name)
Use these macros for icons without any issues.
Definition kis_icon.h:25
KisTool::NodePaintAbility nodePaintAbility()
Definition kis_tool.cc:539
bool nodeEditable()
Checks checks if the current node is editable.
Definition kis_tool.cc:651
KisNodeSP currentNode() const
Definition kis_tool.cc:370
@ PAINT_MODE
Definition kis_tool.h:300
QPointF convertToPixelCoordAndSnap(KoPointerEvent *e, const QPointF &offset=QPointF(), bool useModifiers=true)
Definition kis_tool.cc:214
NodePaintAbility
Definition kis_tool.h:148
@ MYPAINTBRUSH_UNPAINTABLE
Definition kis_tool.h:153
@ UNPAINTABLE
Definition kis_tool.h:152

References Private::canvas, KisTool::convertToPixelCoordAndSnap(), KisTool::currentNode(), koIcon, m_chkShowGuideline, m_chkUseSensors, m_endPoint, m_helper, m_lastUpdatedPoint, m_originalStartPoint, m_showGuideline, m_startPoint, m_strokeIsRunning, KisTool::MYPAINTBRUSH_UNPAINTABLE, KisTool::nodeEditable(), KisTool::nodePaintAbility(), KisTool::PAINT, KisTool::PAINT_MODE, KisToolPaint::setMode(), KisToolShape::ShapeAddInfo::shouldAddSelectionShape, KisToolShape::ShapeAddInfo::shouldAddShape, KisToolShape::shouldAddShape(), KisViewManager::showFloatingMessage(), showSize(), KisTool::UNPAINTABLE, updatePreviewTimer(), and KisCanvas2::viewManager().

◆ cancelStroke()

void KisToolLine::cancelStroke ( )
private

The actual stroke is run by the timer so it is a legal situation when m_strokeIsRunning is true, but the actual redraw stroke is not running.

Definition at line 366 of file kis_tool_line.cc.

367{
368 if (!m_strokeIsRunning) return;
369 if (m_startPoint == m_endPoint) return;
370
376 if (m_helper->isRunning()) {
377 m_helper->cancel();
378 }
379
380 m_strokeIsRunning = false;
382}

References m_endPoint, m_helper, m_startPoint, and m_strokeIsRunning.

◆ continuePrimaryAction()

void KisToolLine::continuePrimaryAction ( KoPointerEvent * event)
overridevirtual

Called by KisToolProxy when the primary action is in progress of pointer movement. If the tool has ignored the event in beginPrimaryAction(), this method will not be called.

Reimplemented from KisTool.

Definition at line 249 of file kis_tool_line.cc.

250{
252 if (!m_strokeIsRunning) return;
253
254 // First ensure the old guideline is deleted
256
257 QPointF pos = convertToPixelCoordAndSnap(event);
258
259 if (event->modifiers() == Qt::AltModifier) {
260 QPointF trans = pos - m_endPoint;
261 m_helper->translatePoints(trans);
262 m_startPoint += trans;
263 m_endPoint += trans;
264 m_originalStartPoint += trans; // original start point is only original in terms of snapping to assistants
265 } else if (event->modifiers() == Qt::ShiftModifier) {
266 pos = straightLine(pos);
267 m_helper->addPoint(event, pos);
268 } else {
269 pos = snapToAssistants(pos);
270 m_helper->addPoint(event, pos);
271 m_helper->movePointsTo(m_startPoint, pos);
272 }
273 m_endPoint = pos;
274
275 // Draw preview if requested
276 if (m_chkShowPreview->isChecked()) {
277 // If the cursor has moved a significant amount, immediately clear the
278 // current preview and redraw. Otherwise, do slow redraws periodically.
279 auto updateDistance = (pixelToView(m_lastUpdatedPoint) - pixelToView(pos)).manhattanLength();
280 if (updateDistance > 10) {
281 m_helper->clearPaint();
284 m_lastUpdatedPoint = pos;
285 } else if (updateDistance > 1 && !m_strokeUpdateCompressor.isActive() && !m_longStrokeUpdateCompressor.isActive()) {
287 m_lastUpdatedPoint = pos;
288 }
289 }
290
291 if(event->modifiers() == Qt::AltModifier) {
292 KisCanvas2 *kisCanvas =dynamic_cast<KisCanvas2*>(canvas());
293 KIS_ASSERT(kisCanvas);
294 kisCanvas->viewManager()->showFloatingMessage(i18n("X: %1 px\nY: %2 px", QString::number(m_startPoint.x(), 'f',1)
295 , QString::number(m_startPoint.y(), 'f',1))
296 , QIcon(), 1000, KisFloatingMessage::High, Qt::AlignLeft | Qt::TextWordWrap | Qt::AlignVCenter);
297 }
298 else {
299 showSize();
300 }
301
304}
QPointF snapToAssistants(QPointF point)
QCheckBox * m_chkShowPreview
QPointF straightLine(QPointF point)
void updateGuideline()
virtual void requestUpdateOutline(const QPointF &outlineDocPoint, const KoPointerEvent *event)
Qt::KeyboardModifiers modifiers() const
QPointF point
The point in document coordinates.
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
#define CHECK_MODE_SANITY_OR_RETURN(_mode)
Definition kis_tool.h:27
QPointF pixelToView(const QPoint &pixelCoord) const
Definition kis_tool.cc:269

References Private::canvas, CHECK_MODE_SANITY_OR_RETURN, KisTool::convertToPixelCoordAndSnap(), KisFloatingMessage::High, KisSignalCompressor::isActive(), KIS_ASSERT, m_chkShowPreview, m_endPoint, m_helper, m_lastUpdatedPoint, m_longStrokeUpdateCompressor, m_originalStartPoint, m_startPoint, m_strokeIsRunning, m_strokeUpdateCompressor, KoPointerEvent::modifiers(), KisTool::PAINT_MODE, KisTool::pixelToView(), KoPointerEvent::point, KisToolPaint::requestUpdateOutline(), KisViewManager::showFloatingMessage(), showSize(), snapToAssistants(), KisSignalCompressor::start(), KisSignalCompressor::stop(), straightLine(), updateGuideline(), and KisCanvas2::viewManager().

◆ createOptionWidget()

QWidget * KisToolLine::createOptionWidget ( )
overrideprivatevirtual

Reimplement this if your tool actually has an option widget. Sets the option widget to 0 by default.

Reimplemented from KisTool.

Definition at line 98 of file kis_tool_line.cc.

99{
100 QWidget* widget = KisToolPaint::createOptionWidget();
101
102 m_chkUseSensors = new QCheckBox(i18n("Use sensors"));
104
105 m_chkShowPreview = new QCheckBox(i18n("Show Preview"));
107
108 m_chkShowGuideline = new QCheckBox(i18n("Show Guideline"));
110
111 m_chkSnapToAssistants = new QCheckBox(i18n("Snap to Assistants"));
113
114 m_chkSnapEraser = new QCheckBox(i18n("Snap Eraser"));
116
117
118
119
120 // hook up connections for value changing
121 connect(m_chkUseSensors, SIGNAL(clicked(bool)), this, SLOT(setUseSensors(bool)) );
122 connect(m_chkShowPreview, SIGNAL(clicked(bool)), this, SLOT(setShowPreview(bool)) );
123 connect(m_chkShowGuideline, SIGNAL(clicked(bool)), this, SLOT(setShowGuideline(bool)) );
124 connect(m_chkSnapToAssistants, SIGNAL(clicked(bool)), this, SLOT(setSnapToAssistants(bool)) );
125
126
127 // read values in from configuration
128 m_chkUseSensors->setChecked(configGroup.readEntry("useSensors", true));
129 m_chkShowPreview->setChecked(configGroup.readEntry("showPreview", true));
130 m_chkShowGuideline->setChecked(configGroup.readEntry("showGuideline", true));
131 m_chkSnapToAssistants->setChecked(configGroup.readEntry("snapToAssistants", false));
132 m_chkSnapEraser->setChecked(configGroup.readEntry("snapEraser", false));
133 if (!m_chkSnapToAssistants->isChecked()) {
134 m_chkSnapEraser->setEnabled(false);
135 }
136
137 return widget;
138}
void setShowPreview(bool value)
void setSnapToAssistants(bool value)
void setUseSensors(bool value)
QCheckBox * m_chkSnapToAssistants
void setShowGuideline(bool value)
QCheckBox * m_chkSnapEraser
QWidget * createOptionWidget() override
virtual void addOptionWidgetOption(QWidget *control, QWidget *label=nullptr)
Add a widget and a label to the current option widget layout.

References KisToolPaint::addOptionWidgetOption(), configGroup, connect(), KisToolPaint::createOptionWidget(), m_chkShowGuideline, m_chkShowPreview, m_chkSnapEraser, m_chkSnapToAssistants, m_chkUseSensors, setShowGuideline(), setShowPreview(), setSnapToAssistants(), and setUseSensors().

◆ deactivate()

void KisToolLine::deactivate ( )
overridevirtual

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

See also
activate()

Reimplemented from KoToolBase.

Definition at line 92 of file kis_tool_line.cc.

93{
96}
void cancelStroke()
void deactivate() override

References cancelStroke(), and KisToolPaint::deactivate().

◆ endPrimaryAction()

void KisToolLine::endPrimaryAction ( KoPointerEvent * event)
overridevirtual

Called by KisToolProxy when the primary action is being finished, that is while mouseRelease or tabletRelease event. If the tool has ignored the event in beginPrimaryAction(), this method will not be called.

Reimplemented from KisTool.

Definition at line 306 of file kis_tool_line.cc.

307{
308 Q_UNUSED(event);
311
313 endStroke();
314
315 if (static_cast<KisCanvas2*>(canvas())->paintingAssistantsDecoration()) {
316 static_cast<KisCanvas2*>(canvas())->paintingAssistantsDecoration()->endStroke();
317 }
318}
@ HOVER_MODE
Definition kis_tool.h:299

References Private::canvas, CHECK_MODE_SANITY_OR_RETURN, endStroke(), KisTool::HOVER_MODE, KisTool::PAINT_MODE, KisToolPaint::setMode(), and updateGuideline().

◆ endStroke()

void KisToolLine::endStroke ( )
private

Definition at line 326 of file kis_tool_line.cc.

327{
328 NodePaintAbility nodeAbility = nodePaintAbility();
329
330 if (!m_strokeIsRunning || m_startPoint == m_endPoint || nodeAbility == UNPAINTABLE) {
331 m_helper->clearPoints();
332 return;
333 }
334
335 const KisToolShape::ShapeAddInfo info =
337
338 if ((nodeAbility == PAINT && !info.shouldAddShape) || info.shouldAddSelectionShape) {
339 updateStroke();
340 m_helper->end();
341 }
342 else {
343 KisResourcesSnapshot resources(image(),
344 currentNode(),
345 canvas()->resourceManager());
346 KoPathShape* path = new KoPathShape();
347 path->setShapeId(KoPathShapeId);
348
349 QTransform resolutionMatrix;
350 resolutionMatrix.scale(1 / currentImage()->xRes(), 1 / currentImage()->yRes());
351 path->moveTo(resolutionMatrix.map(m_startPoint));
352 path->lineTo(resolutionMatrix.map(m_endPoint));
353 path->normalize();
354
355 KoShapeStrokeSP border(new KoShapeStroke(currentStrokeWidth(), resources.currentFgColor().toQColor()));
356 path->setStroke(border);
357
358 KUndo2Command * cmd = canvas()->shapeController()->addShape(path, nullptr);
359 canvas()->addCommand(cmd);
360 }
361
362 m_strokeIsRunning = false;
364}
#define KoPathShapeId
Definition KoPathShape.h:20
void addCommand(KUndo2Command *command) override
The KisResourcesSnapshot class takes a snapshot of the various resources like colors and settings use...
qreal currentStrokeWidth() const
QPointer< KoShapeController > shapeController
The position of a path point within a path shape.
Definition KoPathShape.h:63
KisImageWSP currentImage()
Definition kis_tool.cc:393
KisImageWSP image() const
Definition kis_tool.cc:332

References KisCanvas2::addCommand(), Private::canvas, KisResourcesSnapshot::currentFgColor(), KisTool::currentImage(), KisTool::currentNode(), KisToolShape::currentStrokeWidth(), KisTool::image(), KoPathShapeId, m_endPoint, m_helper, m_startPoint, m_strokeIsRunning, KisTool::nodePaintAbility(), KisTool::PAINT, KoCanvasBase::shapeController, KisToolShape::ShapeAddInfo::shouldAddSelectionShape, KisToolShape::ShapeAddInfo::shouldAddShape, KisToolShape::shouldAddShape(), KoColor::toQColor(), KisTool::UNPAINTABLE, and updateStroke().

◆ paint()

void KisToolLine::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 192 of file kis_tool_line.cc.

193{
194 Q_UNUSED(converter);
195
196 if(mode() == KisTool::PAINT_MODE) {
197 paintLine(gc,QRect());
198 }
199 KisToolPaint::paint(gc,converter);
200}
void paintLine(QPainter &gc, const QRect &rc)
void paint(QPainter &gc, const KoViewConverter &converter) override
virtual ToolMode mode() const
Definition kis_tool.cc:407

References KisTool::mode(), KisToolPaint::paint(), KisTool::PAINT_MODE, and paintLine().

◆ paintLine()

void KisToolLine::paintLine ( QPainter & gc,
const QRect & rc )
private

Definition at line 449 of file kis_tool_line.cc.

450{
451 QPointF viewStartPos = pixelToView(m_startPoint);
452 QPointF viewStartEnd = pixelToView(m_endPoint);
453
454 if (m_showGuideline && canvas()) {
455 QPainterPath path;
456 path.moveTo(viewStartPos);
457 path.lineTo(viewStartEnd);
458 paintToolOutline(&gc, path);
459 }
460}
void paintToolOutline(QPainter *painter, const KisOptimizedBrushOutline &path)
Definition kis_tool.cc:589

References Private::canvas, m_endPoint, m_showGuideline, m_startPoint, KisTool::paintToolOutline(), and KisTool::pixelToView().

◆ primaryActionSupportsHiResEvents()

bool KisToolLine::primaryActionSupportsHiResEvents ( ) const
overridevirtual

Returns true if the tool can handle (and wants to handle) a very tight flow of input events from the tablet

Reimplemented from KisTool.

Definition at line 320 of file kis_tool_line.cc.

321{
322 return true;
323}

◆ quickHelp()

QString KisToolLine::quickHelp ( ) const
overridevirtual

Quick help is a short help text about the way the tool functions.

Reimplemented from KisToolPaint.

Definition at line 462 of file kis_tool_line.cc.

463{
464 return i18n("Alt+Drag will move the origin of the currently displayed line around, Shift+Drag will force you to draw straight lines");
465}

◆ requestStrokeCancellation()

void KisToolLine::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 167 of file kis_tool_line.cc.

168{
169 cancelStroke();
170}

References cancelStroke().

◆ requestStrokeEnd()

void KisToolLine::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 172 of file kis_tool_line.cc.

173{
174 // Terminate any in-progress strokes
175 if (nodePaintAbility() == PAINT && m_helper->isRunning()) {
176 endStroke();
177 }
178}

References endStroke(), m_helper, KisTool::nodePaintAbility(), and KisTool::PAINT.

◆ resetCursorStyle

void KisToolLine::resetCursorStyle ( )
overrideprotectedslot

Definition at line 75 of file kis_tool_line.cc.

76{
77 if (isEraser() && (nodePaintAbility() == PAINT)) {
78 useCursor(KisCursor::load("tool_line_eraser_cursor.png", 6, 6));
79 } else {
81 }
82
84}
bool isEraser() const
void useCursor(const QCursor &cursor)
virtual void resetCursorStyle()
Definition kis_tool.cc:613
bool overrideCursorIfNotEditable()
Override the cursor appropriately if current node is not editable.
Definition kis_tool.cc:618

References KisToolPaint::isEraser(), KisCursor::load(), KisTool::nodePaintAbility(), KisTool::overrideCursorIfNotEditable(), KisTool::PAINT, KisTool::resetCursorStyle(), and KoToolBase::useCursor().

◆ setShowGuideline

void KisToolLine::setShowGuideline ( bool value)
privateslot

Definition at line 145 of file kis_tool_line.cc.

146{
148 configGroup.writeEntry("showGuideline", value);
149}
float value(const T *src, size_t ch)

References configGroup, m_showGuideline, and value().

◆ setShowPreview

void KisToolLine::setShowPreview ( bool value)
privateslot

Definition at line 151 of file kis_tool_line.cc.

152{
153 configGroup.writeEntry("showPreview", value);
154}

References configGroup, and value().

◆ setSnapEraser

void KisToolLine::setSnapEraser ( bool value)
privateslot

Definition at line 162 of file kis_tool_line.cc.

163{
164 configGroup.writeEntry("snapEraser", value);
165}

References configGroup, and value().

◆ setSnapToAssistants

void KisToolLine::setSnapToAssistants ( bool value)
privateslot

Definition at line 156 of file kis_tool_line.cc.

157{
158 configGroup.writeEntry("snapToAssistants", value);
159 m_chkSnapEraser->setEnabled(value);
160}

References configGroup, m_chkSnapEraser, and value().

◆ setUseSensors

void KisToolLine::setUseSensors ( bool value)
privateslot

Definition at line 140 of file kis_tool_line.cc.

141{
142 configGroup.writeEntry("useSensors", value);
143}

References configGroup, and value().

◆ showSize()

void KisToolLine::showSize ( )
private

Definition at line 442 of file kis_tool_line.cc.

443{
444 KisCanvas2 *kisCanvas =dynamic_cast<KisCanvas2*>(canvas());
445 KIS_ASSERT(kisCanvas);
446 kisCanvas->viewManager()->showFloatingMessage(i18n("Length: %1 px", QString::number(QLineF(m_startPoint,m_endPoint).length(), 'f',1))
447 , QIcon(), 1000, KisFloatingMessage::High, Qt::AlignLeft | Qt::TextWordWrap | Qt::AlignVCenter);
448}
qreal length(const QPointF &vec)
Definition Ellipse.cc:82

References Private::canvas, KisFloatingMessage::High, KIS_ASSERT, length(), m_endPoint, m_startPoint, KisViewManager::showFloatingMessage(), and KisCanvas2::viewManager().

◆ snapToAssistants()

QPointF KisToolLine::snapToAssistants ( QPointF point)
private

Definition at line 407 of file kis_tool_line.cc.

408{
409 if (m_chkSnapToAssistants->isChecked() && static_cast<KisCanvas2*>(canvas())->paintingAssistantsDecoration()) {
410 KisCanvas2* c = static_cast<KisCanvas2*>(canvas());
413 QPointF startPoint = m_originalStartPoint;
414
415 // startPoint etc. are in image coordinates system (pixels)
416 // but assistants work in document coordinates system ("points")
417 QPointF startPointInDoc = getCoordinatesConverter(canvas())->imageToDocument(startPoint);
418 QPointF pointInDoc = getCoordinatesConverter(canvas())->imageToDocument(point);
419
420 c->paintingAssistantsDecoration()->adjustLine(pointInDoc, startPointInDoc);
422
423 startPoint = getCoordinatesConverter(canvas())->documentToImage(startPointInDoc);
424 point = getCoordinatesConverter(canvas())->documentToImage(pointInDoc);
425
426 m_startPoint = startPoint;
427 return point;
428 }
429 return point;
430}
KisPaintingAssistantsDecorationSP paintingAssistantsDecoration() const
_Private::Traits< T >::Result documentToImage(const T &obj) const
_Private::Traits< T >::Result imageToDocument(const T &obj) const
void setOnlyOneAssistantSnap(bool assistant)
sets whether we snap to only one assistant
void setEraserSnap(bool assistant)
sets whether eraser brushes snap
void adjustLine(QPointF &point, QPointF &strokeBegin)

References KisPaintingAssistantsDecoration::adjustLine(), Private::canvas, KisCoordinatesConverter::documentToImage(), getCoordinatesConverter(), KisCoordinatesConverter::imageToDocument(), m_chkSnapEraser, m_chkSnapToAssistants, m_originalStartPoint, m_startPoint, KisCanvas2::paintingAssistantsDecoration(), KisPaintingAssistantsDecoration::setAdjustedBrushPosition(), KisPaintingAssistantsDecoration::setEraserSnap(), and KisPaintingAssistantsDecoration::setOnlyOneAssistantSnap().

◆ straightLine()

QPointF KisToolLine::straightLine ( QPointF point)
private

Definition at line 384 of file kis_tool_line.cc.

385{
386 const QPointF lineVector = point - m_startPoint;
387 qreal lineAngle = std::atan2(lineVector.y(), lineVector.x());
388
389 if (lineAngle < 0) {
390 lineAngle += 2 * M_PI;
391 }
392
393 const qreal ANGLE_BETWEEN_CONSTRAINED_LINES = (2 * M_PI) / 24;
394
395 const quint32 constrainedLineIndex = static_cast<quint32>((lineAngle / ANGLE_BETWEEN_CONSTRAINED_LINES) + 0.5);
396 const qreal constrainedLineAngle = constrainedLineIndex * ANGLE_BETWEEN_CONSTRAINED_LINES;
397
398 const qreal lineLength = std::sqrt((lineVector.x() * lineVector.x()) + (lineVector.y() * lineVector.y()));
399
400 const QPointF constrainedLineVector(lineLength * std::cos(constrainedLineAngle), lineLength * std::sin(constrainedLineAngle));
401
402 const QPointF result = m_startPoint + constrainedLineVector;
403
404 return result;
405}
#define M_PI
Definition kis_global.h:111

References M_PI, and m_startPoint.

◆ supportsPaintingAssistants()

bool KisToolLine::supportsPaintingAssistants ( ) const
overridevirtual

Reimplemented from KisTool.

Definition at line 467 of file kis_tool_line.cc.

468{
469 return true;
470}

◆ updateGuideline()

void KisToolLine::updateGuideline ( )
private

Definition at line 433 of file kis_tool_line.cc.

434{
435 if (canvas()) {
436 QRectF bound(m_startPoint, m_endPoint);
437 canvas()->updateCanvas(convertToPt(bound.normalized().adjusted(-3, -3, 3, 3)));
438 }
439}
void updateCanvas(const QRectF &rc) override
QRectF convertToPt(const QRectF &rect)
Definition kis_tool.cc:252

References Private::canvas, KisTool::convertToPt(), m_endPoint, m_startPoint, and KisCanvas2::updateCanvas().

◆ updatePreviewTimer()

void KisToolLine::updatePreviewTimer ( bool showGuide)
private

Definition at line 180 of file kis_tool_line.cc.

181{
182 // If the user disables the guideline, we will want to try to draw some
183 // preview lines even if they're slow, so set the timer to FIRST_ACTIVE.
184 if (showGuideline) {
186 } else {
188 }
189}

References KisSignalCompressor::FIRST_ACTIVE, m_strokeUpdateCompressor, KisSignalCompressor::POSTPONE, and KisSignalCompressor::setMode().

◆ updateStroke

void KisToolLine::updateStroke ( )
privateslot

Definition at line 240 of file kis_tool_line.cc.

241{
242 if (!m_strokeIsRunning) return;
243
244 m_helper->repaintLine(image(),
245 currentNode(),
246 image().data());
247}

References KisTool::currentNode(), KisTool::image(), m_helper, and m_strokeIsRunning.

Member Data Documentation

◆ configGroup

KConfigGroup KisToolLine::configGroup
private

Definition at line 104 of file kis_tool_line.h.

◆ m_chkShowGuideline

QCheckBox* KisToolLine::m_chkShowGuideline {nullptr}
private

Definition at line 95 of file kis_tool_line.h.

95{nullptr};

◆ m_chkShowPreview

QCheckBox* KisToolLine::m_chkShowPreview {nullptr}
private

Definition at line 94 of file kis_tool_line.h.

94{nullptr};

◆ m_chkSnapEraser

QCheckBox* KisToolLine::m_chkSnapEraser {nullptr}
private

Definition at line 97 of file kis_tool_line.h.

97{nullptr};

◆ m_chkSnapToAssistants

QCheckBox* KisToolLine::m_chkSnapToAssistants {nullptr}
private

Definition at line 96 of file kis_tool_line.h.

96{nullptr};

◆ m_chkUseSensors

QCheckBox* KisToolLine::m_chkUseSensors {nullptr}
private

Definition at line 93 of file kis_tool_line.h.

93{nullptr};

◆ m_endPoint

QPointF KisToolLine::m_endPoint
private

Definition at line 86 of file kis_tool_line.h.

◆ m_helper

QScopedPointer<KisToolLineHelper> KisToolLine::m_helper
private

Definition at line 100 of file kis_tool_line.h.

◆ m_infoBuilder

QScopedPointer<KisPaintingInformationBuilder> KisToolLine::m_infoBuilder
private

Definition at line 99 of file kis_tool_line.h.

◆ m_lastUpdatedPoint

QPointF KisToolLine::m_lastUpdatedPoint
private

Definition at line 88 of file kis_tool_line.h.

◆ m_longStrokeUpdateCompressor

KisSignalCompressor KisToolLine::m_longStrokeUpdateCompressor
private

Definition at line 102 of file kis_tool_line.h.

◆ m_originalStartPoint

QPointF KisToolLine::m_originalStartPoint
private

Definition at line 87 of file kis_tool_line.h.

◆ m_showGuideline

bool KisToolLine::m_showGuideline {true}
private

Definition at line 83 of file kis_tool_line.h.

83{true};

◆ m_startPoint

QPointF KisToolLine::m_startPoint
private

Definition at line 85 of file kis_tool_line.h.

◆ m_strokeIsRunning

bool KisToolLine::m_strokeIsRunning {false}
private

Definition at line 90 of file kis_tool_line.h.

90{false};

◆ m_strokeUpdateCompressor

KisSignalCompressor KisToolLine::m_strokeUpdateCompressor
private

Definition at line 101 of file kis_tool_line.h.


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