Code

Reintroduce Shift+L shortcut and handle retraction when setting the type
[inkscape.git] / src / ui / tool / multi-path-manipulator.cpp
index 6101a35567da7d69d0095a707fc719cf0c26bb06..a1b398bb1cbdcfce07865b20fb80ac1167ba946d 100644 (file)
@@ -220,11 +220,29 @@ void MultiPathManipulator::invertSelectionInSubpaths()
 void MultiPathManipulator::setNodeType(NodeType type)
 {
     if (_selection.empty()) return;
+
+    // When all selected nodes are already cusp, retract their handles
+    bool retract_handles = (type == NODE_CUSP);
+
     for (ControlPointSelection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
         Node *node = dynamic_cast<Node*>(*i);
-        if (node) node->setType(type);
+        if (node) {
+            retract_handles &= (node->type() == NODE_CUSP);
+            node->setType(type);
+        }
     }
-    _done(_("Change node type"));
+
+    if (retract_handles) {
+        for (ControlPointSelection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
+            Node *node = dynamic_cast<Node*>(*i);
+            if (node) {
+                node->front()->retract();
+                node->back()->retract();
+            }
+        }
+    }
+
+    _done(retract_handles ? _("Retract handles") : _("Change node type"));
 }
 
 void MultiPathManipulator::setSegmentType(SegmentType type)
@@ -603,6 +621,13 @@ bool MultiPathManipulator::event(GdkEvent *event)
                 return true;
             }
             break;
+        case GDK_l:
+        case GDK_L:
+            if (held_only_shift(event->key)) {
+                // Shift+L - make segments linear
+                setSegmentType(SEGMENT_LINEAR);
+                return true;
+            }
         default:
             break;
         }