Krita Source Code Documentation
Loading...
Searching...
No Matches
KisToolSelectBase< BaseClass > Class Template Reference

#include <kis_tool_select_base.h>

+ Inheritance diagram for KisToolSelectBase< BaseClass >:

Public Types

enum  CursorHit { CursorHit_None , CursorHit_Border , CursorHit_Inside , CursorHit_Outside }
 
enum  SampleLayersMode { SampleAllLayers , SampleCurrentLayer , SampleColorLabeledLayers }
 

Public Member Functions

void activate (const QSet< KoShape * > &shapes) override
 
void activateAlternateAction (KisTool::AlternateAction action) override
 
SelectionAction alternateSelectionAction () const
 
bool antiAliasSelection () const
 
void beginAlternateAction (KoPointerEvent *event, KisTool::AlternateAction action) override
 
bool beginMoveContentInteraction ()
 
bool beginMoveSelectionInteraction ()
 
void beginPrimaryAction (KoPointerEvent *event) override
 
bool beginSelectInteraction ()
 
bool canBeginNewAction (KoPointerEvent *event, const QPointF &pos, CursorHit hit)
 
void cancelMoveSelectionStroke ()
 
CursorHit checkCursorHit (const QPointF &pos, Qt::KeyboardModifiers modifiers) const
 
QList< int > colorLabelsSelected () const
 
void commitMoveSelectionStroke ()
 
void commitMoveSelectionStrokeImpl (bool cancel)
 
void continueAlternateAction (KoPointerEvent *event, KisTool::AlternateAction action) override
 
void continuePrimaryAction (KoPointerEvent *event) override
 
QWidget * createOptionWidget () override
 
void deactivate () override
 
void deactivateAlternateAction (KisTool::AlternateAction action) override
 
void endAlternateAction (KoPointerEvent *event, KisTool::AlternateAction action) override
 
bool endMoveContentInteraction ()
 
bool endMoveSelectionInteraction ()
 
void endPrimaryAction (KoPointerEvent *event) override
 
bool endSelectInteraction ()
 
void explicitUserStrokeEndRequest () override
 
int featherSelection () const
 
int growSelection () const
 
void initializeStrokeAttributes (const QPointF &pos, KisStrokeStrategy *strategy, bool moved)
 
bool isMovingContent () const
 
bool isMovingSelection () const
 
bool isSelecting () const
 
void keyPressEvent (QKeyEvent *event) override
 
void keyReleaseEvent (QKeyEvent *event) override
 
 KisToolSelectBase (KoCanvasBase *canvas, const QCursor cursor, const QString toolName)
 
 KisToolSelectBase (KoCanvasBase *canvas, const QString toolName)
 
 KisToolSelectBase (KoCanvasBase *canvas, QCursor cursor, QString toolName, KoToolBase *delegateTool)
 
KisNodeSP locateSelectionMaskUnderCursor (const QPointF &pos, Qt::KeyboardModifiers modifiers)
 
void mouseMoveEvent (KoPointerEvent *event) override
 
bool moveSelectedContent () const
 
QMenu * popupActionsMenu () override
 
KisPopupWidgetInterfacepopupWidget () override
 
void requestStrokeCancellation () override
 
SampleLayersMode sampleLayersMode () const
 
SelectionAction selectionAction () const
 
bool selectionDidMove () const
 
SelectionMode selectionMode () const
 
KisSelectionOptionsselectionOptionWidget ()
 
virtual void setAlternateSelectionAction (SelectionAction action)
 
bool stopGrowingAtDarkestPixel () const
 
void updateActionShortcutToolTips ()
 
void updateCursor ()
 
void updateCursorDelayed ()
 

Protected Member Functions

virtual bool isPixelOnly () const
 
virtual bool usesColorLabels () const
 

Protected Attributes

SelectionAction m_selectionActionAlternate
 
KisSelectionToolConfigWidgetHelper m_widgetHelper
 

Private Types

enum  Interaction { Interaction_None , Interaction_Select , Interaction_MoveSelection , Interaction_MoveContent }
 

Private Member Functions

Interaction currentInteraction () const
 

Private Attributes

QPoint m_accumulatedOffset
 
Interaction m_currentInteraction {Interaction_None}
 
Qt::KeyboardModifiers m_currentModifiers
 
QPointF m_currentPos
 
bool m_didMove = false
 
QPoint m_dragStartOffset
 
QPointF m_dragStartPos
 
KisSignalAutoConnectionsStore m_modeConnections
 
KisStrokeId m_moveStrokeId
 

Detailed Description

template<class BaseClass>
class KisToolSelectBase< BaseClass >

This is a basic template to create selection tools from basic path based drawing tools. The template overrides the ability to execute alternate actions correctly. The default behavior for the modifier keys is as follows:

Shift: add to selection Alt: subtract from selection Shift+Alt: intersect current selection Ctrl+Alt: symmetric difference Ctrl: replace selection

The mapping itself is done in KisSelectionModifierMapper.

