Open and close all nodes
This commit is contained in:
parent
566dc99370
commit
3cb65b2912
76
origami.el
76
origami.el
@ -63,9 +63,11 @@
|
||||
beg end beg-children end-children)
|
||||
(vector beg end open sorted-children data)))))
|
||||
|
||||
(defun origami-fold-top-level-node (&optional children)
|
||||
(defun origami-fold-root-node (&optional children)
|
||||
;; TODO: fix min and max
|
||||
(origami-fold-node 1 10000 t children))
|
||||
(origami-fold-node 1 10000 t children 'root))
|
||||
|
||||
(defun origami-fold-is-root-node? (node) (eq (origami-fold-data node) 'root))
|
||||
|
||||
(defun origami-fold-beg (node) (when node (aref node 0)))
|
||||
|
||||
@ -80,17 +82,19 @@
|
||||
value
|
||||
(origami-fold-children old-node)
|
||||
(origami-fold-data old-node))))
|
||||
(origami-fold-assoc path new-node)))
|
||||
(if (origami-fold-is-root-node? old-node) ;can't change the state of the root node
|
||||
old-node
|
||||
(origami-fold-assoc path new-node))))
|
||||
|
||||
(defun origami-fold-children (node &optional children)
|
||||
(defun origami-fold-children (node) (when node (aref node 3)))
|
||||
|
||||
(defun origami-fold-children-set (node children)
|
||||
(when node
|
||||
(if children
|
||||
(origami-fold-node (origami-fold-beg node)
|
||||
(origami-fold-end node)
|
||||
(origami-fold-open-p node)
|
||||
children
|
||||
(origami-fold-data node))
|
||||
(aref node 3))))
|
||||
(origami-fold-data node))))
|
||||
|
||||
(defun origami-fold-data (node &optional data)
|
||||
"With optional param DATA, add or replace data. This cannot be
|
||||
@ -108,7 +112,7 @@ used to nil out data. This mutates the node."
|
||||
(equal (origami-fold-open-p a) (origami-fold-open-p b)))
|
||||
|
||||
(defun origami-fold-replace-child (node old new)
|
||||
(origami-fold-children node
|
||||
(origami-fold-children-set node
|
||||
(cons new (remove old (origami-fold-children node)))))
|
||||
|
||||
(defun origami-fold-assoc (path new-node)
|
||||
@ -146,6 +150,16 @@ used to nil out data. This mutates the node."
|
||||
(-each (origami-fold-children node) f)
|
||||
(funcall f node))
|
||||
|
||||
(defun origami-fold-map (f tree)
|
||||
"Map F over the tree. Replacing each node with the result of (f
|
||||
node). The children cannot be manipulated using f as the map will
|
||||
replace them. This cannot change the structure of the tree, just
|
||||
the state of each node."
|
||||
(origami-fold-children-set
|
||||
(funcall f tree)
|
||||
(-map (lambda (node) (origami-fold-map f node))
|
||||
(origami-fold-children tree))))
|
||||
|
||||
(defun origami-fold-find-deepest (tree pred)
|
||||
(when tree
|
||||
(when (funcall pred tree)
|
||||
@ -326,17 +340,16 @@ consumed count."
|
||||
;;; interactive utils
|
||||
|
||||
;;; TODO: delete or make buffer local
|
||||
(defvar origami-tree (origami-fold-top-level-node))
|
||||
(defvar origami-tree (origami-fold-root-node))
|
||||
|
||||
(defun origami-get-cached-tree (buffer)
|
||||
;; TODO:
|
||||
(debug-msg "old tree: %s" origami-tree)
|
||||
origami-tree)
|
||||
|
||||
(defun origami-store-cached-tree (buffer tree)
|
||||
;; TODO:
|
||||
(debug-msg "new tree: %s" tree)
|
||||
(setq origami-tree tree))
|
||||
(debug-msg "new:")
|
||||
(debug-msg (setq origami-tree tree)))
|
||||
|
||||
(defun origami-build-tree (buffer parser)
|
||||
(when parser
|
||||
@ -345,7 +358,7 @@ consumed count."
|
||||
(-> parser
|
||||
(origami-run-parser (origami-content 0 contents))
|
||||
car
|
||||
origami-fold-top-level-node)))))
|
||||
origami-fold-root-node)))))
|
||||
|
||||
(defun origami-get-parser (buffer is-open data)
|
||||
;; TODO: remove hardcoding!
|
||||
@ -379,12 +392,14 @@ consumed count."
|
||||
"Facade. Build the tree if it hasn't already been built
|
||||
otherwise fetch cached tree."
|
||||
;; TODO: caching -- don't parse again if there have been no edits since last time
|
||||
(debug-msg "old:")
|
||||
(debug-msg
|
||||
(origami-build-tree buffer
|
||||
(origami-get-parser buffer
|
||||
(origami-was-previously-open?
|
||||
(origami-get-cached-tree buffer))
|
||||
(origami-previous-data
|
||||
(origami-get-cached-tree buffer)))))
|
||||
(origami-get-cached-tree buffer))))))
|
||||
|
||||
;;; dsl
|
||||
|
||||
@ -397,7 +412,6 @@ otherwise fetch cached tree."
|
||||
(interactive (list (current-buffer) (point)))
|
||||
(let ((tree (origami-get-fold-tree buffer)))
|
||||
(-when-let (path (origami-fold-find-path-containing tree point))
|
||||
(debug-msg "open path: %s" path)
|
||||
(origami-fold-diff tree (origami-store-cached-tree buffer
|
||||
(origami-fold-open-set path t))
|
||||
(origami-create-overlay-from-fold-tree-fn buffer)
|
||||
@ -418,7 +432,6 @@ otherwise fetch cached tree."
|
||||
(interactive (list (current-buffer) (point)))
|
||||
(let ((tree (origami-get-fold-tree buffer)))
|
||||
(-when-let (path (origami-fold-find-path-containing tree point))
|
||||
(debug-msg "open path: %s" path)
|
||||
(origami-fold-diff tree (origami-store-cached-tree buffer
|
||||
(origami-fold-open-set
|
||||
path
|
||||
@ -427,13 +440,34 @@ otherwise fetch cached tree."
|
||||
(origami-delete-overlay-from-fold-tree-fn buffer)
|
||||
(origami-change-overlay-from-fold-node-fn buffer)))))
|
||||
|
||||
(defun origami-reset (buffer)
|
||||
;; TODO: provide this to the user in case we get screwed up, maybe
|
||||
;; use this when disabling the minor mode? Could possibly diff
|
||||
;; against null?
|
||||
(defun origami-open-all-nodes (buffer)
|
||||
(interactive (list (current-buffer)))
|
||||
(let ((tree (origami-get-fold-tree buffer)))
|
||||
(origami-fold-diff tree (origami-store-cached-tree buffer (origami-fold-top-level-node))
|
||||
(origami-fold-diff tree (origami-store-cached-tree buffer
|
||||
(origami-fold-map
|
||||
(lambda (node)
|
||||
(origami-fold-open-set (list node) t))
|
||||
tree))
|
||||
(origami-create-overlay-from-fold-tree-fn buffer)
|
||||
(origami-delete-overlay-from-fold-tree-fn buffer)
|
||||
(origami-change-overlay-from-fold-node-fn buffer))))
|
||||
|
||||
(defun origami-close-all-nodes (buffer)
|
||||
(interactive (list (current-buffer)))
|
||||
(let ((tree (origami-get-fold-tree buffer)))
|
||||
(origami-fold-diff tree (origami-store-cached-tree buffer
|
||||
(origami-fold-map
|
||||
(lambda (node)
|
||||
(origami-fold-open-set (list node) nil))
|
||||
tree))
|
||||
(origami-create-overlay-from-fold-tree-fn buffer)
|
||||
(origami-delete-overlay-from-fold-tree-fn buffer)
|
||||
(origami-change-overlay-from-fold-node-fn buffer))))
|
||||
|
||||
(defun origami-reset (buffer)
|
||||
(interactive (list (current-buffer)))
|
||||
(let ((tree (origami-get-fold-tree buffer)))
|
||||
(origami-fold-diff tree (origami-store-cached-tree buffer (origami-fold-root-node))
|
||||
(origami-create-overlay-from-fold-tree-fn buffer)
|
||||
(origami-delete-overlay-from-fold-tree-fn buffer)
|
||||
(origami-change-overlay-from-fold-node-fn buffer)))
|
||||
|
Loading…
Reference in New Issue
Block a user