Shortcuts on link dragging to quickly add nodes #94598

Open
opened 2022-01-03 12:52:42 +01:00 by Simon Thommes · 17 comments
Member

The functionality to add nodes on link dragging allows to quickly extend a node tree with a string of operations. Due to the fact that this functionality is a modal operator it would be possible to add additional keyboard inputs before the mouse button is let go, to quickly terminate the operation and pick a certain nodes with a shortcut, instead of typing in the name in the search bar after letting go.

This extended functionality would drastically increase workflow efficiency in the cases of a few, commonly used nodes.

Which nodes that includes and how the selection adapts to the context of the dragged link (editor/socket type, in/out link) needs to be figured out/discussed in this task.

Proposed included nodes and shortcuts:

Input
{key 1} : Value
{key 2} : Color
{key 3} : Vector

Link Type: Any (Node version/settings according to the matching datatype)
{key W}: Switch
{key Y}: Reroute (visual representation of a junction and {key R} is reserved)

Link Type: Geometry
{key J}: Join Geometry
{key P}: Set Position

Link Type: Shader
{key X}: Mix Shader
{key A}: Add Shader

Link Type: Float/Vec/Vec2/Col/Int/Bool (Node version/settings according to the matching datatype)
{key X}: Mix (Ideally there would also be nodes for at least vector and float)
{key A}: Add
{key S}: Subtract
{key F}: Multiply (F for factor)
{key D}: Divide
{key C}: Curve
{key R}: Map Range
{key G}: Color Ramp (G for gradient (?))
{key I}: Invert

Separate/Combine Nodes
Using the context sensitivity of the shortcuts, the different separate/combine could elegantly be solved with the keys {key 1}, {key 2}, {key 3}.
Examples:
Dragging from a float output and pressing {key 3} would add a Combine XYZ Node.
Dragging from a float input and pressing {key 2} would add a Separate RGB Node.
Dragging from a vector output and pressing {key 1} would add a Separate XYZ Node.

↓ Key \ Socket → Float In Float Out RGB In RGB Out XYZ In XYZ Out
{key 1} Value / Com. RGB Sep. RGB Com. XYZ Sep. XYZ
{key 2} Sep. RGB Com. RGB RGB / RGB /
{key 3} Sep. XYZ Com. XYZ Vector / Vector /

Note: This might look confusing, but my hope is that it is intuitive, when used.

Notes

The shortcuts should be sensible with the name, but that leads to collisions quite quickly.

Many more useful rules would be possible, but I would keep it to a relatively small and manageable amount for now. The more get added, the muddier and subjective it gets which nodes should be included.

In a perfect scenario this would even be customizable by the user, but for now it would need to be hardcoded.

Some of these nodes are not yet available in every node editor and should be following the implementation of this feature. Unifying the node editors to allow the same workflow/copying nodes/sharing nodegroups is a separate discussion, but should be addressed in a sensible scope for this task.