Certain tools also use modifier keys to alter their behavior, e.g. forcing square proportions with the rectangle tool. The template enables the following rules for forwarding keys:

1) If the user is not selecting, then changing the modifier combination changes the selection method.

2) If the user is selecting then the modifier keys are forwarded to the specific tool, so that it can do with them whatever it wants. The selection method is not changed in this stage and it will be the same as just before the user started selecting.

3) Once the user finishes selecting, the selection method is updated to reflect the current modifier combination

4) If the user is moving the selection, then changing the modifiers

Definition at line 62 of file kis_tool_select_base.h.

Member Enumeration Documentation

◆ CursorHit

template<class BaseClass >
enum KisToolSelectBase::CursorHit
Enumerator
CursorHit_None 
CursorHit_Border 
CursorHit_Inside 
CursorHit_Outside 

Definition at line 91 of file kis_tool_select_base.h.

◆ Interaction

template<class BaseClass >
enum KisToolSelectBase::Interaction
private
Enumerator
Interaction_None 
Interaction_Select 
Interaction_MoveSelection 
Interaction_MoveContent 

Definition at line 743 of file kis_tool_select_base.h.

◆ SampleLayersMode

template<class BaseClass >
enum KisToolSelectBase::SampleLayersMode
Enumerator
SampleAllLayers 
SampleCurrentLayer 
SampleColorLabeledLayers 

Definition at line 99 of file kis_tool_select_base.h.

Constructor & Destructor Documentation

◆ KisToolSelectBase() [1/3]

template<class BaseClass >
KisToolSelectBase< BaseClass >::KisToolSelectBase ( KoCanvasBase * canvas,
const QString toolName )
inline

Definition at line 67 of file kis_tool_select_base.h.

68 : BaseClass(canvas)
69 , m_widgetHelper(toolName)
71 {
73 }
@ SELECTION_DEFAULT
KisSelectionToolConfigWidgetHelper m_widgetHelper
SelectionAction m_selectionActionAlternate
static KisSelectionModifierMapper * instance()

References KisSelectionModifierMapper::instance().

◆ KisToolSelectBase() [2/3]

template<class BaseClass >
KisToolSelectBase< BaseClass >::KisToolSelectBase ( KoCanvasBase * canvas,
const QCursor cursor,
const QString toolName )
inline

Definition at line 75 of file kis_tool_select_base.h.

76 : BaseClass(canvas, cursor)
77 , m_widgetHelper(toolName)
79 {
81 }

References KisSelectionModifierMapper::instance().

◆ KisToolSelectBase() [3/3]

template<class BaseClass >
KisToolSelectBase< BaseClass >::KisToolSelectBase ( KoCanvasBase * canvas,
QCursor cursor,
QString toolName,
KoToolBase * delegateTool )
inline

Definition at line 83 of file kis_tool_select_base.h.

84 : BaseClass(canvas, cursor, delegateTool)
85 , m_widgetHelper(toolName)
87 {
89 }

References KisSelectionModifierMapper::instance().

Member Function Documentation

◆ activate()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::activate ( const QSet< KoShape * > & shapes)
inlineoverride

Definition at line 124 of file kis_tool_select_base.h.

125 {
126 BaseClass::activate(shapes);
127
129 this->action("selection_tool_mode_replace"), SIGNAL(triggered()),
130 &m_widgetHelper, SLOT(slotReplaceModeRequested()));
131
133 this->action("selection_tool_mode_add"), SIGNAL(triggered()),
134 &m_widgetHelper, SLOT(slotAddModeRequested()));
135
137 this->action("selection_tool_mode_subtract"), SIGNAL(triggered()),
138 &m_widgetHelper, SLOT(slotSubtractModeRequested()));
139
141 this->action("selection_tool_mode_intersect"), SIGNAL(triggered()),
142 &m_widgetHelper, SLOT(slotIntersectModeRequested()));
143
145
147 if (isPixelOnly()) {
150 true);
151 }
154 }
155 }
void setModeSectionVisible(bool visible)
void setAdjustmentsSectionVisible(bool visible)
void setReferenceSectionVisible(bool visible)
void addUniqueConnection(Sender sender, Signal signal, Receiver receiver, Method method)
virtual bool isPixelOnly() const
virtual bool usesColorLabels() const
KisSignalAutoConnectionsStore m_modeConnections

References KisSignalAutoConnectionsStore::addUniqueConnection(), KisToolSelectBase< BaseClass >::isPixelOnly(), KisToolSelectBase< BaseClass >::m_modeConnections, KisToolSelectBase< BaseClass >::m_widgetHelper, KisSelectionToolConfigWidgetHelper::optionWidget(), KisSelectionOptions::setAdjustmentsSectionVisible(), KisSelectionOptions::setModeSectionVisible(), KisSelectionOptions::setReferenceSectionVisible(), KisToolSelectBase< BaseClass >::updateActionShortcutToolTips(), and KisToolSelectBase< BaseClass >::usesColorLabels().

