                 (reset! drawing-shape shape)))
 
             (on-draw [[point ctrl?]]
-              (let [shape (update-point @drawing-shape point @counter)]
-                (reset! drawing-shape shape)))
+              (if ctrl?
+                (let [center (get-in @drawing-shape [:points (dec @counter)])
+                      point (as-> point $
+                              (gpt/subtract $ center)
+                              (align-position (gpt/angle $) $)
+                              (gpt/add $ center))]
+                  (->> (update-point @drawing-shape point @counter)
+                       (reset! drawing-shape)))
+                (->> (update-point @drawing-shape point @counter)
+                     (reset! drawing-shape))))
 
             (on-end []
               (let [shape (normalize-shape @drawing-shape)]

              (on-init-draw-path shape))
      (on-init-draw-generic shape))))

(defn- on-init-draw-icon
  [shape]
  (let [{:keys [x y]} (gpt/divide @wb/mouse-canvas-a @wb/zoom-ref)

              (udw/select-for-drawing nil)
              (uds/select-first-shape))
    (rlocks/release! :ui/draw)))

;; --- Path Drawing

(def ^:private immanted-zones
  (let [transform #(vector (- % 7) (+ % 7) %)]
    (concat
     (mapv transform (range 0 181 15))
     (mapv (comp transform -) (range 0 181 15)))))

(defn- align-position
  [angle pos]
  (reduce (fn [pos [a1 a2 v]]
            (if (< a1 angle a2)
              (reduced (gpt/update-angle pos v))
              pos))
          pos
          immanted-zones))

(defn- on-init-draw-path
  [shape]
