Difference between revisions of "GSoC2009 Node Tool Rewrite"
(→Feature Checklist: add keyboard moving, scaling and rotation) |
|||
Line 32: | Line 32: | ||
==Feature Checklist== | ==Feature Checklist== | ||
===Selection=== | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 38: | Line 40: | ||
!Old tool | !Old tool | ||
!New tool | !New tool | ||
|- | |- | ||
|Object selection | |Object selection | ||
Line 95: | Line 95: | ||
|{{no}} | |{{no}} | ||
|{{no}} | |{{no}} | ||
| | |} | ||
===Node transforms=== | |||
{| class="wikitable" border="1" | |||
!Feature | |||
!Description | |||
!Old tool | |||
!New tool | |||
|- | |- | ||
|Move | |Move | ||
Line 106: | Line 113: | ||
|arrows, Shift+arrows, Alt+arrows, Shift+Alt+arrows | |arrows, Shift+arrows, Alt+arrows, Shift+Alt+arrows | ||
|{{yes}} | |{{yes}} | ||
|{{ | |{{yes}} | ||
|- | |- | ||
|Scale with mouse | |Scale with mouse | ||
Line 114: | Line 121: | ||
|- | |- | ||
|Scale with keyboard | |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}} | ||
|{{no}} | |{{no}} | ||
Line 124: | Line 136: | ||
|- | |- | ||
|Rotate with keyboard | |Rotate with keyboard | ||
| | |Rotate nodes with <nowiki>[, ]</nowiki>; Alt rotates by one pixel | ||
|{{yes}} | |||
|{{yes}} | |||
|- | |||
|Rotate handles with keyboard | |||
|When only one node is selected, <nowiki>[, ]</nowiki> rotate its handles | |||
|{{yes}} | |{{yes}} | ||
|{{no}} | |{{no}} | ||
Line 149: | Line 166: | ||
|- | |- | ||
|Sculpting | |Sculpting | ||
|Alt to move selected nodes depending on their distance from the cursor | |Alt to move selected nodes depending on their distance from the cursor and tablet pen pressure | ||
|{{yes}} | |{{yes}} | ||
|{{no}} | |{{no}} | ||
Line 157: | Line 174: | ||
|{{no}} | |{{no}} | ||
|{{no}} | |{{no}} | ||
| | |} | ||
===Node types=== | |||
{| class="wikitable" border="1" | |||
!Feature | |||
!Description | |||
!Old tool | |||
!New tool | |||
|- | |- | ||
|Read node types | |Read node types | ||
Line 181: | Line 205: | ||
|- | |- | ||
|Set node type | |Set node type | ||
|Node type can be set | |Node type can be set and the handles are updated | ||
|{{yes}} | |||
|{{yes}} | |{{yes}} | ||
| | |} | ||
| | |||
===Node actions=== | |||
{| class="wikitable" border="1" | |||
!Feature | |||
!Description | |||
!Old tool | |||
!New tool | |||
|- | |- | ||
|Add node with mouse | |Add node with mouse | ||
Line 222: | Line 253: | ||
|{{no}} | |{{no}} | ||
|- | |- | ||
|Copy / paste subpaths | |||
|Ability to add a subpath by pasting it into the selected path | |||
|{{no}} | |||
|{{no}} | |||
|} | |||
===Segment actions=== | |||
{| class="wikitable" border="1" | |||
!Feature | |||
!Description | |||
!Old tool | |||
!New tool | |||
|- | |- | ||
|Curve drag | |Curve drag | ||
Line 243: | Line 286: | ||
|{{yes}} | |{{yes}} | ||
|{{no}} | |{{no}} | ||
| | |} | ||
===Display=== | |||
{| class="wikitable" border="1" | |||
!Feature | |||
!Description | |||
!Old tool | |||
!New tool | |||
|- | |- | ||
|Unselected path outline | |Unselected path outline | ||
Line 255: | Line 305: | ||
|{{yes}} | |{{yes}} | ||
|{{yes}} | |{{yes}} | ||
| | |} | ||
===Handles=== | |||
{| class="wikitable" border="1" | |||
!Feature | |||
!Description | |||
!Old tool | |||
!New tool | |||
|- | |- | ||
|Handle display | |Handle display | ||
Line 283: | Line 340: | ||
|{{yes}} | |{{yes}} | ||
|- | |- | ||
|Retract handles | |Retract handles by dragging | ||
|Drag a handle near its node to hide it; Retracting both handles of a Bezier segment makes it a line | |Drag a handle near its node to hide it; Retracting both handles of a Bezier segment makes it a line | ||
|{{no}} | |{{no}} | ||
Line 302: | Line 359: | ||
|{{no}} | |{{no}} | ||
|{{no}} | |{{no}} | ||
| | |} | ||
===Extras=== | |||
{| class="wikitable" border="1" | |||
| | !Feature | ||
!Description | |||
!Old tool | |||
!New tool | |||
|- | |- | ||
|Drag tolerance | |Drag tolerance |
Revision as of 22:35, 11 July 2009
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).
Implementation details
(Work in progress)
Control points (Knots) will be represented by a new class called ControlPoint, based on SPKnot, but with a slightly different set of signals. A set of control points will be managed in a Manipulator. Manipulators can be added and removed from a ManipulatorGroup, which takes care of routing events to them.
A subclass of ControlPoint, SelectableControlPoint, can belong to a ControlPointSelection.
ControlPoint signals
- signal_dragged - emitted when the point is dragged to a new position
- signal_grabbed - start of drag. Emitted when there was a click and a move larger than drag tolerance.
- signal_ungrabbed - end of drag
- signal_moved - knot was moved to new position using the move() method.
Order of emission of drag signals:
- signal_grabbed
- signal_dragged
- signal_dragged
- signal_dragged
- ...
- signal_dragged
- signal_ungrabbed
Examples of implementation
- Dragging out handles: the manipulator connects to signal_clicked, and intercepts it if Shift is held. It then creates a new ControlPoint for the dragged out handle and connects to signal_moved, which is only emitted when the drag is finished. in response to signal_moved, 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.
- Constrained dragging: the manipulator connects to signal_dragged. 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: 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 signal_dragged, which will update the position of the other handle appropriately.
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 |
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 | 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 | No |
Invert Selection | ! key inverts node selection in selected subpaths, Alt+! in the whole path | Yes | No |
Nodeset selection cue | Whether a selection cue with transform handles can be toggled for sets of nodes (needs sensible behavior when one node is selected) | No | No |
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 (needs selection cue) | No | No |
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 | No |
Rotate with mouse | Rotating node sets with the mouse | No | No |
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 | No |
Skew with mouse | Skewing node sets with the mouse | No | No |
Skew with keyboard | No | No | |
Flip nodes | v for vertical flip, h for horizontal | Yes | No |
Constrained dragging | Ctrl to restrict movement to axes | Yes | No |
Sculpting | Alt to move selected nodes depending on their distance from the cursor and tablet pen pressure | Yes | No |
Affect handles | Ability to specify whether handles should be transformed (toggle button) | 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 | 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 |
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 | keyboard only |
Delete nodes | Del to remove nodes while trying to preserve shape; hold Control to leave adjacent handles alone | Yes | No |
Join nodes | Fuse two nodes into one | Yes | No |
Multi-path node join | Joining nodes in different paths works sensibly | No | No |
Align nodes | Alignment actions in Align and Distribute dialog | Yes | No |
Snap nodes | Nodes snap according to snap settings when transformed | Yes | No |
Copy / paste subpaths | Ability to add a subpath by pasting it into the selected path | No | No |
Segment actions
Feature | Description | Old tool | New tool |
---|---|---|---|
Curve drag | Dragging a segment changes its appearance | Yes | Yes |
Join segment | Joining two nodes with a segment works correctly | Yes | No |
Multi-path segment join | Join between subpaths in different paths works | No | No |
Delete segment | Removing a path segment between two nodes | Yes | No |
Display
Feature | Description | Old tool | New tool |
---|---|---|---|
Unselected path outline | Outline promptly flashes when hovering over a unselected path | Yes | No |
Selected path outline | Outline of the selected path is drawn | Yes | Yes |
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 | No |
Lock handle length | Alt to move handles while preserving length | Yes | No |
Move along handles | Ctrl+Alt to restrict node movement to the handle lines | Yes | No |
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 |
Restrict movement | Ctrl to restrict handle movements to ~15 degree angle increments from axis-aligned and the original angle | Yes | No |
Snap handles | Handles can be snapped to other snap targets | No | No |
Copy / paste handles | Ability to copy and paste handles between nodes | No | No |
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 | No |
Path effect param editing | Button to to edit the next path parameter of the selected live path effect | Yes | No |
Prefs page | Node tool preferences page with various settings | Yes | No |
Inkscape key guide for the node tool - more detailed description of the old node tool's features