branch: elpa/scad-mode
commit 5dfec8f8dcf587c15b616b9dc840c55b38a9dba9
Author: Daniel Mendler <[email protected]>
Commit: Daniel Mendler <[email protected]>
More efficient preview
---
scad-mode.el | 66 +++++++++++++++++++++++++++++++++---------------------------
1 file changed, 36 insertions(+), 30 deletions(-)
diff --git a/scad-mode.el b/scad-mode.el
index a2867b2f27..b9721d0755 100644
--- a/scad-mode.el
+++ b/scad-mode.el
@@ -227,6 +227,7 @@ Options are .stl, .off, .amf, .3mf, .csg, .dxf, .svg, .pdf,
.png,
(defvar-local scad--preview-buffer nil)
(defvar-local scad--preview-proc nil)
+(defvar-local scad--preview-image nil)
(defvar-local scad--preview-mode-status nil)
(defvar-local scad--preview-mode-camera nil)
(defvar-local scad--preview-timer nil)
@@ -265,20 +266,20 @@ Options are .stl, .off, .amf, .3mf, .csg, .dxf, .svg,
.pdf, .png,
(defun scad-preview ()
"Preview SCAD models in real-time within Emacs."
(interactive)
- (setq scad--preview-buffer (if (buffer-live-p scad--preview-buffer)
- scad--preview-buffer
- (get-buffer-create (format "*scad preview: %s*"
(buffer-name)))))
+ (unless (buffer-live-p scad--preview-buffer)
+ (setq scad--preview-buffer
+ (with-current-buffer (get-buffer-create (format "*scad preview: %s*"
(buffer-name)))
+ (scad-preview-mode)
+ (current-buffer))))
(when scad-preview-refresh
(add-hook 'after-change-functions #'scad--preview-change nil 'local))
- (display-buffer scad--preview-buffer)
(let ((orig-buffer (current-buffer)))
(with-current-buffer scad--preview-buffer
(setq scad--preview-buffer orig-buffer)
- (let ((inhibit-message t)
- (message-log-max nil))
- (scad-preview-mode))
(add-hook 'kill-buffer-hook #'scad--preview-kill nil t)
- (scad--preview-reset))))
+ (add-hook 'kill-buffer-hook #'scad--preview-delete nil t)
+ (scad--preview-reset)))
+ (display-buffer scad--preview-buffer '(nil (inhibit-same-window . t))))
(defun scad--preview-change (&rest _)
"Buffer changed, trigger rerendering."
@@ -305,7 +306,7 @@ Options are .stl, .off, .amf, .3mf, .csg, .dxf, .svg, .pdf,
.png,
(scad--preview-kill)
(scad--preview-status "Render")
(let* ((infile (make-temp-file "scad-preview-" nil ".scad"))
- (outfile (concat infile ".png"))
+ (outfile (concat (file-name-sans-extension infile) ".png"))
(buffer (current-buffer)))
(with-current-buffer scad--preview-buffer
(save-restriction
@@ -326,25 +327,21 @@ Options are .stl, .off, .amf, .3mf, .csg, .dxf, .svg,
.pdf, .png,
:buffer "*scad preview output*"
:sentinel
(lambda (proc _event)
- (when (memq (process-status proc) '(exit signal))
- (unwind-protect
- (when (buffer-live-p buffer)
- (with-current-buffer buffer
- (setq scad--preview-proc nil)
- (if (not (ignore-errors
- (and (file-exists-p outfile)
- (> (file-attribute-size
(file-attributes outfile)) 0))))
- (scad--preview-status "Error")
- (with-silent-modifications
- (fundamental-mode)
- (erase-buffer)
- (insert-file-contents outfile)
- (let ((inhibit-message t)
- (message-log-max nil))
- (scad-preview-mode)))
- (scad--preview-status ""))))
- (delete-file outfile)
- (delete-file infile))))
+ (delete-file infile)
+ (when (and (buffer-live-p buffer)
+ (memq (process-status proc) '(exit signal)))
+ (with-current-buffer buffer
+ (setq scad--preview-proc nil)
+ (if (not (ignore-errors
+ (and (file-exists-p outfile)
+ (> (file-attribute-size (file-attributes
outfile)) 0))))
+ (scad--preview-status "Error")
+ (with-silent-modifications
+ (scad--preview-delete)
+ (setq scad--preview-image outfile)
+ (erase-buffer)
+ (insert (propertize "#" 'display `(image :type png
:file ,outfile))))
+ (scad--preview-status "Done")))))
:command
(append
(list scad-command
@@ -371,7 +368,13 @@ Options are .stl, .off, .amf, .3mf, .csg, .dxf, .svg,
.pdf, .png,
(cancel-timer scad--preview-timer)
(setq scad--preview-timer nil)))
-(define-derived-mode scad-preview-mode image-mode "SCAD/Preview"
+(defun scad--preview-delete ()
+ "Delete current image."
+ (when scad--preview-image
+ (delete-file scad--preview-image)
+ (setq scad--preview-image nil)))
+
+(define-derived-mode scad-preview-mode special-mode "SCAD/Preview"
"Major mode for SCAD preview buffers."
(setq-local buffer-read-only t
line-spacing nil
@@ -387,7 +390,10 @@ Options are .stl, .off, .amf, .3mf, .csg, .dxf, .svg,
.pdf, .png,
fringe-indicator-alist '((truncation . nil))
revert-buffer-function #'scad--preview-reset
mode-line-position '(" " scad--preview-mode-camera)
- mode-line-process '(" " scad--preview-mode-status)))
+ mode-line-process '(" " scad--preview-mode-status)
+ mode-line-modified nil
+ mode-line-mule-info nil
+ mode-line-remote nil))
(defun scad--preview-reset (&rest _)
"Reset camera parameters and refresh."