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

#include <kis_tool_multihand.h>

+ Inheritance diagram for KisToolMultihand:

Public Member Functions

void beginAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
void beginPrimaryAction (KoPointerEvent *event) override
 
void continueAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
void continuePrimaryAction (KoPointerEvent *event) override
 
void endAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
void endPrimaryAction (KoPointerEvent *event) override
 
 KisToolMultihand (KoCanvasBase *canvas)
 
void mouseMoveEvent (KoPointerEvent *event) override
 
 ~KisToolMultihand () override
 
- Public Member Functions inherited from KisToolBrush
qreal delayDistance () const
 
bool finishStabilizedCurve () const
 
 KisToolBrush (KoCanvasBase *canvas)
 
int smoothingType () const
 
qreal smoothnessFactor () const
 
int smoothnessQualityMax () const
 
int smoothnessQualityMin () const
 
bool smoothPressure () const
 
bool stabilizeSensors () const
 
bool useDelayDistance () const
 
bool useScalableDistance () const
 
 ~KisToolBrush () override
 
- Public Member Functions inherited from KisToolFreehand
int flags () const override
 
 KisToolFreehand (KoCanvasBase *canvas, const QCursor &cursor, const KUndo2MagicString &transactionText, bool useSavedSmoothing=true)
 
 ~KisToolFreehand () override
 
- Public Member Functions inherited from KisToolPaint
int flags () const override
 
 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
 
 ~KoToolBase () override
 

Protected Member Functions

QWidget * createOptionWidget () override
 
void paint (QPainter &gc, const KoViewConverter &converter) override
 
- Protected Member Functions inherited from KisToolFreehand
void activateAlternateAction (AlternateAction action) override
 
void deactivateAlternateAction (AlternateAction action) override
 
virtual void doStroke (KoPointerEvent *event)
 
virtual void endStroke ()
 
KisOptimizedBrushOutline getOutlinePath (const QPointF &documentPos, const KoPointerEvent *event, KisPaintOpSettings::OutlineMode outlineMode) override
 
virtual void initStroke (KoPointerEvent *event)
 
KisPaintingInformationBuilderpaintingInformationBuilder () const
 
bool primaryActionSupportsHiResEvents () const override
 
void resetHelper (KisToolFreehandHelper *helper)
 
KisSmoothingOptionsSP smoothingOptions () const
 
bool supportsPaintingAssistants () const override
 
bool trySampleByPaintOp (KoPointerEvent *event, AlternateAction action)
 
bool wantsAutoScroll () const override
 
- 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
 
QWidget * createOptionWidget () override
 
void deactivateAlternateAction (AlternateAction action) override
 
void deactivatePrimaryAction () override
 
void enableControl (QWidget *control, bool value)
 
void endAlternateAction (KoPointerEvent *event, AlternateAction action) override
 
bool isEraser () const
 
bool isOutlineEnabled () const
 
bool isOutlineVisible () const
 
void paint (QPainter &gc, const KoViewConverter &converter) override
 
virtual QString quickHelp () const
 
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)
 

Private Types

enum  enumTransformModes : int {
  SYMMETRY =0 , MIRROR , TRANSLATE , SNOWFLAKE ,
  COPYTRANSLATE , COPYTRANSLATEINTERVALS
}
 

Private Slots

void activateAxesPointModeSetup ()
 
void resetAxes ()
 
void slotAddSubbrushesMode (bool checked)
 
void slotRemoveAllSubbrushes ()
 
void slotSetAxesAngle (qreal angle)
 
void slotSetAxesVisible (bool vis)
 
void slotSetHandsCount (int count)
 
void slotSetIntervals ()
 
void slotSetKeepAspect ()
 
void slotSetMirrorHorizontally (bool mirror)
 
void slotSetMirrorVertically (bool mirror)
 
void slotSetTransformMode (int qcomboboxIndex)
 
void slotSetTranslateRadius (int radius)
 

Private Member Functions

void finishAxesSetup ()
 
void initTransformations ()
 
QVector< QPoint > intervalLocations ()
 
void updateCanvas ()
 

Private Attributes

KisToolMultiHandConfigWidgetcustomUI
 
bool m_addSubbrushesMode
 
qreal m_angle
 
QPointF m_axesPoint
 
int m_handsCount
 
KisToolMultihandHelperm_helper
 
int m_intervalX
 
int m_intervalY
 
QPointF m_lastToolPos
 
bool m_mirrorHorizontally
 
bool m_mirrorVertically
 
QRandomGenerator m_randomGenerator
 
bool m_setupAxesFlag
 
bool m_showAxes
 
QVector< QPointF > m_subbrOriginalLocations
 
enumTransformModes m_transformMode
 
int m_translateRadius
 

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 KisToolBrush
void activate (const QSet< KoShape * > &shapes) override
 
void deactivate () override
 
void setDelayDistance (qreal value)
 
void setFinishStabilizedCurve (bool value)
 
void setSmoothPressure (bool value)
 
void setStabilizeSensors (bool value)
 
void setUseDelayDistance (bool value)
 
void setUseScalableDistance (bool value)
 
void slotSetMagnetism (int magnetism)
 
void slotSetSmoothingType (int index)
 
void slotSetSmoothnessDistanceKeepAspectRatio (bool value)
 
void slotSetSmoothnessDistanceMax (qreal distance)
 
void slotSetSmoothnessDistanceMin (qreal distance)
 
void slotSetTailAggressiveness (qreal argh_rhhrr)
 
void updateSettingsViews () override
 
- Public Slots inherited from KisToolFreehand
void activate (const QSet< KoShape * > &shapes) override
 
void deactivate () override
 
- 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 activate (const QSet< KoShape * > &shapes)
 
virtual void deactivate ()
 
virtual void documentResourceChanged (int key, const QVariant &res)
 
virtual void repaintDecorations ()
 
virtual void requestRedoDuringStroke ()
 
virtual void requestStrokeCancellation ()
 
virtual void requestStrokeEnd ()
 
virtual void requestUndoDuringStroke ()
 
void setStatusText (const QString &statusText)
 
void updateOptionsWidgetIcons ()
 
