Difference between revisions of "GSoC2009 Node Tool Rewrite"

From Inkscape Wiki
Jump to navigation Jump to search
(add some impl. ideas)
Line 3: Line 3:
 
==Implementation details==
 
==Implementation details==
  
The implementation will consist of:
+
(Work in progress)
* refactoring Kontholder, NodePath and GrDrag to have a common superclass, tentatively called CanvasEditor
+
 
* implementing a high-level ShapeEditor object that manages selection and interprets key presses, and manages an arbitrary number of CanvasEditor objects
+
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 will be sets of control points that have queriable selection status. Manipulators will be managed in a top level <tt>ItemEditor</tt> object, which will be the main object used by the new node context (this object cannot be called ShapeEditor for now, because they have to exist side by side).
 +
 
 +
===ControlPoint signals===
 +
* <tt>signal_dragged</tt> - emitted when the point is dragged to a new position
 +
* <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
 +
* <tt>signal_moved</tt> - knot was moved to new position. Emitted in response to the move() method or finished drag.
 +
 
 +
Order of emission:
 +
* signal_clicked
 +
* signal_grabbed
 +
* signal_dragged
 +
* signal_dragged
 +
* signal_dragged
 +
* ...
 +
* signal_dragged
 +
* signal_ungrabbed
 +
* signal_moved
 +
 
 +
===Examples of implementation===
 +
 
 +
* Moving selection: the manipulator connects to <tt>signal_dragged</tt> and <tt>signal_ungrabbed</tt>. It updates the position of its other selected control points in response to <tt>signal_dragged</tt>, which it keeps in a list (selectable control points have <tt>signal_selected</tt> and <tt>signal_deselected</tt> which are connected to from the manipulator to update the list of selected control points accordingly) and updates the XML in response to <tt>signal_ungrabbed</tt>.
 +
 
 +
* 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.
 +
 
 +
* 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: 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==

Revision as of 22:44, 10 June 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 will be sets of control points that have queriable selection status. Manipulators will be managed in a top level ItemEditor object, which will be the main object used by the new node context (this object cannot be called ShapeEditor for now, because they have to exist side by side).

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. Emitted in response to the move() method or finished drag.

Order of emission:

  • signal_clicked
  • signal_grabbed
  • signal_dragged
  • signal_dragged
  • signal_dragged
  • ...
  • signal_dragged
  • signal_ungrabbed
  • signal_moved

Examples of implementation

  • Moving selection: the manipulator connects to signal_dragged and signal_ungrabbed. It updates the position of its other selected control points in response to signal_dragged, which it keeps in a list (selectable control points have signal_selected and signal_deselected which are connected to from the manipulator to update the list of selected control points accordingly) and updates the XML in response to signal_ungrabbed.
  • 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

Feature Description Old tool New tool
Selection
Object selection Selecting objects to node-edit (incl. Shift-click, Alt-click); ignores groups Yes
Selecting single nodes Whether selecting single nodes with left-click works correctly. Yes
Select segment Click on a path segment to select adjacent nodes Yes
Selecting multiple nodes Shift-click to toggle selection of a node Yes
Select all Ctrl+A selects all nodes in subpaths that have something selected, Ctrl+Alt+A selects all nodes Yes
Deselect Esc or click outside of selected paths to deselect Yes
Multi-path selection Selecting nodes in two or more different paths No
Prev/Next node Tab to select next node, Shift+Tab to select previous Yes
Invert Selection ! key inverts node selection in selected subpaths, Alt+! in the whole path Yes
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
Transforms
Move Moving selections of nodes Yes
Move with keyboard arrows, Shift+arrows, Alt+arrows, Shift+Alt+arrows Yes
Scale with mouse Scaling node sets with the mouse (needs selection cue) No
Scale with keyboard Both Ctrl and Alt keys + >, < Yes
Rotate with mouse Rotating node sets with the mouse No
Rotate with keyboard Both Ctrl and Alt keys and [, ] Yes
Skew with mouse Skewing node sets with the mouse No
Skew with keyboard No
Flip nodes v for vertical flip, h for horizontal Yes
Movement restriction Ctrl to restrict movement to axes Yes
Sculpting Alt to move selected nodes depending on their distance from the cursor Yes
Affect handles Ability to specify whether handles should be transformed (toggle button) No
Node actions
Add nodes Double-click on path segment to add node Yes
Delete nodes Del to remove nodes while trying to preserve shape Yes
Join nodes Fuse two nodes into one Yes
Multi-path node join Joining nodes in different paths works sensibly No
Join segment Joining two nodes with a segment works correctly Yes
Multi-path segment join Join between subpaths in different paths works No
Delete segment Removing a path segment between two nodes Yes
Align nodes Alignment actions in Align and Distribute dialog Yes
Snap nodes Nodes snap according to snap settings when transformed Yes
Display
Unselected path outline Outline promptly flashes when hovering over a unselected path Yes
Selected path outline Outline of the selected path is drawn Yes
Handles
Handle display Handles are displayed on the selected nodes and their neighbors Yes
Flip handles v for vertical flip, h for horizontal Yes
Lock handle length Alt to move handles while preserving length Yes
Move along handles Ctrl+Alt to restrict node movement to the handle lines Yes
Drag out handles Shift + mouse drag to drag out a handle that coincides with a node Yes
Restrict movement Ctrl to restrict handle movements to ~15 degree angle increments from axis-aligned and the original angle Yes
Snap handles Handles can be snapped to other snap targets No
Copy / paste handles Ability to copy and paste handles between nodes No
Copy / paste subpaths Ability to add a subpath by pasting it into the selected path No
Extras
Drag tolerance Drags shorter than a configurable distance are regarded as clicks Yes
Clip / mask editing Buttons to edit the clipping and masking paths in place Yes
Path effect param editing Button to to edit the next path parameter of the selected live path effect Yes
Prefs page Node tool preferences page with various settings Yes

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