◆ activateAlternateAction()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::activateAlternateAction ( KisTool::AlternateAction action)
inlineoverride

Definition at line 263 of file kis_tool_select_base.h.

264 {
265 Q_UNUSED(action);
266 BaseClass::activatePrimaryAction();
267 }

◆ alternateSelectionAction()

template<class BaseClass >
SelectionAction KisToolSelectBase< BaseClass >::alternateSelectionAction ( ) const
inline

◆ antiAliasSelection()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::antiAliasSelection ( ) const
inline

◆ beginAlternateAction()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::beginAlternateAction ( KoPointerEvent * event,
KisTool::AlternateAction action )
inlineoverride

Definition at line 275 of file kis_tool_select_base.h.

277 {
278 Q_UNUSED(action);
279 beginPrimaryAction(event);
280 }
void beginPrimaryAction(KoPointerEvent *event) override

References KisToolSelectBase< BaseClass >::beginPrimaryAction().

◆ beginMoveContentInteraction()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::beginMoveContentInteraction ( )
inline

◆ beginMoveSelectionInteraction()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::beginMoveSelectionInteraction ( )
inline

◆ beginPrimaryAction()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::beginPrimaryAction ( KoPointerEvent * event)
inlineoverride

Definition at line 483 of file kis_tool_select_base.h.

484 {
485 const QPointF pos = this->convertToPixelCoord(event->point);
486 const CursorHit hit = checkCursorHit(pos, event->modifiers());
487
488 if (!canBeginNewAction(event, pos, hit)) {
489 return;
490 }
491
492 KisCanvas2* canvas = dynamic_cast<KisCanvas2*>(this->canvas());
494
495 if (hit == CursorHit_Inside && this->moveSelectedContent()) {
496 KisSelectionSP selection = canvas->viewManager()->selection();
497 KisPaintLayerSP layer = dynamic_cast<KisPaintLayer*>(this->currentNode().data());
498 if (this->beginMoveContentInteraction() && selection && layer) {
499 KisStrokeStrategy *strategy =
500 new MoveSelectionStrokeStrategy(layer, selection, this->image().data(), this->image().data());
501 initializeStrokeAttributes(pos, strategy, true);
502 updateCursor();
503 }
504 return;
505 }
506
508 (hit == CursorHit_Inside || hit == CursorHit_Border)) {
509 // we shouldn't pass the control to the parent tool
510 // when we have the already started the move content action
511 return;
512 }
513
514 KisNodeSP selectionMask = locateSelectionMaskUnderCursor(pos, event->modifiers());
515 if (selectionMask) {
516 if (this->beginMoveSelectionInteraction()) {
517 KisStrokeStrategy *strategy =
518 new MoveStrokeStrategy({selectionMask}, this->image().data(), this->image().data());
519 initializeStrokeAttributes(pos, strategy, true);
520 updateCursor();
521 return;
522 }
523 }
524
525 m_didMove = false;
526 BaseClass::beginPrimaryAction(event);
527 }
KisViewManager * viewManager() const
void initializeStrokeAttributes(const QPointF &pos, KisStrokeStrategy *strategy, bool moved)
CursorHit checkCursorHit(const QPointF &pos, Qt::KeyboardModifiers modifiers) const
KisNodeSP locateSelectionMaskUnderCursor(const QPointF &pos, Qt::KeyboardModifiers modifiers)
bool moveSelectedContent() const
bool canBeginNewAction(KoPointerEvent *event, const QPointF &pos, CursorHit hit)
KisSelectionSP selection()
Qt::KeyboardModifiers modifiers() const
QPointF point
The point in document coordinates.
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References KisToolSelectBase< BaseClass >::beginMoveContentInteraction(), KisToolSelectBase< BaseClass >::beginMoveSelectionInteraction(), KisToolSelectBase< BaseClass >::canBeginNewAction(), KisToolSelectBase< BaseClass >::checkCursorHit(), KisToolSelectBase< BaseClass >::CursorHit_Border, KisToolSelectBase< BaseClass >::CursorHit_Inside, KisSharedPtr< T >::data(), KisToolSelectBase< BaseClass >::initializeStrokeAttributes(), KisToolSelectBase< BaseClass >::Interaction_MoveContent, KIS_SAFE_ASSERT_RECOVER_RETURN, KisToolSelectBase< BaseClass >::locateSelectionMaskUnderCursor(), KisToolSelectBase< BaseClass >::m_currentInteraction, KisToolSelectBase< BaseClass >::m_didMove, KoPointerEvent::modifiers(), KisToolSelectBase< BaseClass >::moveSelectedContent(), KoPointerEvent::point, KisViewManager::selection(), KisToolSelectBase< BaseClass >::updateCursor(), and KisCanvas2::viewManager().

◆ beginSelectInteraction()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::beginSelectInteraction ( )
inline

◆ canBeginNewAction()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::canBeginNewAction ( KoPointerEvent * event,
const QPointF & pos,
CursorHit hit )
inline