- Signals inherited from KisToolBrush
void delayDistanceChanged ()
 
void finishStabilizedCurveChanged ()
 
void smoothingTypeChanged ()
 
void smoothnessFactorChanged ()
 
void smoothnessQualityChanged ()
 
void smoothPressureChanged ()
 
void stabilizeSensorsChanged ()
 
void useDelayDistanceChanged ()
 
void useScalableDistanceChanged ()
 
- 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 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 Slots inherited from KisToolBrush
void resetCursorStyle () override
 
- Protected Slots inherited from KisToolFreehand
void explicitUpdateOutline ()
 
void resetCursorStyle () override
 
void setAssistant (bool assistant)
 
void setOnlyOneAssistantSnap (bool assistant)
 
void setSnapEraser (bool assistant)
 
void slotDoResizeBrush (qreal newSize)
 
- Protected Slots inherited from KisTool
virtual void resetCursorStyle ()
 
- Protected Attributes inherited from KisToolBrush
KConfigGroup m_configGroup
 
- Protected Attributes inherited from KisToolFreehand
bool m_assistant {false}
 
bool m_eraser_snapping {false}
 
double m_magnetism {1.0}
 
bool m_only_one_assistant {true}
 
- 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 KisToolBrush
qreal delayDistance
 
bool finishStabilizedCurve
 
int smoothingType
 
qreal smoothnessFactor
 
int smoothnessQualityMax
 
int smoothnessQualityMin
 
bool smoothPressure
 
bool stabilizeSensors
 
bool useDelayDistance
 
bool useScalableDistance
 
- Properties inherited from KisTool
bool isActive
 

Detailed Description

Definition at line 23 of file kis_tool_multihand.h.

Member Enumeration Documentation

◆ enumTransformModes

Enumerator
SYMMETRY 
MIRROR 
TRANSLATE 
SNOWFLAKE 
COPYTRANSLATE 
COPYTRANSLATEINTERVALS 

Definition at line 69 of file kis_tool_multihand.h.

Constructor & Destructor Documentation

◆ KisToolMultihand()

KisToolMultihand::KisToolMultihand ( KoCanvasBase * canvas)

Definition at line 28 of file kis_tool_multihand.cpp.

31 m_angle(0),
32 m_handsCount(6),
33 m_mirrorVertically(false),
35 m_showAxes(false),
37 m_setupAxesFlag(false),
39 m_intervalX(0),
41 , m_randomGenerator(QRandomGenerator::global()->generate())
42 , customUI(0)
43{
44
45
46 m_helper =
49 kundo2_i18n("Multibrush Stroke"));
51 if (image()) {
52 m_axesPoint = QPointF(0.5 * image()->width(), 0.5 * image()->height());
53 }
54
55}
KisToolBrush(KoCanvasBase *canvas)
KisPaintingInformationBuilder * paintingInformationBuilder() const
void resetHelper(KisToolFreehandHelper *helper)
QRandomGenerator m_randomGenerator
KisToolMultiHandConfigWidget * customUI
enumTransformModes m_transformMode
KisToolMultihandHelper * m_helper
QPointer< KoCanvasResourceProvider > resourceManager
KUndo2MagicString kundo2_i18n(const char *text)
KisImageWSP image() const
Definition kis_tool.cc:332
KisCanvas2 * canvas

References Private::canvas, KisTool::image(), kundo2_i18n(), m_axesPoint, m_helper, KisToolFreehand::paintingInformationBuilder(), KisToolFreehand::resetHelper(), and KoCanvasBase::resourceManager.

◆ ~KisToolMultihand()

KisToolMultihand::~KisToolMultihand ( )
override

Definition at line 57 of file kis_tool_multihand.cpp.

58{
59}

Member Function Documentation

◆ activateAxesPointModeSetup

void KisToolMultihand::activateAxesPointModeSetup ( )
privateslot

Definition at line 512 of file kis_tool_multihand.cpp.

513{
514 if (customUI->moveOriginButton->isChecked()){
515 m_setupAxesFlag = true;
517 updateCanvas();
518 } else {
520 }
521}
static QCursor crossCursor()
Definition kis_cursor.cc:34
void useCursor(const QCursor &cursor)

References KisCursor::crossCursor(), customUI, finishAxesSetup(), m_setupAxesFlag, updateCanvas(), and KoToolBase::useCursor().

◆ beginAlternateAction()

void KisToolMultihand::beginAlternateAction ( KoPointerEvent * event,
AlternateAction action )
overridevirtual

Reimplemented from KisToolFreehand.

Definition at line 111 of file kis_tool_multihand.cpp.

112{
113 if ((action != ChangeSize && action != ChangeSizeSnap) ||
117 return;
118 }
121 requestUpdateOutline(event->point, 0);
122 updateCanvas();
123}
virtual void requestUpdateOutline(const QPointF &outlineDocPoint, const KoPointerEvent *event)
void setMode(ToolMode mode) override
QPointF point
The point in document coordinates.
QAction * action(const QString &name) const
QPointF convertToPixelCoord(KoPointerEvent *e)
Definition kis_tool.cc:189
@ OTHER_1
Definition kis_tool.h:306
virtual void beginAlternateAction(KoPointerEvent *event, AlternateAction action)
Definition kis_tool.cc:466
@ ChangeSizeSnap
Definition kis_tool.h:136
@ ChangeSize
Definition kis_tool.h:135

References KoToolBase::action(), KisTool::beginAlternateAction(), KisTool::ChangeSize, KisTool::ChangeSizeSnap, KisTool::convertToPixelCoord(), COPYTRANSLATE, m_addSubbrushesMode, m_axesPoint, m_transformMode, KisTool::OTHER_1, KoPointerEvent::point, KisToolPaint::requestUpdateOutline(), KisToolPaint::setMode(), and updateCanvas().

◆ beginPrimaryAction()

void KisToolMultihand::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 KisToolFreehand.

Definition at line 61 of file kis_tool_multihand.cpp.

