Difference between revisions of "GSoC2009 Node Tool Rewrite"

From Inkscape Wiki
Jump to navigation Jump to search
 
(50 intermediate revisions by the same user not shown)
Line 1: Line 1:
This page tracks the progress of the node tool rewrite project which is a part of the Google Summer of Code 2009. This project is being implemented by [[User:Tweenk|Krzysztof Kosiński]], and the mentor is Bulia Byak. This page will be kept updated with the current status of the student's code (it may not reflect the code in the trunk).
This page tracks the progress of the node tool rewrite project which is a part of the Google Summer of Code 2009. This project is being implemented by [[User:Tweenk|Krzysztof Kosiński]], and the mentor is Bulia Byak. This page will be kept updated with the current status of the student's code (it may not reflect the code in the trunk).
The code has been merged into lp:inkscape. development continues in the trunk.


==Implementation details==
==Implementation details==


(Work in progress)
Control points (Knots) are represented by a new class called <tt>ControlPoint</tt>, reusing the SPCtrl canvas item of SPKnot, but with a different set of signals. A set of control points that can edit something is called a <tt>Manipulator</tt>. For paths, there will be three classes: PathManipulator (edits a single path, but is not standalone), MultiPathManipulator (edits everal paths at once and allows multipath operations on them) and SinglePathManipulator (edits only one path and can be used to edit path parameters of path effects).


Control points (Knots) will be represented by a new class called <tt>ControlPoint</tt>, based on SPKnot, but with a slightly different set of signals. A set of control points will be managed in a <tt>Manipulator</tt>. Manipulators can be added and removed from a ManipulatorGroup, which takes care of routing events to them.
A subclass of <tt>ControlPoint</tt>, <tt>SelectableControlPoint</tt>, can belong to a <tt>ControlPointSelection</tt>. Control points selections are a reusable selection metaphor. Each point is bound to a selection that it can be part of or not; there can be multiple simultaneously active selections for different kinds of points. Having separate selections means that the points will be dragged separately. The event context is responsible for handling selection by rubberband, and a separate selector component is provided for this.


A subclass of <tt>ControlPoint</tt>, <tt>SelectableControlPoint</tt>, can belong to a <tt>ControlPointSelection</tt>.
===ControlPoint virtual methods===
Control points have two important virtual methods:
- setPosition(), which takes a Geom::Point in desktop coordinates and updates the position without side effects
- move(), which updates the position with side effects, like realigning the second handle of a smooth node or recomputing the handles of auto nodes.


===ControlPoint signals===
===ControlPoint signals===
* <tt>signal_dragged</tt> - emitted when the point is dragged to a new position
(obsoleted by performance work - signals were changed into virtual functions)
* <tt>signal_grabbed</tt> - start of drag. Emitted when there was a click and a move larger than drag tolerance.
 
* <tt>signal_ungrabbed</tt> - end of drag
===Additional features===
* <tt>signal_moved</tt> - knot was moved to new position using the move() method.
Control points automatically enable forced redraws while dragging to ensure smooth updates and handle drag tolerance. There's also a transferGrab() method that allows to drag a different point that the one that was initially clicked for dragging; this is used to implement dragging out handles.
Order of emission of drag signals:
* signal_grabbed
* signal_dragged
* signal_dragged
* signal_dragged
* ...
* signal_dragged
* signal_ungrabbed


===Examples of implementation===
===Examples of implementation===


* Dragging out handles: the manipulator connects to <tt>signal_clicked</tt>, and intercepts it if Shift is held. It then creates a new ControlPoint for the dragged out handle and connects to <tt>signal_moved</tt>, which is only emitted when the drag is finished. in response to <tt>signal_moved</tt>, the distance between the node and the handle is checked against the drag tolerance; if it's smaller, the handle is deleted and the path is not updated. If it's larger, repr is updated.
* Dragging out handles: the grabbed handler of a node shows the handle and calls its transferGrab() method if Shift is pressed.
 