Definition at line 458 of file kis_tool_select_base.h.

459 {
460 /* Prevent interrupting while selecting a region */
461 if (isSelecting()) {
462 BaseClass::beginPrimaryAction(event);
463 return false;
464 }
465
466 /* Prevent interrupting while moving */
467 if (isMovingContent()) {
468 /* We must update the offsets here, so the offset is sane later */
469 m_dragStartPos = pos;
471 /* User clicked outside? Commit changes and start a new stroke */
472 /* This eliminates extra keystrokes to start a new transaction */
473 if (hit == CursorHit_Outside) {
475 BaseClass::beginPrimaryAction(event);
476 return false;
477 }
478 }
479
480 return true;
481 }

References KisToolSelectBase< BaseClass >::commitMoveSelectionStroke(), KisToolSelectBase< BaseClass >::CursorHit_Outside, KisToolSelectBase< BaseClass >::isMovingContent(), KisToolSelectBase< BaseClass >::isSelecting(), KisToolSelectBase< BaseClass >::m_accumulatedOffset, KisToolSelectBase< BaseClass >::m_dragStartOffset, and KisToolSelectBase< BaseClass >::m_dragStartPos.

◆ cancelMoveSelectionStroke()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::cancelMoveSelectionStroke ( )
inline

◆ checkCursorHit()

template<class BaseClass >
CursorHit KisToolSelectBase< BaseClass >::checkCursorHit ( const QPointF & pos,
Qt::KeyboardModifiers modifiers ) const
inline

Definition at line 428 of file kis_tool_select_base.h.

429 {
430 KisCanvas2 *canvas = dynamic_cast<KisCanvas2*>(this->canvas());
432 KisSelectionSP selection = canvas->viewManager()->selection();
433
434 if (!selection || !selection->outlineCacheValid()) {
435 return CursorHit_Outside;
436 }
437
438 const QPainterPath selectionPath = selection->outlineCache();
439
440 if (modifiers == Qt::NoModifier) {
441 const qreal handleRadius = qreal(this->handleRadius()) / canvas->coordinatesConverter()->effectiveZoom();
442
443 QPainterPath samplePath;
444 samplePath.addEllipse(pos, handleRadius, handleRadius);
445
446 if (selectionPath.intersects(samplePath) && !selectionPath.contains(samplePath)) {
447 return CursorHit_Border;
448 }
449 }
450
451 if (selectionPath.contains(pos)) {
452 return CursorHit_Inside;
453 }
454
455 return CursorHit_Outside;
456 }
KisCoordinatesConverter * coordinatesConverter
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
bool outlineCacheValid() const
QPainterPath outlineCache() const

References KisCanvas2::coordinatesConverter, KisToolSelectBase< BaseClass >::CursorHit_Border, KisToolSelectBase< BaseClass >::CursorHit_Inside, KisToolSelectBase< BaseClass >::CursorHit_Outside, KisCoordinatesConverter::effectiveZoom(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, KisSelection::outlineCache(), KisSelection::outlineCacheValid(), KisViewManager::selection(), and KisCanvas2::viewManager().

◆ colorLabelsSelected()

template<class BaseClass >
QList< int > KisToolSelectBase< BaseClass >::colorLabelsSelected ( ) const
inline

◆ commitMoveSelectionStroke()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::commitMoveSelectionStroke ( )
inline

◆ commitMoveSelectionStrokeImpl()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::commitMoveSelectionStrokeImpl ( bool cancel)
inline

◆ continueAlternateAction()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::continueAlternateAction ( KoPointerEvent * event,
KisTool::AlternateAction action )
inlineoverride

Definition at line 282 of file kis_tool_select_base.h.

284 {
285 Q_UNUSED(action);
287 }
void continuePrimaryAction(KoPointerEvent *event) override

References KisToolSelectBase< BaseClass >::continuePrimaryAction().

◆ continuePrimaryAction()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::continuePrimaryAction ( KoPointerEvent * event)
inlineoverride

Definition at line 529 of file kis_tool_select_base.h.

530 {
532 const QPointF pos = this->convertToPixelCoord(event->point);
533 const QPoint delta = (pos - m_dragStartPos).toPoint();
534 const QPoint offset = m_dragStartOffset + delta;
535 m_accumulatedOffset = offset;
536 this->image()->addJob(m_moveStrokeId, new MoveStrokeStrategy::Data(offset));
537 return;
538 }
539
540 BaseClass::continuePrimaryAction(event);
541 }

References KisToolSelectBase< BaseClass >::isMovingContent(), KisToolSelectBase< BaseClass >::isMovingSelection(), KisToolSelectBase< BaseClass >::m_accumulatedOffset, KisToolSelectBase< BaseClass >::m_dragStartOffset, KisToolSelectBase< BaseClass >::m_dragStartPos, KisToolSelectBase< BaseClass >::m_moveStrokeId, and KoPointerEvent::point.

◆ createOptionWidget()