The functionality to add nodes on link dragging allows to quickly extend a node tree with a string of operations. Due to the fact that this functionality is a modal operator it would be possible to add additional keyboard inputs before the mouse button is let go, to quickly terminate the operation and pick a certain nodes with a shortcut, instead of typing in the name in the search bar after letting go. This extended functionality would drastically increase workflow efficiency in the cases of a few, commonly used nodes. Which nodes that includes and how the selection adapts to the context of the dragged link (editor/socket type, in/out link) needs to be figured out/discussed in this task. **Proposed included nodes and shortcuts:** **Input** {key 1} : Value {key 2} : Color {key 3} : Vector **Link Type: Any (Node version/settings according to the matching datatype)** {key W}: Switch {key Y}: Reroute (visual representation of a junction and {key R} is reserved) **Link Type: Geometry** {key J}: Join Geometry {key P}: Set Position **Link Type: Shader** {key X}: Mix Shader {key A}: Add Shader **Link Type: Float/Vec/Vec2/Col/Int/Bool (Node version/settings according to the matching datatype)** {key X}: Mix (Ideally there would also be nodes for at least vector and float) {key A}: Add {key S}: Subtract {key F}: Multiply (F for factor) {key D}: Divide {key C}: Curve {key R}: Map Range {key G}: Color Ramp (G for gradient (?)) {key I}: Invert **Separate/Combine Nodes** Using the context sensitivity of the shortcuts, the different separate/combine could elegantly be solved with the keys {key 1}, {key 2}, {key 3}. **Examples:** Dragging from a float output and pressing {key 3} would add a `Combine XYZ` Node. Dragging from a float input and pressing {key 2} would add a `Separate RGB` Node. Dragging from a vector output and pressing {key 1} would add a `Separate XYZ` Node. | ↓ Key \ Socket → | Float In | Float Out | RGB In | RGB Out | XYZ In | XYZ Out | | -- | -- | -- | -- | -- | -- | -- | | {key 1} | Value | / | Com. RGB | Sep. RGB | Com. XYZ | Sep. XYZ | | {key 2} | Sep. RGB | Com. RGB | RGB | / | RGB | / | | {key 3} | Sep. XYZ | Com. XYZ | Vector | / | Vector | / | *Note: This might look confusing, but my hope is that it is intuitive, when used.* **Notes** The shortcuts should be sensible with the name, but that leads to collisions quite quickly. Many more useful rules would be possible, but I would keep it to a relatively small and manageable amount for now. The more get added, the muddier and subjective it gets which nodes should be included. In a perfect scenario this would even be customizable by the user, but for now it would need to be hardcoded. Some of these nodes are not yet available in every node editor and should be following the implementation of this feature. Unifying the node editors to allow the same workflow/copying nodes/sharing nodegroups is a separate discussion, but should be addressed in a sensible scope for this task.
Author
Member

Changed status from 'Needs Triage' to: 'Confirmed'

Changed status from 'Needs Triage' to: 'Confirmed'
Author
Member

Added subscriber: @SimonThommes

Added subscriber: @SimonThommes

Added subscriber: @Garek

Added subscriber: @Garek

Added subscriber: @GeorgiaPacific

Added subscriber: @GeorgiaPacific

Added subscriber: @ToxicTuba

Added subscriber: @ToxicTuba

interesting.
What about using the numpad operators +-*/ for Add, Subtract, Multiply Divide?
numpad0 could be mix and numpad decimal for maprange. though decimal can be . or ,
that would also keep those together on the keyboard that belong together. Alternatively A and S and D are close together so using F for Multiply (factor?) keeps the keys close together...

interesting. What about using the numpad operators +-*/ for Add, Subtract, Multiply Divide? numpad0 could be mix and numpad decimal for maprange. though decimal can be . or , that would also keep those together on the keyboard that belong together. Alternatively A and S and D are close together so using F for Multiply (**f**actor?) keeps the keys close together...

Added subscriber: @Yuro

Added subscriber: @Yuro
Author
Member

In #94598#1282254, @ToxicTuba wrote:
What about using the numpad operators +-*/ for Add, Subtract, Multiply Divide?

Though I generally do like the idea of using the operator keys, i don't think we should utilize the numpad for this at all for two reasons:
One is that an existing numpad is not always given on a keyboard and we're generally moving away from requiring it for crucial shortcuts. The other is simply that usually people are using the mouse with their right on the right side of the keyboard. So if they are dragging a link, the shortcut will have to be executed with the left hand only. The numpad is just too far away in that case to allow a comfortable workflow.

that would also keep those together on the keyboard that belong together. Alternatively A and S and D are close together so using F for Multiply (factor?) keeps the keys close together...

The mapping of keys to nodes for this is definitely something that requires some discussion. I think your point of keeping them close on the keyboard is valid. I just want to mention that I do think we should stick to the first letter whenever possible, as discoverability is already going to be an issue with this feature.
That said, name clashes are unavoidable here. Multiply already clashes with mix, so I can see {key F} fitting better than {key U} as an alternative. {key X} for Mix would also be an option though.

One other idea to avoid name clashes that I just want to have mentioned would be a pie menu. But I don't actually think in this case a pie menu is a good idea.