* Constrained dragging: a handler for the dragged signal modifies the new position parameter it was passed, based on the information from the event.
* Constrained dragging: the manipulator connects to <tt>signal_dragged</tt>. In response to it, it calculates the constrained position, calls setPosition (which doesn't emit any signals) and returns true, which prevents the position from being updated. The events still flow only to the control point due to a pointer grab.
* Handle dragging: updating opposite handles in smooth nodes and smooth handles at ends of linear segments is done in an overridden move() method.
 
* Handle dragging: A control point representing a node will be subclassed, and will know about its handles. Handles will also be subclassed and know about their nodes. There will be an additional handler for <tt>signal_dragged</tt>, which will update the position of the other handle appropriately.


==Feature Checklist==
==Feature Checklist==
Line 43: Line 38:
|Object selection
|Object selection
|Selecting objects to node-edit (incl. Shift-click, Alt-click); ignores groups
|Selecting objects to node-edit (incl. Shift-click, Alt-click); ignores groups
|{{yes}}
|{{yes}}
|-
|Shape editor
|Selecting objects that are not paths shows their manipulators. This is unlikely to get fixed correctly during GSoC, as it requires at least partially rewriting the shape tools, but some short-term hack will be added.
|{{yes}}
|{{yes}}
|-
|Gradient editors
|Control points for gradients are displayed when the preference setting is enabled
|{{yes}}
|{{yes}}
|{{yes}}
|{{yes}}
Line 84: Line 89:
|Tab to select next node, Shift+Tab to select previous
|Tab to select next node, Shift+Tab to select previous
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Invert selection
|Invert selection
|! key inverts node selection in selected subpaths, Alt+! in the whole path
|! key inverts node selection in selected subpaths, Alt+! in the whole path
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Grow selection
|Grow / shrink selection
|Scrolling the mouse wheel when a selected node is hovered over causes the selection to propagate from this node to adjacent nodes in the path (without Ctrl) or to geometrically closest nodes (with Ctrl)
|Scrolling the mouse wheel when a selected node is hovered over causes the selection to propagate from this node to adjacent nodes in the path (without Ctrl) or to geometrically closest nodes (with Ctrl)
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Preserve selection on undo
|Preserve selection on undo
|An attempt is made to preserve the node selection when undoing / redoing
|An attempt is made to preserve the node selection when undoing / redoing
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Transform handles
|Transform handles
|Whether transform handles can be toggled for sets of nodes (needs sensible behavior when one node is selected). Should have 3 settings: never show handles, show for 2+ nodes (default), always show
|Whether transform handles can be toggled for sets of nodes (needs sensible behavior when one node is selected). Should have 3 settings: never show handles, show for 2+ nodes (default), always show
|{{no}}
|{{no}}
|always on
|{{yes}}
|}
|}