template<class BaseClass >
QWidget * KisToolSelectBase< BaseClass >::createOptionWidget ( )
inlineoverride

Definition at line 164 of file kis_tool_select_base.h.

165 {
166 m_widgetHelper.createOptionWidget(this->toolId());
168
169 this->connect(this, SIGNAL(isActiveChanged(bool)), &m_widgetHelper, SLOT(slotToolActivatedChanged(bool)));
170 this->connect(&m_widgetHelper,
171 SIGNAL(selectionActionChanged(SelectionAction)),
172 this,
173 SLOT(resetCursorStyle()));
174
177 m_widgetHelper.optionWidget()->setContentsMargins(0, 10, 0, 10);
178 if (isPixelOnly()) {
181 true);
182 }
185 }
186
188 }
SelectionAction

References KisSelectionToolConfigWidgetHelper::createOptionWidget(), KisToolSelectBase< BaseClass >::isPixelOnly(), KisToolSelectBase< BaseClass >::m_widgetHelper, KisSelectionToolConfigWidgetHelper::optionWidget(), KisSelectionOptions::setAdjustmentsSectionVisible(), KisSelectionToolConfigWidgetHelper::setConfigGroupForExactTool(), KisSelectionOptions::setModeSectionVisible(), KisSelectionOptions::setReferenceSectionVisible(), KisToolSelectBase< BaseClass >::updateActionShortcutToolTips(), and KisToolSelectBase< BaseClass >::usesColorLabels().

◆ currentInteraction()

template<class BaseClass >
Interaction KisToolSelectBase< BaseClass >::currentInteraction ( ) const
inlineprivate

Definition at line 753 of file kis_tool_select_base.h.

753 {
755 }

References KisToolSelectBase< BaseClass >::m_currentInteraction.

◆ deactivate()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::deactivate ( )
inlineoverride

◆ deactivateAlternateAction()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::deactivateAlternateAction ( KisTool::AlternateAction action)
inlineoverride

Definition at line 269 of file kis_tool_select_base.h.

270 {
271 Q_UNUSED(action);
272 BaseClass::deactivatePrimaryAction();
273 }

◆ endAlternateAction()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::endAlternateAction ( KoPointerEvent * event,
KisTool::AlternateAction action )
inlineoverride

Definition at line 289 of file kis_tool_select_base.h.

291 {
292 Q_UNUSED(action);
293 endPrimaryAction(event);
294 }
void endPrimaryAction(KoPointerEvent *event) override

References KisToolSelectBase< BaseClass >::endPrimaryAction().

◆ endMoveContentInteraction()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::endMoveContentInteraction ( )
inline

◆ endMoveSelectionInteraction()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::endMoveSelectionInteraction ( )
inline

◆ endPrimaryAction()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::endPrimaryAction ( KoPointerEvent * event)
inlineoverride

Definition at line 543 of file kis_tool_select_base.h.

544 {
545 if (isMovingContent()) {
546 const QPointF pos = this->convertToPixelCoord(event->point);
547 const QPoint delta = (pos - m_dragStartPos).toPoint();
549 return;
550 }
551 if (isMovingSelection()) {
552 this->image()->endStroke(m_moveStrokeId);
553 m_moveStrokeId.clear();
555 return;
556 }
557
558 BaseClass::endPrimaryAction(event);
559 }

References KisToolSelectBase< BaseClass >::endMoveSelectionInteraction(), KisToolSelectBase< BaseClass >::isMovingContent(), KisToolSelectBase< BaseClass >::isMovingSelection(), KisToolSelectBase< BaseClass >::m_accumulatedOffset, KisToolSelectBase< BaseClass >::m_dragStartOffset, KisToolSelectBase< BaseClass >::m_dragStartPos, KisToolSelectBase< BaseClass >::m_moveStrokeId, and KoPointerEvent::point.

◆ endSelectInteraction()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::endSelectInteraction ( )
inline

◆ explicitUserStrokeEndRequest()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::explicitUserStrokeEndRequest ( )
inlineoverride

◆ featherSelection()

template<class BaseClass >
int KisToolSelectBase< BaseClass >::featherSelection ( ) const
inline

◆ growSelection()

template<class BaseClass >
int KisToolSelectBase< BaseClass >::growSelection ( ) const
inline

◆ initializeStrokeAttributes()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::initializeStrokeAttributes ( const QPointF & pos,
KisStrokeStrategy * strategy,
bool moved )
inline

◆ isMovingContent()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::isMovingContent ( ) const
inline

◆ isMovingSelection()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::isMovingSelection ( ) const
inline

◆ isPixelOnly()

template<class BaseClass >
virtual bool KisToolSelectBase< BaseClass >::isPixelOnly ( ) const
inlineprotectedvirtual

Reimplemented in KisToolSelectContiguous, and KisToolSelectSimilar.

Definition at line 734 of file kis_tool_select_base.h.

734 {
735 return false;
736 }

◆ isSelecting()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::isSelecting ( ) const
inline

