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

Select Layer implementation of KisAbstractInputAction. More...

#include <kis_select_layer_action.h>

+ Inheritance diagram for KisSelectLayerAction:

Classes

class  Private
 

Public Types

enum  LayerSelectionMode { LayerSelectionMode_TopLayer , LayerSelectionMode_AllLayers , LayerSelectionMode_Ask }
 
enum  SelectionOverrideMode { SelectionOverrideMode_Replace , SelectionOverrideMode_Add }
 

Public Member Functions

void activate (int shortcut) override
 
void begin (int shortcut, QEvent *event) override
 
void deactivate (int shortcut) override
 
void inputEvent (QEvent *event) override
 
 KisSelectLayerAction ()
 
int priority () const override
 
 ~KisSelectLayerAction () override
 
- Public Member Functions inherited from KisAbstractInputAction
virtual bool canIgnoreModifiers () const
 
virtual QString description () const
 
virtual void end (QEvent *event)
 
virtual QString id () const
 
virtual KisInputActionGroup inputActionGroup (int shortcut) const
 
virtual bool isAvailable () const
 
virtual bool isShortcutRequired (int shortcut) const
 
 KisAbstractInputAction (const QString &id)
 
virtual QString name () const
 
virtual QHash< QString, int > shortcutIndexes () const
 
virtual bool supportsHiResInputEvents (int shortcut) const
 
virtual ~KisAbstractInputAction ()
 

Private Attributes

Private *const d
 

Additional Inherited Members

- Public Attributes inherited from KisAbstractInputAction
QString description
 
QString id
 
QHash< QString, int > indexes
 
QPointF lastCursorPosition
 
QString name
 
QPointF startCursorPosition
 
- Static Public Attributes inherited from KisAbstractInputAction
static KisInputManagerinputManager
 
- Protected Member Functions inherited from KisAbstractInputAction
virtual void cursorMoved (const QPointF &lastPos, const QPointF &pos)
 
virtual void cursorMovedAbsolute (const QPointF &startPos, const QPointF &pos)
 
QPoint eventPos (const QEvent *event)
 
QPointF eventPosF (const QEvent *event)
 
KisInputManagerinputManager () const
 
void setDescription (const QString &description)
 
void setName (const QString &name)
 
void setShortcutIndexes (const QHash< QString, int > &indexes)
 

Detailed Description

Select Layer implementation of KisAbstractInputAction.

The Select Layer action selects a layer under a cursor.

Definition at line 17 of file kis_select_layer_action.h.

Member Enumeration Documentation

◆ LayerSelectionMode

Enumerator
LayerSelectionMode_TopLayer 
LayerSelectionMode_AllLayers 
LayerSelectionMode_Ask 

Definition at line 20 of file kis_select_layer_action.h.

◆ SelectionOverrideMode

Enumerator
SelectionOverrideMode_Replace 
SelectionOverrideMode_Add 

Definition at line 27 of file kis_select_layer_action.h.

Constructor & Destructor Documentation

◆ KisSelectLayerAction()

KisSelectLayerAction::KisSelectLayerAction ( )
explicit

Definition at line 112 of file kis_select_layer_action.cpp.