Line 138: Line 143:
|When only one node is selected, &gt; and &lt; scale its handles
|When only one node is selected, &gt; and &lt; scale its handles
|{{yes}}
|{{yes}}
|partial
|{{yes}}
|-
|-
|Rotate with mouse
|Rotate with mouse
Line 153: Line 158:
|When only one node is selected, <nowiki>[, ]</nowiki> rotate its handles
|When only one node is selected, <nowiki>[, ]</nowiki> rotate its handles
|{{yes}}
|{{yes}}
|partial
|{{yes}}
|-
|-
|Skew with mouse
|Skew with mouse
Line 173: Line 178:
|Ctrl to restrict movement to axes
|Ctrl to restrict movement to axes
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|Move along handles
|Ctrl+Alt to restrict node movement to the handle lines
|{{yes}}
|{{yes}}
|-
|-
|Sculpting
|Sculpting
|Alt to move selected nodes depending on their distance from the cursor and tablet pen pressure
|Alt to move selected nodes depending on their distance from the cursor
|{{yes}}
|{{yes}}
|{{yes}}
|{{no}}
|-
|-
|Affect handles
|Rotation center snapping
|Ability to specify whether handles should be transformed (toggle button)
|Rotation center snaps to the geometric center of the bounding box, its corners, sides and nodes
|{{no}}
|{{no}}
|{{no}}
|{{no}}
Line 205: Line 215:
|-
|-
|Auto nodes
|Auto nodes
|
|Handles are recalculated according to neighboring node positions
|{{yes}}
|{{yes}}
|{{yes}}
|{{yes}}
Line 217: Line 227:
|Node type can be set and the handles are updated
|Node type can be set and the handles are updated
|{{yes}}
|{{yes}}
|{{yes}}
|-
|Restrict end node types
|It is not possible to create a nonsensical auto or symmetric end node
|{{no}}
|{{yes}}
|{{yes}}
|}
|}
Line 249: Line 264:
|-
|-
|Weld nodes
|Weld nodes
|Joining non-end nodes welds them into one with averaged position
|When no endnode joins can be made, joining non-end nodes welds them into one with averaged position
|{{no}}
|{{yes}}
|-
|Join multiple nodes
|Joining more than two endnodes at once is possible, using a pairwise nearest neighbor algorithm
|{{no}}
|{{no}}
|{{yes}}
|{{yes}}
Line 256: Line 276:
|If a node is mouseovered when joining nodes, its position is used as the position for the joined node
|If a node is mouseovered when joining nodes, its position is used as the position for the joined node
|{{yes}}
|{{yes}}
|{{yes}}
|-
|Mouseover weld
|The mouseovered node in a welded node selection will be used as the position of the joined node
|{{no}}
|{{no}}
|{{yes}}
|-
|-
|Multi-path node join
|Multi-path node join
|Joining nodes in different paths works sensibly
|Joining nodes in different paths works correctly
|{{no}}
|{{no}}
|{{yes}}
|{{yes}}
Line 271: Line 296:
|Alignment actions in Align and Distribute dialog
|Alignment actions in Align and Distribute dialog
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Snap nodes
|Snap nodes
|Nodes snap according to snap settings when transformed
|Nodes snap according to snap settings when transformed
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Copy / paste subpaths
|Cycle node type
|Ability to add a subpath by pasting it into the selected path
|Ctrl+click to cycle between node types
|{{no}}
|{{yes}}
|{{no}}
|{{yes}}
|}
|}


Line 303: Line 328:
|-
|-
|Weld segments
|Weld segments
|Joining segments when non-end nodes are selected replaces each contiguous segment selection with one segment
|When no segment joins can be made, delete nodes in the middle of each selected stretch
|{{no}}
|{{no}}
|{{no}}
|{{yes}}
|-
|-
|Multi-path segment join
|Multi-path segment join
Line 331: Line 356:
!New tool
!New tool
|-
|-
|Unselected path outline
|Flash path outline
|Outline promptly flashes when hovering over a unselected path
|Outline promptly flashes when hovering over paths when no path is selected
|{{yes}}
|{{yes}}
|{{yes}}
|{{no}}
|-
|-
|Selected path outline
|Selected path outline
|Outline of the selected path is drawn when the "show outline" toggle button is on
|Outline of the selected path is drawn when the "show outline" toggle button is on
|{{yes}}
|{{yes}}
|always on
|{{yes}}
|-
|-
|Curve drag cursor
|Curve drag cursor
|The cursor changes when hovering over a curve to indicate that it will be dragged
|The cursor changes when hovering over a curve to indicate that it will be dragged
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Smooth redraws
|Smooth redraws
Line 351: Line 376:
|{{yes}}
|{{yes}}
|-
|-
|Statusbar information
|Status bar tips
|Display the number of selected nodes and useful tips in the statusbar
|Display the number of selected nodes and information on how to use the controls in the status bar
|{{yes}}
|{{yes}}
|{{yes}}
|-
|Smart tips
|The displayed status bar tip depends on the modifier state and the state of the mouseovered control point; tips are short, so that most are visible in full on a 1024x768 screen
|{{no}}
|{{no}}
|{{yes}}
|-
|-
|Path direction
|Path direction
|Small arrows on the outline optionally visualize the direction of the path
|Small arrows on the outline optionally visualize the direction of the path
|{{no}}
|{{no}}
|{{no}}
|{{yes}}
|-
|Color-coded outlines
|Red outlines for normal paths, green for clipping paths, blue for masks - configurable in prefs
|hardcoded colors
|yes, but no pref UI
|}
|}


