emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/sketch-mode 275ef27 2/4: Implement interactive feedback


From: ELPA Syncer
Subject: [elpa] externals/sketch-mode 275ef27 2/4: Implement interactive feedback for drawing lines
Date: Sun, 10 Oct 2021 01:57:25 -0400 (EDT)

branch: externals/sketch-mode
commit 275ef2717e6029d90cd3b5bfce0f054cc72fea31
Author: Daniel Nicolai <dalanicolai@gmail.com>
Commit: Daniel Nicolai <dalanicolai@gmail.com>

    Implement interactive feedback for drawing lines
    
    Currently this commit breaks the mode-line coords echo.
    
    Interactive feedback support for all other object types will be added in 
future
    commits
---
 sketch-mode.el | 145 +++++++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 120 insertions(+), 25 deletions(-)

diff --git a/sketch-mode.el b/sketch-mode.el
index 410c776..196eb46 100644
--- a/sketch-mode.el
+++ b/sketch-mode.el
@@ -281,20 +281,22 @@ Optionally set a custom GRID-PARAMETER (default is value 
of
     (setq sketch-root (sketch-group "root"))
     (setq sketch-layers-list (list (sketch-group "layer-0")))
     (setq show-layers '(0))
-    (insert-image (sketch-image sketch-svg
+    (sketch-insert-image sketch-svg
+                         (prin1-to-string sketch-root)
                                 :grid-param grid-parameter
                                 :pointer 'arrow
                                 :map `(((rect . ((0 . 0) . (,(dom-attr 
sketch-svg 'width) . ,(dom-attr sketch-svg 'height))))
                                         ;; :map '(((rect . ((0 . 0) . (800 . 
600)))
                                         sketch
                                         (pointer arrow help-echo (lambda (_ _ 
pos)
-                                                                   (let 
((message-log-max nil)
+                                                                   (let (
+                                                                         ;; 
(message-log-max nil)
                                                                          
(coords (cdr (mouse-pixel-position))))
                                                                      (setq 
sketch-cursor-position (format "(%s, %s)"
                                                                                
                           (- (car coords) sketch-im-x-offset)
                                                                                
                           (+ (cdr coords) sketch-im-y-offset))))
-                                                                               
                                   (force-mode-line-update))))))
-                  (prin1-to-string sketch-root))))
+                                                                               
                                   (force-mode-line-update)))))
+                  )))
 
 ;; FIXME: `defvar' can't be meaningfully inside a function like that.
 ;; FIXME: Use a `sketch-' prefix for all dynbound vars.
@@ -475,9 +477,12 @@ else return nil"
     ("-L" sketch-layers)
     ("A" "Add layer" sketch-add-layer)]]
   ["Commands"
-   [([sketch drag-mouse-1] "Draw object"  sketch-interactively-1)
+   [([sketch down-mouse-1] "Draw object"  sketch-interactively-1)
     ([sketch mouse-1] "Draw text"  sketch-text-interactively)
-    ([sketch C-S-drag-mouse-1] "Crop image" sketch-crop)]
+    ([sketch C-S-drag-mouse-1] "Crop image" sketch-crop)
+    ;; ("T" "Polyline" test-mouse)
+    ;; ([sketch S-down-mouse-1] "Track mouse" sketch-line)
+    ]
    [("t" "Transform object" sketch-modify-object)
     ("r" "Remove object" sketch-remove-object)
     ("i" "Import object" sketch-import)]
@@ -710,7 +715,7 @@ else return nil"
 ;;     ) ;; TODO make it work for all types of elements
 ;;   node))
 
-(defun sketch-redraw (&optional lisp lisp-buffer)
+(defun sketch-redraw (&optional lisp lisp-buffer coords)
   (unless sketch-mode
     (user-error "Not in sketch-mode buffer"))
   (save-current-buffer
@@ -730,23 +735,59 @@ else return nil"
                              (when sketch-show-labels (list (sketch-labels)))
                              (list sketch-root)))
     (erase-buffer) ;; a (not exact) alternative is to use (kill-backward-chars 
1)
-    (insert-image (sketch-image sketch-svg
+    (sketch-insert-image sketch-svg
+                         (prin1-to-string sketch-root)
                                 :pointer 'arrow
                                 :grid-param sketch-grid-param
                                 :map `(((rect . ((0 . 0) . (,(dom-attr 
sketch-svg 'width) . ,(dom-attr sketch-svg 'height))))
                                         ;; :map '(((rect . ((0 . 0) . (800 . 
600)))
                                         sketch
                                         (pointer arrow help-echo (lambda (_ _ 
pos)
-                                                                   (let 
((message-log-max nil)
-                                                                         
(coords (mouse-pixel-position)))
+                                                                   ;; (let 
((message-log-max nil)
+                                                                   ;;       
(coords (mouse-pixel-position)))
                                                                      (setq 
sketch-cursor-position (format "(%s, %s)"
-                                                                               
                           (- (cadr coords) pos)
-                                                                               
                           (cddr coords))))
-                                                                               
                                   (force-mode-line-update))))))
-                  (prin1-to-string sketch-root))))
+                                                                               
                           (- (car coords) pos)