62{
63 if(m_setupAxesFlag) {
66 requestUpdateOutline(event->point, 0);
68 }
70 QPointF newPoint = convertToPixelCoord(event->point);
71 m_subbrOriginalLocations << newPoint;
72 requestUpdateOutline(event->point, 0);
74 }
79 }
80 else {
83 }
84}
void beginPrimaryAction(KoPointerEvent *event) override
QVector< QPointF > m_subbrOriginalLocations

References KisToolFreehand::beginPrimaryAction(), KisTool::convertToPixelCoord(), COPYTRANSLATE, COPYTRANSLATEINTERVALS, initTransformations(), m_addSubbrushesMode, m_axesPoint, m_setupAxesFlag, m_subbrOriginalLocations, m_transformMode, KisTool::OTHER, KoPointerEvent::point, KisToolPaint::requestUpdateOutline(), KisToolPaint::setMode(), and updateCanvas().

◆ continueAlternateAction()

void KisToolMultihand::continueAlternateAction ( KoPointerEvent * event,
AlternateAction action )
overridevirtual

◆ continuePrimaryAction()

void KisToolMultihand::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.

Actual painting

Reimplemented from KisToolFreehand.

Definition at line 86 of file kis_tool_multihand.cpp.

87{
88 if(mode() == KisTool::OTHER) {
90 requestUpdateOutline(event->point, 0);
92 }
93 else {
94 requestUpdateOutline(event->point, 0);
96 }
97}
void continuePrimaryAction(KoPointerEvent *event) override

References KisToolFreehand::continuePrimaryAction(), KisTool::convertToPixelCoord(), m_axesPoint, KisTool::mode(), KisTool::OTHER, KoPointerEvent::point, KisToolPaint::requestUpdateOutline(), and updateCanvas().

◆ createOptionWidget()

QWidget * KisToolMultihand::createOptionWidget ( )
overrideprotectedvirtual

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

Reimplemented from KisToolBrush.

Definition at line 427 of file kis_tool_multihand.cpp.

428{
429 QWidget *widget = KisToolBrush::createOptionWidget();
430
432
433 // brush smoothing option.
434 //customUI->layout()->addWidget(widget);
435 customUI->smoothingOptionsLayout->addWidget(widget);
436
437
438 // setup common parameters that all of the modes will see
439 connect(customUI->showAxesCheckbox, SIGNAL(toggled(bool)), this, SLOT(slotSetAxesVisible(bool)));
440 customUI->showAxesCheckbox->setChecked((bool)m_configGroup.readEntry("showAxes", false));
441
442 connect(image(), SIGNAL(sigSizeChanged(QPointF,QPointF)), this, SLOT(resetAxes()));
443
444 customUI->moveOriginButton->setCheckable(true);
445 connect(customUI->moveOriginButton, SIGNAL(clicked(bool)),this, SLOT(activateAxesPointModeSetup()));
446
447 connect(customUI->resetOriginButton, SIGNAL(released()), this, SLOT(resetAxes()));
448
449 customUI->multihandTypeCombobox->addItem(i18n("Symmetry"),int(SYMMETRY)); // axis mode
450 customUI->multihandTypeCombobox->addItem(i18nc("Label of Mirror in Multihand brush tool options", "Mirror"),int(MIRROR));
451 customUI->multihandTypeCombobox->addItem(i18n("Translate"),int(TRANSLATE));
452 customUI->multihandTypeCombobox->addItem(i18n("Snowflake"),int(SNOWFLAKE));
453 customUI->multihandTypeCombobox->addItem(i18n("Copy Translate"),int(COPYTRANSLATE));
454 customUI->multihandTypeCombobox->addItem(i18n("Copy Translate at Intervals"),int(COPYTRANSLATEINTERVALS));
455 connect(customUI->multihandTypeCombobox,SIGNAL(currentIndexChanged(int)),this, SLOT(slotSetTransformMode(int)));
456 customUI->multihandTypeCombobox->setCurrentIndex(m_configGroup.readEntry("transformMode", 0));
457
458
459 customUI->axisRotationAngleSelector->setRange(0.0, 90.0);
460 customUI->axisRotationAngleSelector->setDecimals(1);
461 customUI->axisRotationAngleSelector->setWrapping(false);
462 customUI->axisRotationAngleSelector->setFlipOptionsMode(KisAngleSelector::FlipOptionsMode_NoFlipOptions);
463 connect(customUI->axisRotationAngleSelector, SIGNAL(angleChanged(qreal)), this, SLOT(slotSetAxesAngle(qreal)));
464 customUI->axisRotationAngleSelector->setAngle(m_configGroup.readEntry("axesAngle", 0.0));
465
466
467 // symmetry mode options
468 customUI->brushCountSpinBox->setRange(1, MAXIMUM_BRUSHES);
469 connect(customUI->brushCountSpinBox, SIGNAL(valueChanged(int)),this, SLOT(slotSetHandsCount(int)));
470 customUI->brushCountSpinBox->setValue(m_configGroup.readEntry("handsCount", 4));
471
472 // mirror mode specific options
473 connect(customUI->horizontalCheckbox, SIGNAL(toggled(bool)), this, SLOT(slotSetMirrorHorizontally(bool)));
474 customUI->horizontalCheckbox->setChecked((bool)m_configGroup.readEntry("mirrorHorizontally", false));
475
476 connect(customUI->verticalCheckbox, SIGNAL(toggled(bool)), this, SLOT(slotSetMirrorVertically(bool)));
477 customUI->verticalCheckbox->setChecked((bool)m_configGroup.readEntry("mirrorVertically", false));
478
479 // translate mode options
480 customUI->translationRadiusSpinbox->setRange(0, 200);
481 customUI->translationRadiusSpinbox->setSuffix(i18n(" px"));
482
483 connect(customUI->translationRadiusSpinbox,SIGNAL(valueChanged(int)),this,SLOT(slotSetTranslateRadius(int)));
484 customUI->translationRadiusSpinbox->setValue(m_configGroup.readEntry("translateRadius", 0));
485
486 // Copy translate mode options and actions
487 connect(customUI->addSubbrushButton, &QPushButton::clicked, this, &KisToolMultihand::slotAddSubbrushesMode);
488 connect(customUI->removeSubbrushButton, &QPushButton::clicked, this, &KisToolMultihand::slotRemoveAllSubbrushes);
489
490 // Copy translate at intervals mode options and actions
491 customUI->intervalXSpinBox->setRange(0, 2000);
492 customUI->intervalXSpinBox->setSuffix(i18n(" px"));
493 customUI->intervalYSpinBox->setRange(0, 2000);
494 customUI->intervalYSpinBox->setSuffix(i18n(" px"));
495
496 KisAspectRatioLocker *intervalAspectLocker = new KisAspectRatioLocker(this);
497 intervalAspectLocker->connectSpinBoxes(customUI->intervalXSpinBox, customUI->intervalYSpinBox, customUI->intervalAspectButton);
498
499 customUI->intervalXSpinBox->setValue(m_configGroup.readEntry("intervalX", 0));
500 customUI->intervalYSpinBox->setValue(m_configGroup.readEntry("intervalY", 0));
501 connect(intervalAspectLocker, SIGNAL(sliderValueChanged()), this, SLOT(slotSetIntervals()));
502 slotSetIntervals(); // X and Y need to be set at the same time.
503 connect(intervalAspectLocker, SIGNAL(aspectButtonChanged()), this, SLOT(slotSetKeepAspect()));
504 customUI->intervalAspectButton->setKeepAspectRatio(m_configGroup.readEntry("intervalKeepAspect", false));
505
506 // snowflake re-uses the existing options, so there is no special parameters for that...
507
508
509 return static_cast<QWidget*>(customUI); // keeping it in the native class until the end allows us to access the UI components
510}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
@ FlipOptionsMode_NoFlipOptions
There is no flip options available.
void connectSpinBoxes(SpinBoxType *spinOne, SpinBoxType *spinTwo, KoAspectButton *aspectButton)
KConfigGroup m_configGroup
QWidget * createOptionWidget() override
void slotSetMirrorVertically(bool mirror)
void slotSetAxesVisible(bool vis)
void slotSetTranslateRadius(int radius)
void slotSetHandsCount(int count)
void slotAddSubbrushesMode(bool checked)
void slotSetTransformMode(int qcomboboxIndex)
void slotSetAxesAngle(qreal angle)
void slotSetMirrorHorizontally(bool mirror)
static const int MAXIMUM_BRUSHES