> In #94598#1282254, @ToxicTuba wrote: >What about using the numpad operators +-*/ for Add, Subtract, Multiply Divide? Though I generally do like the idea of using the operator keys, i don't think we should utilize the numpad for this at all for two reasons: One is that an existing numpad is not always given on a keyboard and we're generally moving away from requiring it for crucial shortcuts. The other is simply that *usually* people are using the mouse with their right on the right side of the keyboard. So if they are dragging a link, the shortcut will have to be executed with the left hand only. The numpad is just too far away in that case to allow a comfortable workflow. > that would also keep those together on the keyboard that belong together. Alternatively A and S and D are close together so using F for Multiply (**f**actor?) keeps the keys close together... The mapping of keys to nodes for this is definitely something that requires some discussion. I think your point of keeping them close on the keyboard is valid. I just want to mention that I do think we should stick to the first letter whenever possible, as discoverability is already going to be an issue with this feature. That said, name clashes are unavoidable here. Multiply already clashes with mix, so I can see {key F} fitting better than {key U} as an alternative. {key X} for `Mix` would also be an option though. One other idea to avoid name clashes that I just want to have mentioned would be a pie menu. But I don't actually think in this case a pie menu is a good idea.
Simon Thommes changed title from Add functionality for link dragging to quickly add nodes with shortcuts to Shortcuts on link dragging to quickly add nodes 2022-01-04 11:39:44 +01:00

Added subscriber: @Erindale

Added subscriber: @Erindale

I think your proposed shortcuts look good but I'd go for X for Mix and F for multiply (of the pairs you chose) to keep it all left handed

I think your proposed shortcuts look good but I'd go for X for Mix and F for multiply (of the pairs you chose) to keep it all left handed

I'm not a developer, so this is probably nonsense.
Since we seem to be able to select sockets on nodes:
select socket.png
1.gif
So I don't know if we can select the socket first and then use the shortcut keys directly?
This is just like selecting a vertex in edit mode and pressing {key E} to extrude.
This may not necessarily be faster, but I believe it can reduce a lot of mouse dragging in node editor.

I'm not a developer, so this is probably nonsense. Since we seem to be able to select sockets on nodes: ![select socket.png](https://archive.blender.org/developer/F12790775/select_socket.png) ![1.gif](https://archive.blender.org/developer/F12790778/1.gif) So I don't know if we can select the socket first and then use the shortcut keys directly? This is just like selecting a vertex in edit mode and pressing {key E} to extrude. This may not necessarily be faster, but I believe it can reduce a lot of mouse dragging in node editor.

@Yuro is making a good point actually. Maybe the drag / click can be toggled in settings because I find dragging much easier than clicking with a tablet and it feels more natural imo with a mouse but from an accessibility point of view though, I remember someone brought up how dragging isn't always possible for everyone before (maybe regarding muting noodles).

@Yuro is making a good point actually. Maybe the drag / click can be toggled in settings because I find dragging much easier than clicking with a tablet and it feels more natural imo with a mouse but from an accessibility point of view though, I remember someone brought up how dragging isn't always possible for everyone before (maybe regarding muting noodles).
Contributor

Added subscriber: @Rawalanche

Added subscriber: @Rawalanche
Contributor

In #94598#1283558, @Yuro wrote:
I'm not a developer, so this is probably nonsense.
Since we seem to be able to select sockets on nodes:
select socket.png
1.gif
So I don't know if we can select the socket first and then use the shortcut keys directly?
This is just like selecting a vertex in edit mode and pressing {key E} to extrude.
This may not necessarily be faster, but I believe it can reduce a lot of mouse dragging in node editor.

I am afraid this would mean significant overcomplication of the node editor keymap and possible keyboard shortcut conflicts. When you are in a link drag, you are in sort of a mode, so it's fine that the shortcuts work as the awareness of being in that mode is explicit, but when you are just in a regular node editor state, then suddenly you would have to be constantly aware whether you currently have a node socket selected or not, and the keymap would behave differently based on that.

That sounds very frustrating and error prone, especially given that in a complex node network, you'd have to be constantly watching out for that one selected socket, or adopt an irritating habit of always deselecting a node first before pressing any key, which makes even less sense, since many keyboard shortcuts actually require a node to be selected (like mute).