◆ keyPressEvent()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::keyPressEvent ( QKeyEvent * event)
inlineoverride

Definition at line 356 of file kis_tool_select_base.h.

357 {
359 // Assume all the modifiers were unpressed...
360 m_currentModifiers = Qt::NoModifier;
361 // ...and add those which are right now
362 if (key == Qt::Key_Control || event->modifiers().testFlag(Qt::ControlModifier)) {
363 m_currentModifiers.setFlag(Qt::ControlModifier);
364 }
365 if (key == Qt::Key_Shift || event->modifiers().testFlag(Qt::ShiftModifier)) {
366 m_currentModifiers.setFlag(Qt::ShiftModifier);
367 }
368 if (key == Qt::Key_Alt || event->modifiers().testFlag(Qt::AltModifier)) {
369 m_currentModifiers.setFlag(Qt::AltModifier);
370 }
371
372 // Avoid changing the cursor if the user is interacting
373 if (isSelecting()) {
374 BaseClass::keyPressEvent(event);
375 return;
376 }
377 if (isMovingSelection()) {
378 return;
379 }
380
382 updateCursor();
383 }
static Qt::Key workaroundShiftAltMetaHell(const QKeyEvent *keyEvent)
virtual void setAlternateSelectionAction(SelectionAction action)
Qt::KeyboardModifiers m_currentModifiers
SelectionAction map(Qt::KeyboardModifiers m)

References KisToolSelectBase< BaseClass >::isMovingSelection(), KisToolSelectBase< BaseClass >::isSelecting(), KisToolSelectBase< BaseClass >::m_currentModifiers, KisSelectionModifierMapper::map(), KisToolSelectBase< BaseClass >::setAlternateSelectionAction(), KisToolSelectBase< BaseClass >::updateCursor(), and KisExtendedModifiersMapper::workaroundShiftAltMetaHell().

◆ keyReleaseEvent()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::keyReleaseEvent ( QKeyEvent * event)
inlineoverride

Definition at line 385 of file kis_tool_select_base.h.

386 {
388 // Assume all the modifiers were pressed...
389 m_currentModifiers = Qt::ControlModifier | Qt::ShiftModifier | Qt::AltModifier;
390 // ...and remove those which aren't right now
391 if (key == Qt::Key_Control || !event->modifiers().testFlag(Qt::ControlModifier)) {
392 m_currentModifiers.setFlag(Qt::ControlModifier, false);
393 }
394 if (key == Qt::Key_Shift || !event->modifiers().testFlag(Qt::ShiftModifier)) {
395 m_currentModifiers.setFlag(Qt::ShiftModifier, false);
396 }
397 if (key == Qt::Key_Alt || !event->modifiers().testFlag(Qt::AltModifier)) {
398 m_currentModifiers.setFlag(Qt::AltModifier, false);
399 }
400
401 // Avoid changing the selection mode and cursor if the user is interacting
402 if (isSelecting()) {
403 BaseClass::keyReleaseEvent(event);
404 return;
405 }
406 if (isMovingSelection()) {
407 return;
408 }
409
411 if (m_currentModifiers == Qt::NoModifier) {
412 updateCursor();
413 }
414 else {
415 this->resetCursorStyle();
416 }
417 }

References KisToolSelectBase< BaseClass >::isMovingSelection(), KisToolSelectBase< BaseClass >::isSelecting(), KisToolSelectBase< BaseClass >::m_currentModifiers, KisSelectionModifierMapper::map(), KisToolSelectBase< BaseClass >::setAlternateSelectionAction(), KisToolSelectBase< BaseClass >::updateCursor(), and KisExtendedModifiersMapper::workaroundShiftAltMetaHell().

◆ locateSelectionMaskUnderCursor()

template<class BaseClass >
KisNodeSP KisToolSelectBase< BaseClass >::locateSelectionMaskUnderCursor ( const QPointF & pos,
Qt::KeyboardModifiers modifiers )
inline

Definition at line 329 of file kis_tool_select_base.h.

329 {
330 if (modifiers != Qt::NoModifier) return 0;
331
332 KisCanvas2* canvas = dynamic_cast<KisCanvas2*>(this->canvas());
334
335 KisSelectionSP selection = canvas->viewManager()->selection();
336 if (selection &&
337 selection->outlineCacheValid()) {
338
339 const qreal handleRadius = qreal(this->handleRadius()) / canvas->coordinatesConverter()->effectiveZoom();
340 QPainterPath samplePath;
341 samplePath.addEllipse(pos, handleRadius, handleRadius);
342
343 const QPainterPath selectionPath = selection->outlineCache();
344
345 if (selectionPath.intersects(samplePath) && !selectionPath.contains(samplePath)) {
346 KisNodeSP parent = selection->parentNode();
347 if (parent && parent->isEditable()) {
348 return parent;
349 }
350 }
351 }
352
353 return 0;
354 }
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327
KisNodeWSP parentNode