References activateAxesPointModeSetup(), connect(), KisAspectRatioLocker::connectSpinBoxes(), COPYTRANSLATE, COPYTRANSLATEINTERVALS, KisToolBrush::createOptionWidget(), customUI, KisAngleSelector::FlipOptionsMode_NoFlipOptions, KisTool::image(), KisToolBrush::m_configGroup, MAXIMUM_BRUSHES, MIRROR, resetAxes(), slotAddSubbrushesMode(), slotRemoveAllSubbrushes(), slotSetAxesAngle(), slotSetAxesVisible(), slotSetHandsCount(), slotSetIntervals(), slotSetKeepAspect(), slotSetMirrorHorizontally(), slotSetMirrorVertically(), slotSetTransformMode(), slotSetTranslateRadius(), SNOWFLAKE, SYMMETRY, and TRANSLATE.

◆ endAlternateAction()

void KisToolMultihand::endAlternateAction ( KoPointerEvent * event,
AlternateAction action )
overridevirtual

◆ endPrimaryAction()

void KisToolMultihand::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 KisToolFreehand.

Definition at line 99 of file kis_tool_multihand.cpp.

100{
101 if(mode() == KisTool::OTHER) {
103 requestUpdateOutline(event->point, 0);
105 }
106 else {
108 }
109}
void endPrimaryAction(KoPointerEvent *event) override

References KisToolFreehand::endPrimaryAction(), finishAxesSetup(), KisTool::HOVER_MODE, KisTool::mode(), KisTool::OTHER, KoPointerEvent::point, KisToolPaint::requestUpdateOutline(), and KisToolPaint::setMode().

◆ finishAxesSetup()

void KisToolMultihand::finishAxesSetup ( )
private

Definition at line 530 of file kis_tool_multihand.cpp.

531{
532 m_setupAxesFlag = false;
533 customUI->moveOriginButton->setChecked(false);
535 updateCanvas();
536}
void resetCursorStyle() override

References customUI, m_setupAxesFlag, KisToolBrush::resetCursorStyle(), and updateCanvas().

◆ initTransformations()

void KisToolMultihand::initTransformations ( )
private

TODO: currently, the seed is the same for all the strokes

Definition at line 294 of file kis_tool_multihand.cpp.