Even if this was possible to make it conflict-less with the default keymap, it would make life hell for anyone who is not using a default keymap.

So let's just not overcomplicate it, and let's keep this sort of obscure advanced functionality to node-wrangler like addons. If Python API exposes socket selection state, it should be very easy for anyone to script an addon doing this, but Blender's default keymap is already overcomplicated as is. Last thing we need is different keymap behavior based on whether there is one tiny circle selected in an editor which often displays hundreds of tiny circles at the same time.

> In #94598#1283558, @Yuro wrote: > I'm not a developer, so this is probably nonsense. > Since we seem to be able to select sockets on nodes: > ![select socket.png](https://archive.blender.org/developer/F12790775/select_socket.png) > ![1.gif](https://archive.blender.org/developer/F12790778/1.gif) > So I don't know if we can select the socket first and then use the shortcut keys directly? > This is just like selecting a vertex in edit mode and pressing {key E} to extrude. > This may not necessarily be faster, but I believe it can reduce a lot of mouse dragging in node editor. I am afraid this would mean significant overcomplication of the node editor keymap and possible keyboard shortcut conflicts. When you are in a link drag, you are in sort of a mode, so it's fine that the shortcuts work as the awareness of being in that mode is explicit, but when you are just in a regular node editor state, then suddenly you would have to be constantly aware whether you currently have a node socket selected or not, and the keymap would behave differently based on that. That sounds very frustrating and error prone, especially given that in a complex node network, you'd have to be constantly watching out for that one selected socket, or adopt an irritating habit of always deselecting a node first before pressing any key, which makes even less sense, since many keyboard shortcuts actually require a node to be selected (like mute). Even if this was possible to make it conflict-less with the default keymap, it would make life hell for anyone who is not using a default keymap. So let's just not overcomplicate it, and let's keep this sort of obscure advanced functionality to node-wrangler like addons. If Python API exposes socket selection state, it should be very easy for anyone to script an addon doing this, but Blender's default keymap is already overcomplicated as is. Last thing we need is different keymap behavior based on whether there is one tiny circle selected in an editor which often displays hundreds of tiny circles at the same time.
Author
Member

In #94598#1283699, @Rawalanche wrote:
I am afraid this would mean significant overcomplication of the node editor keymap and possible keyboard shortcut conflicts. When you are in a link drag, you are in sort of a mode, so it's fine that the shortcuts work as the awareness of being in that mode is explicit, but when you are just in a regular node editor state, then suddenly you would have to be constantly aware whether you currently have a node socket selected or not, and the keymap would behave differently based on that.

I fully agree. The modal nature of dragging the node link is crucial for this feature. The last thing I'd want to do would be to change the whole keymap for node editors.
It could be interesting to add another modal operator to e.g. {key E} which does the same as link dragging. But that would be an additional topic that comes with its own design questions.

> In #94598#1283699, @Rawalanche wrote: > I am afraid this would mean significant overcomplication of the node editor keymap and possible keyboard shortcut conflicts. When you are in a link drag, you are in sort of a mode, so it's fine that the shortcuts work as the awareness of being in that mode is explicit, but when you are just in a regular node editor state, then suddenly you would have to be constantly aware whether you currently have a node socket selected or not, and the keymap would behave differently based on that. I fully agree. The modal nature of dragging the node link is crucial for this feature. The last thing I'd want to do would be to change the whole keymap for node editors. It could be interesting to add another modal operator to e.g. {key E} which does the same as link dragging. But that would be an additional topic that comes with its own design questions.

Thank you guys. I think I have realized that this may make the problem too complicated to be worth it.

Thank you guys. I think I have realized that this may make the problem too complicated to be worth it.

Added subscriber: @Aeraglyx

Added subscriber: @Aeraglyx
Sign in to join this conversation.
No Label
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE
Interest
EEVEE & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overlay
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest
Wayland
Interest
Workbench
Interest: X11
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
EEVEE & Viewport
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
No Milestone
No project
No Assignees
8 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: blender/blender#94598
No description provided.