References KisCanvas2::coordinatesConverter, KisCoordinatesConverter::effectiveZoom(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, KisSelection::outlineCache(), KisSelection::outlineCacheValid(), KisSelection::parentNode, KisViewManager::selection(), and KisCanvas2::viewManager().

◆ mouseMoveEvent()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::mouseMoveEvent ( KoPointerEvent * event)
inlineoverride

Definition at line 419 of file kis_tool_select_base.h.

420 {
421 m_currentPos = this->convertToPixelCoord(event->point);
422 m_currentModifiers = event->modifiers();
423
424 updateCursor();
425 BaseClass::mouseMoveEvent(event);
426 }

References KisToolSelectBase< BaseClass >::m_currentModifiers, KisToolSelectBase< BaseClass >::m_currentPos, KoPointerEvent::point, and KisToolSelectBase< BaseClass >::updateCursor().

◆ moveSelectedContent()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::moveSelectedContent ( ) const
inline

◆ popupActionsMenu()

template<class BaseClass >
QMenu * KisToolSelectBase< BaseClass >::popupActionsMenu ( )
inlineoverride

Definition at line 566 of file kis_tool_select_base.h.

567 {
568 if (isSelecting()) {
569 return BaseClass::popupActionsMenu();
570 }
571
572 KisCanvas2 * kisCanvas = dynamic_cast<KisCanvas2*>(canvas());
574
576 }
static QMenu * getSelectionContextMenu(KisCanvas2 *canvas)

References KisSelectionToolHelper::getSelectionContextMenu(), KisToolSelectBase< BaseClass >::isSelecting(), and KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE.

◆ popupWidget()

template<class BaseClass >
KisPopupWidgetInterface * KisToolSelectBase< BaseClass >::popupWidget ( )
inlineoverride

Definition at line 578 of file kis_tool_select_base.h.

579 {
580 if (isSelecting()) {
581 return BaseClass::popupWidget();
582 }
583 return nullptr;
584 }

References KisToolSelectBase< BaseClass >::isSelecting().

◆ requestStrokeCancellation()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::requestStrokeCancellation ( )
inlineoverride

◆ sampleLayersMode()

template<class BaseClass >
SampleLayersMode KisToolSelectBase< BaseClass >::sampleLayersMode ( ) const
inline

Definition at line 233 of file kis_tool_select_base.h.

References KisSelectionOptions::AllLayers, KisSelectionOptions::ColorLabeledLayers, KisSelectionOptions::CurrentLayer, KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, KisToolSelectBase< BaseClass >::m_widgetHelper, KisSelectionToolConfigWidgetHelper::referenceLayers(), KisToolSelectBase< BaseClass >::SampleAllLayers, KisToolSelectBase< BaseClass >::SampleColorLabeledLayers, and KisToolSelectBase< BaseClass >::SampleCurrentLayer.

◆ selectionAction()

◆ selectionDidMove()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::selectionDidMove ( ) const
inline

Definition at line 561 of file kis_tool_select_base.h.

562 {
563 return m_didMove;
564 }

References KisToolSelectBase< BaseClass >::m_didMove.

◆ selectionMode()

template<class BaseClass >
SelectionMode KisToolSelectBase< BaseClass >::selectionMode ( ) const
inline

◆ selectionOptionWidget()

template<class BaseClass >
KisSelectionOptions * KisToolSelectBase< BaseClass >::selectionOptionWidget ( )
inline

◆ setAlternateSelectionAction()

template<class BaseClass >
virtual void KisToolSelectBase< BaseClass >::setAlternateSelectionAction ( SelectionAction action)
inlinevirtual

◆ stopGrowingAtDarkestPixel()

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::stopGrowingAtDarkestPixel ( ) const
inline

◆ updateActionShortcutToolTips()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::updateActionShortcutToolTips ( )
inline

Definition at line 106 of file kis_tool_select_base.h.

106 {
108 if (widget) {
111 this->action("selection_tool_mode_replace")->shortcut());
114 this->action("selection_tool_mode_add")->shortcut());
117 this->action("selection_tool_mode_subtract")->shortcut());
120 this->action("selection_tool_mode_intersect")->shortcut());
121 }
122 }
@ SELECTION_REPLACE
@ SELECTION_INTERSECT
@ SELECTION_SUBTRACT
@ SELECTION_ADD
void updateActionButtonToolTip(SelectionAction action, const QKeySequence &shortcut)

References KisToolSelectBase< BaseClass >::m_widgetHelper, KisSelectionToolConfigWidgetHelper::optionWidget(), SELECTION_ADD, SELECTION_INTERSECT, SELECTION_REPLACE, SELECTION_SUBTRACT, and KisSelectionOptions::updateActionButtonToolTip().

◆ updateCursor()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::updateCursor ( )
inline

Definition at line 657 of file kis_tool_select_base.h.