295{
296 QVector<QTransform> transformations;
297 QTransform m;
298
300 qreal angle = 0;
301 const qreal angleStep = (2 * M_PI) / m_handsCount;
302
303 for(int i = 0; i < m_handsCount; i++) {
304 m.translate(m_axesPoint.x(), m_axesPoint.y());
305 m.rotateRadians(angle);
306 m.translate(-m_axesPoint.x(), -m_axesPoint.y());
307
308 transformations << m;
309 m.reset();
310 angle += angleStep;
311 }
312 }
313 else if(m_transformMode == MIRROR) {
314 transformations << m;
315
317 m.translate(m_axesPoint.x(),m_axesPoint.y());
318 m.rotateRadians(m_angle);
319 m.scale(-1,1);
320 m.rotateRadians(-m_angle);
321 m.translate(-m_axesPoint.x(), -m_axesPoint.y());
322 transformations << m;
323 m.reset();
324 }
325
326 if (m_mirrorVertically) {
327 m.translate(m_axesPoint.x(),m_axesPoint.y());
328 m.rotateRadians(m_angle);
329 m.scale(1,-1);
330 m.rotateRadians(-m_angle);
331 m.translate(-m_axesPoint.x(), -m_axesPoint.y());
332 transformations << m;
333 m.reset();
334 }
335
337 m.translate(m_axesPoint.x(),m_axesPoint.y());
338 m.rotateRadians(m_angle);
339 m.scale(-1,-1);
340 m.rotateRadians(-m_angle);
341 m.translate(-m_axesPoint.x(), -m_axesPoint.y());
342 transformations << m;
343 m.reset();
344 }
345
346 }
347 else if(m_transformMode == SNOWFLAKE) {
348 qreal angle = 0;
349 const qreal angleStep = (2 * M_PI) / m_handsCount/4;
350
351 for(int i = 0; i < m_handsCount*4; i++) {
352 if ((i%2)==1) {
353
354 m.translate(m_axesPoint.x(), m_axesPoint.y());
355 m.rotateRadians(m_angle-angleStep);
356 m.rotateRadians(angle);
357 m.scale(-1,1);
358 m.rotateRadians(-m_angle+angleStep);
359 m.translate(-m_axesPoint.x(), -m_axesPoint.y());
360
361 transformations << m;
362 m.reset();
363 angle += angleStep*2;
364 } else {
365 m.translate(m_axesPoint.x(), m_axesPoint.y());
366 m.rotateRadians(m_angle-angleStep);
367 m.rotateRadians(angle);
368 m.rotateRadians(-m_angle+angleStep);
369 m.translate(-m_axesPoint.x(), -m_axesPoint.y());
370
371 transformations << m;
372 m.reset();
373 angle += angleStep*2;
374 }
375 }
376 }
377 else if(m_transformMode == TRANSLATE) {
382 for (int i = 0; i < m_handsCount; i++){
383 const qreal angle = m_randomGenerator.bounded(2.0 * M_PI);
384 const qreal length = m_randomGenerator.bounded(1.0);
385
386 // convert the Polar coordinates to Cartesian coordinates
387 qreal nx = (m_translateRadius * cos(angle) * length);
388 qreal ny = (m_translateRadius * sin(angle) * length);
389
390 m.translate(m_axesPoint.x(),m_axesPoint.y());
391 m.rotateRadians(m_angle);
392 m.translate(nx,ny);
393 m.rotateRadians(-m_angle);
394 m.translate(-m_axesPoint.x(), -m_axesPoint.y());
395 transformations << m;
396 m.reset();
397 }
398 } else if (m_transformMode == COPYTRANSLATE) {
399 transformations << m;
400 Q_FOREACH (QPointF dPos, m_subbrOriginalLocations) {
401 const QPointF resPos = dPos-m_axesPoint; // Calculate the difference between subbrush reference position and "origin" reference
402 m.translate(resPos.x(), resPos.y());
403 transformations << m;
404 m.reset();
405 }
407 KisCanvas2 *kisCanvas = dynamic_cast<KisCanvas2*>(canvas());
408 Q_ASSERT(kisCanvas);
409 const QRect bounds = kisCanvas->viewManager()->selection() ?
410 kisCanvas->viewManager()->selection()->selectedExactRect() :
411 kisCanvas->currentImage()->bounds();
412 const QPoint dPos = bounds.topLeft() +
413 QPoint(m_intervalX ? m_intervalX * floor((m_axesPoint.x() - bounds.left()) / m_intervalX) : 0,
414 m_intervalY ? m_intervalY * floor((m_axesPoint.y() - bounds.top()) / m_intervalY) : 0);
415
416 Q_FOREACH (QPoint pos, intervalLocations()) {
417 const QPointF resPos = pos - dPos;
418 m.translate(resPos.x(), resPos.y());
419 transformations << m;
420 m.reset();
421 }
422 }
423
424 m_helper->setupTransformations(transformations);
425}
qreal length(const QPointF &vec)
Definition Ellipse.cc:82
KisImageWSP currentImage() const
KisViewManager * viewManager() const
QRect bounds() const override
void setupTransformations(const QVector< QTransform > &transformations)
QVector< QPoint > intervalLocations()
KisSelectionSP selection()
#define bounds(x, a, b)
#define M_PI
Definition kis_global.h:111
QRect selectedExactRect() const
Slow, but exact way of determining the rectangle that encloses the selection.

References KisImage::bounds(), bounds, Private::canvas, COPYTRANSLATE, COPYTRANSLATEINTERVALS, KisCanvas2::currentImage(), intervalLocations(), length(), m_angle, m_axesPoint, m_handsCount, m_helper, m_intervalX, m_intervalY, m_mirrorHorizontally, m_mirrorVertically, M_PI, m_randomGenerator, m_subbrOriginalLocations, m_transformMode, m_translateRadius, MIRROR, KisSelection::selectedExactRect(), KisViewManager::selection(), KisToolMultihandHelper::setupTransformations(), SNOWFLAKE, SYMMETRY, TRANSLATE, and KisCanvas2::viewManager().

◆ intervalLocations()

QVector< QPoint > KisToolMultihand::intervalLocations ( )
private

Definition at line 551 of file kis_tool_multihand.cpp.

552{
554
555 KisCanvas2 *kisCanvas = dynamic_cast<KisCanvas2*>(canvas());
556 Q_ASSERT(kisCanvas);
557 const QRect bounds = kisCanvas->viewManager()->selection() ?
558 kisCanvas->viewManager()->selection()->selectedExactRect() :
559 kisCanvas->currentImage()->bounds();
560
561 const int intervals = m_intervalX ? (bounds.width() / m_intervalX) : 0 +
562 m_intervalY ? (bounds.height() / m_intervalY) : 0;
563 if (intervals > MAXIMUM_BRUSHES) {
564 kisCanvas->viewManager()->showFloatingMessage(
565 i18n("Multibrush Tool does not support more than %1 brushes; use a larger interval.",
566 QString::number(MAXIMUM_BRUSHES)), QIcon());
567 return intervalLocations;
568 }
569
570 for (int x = bounds.left(); x <= bounds.right(); x += m_intervalX) {
571 for (int y = bounds.top(); y <= bounds.bottom(); y += m_intervalY) {
572 intervalLocations << QPoint(x,y);
573
574 if (m_intervalY == 0) { break; }
575 }
576 if (m_intervalX == 0) { break; }
577 }
578
579 return intervalLocations;
580}
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

References KisImage::bounds(), bounds, Private::canvas, KisCanvas2::currentImage(), intervalLocations(), m_intervalX, m_intervalY, MAXIMUM_BRUSHES, KisSelection::selectedExactRect(), KisViewManager::selection(), KisViewManager::showFloatingMessage(), and KisCanvas2::viewManager().

