Code

Fix oddities related to smooth endnodes. Should fix a crasher.
authorKrzysztof Kosiński <tweenk.pl@gmail.com>
Tue, 12 Oct 2010 16:22:08 +0000 (18:22 +0200)
committerKrzysztof Kosiński <tweenk.pl@gmail.com>
Tue, 12 Oct 2010 16:22:08 +0000 (18:22 +0200)
src/ui/tool/node.cpp
src/ui/tool/path-manipulator.cpp

index a5952c9fbce9086577e070f366ec85c71c1794fe..7efb6a5dc87f6935b0ccccd2b76c651d45a95614 100644 (file)
@@ -580,13 +580,15 @@ void Node::setType(NodeType type, bool update_handles)
             _updateAutoHandles();
             break;
         case NODE_SMOOTH: {
+            // ignore attempts to make smooth endnodes.
+            if (isEndNode()) return;
             // rotate handles to be colinear
             // for degenerate nodes set positions like auto handles
             bool prev_line = _is_line_segment(_prev(), this);
             bool next_line = _is_line_segment(this, _next());
             if (_type == NODE_SMOOTH) {
-                // for a node that is already smooth and has a degenerate handle,
-                // drag out the second handle to 1/3 the length of the linear segment
+                // For a node that is already smooth and has a degenerate handle,
+                // drag out the second handle without changing the direction of the first one.
                 if (_front.isDegenerate()) {
                     double dist = Geom::distance(_next()->position(), position());
                     _front.setRelativePos(Geom::unit_vector(-_back.relativePos()) * dist / 3);
index 81fc336ceb721d40599e2f26c3e1bc98d1620056..41be81d4f38da06bfce547c51354f909876de687 100644 (file)
@@ -1325,17 +1325,11 @@ bool PathManipulator::_nodeClicked(Node *n, GdkEventButton *event)
         return true;
     } else if (held_control(*event)) {
         // Ctrl+click: cycle between node types
-        if (n->isEndNode()) {
-            if (n->type() == NODE_CUSP) {
-                n->setType(NODE_SMOOTH);
-            } else {
-                n->setType(NODE_CUSP);
-            }
-        } else {
+        if (!n->isEndNode()) {
             n->setType(static_cast<NodeType>((n->type() + 1) % NODE_LAST_REAL_TYPE));
+            update();
+            _commit(_("Cycle node type"));
         }
-        update();
-        _commit(_("Cycle node type"));
         return true;
     }
     return false;