658 {
659
660 const Interaction interaction = currentInteraction();
662
663 switch (interaction)
664 {
666 switch (hit)
667 {
668 case CursorHit_Border:
669 this->useCursor(KisCursor::moveCursor());
670 break;
671 case CursorHit_Inside:
672 this->useCursor(KisCursor::moveCursor());
673 break;
675 this->resetCursorStyle();
676 break;
677 case CursorHit_None:
678 default:
679 break;
680 }
681 break;
683 switch (hit)
684 {
685 case CursorHit_Border:
686 this->useCursor(KisCursor::moveSelectionCursor());
687 break;
688 case CursorHit_Inside:
689 this->resetCursorStyle();
690 break;
692 this->resetCursorStyle();
693 break;
694 case CursorHit_None:
695 default:
696 break;
697 }
698 break;
700 this->useCursor(KisCursor::moveCursor());
701 break;
702 case Interaction_None:
703 if (hit == CursorHit_Border){
704 this->useCursor(KisCursor::moveSelectionCursor());
705 }
706 else if (hit == CursorHit_Inside && this->moveSelectedContent()) {
707 this->useCursor(KisCursor::moveCursor());
708 } else {
709 this->resetCursorStyle();
710 }
711 break;
712 default:
713 this->resetCursorStyle();
714 break;
715 }
716 }
static QCursor moveSelectionCursor()
static QCursor moveCursor()
Interaction currentInteraction() const

References KisToolSelectBase< BaseClass >::checkCursorHit(), KisToolSelectBase< BaseClass >::currentInteraction(), KisToolSelectBase< BaseClass >::CursorHit_Border, KisToolSelectBase< BaseClass >::CursorHit_Inside, KisToolSelectBase< BaseClass >::CursorHit_None, KisToolSelectBase< BaseClass >::CursorHit_Outside, KisToolSelectBase< BaseClass >::Interaction_MoveContent, KisToolSelectBase< BaseClass >::Interaction_MoveSelection, KisToolSelectBase< BaseClass >::Interaction_None, KisToolSelectBase< BaseClass >::Interaction_Select, KisToolSelectBase< BaseClass >::m_currentModifiers, KisToolSelectBase< BaseClass >::m_currentPos, KisCursor::moveCursor(), KisToolSelectBase< BaseClass >::moveSelectedContent(), and KisCursor::moveSelectionCursor().

◆ updateCursorDelayed()

template<class BaseClass >
void KisToolSelectBase< BaseClass >::updateCursorDelayed ( )
inline

◆ usesColorLabels()

template<class BaseClass >
virtual bool KisToolSelectBase< BaseClass >::usesColorLabels ( ) const
inlineprotectedvirtual

Reimplemented in KisToolSelectContiguous, and KisToolSelectSimilar.

Definition at line 738 of file kis_tool_select_base.h.

738 {
739 return false;
740 }

Member Data Documentation

◆ m_accumulatedOffset

template<class BaseClass >
QPoint KisToolSelectBase< BaseClass >::m_accumulatedOffset
private

Definition at line 761 of file kis_tool_select_base.h.

◆ m_currentInteraction

template<class BaseClass >
Interaction KisToolSelectBase< BaseClass >::m_currentInteraction {Interaction_None}
private

Definition at line 751 of file kis_tool_select_base.h.

◆ m_currentModifiers

template<class BaseClass >
Qt::KeyboardModifiers KisToolSelectBase< BaseClass >::m_currentModifiers
private

Definition at line 757 of file kis_tool_select_base.h.

◆ m_currentPos

template<class BaseClass >
QPointF KisToolSelectBase< BaseClass >::m_currentPos
private

Definition at line 760 of file kis_tool_select_base.h.

◆ m_didMove

template<class BaseClass >
bool KisToolSelectBase< BaseClass >::m_didMove = false
private

Definition at line 764 of file kis_tool_select_base.h.

◆ m_dragStartOffset

template<class BaseClass >
QPoint KisToolSelectBase< BaseClass >::m_dragStartOffset
private

Definition at line 762 of file kis_tool_select_base.h.

◆ m_dragStartPos

template<class BaseClass >
QPointF KisToolSelectBase< BaseClass >::m_dragStartPos
private

Definition at line 759 of file kis_tool_select_base.h.

◆ m_modeConnections

template<class BaseClass >
KisSignalAutoConnectionsStore KisToolSelectBase< BaseClass >::m_modeConnections
private

Definition at line 766 of file kis_tool_select_base.h.

◆ m_moveStrokeId

template<class BaseClass >
KisStrokeId KisToolSelectBase< BaseClass >::m_moveStrokeId
private

Definition at line 763 of file kis_tool_select_base.h.

◆ m_selectionActionAlternate

template<class BaseClass >
SelectionAction KisToolSelectBase< BaseClass >::m_selectionActionAlternate
protected

Definition at line 732 of file kis_tool_select_base.h.

◆ m_widgetHelper

template<class BaseClass >
KisSelectionToolConfigWidgetHelper KisToolSelectBase< BaseClass >::m_widgetHelper
protected

Definition at line 731 of file kis_tool_select_base.h.


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