◆ mouseMoveEvent()

void KisToolMultihand::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

Reimplemented from KisToolFreehand.

Definition at line 153 of file kis_tool_multihand.cpp.

154{
155 if (mode() == HOVER_MODE) {
157 }
159}
virtual void mouseMoveEvent(KoPointerEvent *event)=0

References KisTool::convertToPixelCoord(), KisTool::HOVER_MODE, m_lastToolPos, KisTool::mode(), KoToolBase::mouseMoveEvent(), and KoPointerEvent::point.

◆ paint()

void KisToolMultihand::paint ( QPainter & painter,
const KoViewConverter & converter )
overrideprotectedvirtual

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 161 of file kis_tool_multihand.cpp.

162{
163 QPainterPath path;
164
165 if (m_showAxes) {
166 const int axisLength = currentImage()->height() + currentImage()->width();
167
168 // add division guide lines if using multiple brushes
169 if ((m_handsCount > 1 && m_transformMode == SYMMETRY) ||
171 int axesCount;
173 axesCount = m_handsCount;
174 }
175 else {
176 axesCount = m_handsCount*2;
177 }
178 const qreal axesAngle = 360.0 / float(axesCount);
179 float currentAngle = 0.0;
180 const float startingInsetLength = 20; // don't start each line at the origin so we can see better when all points converge
181
182 // draw lines radiating from the origin
183 for( int i=0; i < axesCount; i++) {
184
185 currentAngle = i*axesAngle;
186
187 // convert angles to radians since cos and sin need that
188 currentAngle = currentAngle * 0.017453 + m_angle; // m_angle is current rotation set on UI
189
190 const QPoint startingSpot = QPoint(m_axesPoint.x()+ (sin(currentAngle)*startingInsetLength), m_axesPoint.y()- (cos(currentAngle))*startingInsetLength );
191 path.moveTo(startingSpot.x(), startingSpot.y());
192 QPointF symmetryLinePoint(m_axesPoint.x()+ (sin(currentAngle)*axisLength), m_axesPoint.y()- (cos(currentAngle))*axisLength );
193 path.lineTo(symmetryLinePoint);
194 }
195
196 }
197 else if(m_transformMode == MIRROR) {
198
200 path.moveTo(m_axesPoint.x()-axisLength*cos(m_angle+M_PI_2), m_axesPoint.y()-axisLength*sin(m_angle+M_PI_2));
201 path.lineTo(m_axesPoint.x()+axisLength*cos(m_angle+M_PI_2), m_axesPoint.y()+axisLength*sin(m_angle+M_PI_2));
202 }
203
205 path.moveTo(m_axesPoint.x()-axisLength*cos(m_angle), m_axesPoint.y()-axisLength*sin(m_angle));
206 path.lineTo(m_axesPoint.x()+axisLength*cos(m_angle), m_axesPoint.y()+axisLength*sin(m_angle));
207 }
208 }
209 else if (m_transformMode == COPYTRANSLATE) {
210
211 const int ellipsePreviewSize = 10;
212 // draw ellipse at origin to emphasize this is a drawing point
213 path.addEllipse(m_axesPoint.x()-(ellipsePreviewSize),
214 m_axesPoint.y()-(ellipsePreviewSize),
215 ellipsePreviewSize*2,
216 ellipsePreviewSize*2);
217
218 Q_FOREACH (QPointF dPos, m_subbrOriginalLocations) {
219 path.addEllipse(dPos, ellipsePreviewSize, ellipsePreviewSize); // Show subbrush reference locations while in add mode
220 }
221
222 // draw the horiz/vertical line for axis origin
223 path.moveTo(m_axesPoint.x()-axisLength*cos(m_angle), m_axesPoint.y()-axisLength*sin(m_angle));
224 path.lineTo(m_axesPoint.x()+axisLength*cos(m_angle), m_axesPoint.y()+axisLength*sin(m_angle));
225 path.moveTo(m_axesPoint.x()-axisLength*cos(m_angle+M_PI_2), m_axesPoint.y()-axisLength*sin(m_angle+M_PI_2));
226 path.lineTo(m_axesPoint.x()+axisLength*cos(m_angle+M_PI_2), m_axesPoint.y()+axisLength*sin(m_angle+M_PI_2));
227
228 }
230 const int ellipsePreviewSize = 10;
231
232 Q_FOREACH (QPointF dPos, intervalLocations()) {
233 path.addEllipse(dPos, ellipsePreviewSize, ellipsePreviewSize);
234 }
235 }
236 else {
237
238 // draw the horiz/vertical line for axis origin
239 path.moveTo(m_axesPoint.x()-axisLength*cos(m_angle), m_axesPoint.y()-axisLength*sin(m_angle));
240 path.lineTo(m_axesPoint.x()+axisLength*cos(m_angle), m_axesPoint.y()+axisLength*sin(m_angle));
241 path.moveTo(m_axesPoint.x()-axisLength*cos(m_angle+M_PI_2), m_axesPoint.y()-axisLength*sin(m_angle+M_PI_2));
242 path.lineTo(m_axesPoint.x()+axisLength*cos(m_angle+M_PI_2), m_axesPoint.y()+axisLength*sin(m_angle+M_PI_2));
243 }
244
245 } else {
246
247 // not showing axis
249
250 Q_FOREACH (QPointF dPos, m_subbrOriginalLocations) {
251 // Show subbrush reference locations while in add mode
253 path.addEllipse(dPos, 10, 10);
254 }
255 }
256 }
257 }
258
259 KisToolFreehand::paint(gc, converter);
260
261 // origin point preview line/s
262 gc.save();
263 QPen outlinePen;
264 outlinePen.setColor(QColor(100,100,100,150));
265 outlinePen.setStyle(Qt::PenStyle::SolidLine);
266 gc.setPen(outlinePen);
267 paintToolOutline(&gc, pixelToView(path));
268 gc.restore();
269
270
271 // fill in a dot for the origin if showing axis
273 // draw a dot at the origin point to help with precisely moving
274 QPainterPath dotPath;
275 const int dotRadius = 4;
276 dotPath.moveTo(m_axesPoint.x(), m_axesPoint.y());
277 dotPath.addEllipse(m_axesPoint.x()- dotRadius*0.25, m_axesPoint.y()- dotRadius*0.25, dotRadius, dotRadius); // last 2 parameters are dot's size
278
279 QBrush fillBrush;
280 fillBrush.setColor(QColor(255, 255, 255, 255));
281 fillBrush.setStyle(Qt::SolidPattern);
282 gc.fillPath(pixelToView(dotPath), fillBrush);
283
284
285 // add slight offset circle for contrast to help show it on
286 dotPath = QPainterPath(); // resets path
287 dotPath.addEllipse(m_axesPoint.x() - dotRadius*0.75, m_axesPoint.y()- dotRadius*0.75, dotRadius, dotRadius); // last 2 parameters are dot's size
288 fillBrush.setColor(QColor(120, 120, 120, 255));
289 gc.fillPath(pixelToView(dotPath), fillBrush);
290 }
291
292}
qint32 width() const
qint32 height() const
virtual void paint(QPainter &painter, const KoViewConverter &converter)=0
KisImageWSP currentImage()
Definition kis_tool.cc:393
QPointF pixelToView(const QPoint &pixelCoord) const
Definition kis_tool.cc:269
void paintToolOutline(QPainter *painter, const KisOptimizedBrushOutline &path)
Definition kis_tool.cc:589