+                                                                               
                           (cdr coords)))
+                                                                               
                                   (force-mode-line-update)))))
+                  )))
 
+(defun sketch-update (&optional lisp lisp-buffer coords)
+  (unless sketch-mode
+    (user-error "Not in sketch-mode buffer"))
+  (save-current-buffer
+    (when lisp-buffer
+      (sketch-update-lisp-window lisp lisp-buffer))
+    ;; (let ((lisp-window (or (get-buffer-window "*sketch-root*")
+    ;;                        (get-buffer-window lisp-buffer))))
+    ;;   (unless (string= (buffer-name (window-buffer lisp-window)) "*sketch*")
+    ;;     (if-let (buf (get-buffer"*sketch-root*"))
+    ;;         (sketch-update-lisp-window sketch-root buf)
+    ;;       (sketch-update-lisp-window lisp lisp-buffer))))
+    (setq sketch-root (append (cl-subseq sketch-root 0 2) (list (nth (car 
show-layers) sketch-layers-list))))
+    (dolist (layer (cdr show-layers))
+      (setq sketch-root (append sketch-root (list (nth layer 
sketch-layers-list)))))
+    (setq sketch-svg (append svg-canvas
+                             (when sketch-show-grid (list sketch-grid))
+                             (when sketch-show-labels (list (sketch-labels)))
+                             (list sketch-root)))
+    (erase-buffer) ;; a (not exact) alternative is to use (kill-backward-chars 
1)
+    (sketch-insert-image sketch-svg
+                         nil
+                                :pointer 'arrow
+                                :grid-param sketch-grid-param
+                                :map `(((rect . ((0 . 0) . (,(dom-attr 
sketch-svg 'width) . ,(dom-attr sketch-svg 'height))))
+                                        ;; :map '(((rect . ((0 . 0) . (800 . 
600)))
+                                        sketch
+                                        (pointer arrow help-echo (lambda (_ _ 
pos)
+                                                                   ;; (let 
((message-log-max nil)
+                                                                   ;;       
(coords (mouse-pixel-position)))
+                                                                     (setq 
sketch-cursor-position (format "(%s, %s)"
+                                                                               
                           (- (car coords) pos)
+                                                                               
                           (cdr coords)))
+                                                                               
                                   (force-mode-line-update)))))
+                  )))
 
-(transient-define-suffix sketch-interactively-1 (event)
+(defun sketch-interactively-1 (event)
   (interactive "@e")
   (let* ((args (when transient-current-prefix (transient-args 
'sketch-transient)))
          (start (event-start event))
@@ -775,20 +816,50 @@ else return nil"
                                                "url(#arrow)"
                                              "none"))))
          (object-type (transient-arg-value "--object=" args))
-         (command-and-coords (pcase object-type
+         (start-command-and-coords (pcase object-type
                                ("line" (list 'svg-line
                                              (car start-coords) (cdr 
start-coords)
-                                             (car end-coords) (cdr 
end-coords)))
+                                             (car start-coords) (cdr 
start-coords)))
                                ("rectangle" `(svg-rectangle
-                                              ,@(sketch--rectangle-coords 
start-coords end-coords)))
+                                              ,@(sketch--rectangle-coords 
start-coords start-coords)))
                                ("circle" (list 'svg-circle
                                                (car start-coords) (cdr 
start-coords)
-                                               (sketch--circle-radius 
start-coords end-coords)))
-                               ("ellipse" `(svg-ellipse 
,@(sketch--ellipse-coords start-coords end-coords))))))
-    (apply (car command-and-coords) (nth sketch-active-layer 
sketch-layers-list) `(,@(cdr command-and-coords) ,@object-props :id 
,(sketch-create-label object-type)))
-    (when-let (buf (get-buffer "*sketch-root*"))
-      (sketch-update-lisp-window sketch-root buf))
-    (sketch-redraw)))
+                                               (sketch--circle-radius 
start-coords start-coords)))
+                               ("ellipse" `(svg-ellipse 
,@(sketch--ellipse-coords start-coords start-coords)))))
+         ;; (end-command-and-coords (pcase object-type
+         ;;                       ("line" (list 'svg-line
+         ;;                                     (car start-coords) (cdr 
start-coords)
+         ;;                                     (car end-coords) (cdr 
end-coords)))
+         ;;                       ("rectangle" `(svg-rectangle
+         ;;                                      ,@(sketch--rectangle-coords 
start-coords end-coords)))
+         ;;                       ("circle" (list 'svg-circle
+         ;;                                       (car start-coords) (cdr 
start-coords)
+         ;;                                       (sketch--circle-radius 
start-coords end-coords)))
+         ;;                       ("ellipse" `(svg-ellipse 
,@(sketch--ellipse-coords start-coords end-coords)))))
+         (label (sketch-create-label object-type)))
+    (apply (car start-command-and-coords) (nth sketch-active-layer 
sketch-layers-list) `(,@(cdr start-command-and-coords) ,@object-props :id 
,label))
+    ;; (apply (car end-command-and-coords) (nth sketch-active-layer 
sketch-layers-list) `(,@(cdr command-and-coords) ,@object-props :id ,label))
+    (let ((node (car (dom-by-id (nth sketch-active-layer sketch-layers-list) 
label))))
+      (track-mouse
+        (while (not (eq (car event) 'drag-mouse-1))
+          (setq event (read-event))
+          (let ((end (posn-object-x-y (event-start event))))
+            (setf (dom-attr node 'x2) (car end))
+            (setf (dom-attr node 'y2) (cdr end)))
+          (sketch-update nil nil (cons (car end) (cdr end)))))
+          ;; (sketch-possibly-update-image sketch-svg)))
+      (let ((end (posn-object-x-y (event-end event))))
+        (setf (dom-attr node 'x2) (car end))
+        (setf (dom-attr node 'y2) (cdr end))
+        ;; (sketch-possibly-update-image sketch-svg
+        ;;                               :pointer 'arrow
+        ;;                               :map `(((rect . ((0 . 0) . 
(,(dom-attr sketch-svg 'width) . ,(dom-attr sketch-svg 'height))))
+        ;;                                       ;; :map '(((rect . ((0 . 0) . 
(800 . 600)))
+        ;;                                       sketch
+        ;;                                       (pointer arrow))))
+        (when-let (buf (get-buffer "*sketch-root*"))
+          (sketch-update-lisp-window sketch-root buf))
+        (sketch-redraw)))))
 
 (transient-define-suffix sketch-remove-object ()
   (interactive)
@@ -881,7 +952,8 @@ else return nil"
         ((fboundp 'undo-tree-undo)
          (undo-tree-undo))
         (t (undo)))
-  (setq sketch-root (read (buffer-string)))
+  (setq sketch-svg (read (buffer-string)))
+  (setq sketch-root (car (dom-by-id sketch-svg "root")))
   (setq sketch-layers-list (dom-elements sketch-root 'id "layer"))
   (unless sketch-layers-list (sketch-add-layer)))
 ;; (let ((sketch-reverse (nreverse sketch-root)))
@@ -1052,6 +1124,29 @@ PROPS is passed on to `create-image' as its PROPS list."
      (buffer-string))
    'svg t props))
 
+(defun sketch-insert-image (svg string &rest props)
+  "Insert SVG as an image at point.
+If the SVG is later changed, the image will also be updated."
+  (let ((image (apply #'sketch-image svg props))
+             (marker (point-marker)))
+    (insert-image image string)))
+    ;; (dom-set-attribute svg :image marker)))
+
+(defun sketch-possibly-update-image (svg)
+  (let ((marker (dom-attr svg :image)))
+    (when (and marker
+                    (buffer-live-p (marker-buffer marker)))
+      (with-current-buffer (marker-buffer marker)
+             (put-text-property marker (1+ marker) 'display (svg-image 
svg))))))
+
+(defun sketch-possibly-update-image (svg)
+  "Exact copy of svg-possibly-update-image."
+  (let ((marker (dom-attr svg :image)))
+    (when (and marker
+                    (buffer-live-p (marker-buffer marker)))
+      (with-current-buffer (marker-buffer marker)
+             (put-text-property marker (1+ marker) 'display (svg-image 
svg))))))
+
 (transient-define-suffix sketch-save ()
   (interactive)
   (let ((image (get-char-property (point) 'display))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]