113 : KisAbstractInputAction("Select Layer")
114 , d(new Private(this))
115{
116 setName(i18n("Select Layer"));
117 setDescription(i18n("Select layers under the cursor position"));
118
119 QHash<QString, int> shortcuts;
120 shortcuts.insert(i18n("Select Top Layer (Replace Selection)"),
122 shortcuts.insert(i18n("Select All Layers (Replace Selection)"),
124 shortcuts.insert(i18n("Select from Menu (Replace Selection)"),
126 shortcuts.insert(i18n("Select Top Layer (Add to Selection)"),
128 shortcuts.insert(i18n("Select All Layers (Add to Selection)"),
130 shortcuts.insert(i18n("Select from Menu (Add to Selection)"),
132 setShortcutIndexes(shortcuts);
133}
KisAbstractInputAction(const QString &id)
void setShortcutIndexes(const QHash< QString, int > &indexes)
void setName(const QString &name)
void setDescription(const QString &description)
static int makeShortcut(LayerSelectionMode layerSelectionMode, SelectionOverrideMode selectionOverrideMode)

References d, LayerSelectionMode_AllLayers, LayerSelectionMode_Ask, LayerSelectionMode_TopLayer, KisSelectLayerAction::Private::makeShortcut(), SelectionOverrideMode_Add, SelectionOverrideMode_Replace, KisAbstractInputAction::setDescription(), KisAbstractInputAction::setName(), and KisAbstractInputAction::setShortcutIndexes().

◆ ~KisSelectLayerAction()

KisSelectLayerAction::~KisSelectLayerAction ( )
override

Definition at line 135 of file kis_select_layer_action.cpp.

136{
137 delete d;
138}

References d.

Member Function Documentation

◆ activate()

void KisSelectLayerAction::activate ( int shortcut)
overridevirtual

The method is called when the action is yet to be started, that is, e.g. the user has pressed all the modifiers for the action but hasn't started painting yet. This method is a right place to show the user what is going to happen, e.g. change the cursor.

Reimplemented from KisAbstractInputAction.

Definition at line 145 of file kis_select_layer_action.cpp.

146{
147 Q_UNUSED(shortcut);
148 QApplication::setOverrideCursor(KisCursor::pickLayerCursor());
149}
static QCursor pickLayerCursor()

References KisCursor::pickLayerCursor().

◆ begin()

void KisSelectLayerAction::begin ( int shortcut,
QEvent * event )
overridevirtual

Begin the action.

Parameters
shortcutThe index of the behaviour to trigger.
eventThe mouse event that has triggered this action. Is null for keyboard-activated actions.

Reimplemented from KisAbstractInputAction.

Definition at line 157 of file kis_select_layer_action.cpp.

158{
159 KisAbstractInputAction::begin(shortcut, event);
160
161 d->shortcut = shortcut;
162 inputEvent(event);
163}
virtual void begin(int shortcut, QEvent *event)
void inputEvent(QEvent *event) override

References KisAbstractInputAction::begin(), d, inputEvent(), and KisSelectLayerAction::Private::shortcut.

◆ deactivate()

void KisSelectLayerAction::deactivate ( int shortcut)
overridevirtual

The method is called when the action is not a candidate for the starting anymore. The action should revert everything that was done in activate() method.

See also
activate()

Reimplemented from KisAbstractInputAction.

Definition at line 151 of file kis_select_layer_action.cpp.

152{
153 Q_UNUSED(shortcut);
154 QApplication::restoreOverrideCursor();
155}

◆ inputEvent()

void KisSelectLayerAction::inputEvent ( QEvent * event)
overridevirtual

Process an input event.

By default handles MouseMove events and passes the data to a convenience cursorMoved() method

Parameters
eventAn event to process.

Reimplemented from KisAbstractInputAction.

Definition at line 165 of file kis_select_layer_action.cpp.

166{
167 // Event not recognized
168 if (!event || (event->type() != QEvent::MouseMove && event->type() != QEvent::TabletMove &&
169 event->type() != QTouchEvent::TouchUpdate && event->type() != QEvent::MouseButtonPress &&
170 event->type() != QEvent::TabletPress && event->type() != QTouchEvent::TouchBegin)) {
171 return;
172 }
173
174 const int layerSelectionMode = d->layerSelectionMode(d->shortcut);
175 const int selectionOverrideMode = d->selectionOverrideMode(d->shortcut);
176
177 // Shortcut not recognized
179 (layerSelectionMode == LayerSelectionMode_TopLayer ||
180 layerSelectionMode == LayerSelectionMode_AllLayers ||
181 layerSelectionMode == LayerSelectionMode_Ask) &&
182 (selectionOverrideMode == SelectionOverrideMode_Replace ||
183 selectionOverrideMode == SelectionOverrideMode_Add)
184 );
185
186 QPoint pos =
187 inputManager()->canvas()->
188 coordinatesConverter()->widgetToImage(eventPosF(event)).toPoint();
189
190 // First make a list with the nodes to be selected
191 KisNodeList nodesToSelect;
192
193 if (layerSelectionMode == LayerSelectionMode_TopLayer) {
194 KisNodeSP foundNode = KisToolUtils::findNode(inputManager()->canvas()->image()->root(), pos, false);
195 if (!foundNode) {
196 return;
197 }
198 nodesToSelect.append(foundNode);
199 } else {
200 // Retrieve group nodes only if the mode is LayerSelectionMode_Ask
201 const KisNodeList foundNodes = KisToolUtils::findNodes(
202 inputManager()->canvas()->image()->root()->firstChild(),
203 pos, false, layerSelectionMode == LayerSelectionMode_Ask);
204
205 if (foundNodes.isEmpty()) {
206 return;
207 }
208
209 if (layerSelectionMode == LayerSelectionMode_AllLayers) {
210 nodesToSelect = foundNodes;
211 } else { //LayerSelectionMode_Ask
212 QWidget *canvasWidget = inputManager()->canvas()->canvasWidget();
213 QMenu *menu = new QMenu(canvasWidget);
214 menu->setAttribute(Qt::WA_DeleteOnClose);
215 int numberOfLayers = 0;
216
217 // Traverse the list in reverse order so that the menu entries order
218 // resembles that of the layer stack
219 for (int i = foundNodes.size() - 1; i >= 0; --i) {
220 KisNodeSP node = foundNodes[i];
221 int indentation = -1;
222 {
223 KisNodeSP tempNode = node;
224 while (tempNode->parent()) {
225 ++indentation;
226 tempNode = tempNode->parent();
227 }
228 }
229 QAction *action = menu->addAction(QString(4 * indentation, ' ') + node->name());
230 QObject::connect(action, &QAction::triggered,
231 [this, node, selectionOverrideMode]()
232 {
233 d->selectNode(node, selectionOverrideMode);
234 }
235 );
236 if (!dynamic_cast<KisGroupLayer*>(node.data())) {
237 ++numberOfLayers;
238 }
239 }
240
241 // Add separator
242 menu->addSeparator();
243
244 // Add "select all layers" menu item
245 {
246 QAction *action = menu->addAction(i18nc("Menu entry for the select layer under cursor canvas input action",
247 "Select all layers"));
248 action->setVisible(numberOfLayers > 1);
249 QObject::connect(action, &QAction::triggered,
250 [this, foundNodes, selectionOverrideMode]()
251 {
252 d->selectNodes(foundNodes, selectionOverrideMode, false);
253 }
254 );
255 }
256
257 menu->popup(canvasWidget->mapToGlobal(eventPos(event)));
258 return;
259 }
260 }
261
262 // Now select the nodes
263 d->selectNodes(nodesToSelect, selectionOverrideMode, true);
264}
static KisInputManager * inputManager
QPoint eventPos(const QEvent *event)
QPointF eventPosF(const QEvent *event)
KisAbstractCanvasWidget * canvasWidget
KisCanvas2 * canvas() const
static int selectionOverrideMode(int shortcut)
static int layerSelectionMode(int shortcut)
void selectNodes(const KisNodeList &nodesToSelect, int selectionOverrideMode, bool includeGroups) const
void selectNode(KisNodeSP node, int selectionOverrideMode) const
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
KisNodeList findNodes(KisNodeSP node, const QPoint &point, bool wholeGroup, bool includeGroups, bool editableOnly)
KisNodeSP findNode(KisNodeSP node, const QPoint &point, bool wholeGroup, bool editableOnly)
QString name() const
KisNodeWSP parent
Definition kis_node.cpp:86
KisCanvas2 * canvas

References Private::canvas, KisInputManager::canvas(), KisCanvas2::canvasWidget, d, KisSharedPtr< T >::data(), KisAbstractInputAction::eventPos(), KisAbstractInputAction::eventPosF(), KisToolUtils::findNode(), KisToolUtils::findNodes(), KisAbstractInputAction::inputManager, KIS_SAFE_ASSERT_RECOVER_RETURN, KisSelectLayerAction::Private::layerSelectionMode(), LayerSelectionMode_AllLayers, LayerSelectionMode_Ask, LayerSelectionMode_TopLayer, KisBaseNode::name(), KisNode::parent, KisSelectLayerAction::Private::selectionOverrideMode(), SelectionOverrideMode_Add, SelectionOverrideMode_Replace, KisSelectLayerAction::Private::selectNode(), KisSelectLayerAction::Private::selectNodes(), and KisSelectLayerAction::Private::shortcut.

◆ priority()

int KisSelectLayerAction::priority ( ) const
overridevirtual

The priority for this action.

Priority determines how "important" the action is and is used to resolve conflicts when multiple actions can be activated.

Reimplemented from KisAbstractInputAction.

Definition at line 140 of file kis_select_layer_action.cpp.

141{
142 return 5;
143}

Member Data Documentation

◆ d

Private* const KisSelectLayerAction::d
private

Definition at line 46 of file kis_select_layer_action.h.


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