References COPYTRANSLATE, COPYTRANSLATEINTERVALS, KisTool::currentImage(), KisImage::height(), intervalLocations(), m_addSubbrushesMode, m_angle, m_axesPoint, m_handsCount, m_mirrorHorizontally, m_mirrorVertically, m_showAxes, m_subbrOriginalLocations, m_transformMode, MIRROR, KoToolBase::paint(), KisTool::paintToolOutline(), KisTool::pixelToView(), SNOWFLAKE, SYMMETRY, and KisImage::width().

◆ resetAxes

void KisToolMultihand::resetAxes ( )
privateslot

Definition at line 523 of file kis_tool_multihand.cpp.

524{
525 m_axesPoint = QPointF(0.5 * image()->width(), 0.5 * image()->height());
527}

References finishAxesSetup(), KisTool::image(), and m_axesPoint.

◆ slotAddSubbrushesMode

void KisToolMultihand::slotAddSubbrushesMode ( bool checked)
privateslot

Definition at line 668 of file kis_tool_multihand.cpp.

669{
670 m_addSubbrushesMode = checked;
671 updateCanvas();
672}

References m_addSubbrushesMode, and updateCanvas().

◆ slotRemoveAllSubbrushes

void KisToolMultihand::slotRemoveAllSubbrushes ( )
privateslot

Definition at line 674 of file kis_tool_multihand.cpp.

675{
677 updateCanvas();
678}

References m_subbrOriginalLocations, and updateCanvas().

◆ slotSetAxesAngle

void KisToolMultihand::slotSetAxesAngle ( qreal angle)
privateslot

Definition at line 589 of file kis_tool_multihand.cpp.

590{
591 //negative so axes rotates counter clockwise
592 m_angle = -angle*M_PI/180;
593 updateCanvas();
594 m_configGroup.writeEntry("axesAngle", angle);
595}

References m_angle, KisToolBrush::m_configGroup, M_PI, and updateCanvas().

◆ slotSetAxesVisible

void KisToolMultihand::slotSetAxesVisible ( bool vis)
privateslot

Definition at line 640 of file kis_tool_multihand.cpp.

641{
642 m_showAxes = vis;
643 updateCanvas();
644 m_configGroup.writeEntry("showAxes", vis);
645}

References KisToolBrush::m_configGroup, m_showAxes, and updateCanvas().

◆ slotSetHandsCount

void KisToolMultihand::slotSetHandsCount ( int count)
privateslot

Definition at line 582 of file kis_tool_multihand.cpp.

583{
584 m_handsCount = count;
585 m_configGroup.writeEntry("handsCount", count);
586 updateCanvas();
587}

References KisToolBrush::m_configGroup, m_handsCount, and updateCanvas().

◆ slotSetIntervals

void KisToolMultihand::slotSetIntervals ( )
privateslot

Definition at line 680 of file kis_tool_multihand.cpp.

681{
682 m_intervalX = customUI->intervalXSpinBox->value();
683 m_configGroup.writeEntry("intervalX", m_intervalX);
684
685 m_intervalY = customUI->intervalYSpinBox->value();
686 m_configGroup.writeEntry("intervalY", m_intervalY);
687
688 updateCanvas();
689}

References customUI, KisToolBrush::m_configGroup, m_intervalX, m_intervalY, and updateCanvas().

◆ slotSetKeepAspect

void KisToolMultihand::slotSetKeepAspect ( )
privateslot

Definition at line 691 of file kis_tool_multihand.cpp.

692{
693 m_configGroup.writeEntry("intervalKeepAspect", customUI->intervalAspectButton->keepAspectRatio());
694}

References customUI, and KisToolBrush::m_configGroup.

◆ slotSetMirrorHorizontally

void KisToolMultihand::slotSetMirrorHorizontally ( bool mirror)
privateslot

Definition at line 655 of file kis_tool_multihand.cpp.

656{
657 m_mirrorHorizontally = mirror;
658 updateCanvas();
659 m_configGroup.writeEntry("mirrorHorizontally", mirror);
660}

References KisToolBrush::m_configGroup, m_mirrorHorizontally, and updateCanvas().

◆ slotSetMirrorVertically

void KisToolMultihand::slotSetMirrorVertically ( bool mirror)
privateslot

Definition at line 648 of file kis_tool_multihand.cpp.

649{
650 m_mirrorVertically = mirror;
651 updateCanvas();
652 m_configGroup.writeEntry("mirrorVertically", mirror);
653}

References KisToolBrush::m_configGroup, m_mirrorVertically, and updateCanvas().

◆ slotSetTransformMode

void KisToolMultihand::slotSetTransformMode ( int qcomboboxIndex)
privateslot

Definition at line 597 of file kis_tool_multihand.cpp.