Line 383: Line 418:
|Alt to move handles while preserving length
|Alt to move handles while preserving length
|{{yes}}
|{{yes}}
|{{no}}
|-
|Move along handles
|Ctrl+Alt to restrict node movement to the handle lines
|{{yes}}
|{{yes}}
|{{no}}
|-
|-
|Drag out handles
|Drag out handles
Line 403: Line 433:
|Ctrl+click retracts a handle
|Ctrl+click retracts a handle
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Restrict movement
|Restrict movement
|Ctrl to restrict handle movements to ~15 degree angle increments from axis-aligned and the original angle
|Ctrl to restrict handle movements to ~15 degree angle increments from axis-aligned and the original angle
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Snap handles
|Snap handles
|Handles can be snapped to other snap targets
|Handles can be snapped to other snap targets
|{{no}}
|{{yes}}
|{{no}}
|{{no}}
|-
|-
Line 419: Line 449:
|{{no}}
|{{no}}
|{{no}}
|{{no}}
|-
|Keyboard handle modification
|Keybindings to modify single handles using left/right Ctrl and Alt
|{{yes}}
|{{yes}}
|}
|}


Line 437: Line 472:
|Buttons to edit the clipping and masking paths in place
|Buttons to edit the clipping and masking paths in place
|{{yes}}
|{{yes}}
|{{yes}}
|-
|Simultaneous clip / mask editing
|Buttons to edit masks and clipping paths are toggle buttons that show or hide the editing controls for them
|{{no}}
|{{yes}}
|-
|Resilient simultaneous editing
|Not possible to e.g. join between mask and base path
|{{no}}
|{{no}}
|-
|Multi mask edit
|Can edit the clipping and masking paths of several items at once
|{{no}}
|{{yes}}
|-
|Grouped masks
|Can handle groups used as clipping paths or masks
|{{no}}
|{{yes}}
|-
|Mask transform
|Clipping path / mask outline is drawn in the correct place when the object that has it is transformed after applying the mask
|{{no}}
|{{yes}}
|-
|Mask transform undo
|Undoing a move of the masked object when node-editing the mask moves the outline to the correct place
|{{no}}
|{{no}}
|-
|Support for objectBoundingBox
|Clipping paths and masks with units set to "objectBoundingBox" instead of the default "userSpaceOnUse" are handled correctly
|{{no}}
|{{no}}
|-
|Reverse subpaths
|Shift+R and the menu reverse action only reverse the subpaths that have at least one selected node
|{{no}}
|{{yes}}
|-
|Drag stroke width
|Ctrl-dragging on a curve causes the stroke width to be adjusted
|{{no}}
|{{no}}
|{{no}}
|-
|-
Line 442: Line 522:
|Button to to edit the next path parameter of the selected live path effect
|Button to to edit the next path parameter of the selected live path effect
|{{yes}}
|{{yes}}
|{{no}}
|{{yes}}
|-
|-
|Prefs page
|Prefs page
|Node tool preferences page with various settings
|Node tool preferences page with various settings
|{{yes}}
|{{yes}}
|{{yes}}
|}
===Bugfixes / feature requests===
{| class="wikitable" border="1"
!Bugfix
!Description
!Old tool
!New tool
|-
|Bug #290870
|[https://bugs.launchpad.net/inkscape/+bug/290870 Regression: Curve dragging via Node Tool sometimes won't work]
|{{no}}
|{{no}}
|-
|Bug #379817
|[https://bugs.launchpad.net/inkscape/+bug/379817 Node tool behaviour different and wrong in 0.47 compared to 0.46]
|{{no}}
|{{no}}
|{{yes}}
|-
|Bug #380726
|[https://bugs.launchpad.net/inkscape/+bug/380726 display a ghost path]
|{{no}}
|{{yes}}
|}
|}


[http://inkscape.org/doc/keys046.html#id2248621 Inkscape key guide for the node tool] - more detailed description of the old node tool's features
[http://inkscape.org/doc/keys046.html#id2248621 Inkscape key guide for the node tool] - more detailed description of the old node tool's features and keybindings

Latest revision as of 17:42, 14 March 2010

This page tracks the progress of the node tool rewrite project which is a part of the Google Summer of Code 2009. This project is being implemented by Krzysztof Kosiński, and the mentor is Bulia Byak. This page will be kept updated with the current status of the student's code (it may not reflect the code in the trunk).

The code has been merged into lp:inkscape. development continues in the trunk.

Implementation details

Control points (Knots) are represented by a new class called ControlPoint, reusing the SPCtrl canvas item of SPKnot, but with a different set of signals. A set of control points that can edit something is called a Manipulator. For paths, there will be three classes: PathManipulator (edits a single path, but is not standalone), MultiPathManipulator (edits everal paths at once and allows multipath operations on them) and SinglePathManipulator (edits only one path and can be used to edit path parameters of path effects).

A subclass of ControlPoint, SelectableControlPoint, can belong to a ControlPointSelection. Control points selections are a reusable selection metaphor. Each point is bound to a selection that it can be part of or not; there can be multiple simultaneously active selections for different kinds of points. Having separate selections means that the points will be dragged separately. The event context is responsible for handling selection by rubberband, and a separate selector component is provided for this.

ControlPoint virtual methods

Control points have two important virtual methods: - setPosition(), which takes a Geom::Point in desktop coordinates and updates the position without side effects - move(), which updates the position with side effects, like realigning the second handle of a smooth node or recomputing the handles of auto nodes.

ControlPoint signals

(obsoleted by performance work - signals were changed into virtual functions)

Additional features

Control points automatically enable forced redraws while dragging to ensure smooth updates and handle drag tolerance. There's also a transferGrab() method that allows to drag a different point that the one that was initially clicked for dragging; this is used to implement dragging out handles.

Examples of implementation

  • Dragging out handles: the grabbed handler of a node shows the handle and calls its transferGrab() method if Shift is pressed.
  • Constrained dragging: a handler for the dragged signal modifies the new position parameter it was passed, based on the information from the event.
  • Handle dragging: updating opposite handles in smooth nodes and smooth handles at ends of linear segments is done in an overridden move() method.

Feature Checklist

Selection

Feature Description Old tool New tool
Object selection Selecting objects to node-edit (incl. Shift-click, Alt-click); ignores groups Yes Yes
Shape editor Selecting objects that are not paths shows their manipulators. This is unlikely to get fixed correctly during GSoC, as it requires at least partially rewriting the shape tools, but some short-term hack will be added. Yes Yes
Gradient editors Control points for gradients are displayed when the preference setting is enabled Yes Yes
Selecting single nodes Whether selecting single nodes with left-click works correctly. Yes Yes
Select segment Click on a path segment to select adjacent nodes. Also works with Shift Yes Yes
Selecting multiple nodes Shift-click to toggle selection of a node Yes Yes
Select all Ctrl+A selects all nodes in subpaths that have something selected, Ctrl+Alt+A selects all nodes Yes Yes
Deselect Esc or click outside of selected paths to deselect Yes Yes
Multi-path selection Selecting nodes in two or more different paths; all per-node actions work on all selected nodes No Yes
Rubberband selector Selecting nodes by dragging anywhere to draw a selection rectangle Yes Yes
Prev/Next node Tab to select next node, Shift+Tab to select previous Yes Yes
Invert selection ! key inverts node selection in selected subpaths, Alt+! in the whole path Yes Yes
Grow / shrink selection Scrolling the mouse wheel when a selected node is hovered over causes the selection to propagate from this node to adjacent nodes in the path (without Ctrl) or to geometrically closest nodes (with Ctrl) Yes Yes
Preserve selection on undo An attempt is made to preserve the node selection when undoing / redoing Yes Yes
Transform handles Whether transform handles can be toggled for sets of nodes (needs sensible behavior when one node is selected). Should have 3 settings: never show handles, show for 2+ nodes (default), always show No Yes

Node transforms

Feature Description Old tool New tool
Move Moving selections of nodes Yes Yes
Move with keyboard arrows, Shift+arrows, Alt+arrows, Shift+Alt+arrows Yes Yes
Scale with mouse Scaling node sets with the mouse No Yes
Scale with keyboard Scaling nodes with >, <; Alt scales by one pixel Yes Yes
Scale handles with keyboard When only one node is selected, > and < scale its handles Yes Yes
Rotate with mouse Rotating node sets with the mouse No Yes
Rotate with keyboard Rotate nodes with [, ]; Alt rotates by one pixel Yes Yes
Rotate handles with keyboard When only one node is selected, [, ] rotate its handles Yes Yes
Skew with mouse Skewing node sets with the mouse No Yes
Skew with keyboard Tentative keybinding: / and \ to skew horizontally (corners move by nudgedistance), Ctrl skews vertically, Shift = x10, Alt = one pixel No No
Flip nodes v for vertical flip, h for horizontal, mouseovered node is the center Yes Yes
Constrained dragging Ctrl to restrict movement to axes Yes Yes
Move along handles Ctrl+Alt to restrict node movement to the handle lines Yes Yes
Sculpting Alt to move selected nodes depending on their distance from the cursor Yes Yes
Rotation center snapping Rotation center snaps to the geometric center of the bounding box, its corners, sides and nodes No No

Node types

Feature Description Old tool New tool
Read node types Read and store node type information Yes Yes
Basic (cusp, smooth, symmetric) The second handle is modified according to the node type Yes Yes
Auto nodes Handles are recalculated according to neighboring node positions Yes Yes
Smooth nodes at ends of linear segments When a smooth node appears on the end of a linear segment, its handle should remain colinear with the segment when the node or the handle are dragged Yes Yes
Set node type Node type can be set and the handles are updated Yes Yes
Restrict end node types It is not possible to create a nonsensical auto or symmetric end node No Yes

Node actions

Feature Description Old tool New tool
Add node with mouse Double-click on a path segment to add node Yes Yes
Insert nodes Insert a node in the middle of each selected segment (Insert, Shift+I, toolbar) Yes Yes
Delete nodes Del to remove nodes while trying to preserve shape; hold Control to leave adjacent handles alone Yes Yes
Join nodes Join two end nodes into one Yes Yes
Weld nodes When no endnode joins can be made, joining non-end nodes welds them into one with averaged position No Yes
Join multiple nodes Joining more than two endnodes at once is possible, using a pairwise nearest neighbor algorithm No Yes
Mouseover join If a node is mouseovered when joining nodes, its position is used as the position for the joined node Yes Yes
Mouseover weld The mouseovered node in a welded node selection will be used as the position of the joined node No Yes
Multi-path node join Joining nodes in different paths works correctly No Yes
Break nodes Break subpaths into pieces at the selected nodes Yes Yes
Align nodes Alignment actions in Align and Distribute dialog Yes Yes
Snap nodes Nodes snap according to snap settings when transformed Yes Yes
Cycle node type Ctrl+click to cycle between node types Yes Yes

Segment actions

Feature Description Old tool New tool
Curve drag Dragging a segment changes its appearance Yes Yes
Join segment Connect two end nodes with a segment Yes Yes
Weld segments When no segment joins can be made, delete nodes in the middle of each selected stretch No Yes
Multi-path segment join Join between subpaths in different paths No Yes
Delete segment Remove a path segment between two nodes Yes Yes
Improved segment deletion Arbitrary number of segments can be deleted at once; selected segments at the start and end of subpath are trimmed No Yes

Display

Feature Description Old tool New tool
Flash path outline Outline promptly flashes when hovering over paths when no path is selected Yes Yes
Selected path outline Outline of the selected path is drawn when the "show outline" toggle button is on Yes Yes
Curve drag cursor The cursor changes when hovering over a curve to indicate that it will be dragged Yes Yes
Smooth redraws Dragging doesn't cause excessive tearing or other artifacts Yes Yes
Status bar tips Display the number of selected nodes and information on how to use the controls in the status bar Yes Yes
Smart tips The displayed status bar tip depends on the modifier state and the state of the mouseovered control point; tips are short, so that most are visible in full on a 1024x768 screen No Yes
Path direction Small arrows on the outline optionally visualize the direction of the path No Yes
Color-coded outlines Red outlines for normal paths, green for clipping paths, blue for masks - configurable in prefs hardcoded colors yes, but no pref UI

Handles

Feature Description Old tool New tool
Handle display Handles are displayed on the selected nodes and their neighbors Yes Yes
Flip handles v for vertical flip, h for horizontal Yes Yes
Lock handle length Alt to move handles while preserving length Yes Yes
Drag out handles Shift + mouse drag to drag out a handle that coincides with a node Yes Yes
Retract handles by dragging Drag a handle near its node to hide it; Retracting both handles of a Bezier segment makes it a line No Yes
Retract handles with click Ctrl+click retracts a handle Yes Yes
Restrict movement Ctrl to restrict handle movements to ~15 degree angle increments from axis-aligned and the original angle Yes Yes
Snap handles Handles can be snapped to other snap targets Yes No
Copy / paste handles Ability to copy and paste handles between nodes No No
Keyboard handle modification Keybindings to modify single handles using left/right Ctrl and Alt Yes Yes

Extras

Feature Description Old tool New tool
Drag tolerance Drags shorter than a configurable distance are regarded as clicks Yes Yes
Clip / mask editing Buttons to edit the clipping and masking paths in place Yes Yes
Simultaneous clip / mask editing Buttons to edit masks and clipping paths are toggle buttons that show or hide the editing controls for them No Yes
Resilient simultaneous editing Not possible to e.g. join between mask and base path No No
Multi mask edit Can edit the clipping and masking paths of several items at once No Yes
Grouped masks Can handle groups used as clipping paths or masks No Yes
Mask transform Clipping path / mask outline is drawn in the correct place when the object that has it is transformed after applying the mask No Yes
Mask transform undo Undoing a move of the masked object when node-editing the mask moves the outline to the correct place No No
Support for objectBoundingBox Clipping paths and masks with units set to "objectBoundingBox" instead of the default "userSpaceOnUse" are handled correctly No No
Reverse subpaths Shift+R and the menu reverse action only reverse the subpaths that have at least one selected node No Yes
Drag stroke width Ctrl-dragging on a curve causes the stroke width to be adjusted No No
Path effect param editing Button to to edit the next path parameter of the selected live path effect Yes Yes
Prefs page Node tool preferences page with various settings Yes Yes

Bugfixes / feature requests

Bugfix Description Old tool New tool
Bug #290870 Regression: Curve dragging via Node Tool sometimes won't work No No
Bug #379817 Node tool behaviour different and wrong in 0.47 compared to 0.46 No Yes
Bug #380726 display a ghost path No Yes

Inkscape key guide for the node tool - more detailed description of the old node tool's features and keybindings