598{
599 m_transformMode = enumTransformModes(customUI->multihandTypeCombobox->itemData(index).toInt());
600 m_configGroup.writeEntry("transformMode", index);
601
602 // turn on or off what we need
603
604 bool vis = index == MIRROR;
605 customUI->horizontalCheckbox->setVisible(vis);
606 customUI->verticalCheckbox->setVisible(vis);
607
608 vis = index == TRANSLATE;
609 customUI->translationRadiusSpinbox->setVisible(vis);
610 customUI->radiusLabel->setVisible(vis);
611 customUI->brushCountSpinBox->setVisible(vis);
612 customUI->brushesLabel->setVisible(vis);
613
614 vis = index == SYMMETRY || index == SNOWFLAKE || index == TRANSLATE;
615 customUI->brushCountSpinBox->setVisible(vis);
616 customUI->brushesLabel->setVisible(vis);
617
618 vis = index == COPYTRANSLATE;
619 customUI->subbrushLabel->setVisible(vis);
620 customUI->addSubbrushButton->setVisible(vis);
621 customUI->addSubbrushButton->setChecked(m_addSubbrushesMode);
622 customUI->removeSubbrushButton->setVisible(vis);
623
624 vis = index == COPYTRANSLATEINTERVALS;
625 customUI->intervalXLabel->setVisible(vis);
626 customUI->intervalYLabel->setVisible(vis);
627 customUI->intervalXSpinBox->setVisible(vis);
628 customUI->intervalYSpinBox->setVisible(vis);
629 customUI->intervalAspectButton->setVisible(vis);
630
631 vis = index != COPYTRANSLATEINTERVALS;
632 customUI->label->setVisible(vis); // the origin label
633 customUI->moveOriginButton->setVisible(vis);
634 customUI->resetOriginButton->setVisible(vis);
635 customUI->axisRotationLabel->setVisible(vis);
636 customUI->axisRotationAngleSelector->setVisible(vis);
637
638}

References COPYTRANSLATE, COPYTRANSLATEINTERVALS, customUI, m_addSubbrushesMode, KisToolBrush::m_configGroup, m_transformMode, MIRROR, SNOWFLAKE, SYMMETRY, and TRANSLATE.

◆ slotSetTranslateRadius

void KisToolMultihand::slotSetTranslateRadius ( int radius)
privateslot

Definition at line 662 of file kis_tool_multihand.cpp.

663{
664 m_translateRadius = radius;
665 m_configGroup.writeEntry("translateRadius", radius);
666}

References KisToolBrush::m_configGroup, and m_translateRadius.

◆ updateCanvas()

void KisToolMultihand::updateCanvas ( )
private

Definition at line 538 of file kis_tool_multihand.cpp.

539{
540 KisCanvas2 *kisCanvas = dynamic_cast<KisCanvas2*>(canvas());
541 Q_ASSERT(kisCanvas);
542 kisCanvas->updateCanvas();
543 if(customUI->moveOriginButton->isChecked())
544 {
545 kisCanvas->viewManager()->showFloatingMessage(i18n("X: %1 px\nY: %2 px"
546 , QString::number(this->m_axesPoint.x(),'f',1),QString::number(this->m_axesPoint.y(),'f',1))
547 , QIcon(), 1000, KisFloatingMessage::High, Qt::AlignLeft | Qt::TextWordWrap | Qt::AlignVCenter);
548 }
549}
void updateCanvas(const QRectF &rc) override

References Private::canvas, customUI, KisFloatingMessage::High, m_axesPoint, KisViewManager::showFloatingMessage(), KisCanvas2::updateCanvas(), and KisCanvas2::viewManager().

Member Data Documentation

◆ customUI

KisToolMultiHandConfigWidget* KisToolMultihand::customUI
private

Definition at line 88 of file kis_tool_multihand.h.

◆ m_addSubbrushesMode

bool KisToolMultihand::m_addSubbrushesMode
private

Definition at line 80 of file kis_tool_multihand.h.

◆ m_angle

qreal KisToolMultihand::m_angle
private

Definition at line 72 of file kis_tool_multihand.h.

◆ m_axesPoint

QPointF KisToolMultihand::m_axesPoint
private

Definition at line 71 of file kis_tool_multihand.h.

◆ m_handsCount

int KisToolMultihand::m_handsCount
private

Definition at line 73 of file kis_tool_multihand.h.

◆ m_helper

KisToolMultihandHelper* KisToolMultihand::m_helper
private

Definition at line 67 of file kis_tool_multihand.h.

◆ m_intervalX

int KisToolMultihand::m_intervalX
private

Definition at line 84 of file kis_tool_multihand.h.

◆ m_intervalY

int KisToolMultihand::m_intervalY
private

Definition at line 85 of file kis_tool_multihand.h.

◆ m_lastToolPos

QPointF KisToolMultihand::m_lastToolPos
private

Definition at line 81 of file kis_tool_multihand.h.

◆ m_mirrorHorizontally

bool KisToolMultihand::m_mirrorHorizontally
private

Definition at line 75 of file kis_tool_multihand.h.

◆ m_mirrorVertically

bool KisToolMultihand::m_mirrorVertically
private

Definition at line 74 of file kis_tool_multihand.h.

◆ m_randomGenerator

QRandomGenerator KisToolMultihand::m_randomGenerator
private

Definition at line 86 of file kis_tool_multihand.h.

◆ m_setupAxesFlag

bool KisToolMultihand::m_setupAxesFlag
private

Definition at line 79 of file kis_tool_multihand.h.

◆ m_showAxes

bool KisToolMultihand::m_showAxes
private

Definition at line 76 of file kis_tool_multihand.h.

◆ m_subbrOriginalLocations

QVector<QPointF> KisToolMultihand::m_subbrOriginalLocations
private

Definition at line 82 of file kis_tool_multihand.h.

◆ m_transformMode

enumTransformModes KisToolMultihand::m_transformMode
private

Definition at line 70 of file kis_tool_multihand.h.

◆ m_translateRadius

int KisToolMultihand::m_translateRadius
private

Definition at line 77 of file kis_tool_multihand.h.


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