[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/treeview ad9c094d89 23/25: Implemented selection of files
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/treeview ad9c094d89 23/25: Implemented selection of files and highlighting of nodes |
Date: |
Sat, 10 Sep 2022 17:59:39 -0400 (EDT) |
branch: elpa/treeview
commit ad9c094d89feae3300ac6c9fa49a62f08d0ff0ef
Author: Tilman Rassy <tilman.rassy@googlemail.com>
Commit: Tilman Rassy <tilman.rassy@googlemail.com>
Implemented selection of files and highlighting of nodes
---
treeview.el | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 120 insertions(+), 24 deletions(-)
diff --git a/treeview.el b/treeview.el
index 6676088b84..752a1c6b31 100644
--- a/treeview.el
+++ b/treeview.el
@@ -1,10 +1,10 @@
;;; treeview.el --- A generic tree navigation library -*- lexical-binding: t
-*-
-;; Copyright (C) 2018-2020 Tilman Rassy
+;; Copyright (C) 2018-2021 Tilman Rassy
;; Author: Tilman Rassy <tilman.rassy@googlemail.com>
;; URL: https://github.com/tilmanrassy/emacs-treeview
-;; Version: 1.0.0
+;; Version: 1.1.0
;; Package-Requires: ((emacs "24.4"))
;; Keywords: lisp, tools, internal, convenience
@@ -103,6 +103,7 @@
;; The framework is used by implementing several functions which are defined
as function variables,
;; thus, variables whose values are function symbols. Here is a list of that
variables:
;;
+;; treeview-get-root-node-function
;; treeview-node-leaf-p-function
;; treeview-update-node-children-function
;; treeview-after-node-expanded-function
@@ -166,7 +167,8 @@ the entry `state' with the value `folder-unread'."
(setcar (nthcdr 1 node) props))
(defun treeview-get-node-prop (node key)
- "Return the property KEY of NODE."
+ "Return the property KEY of NODE.
+If the property is not set, returns nil."
(plist-get (treeview-get-node-props node) key))
(defun treeview-set-node-prop (node key value)
@@ -214,6 +216,16 @@ This is the case if and only if NODES's state is
`folded-unread' or `folded-read
"Set the children of NODE to CHILDREN."
(setcar (nthcdr 3 node) children))
+(defvar treeview-get-root-node-function nil
+ "Function that returns the root node of the tree.")
+
+(make-variable-buffer-local 'treeview-get-root-node-function)
+
+(defun treeview-get-root-node ()
+ "Return the root node of the tree.
+Calls `treeview-get-root-node-function', which must be implemented."
+ (funcall treeview-get-root-node-function))
+
(defun treeview-get-parent-children (node)
"Return the children of the parent of NODE.
If NODE has no parent, return nil."
@@ -459,6 +471,20 @@ The default implementation is `treeview-return-nil'.")
(make-variable-buffer-local 'treeview-get-selected-node-face-function)
+(defvar treeview-highlighted-node nil
+ "The highlighted node, or nil if currently no node is highlighted.")
+
+(make-variable-buffer-local 'treeview-highlighted-node)
+
+(defvar treeview-get-highlighted-node-face-function 'treeview-return-nil
+ "Function to get the face to highlighted a node.
+Called with one argument, the node. The return value must be a face or nil.
If a
+face, it is used to highlight the node.
+
+The default implementation is `treeview-return-nil'.")
+
+(make-variable-buffer-local 'treeview-get-highlighted-node-face-function)
+
(defvar treeview-get-label-keymap-function 'treeview-return-nil
"Function to get the keymap of the label of a node.
Called with one argument, the node. The return value is passed as the KEYMAP
@@ -519,6 +545,25 @@ The default implementation is `treeview-return-nil'.")
(make-variable-buffer-local 'treeview-get-icon-mouse-face-function)
+(defun treeview-apply-recursively (node callback)
+ "Apply CALLBACK to NODE and all its descendants.
+CALLBACK should be a function expecting a node as argument."
+ (funcall callback node)
+ (dolist (child (treeview-get-node-children node))
+ (treeview-apply-recursively child callback)))
+
+(defun treeview-for-each-node (callback)
+ "Apply CALLBACK to each node in the tree.
+CALLBACK should be a function expecting a node as argument."
+ (treeview-apply-recursively (treeview-get-root-node) callback))
+
+(defun treeview-filter-nodes (filter)
+ "Return a list of all nodes for which FILTER returns non-nil.
+FILTER must be function accepting a node as argument."
+ (let ( (nodes ()) )
+ (treeview-for-each-node (lambda (node) (when (funcall filter node) (push
node nodes))))
+ nodes))
+
(defun treeview-get-node-at-pos (pos)
"Return the node at the buffer position POS, or nil if there is no node at
that position."
(let ( (overlays (overlays-at pos t))
@@ -822,7 +867,11 @@ after this cons cell. NODE is also displayed if the
parent is not hidden."
(let ( (buffer-read-only nil) )
(goto-char (treeview-get-node-prop anchor-node 'end))
(end-of-line)
+ ;; Set insertion type of end marker of anchor-node to nil, to prevent
marker from moving:
+ (treeview-set-node-end anchor-node nil nil)
(newline)
+ ;; Reset insertion type of end marker of anchor-node:
+ (treeview-set-node-end anchor-node nil t)
(treeview-render-node node nil)
(treeview-set-node-end-after-display node) )) ))
@@ -989,6 +1038,43 @@ does nothing."
(let ( (node (treeview-get-node-at-pos (point))) )
(when node (funcall action-function node))))
+(defun treeview-refresh-node (node)
+ "Update and redisplay NODE.
+
+First, NODE is updated by calling `treeview-update-node'. Then, NODE is
+redisplayed by calling `treeview-redisplay-node'."
+ (let ( (pos (point)) )
+ (treeview-update-node node)
+ (treeview-redisplay-node node)
+ (goto-char (if (<= pos (point-max)) (if (>= pos (point-min)) pos
(point-min)) (point-max))) ))
+
+(defun treeview-refresh-tree ()
+ "Update and redisplay the entire tree."
+ (interactive)
+ (treeview-refresh-node (treeview-get-root-node)))
+
+(defun treeview-refresh-node-at-point ()
+ "Update and redisplay the node at point.
+Calls `treeview-refresh-node' with the node at point.
+If there is no node at point, does nothing."
+ (interactive)
+ (treeview-call-for-node-at-point 'treeview-refresh-node))
+
+(defun treeview-refresh-subtree-at-point ()
+ "Update and redisplay the subtree point is in.
+If the node at point is expanded, calls `treeview-refresh-node' for the
+node at point. If the node at point is not expanded and its parent is not
+nil, calls `treeview-refresh-node' for the parent. If the node at point
+is not expanded and its parent is nil, calls `treeview-refresh-node' for
+the node at point. If there is no node at point, does nothing."
+ (interactive)
+ (let ( (node (treeview-get-node-at-pos (point))) )
+ (when node
+ (unless (treeview-node-expanded-p node)
+ (let ( (parent (treeview-get-node-parent node)) )
+ (when parent (setq node parent))))
+ (treeview-refresh-node node))))
+
(defvar treeview-suggest-point-pos-in-control-function
'treeview-get-overlay-center
"Function to suggest an appropriate position for the point in a node control.
Called with one argument, the control overlay. Auxiliary for implementing
@@ -1064,41 +1150,40 @@ has no next sibling, does nothing."
(let ( (sibling (treeview-get-next-sibling parent)) )
(when sibling (treeview-place-point-in-node sibling))))))))
-(defvar treeview-selected-nodes-list ()
- "List of selected nodes.")
-
-(make-variable-buffer-local 'treeview-selected-nodes-list)
-
(defun treeview-node-selected-p (node)
"Return non-nil if NODE is selected, otherwise nil.
-A node is selected if it is contained in `treeview-selected-nodes-list'."
- (memq node treeview-selected-nodes-list))
+A node is selected if its property `selected' is non-nil."
+ (treeview-get-node-prop node 'selected))
(defun treeview-select-node (node)
"Select NODE.
-The node is added to `treeview-selected-nodes-list' and highlighted with the
face
-returned by `treeview-get-selected-node-face-function'. If the node is already
-selected, does nothing"
- (unless (memq node treeview-selected-nodes-list)
- (push node treeview-selected-nodes-list)
+The node's property `select' is set to t, and the node's label is highlighted
+with the face returned by `treeview-get-selected-node-face-function'. If the
+node is already selected, does nothing"
+ (unless (treeview-node-selected-p node)
+ (treeview-set-node-prop node 'selected t)
(treeview-add-node-label-face node (funcall
treeview-get-selected-node-face-function node))))
(defun treeview-unselect-node (node)
"Unselect NODE.
-If the node is selcted, it is removed from `treeview-selected-nodes-list' and
-its highlighting as a selected node is removed. If the node isn't selected,
-does nothing"
- (when (memq node treeview-selected-nodes-list)
- (setq treeview-selected-nodes-list (delq node
treeview-selected-nodes-list))
+The node's property `select' is set to nil, and the highlighting as a selected
+node is removed. If the node isn't selected, does nothing"
+ (when (treeview-node-selected-p node)
+ (treeview-set-node-prop node 'selected nil)
(treeview-remove-node-label-face node (funcall
treeview-get-selected-node-face-function node))))
+(defun treeview-get-all-selected-nodes ()
+ "Return all selected nodes as a list."
+ (treeview-filter-nodes 'treeview-node-selected-p))
+
+(defun treeview-selected-nodes-exist ()
+ "Return non-nil if at least one node is selected, otherwise nil."
+ (> (length (treeview-get-all-selected-nodes)) 0))
+
(defun treeview-unselect-all-nodes ()
"Unselect all selected nodes."
(interactive)
- (while treeview-selected-nodes-list
- (let ( (node (car treeview-selected-nodes-list)) )
- (treeview-remove-node-label-face node (funcall
treeview-get-selected-node-face-function node))
- (setq treeview-selected-nodes-list (cdr treeview-selected-nodes-list)))))
+ (dolist (node (treeview-get-all-selected-nodes)) (treeview-unselect-node
node)))
(defun treeview-unselect-all-nodes-after-keyboard-quit ()
(when (eq this-command 'keyboard-quit) (treeview-unselect-all-nodes)))
@@ -1176,6 +1261,17 @@ See `treeview-select-gap-above-node' for more
information."
(let ( (node (treeview-get-node-at-event event)) )
(when node (treeview-select-gap-above-node node))))
+(defun treeview-unhighlight-node ()
+ (when treeview-highlighted-node
+ (let ( (node treeview-highlighted-node) )
+ (treeview-remove-node-label-face node (funcall
treeview-get-highlighted-node-face-function node)))
+ (setq treeview-highlighted-node nil)))
+
+(defun treeview-highlight-node (node)
+ (treeview-unhighlight-node)
+ (treeview-add-node-label-face node (funcall
treeview-get-highlighted-node-face-function node))
+ (setq treeview-highlighted-node node))
+
(defun treeview-make-keymap (key-table)
"Create and return a keymap from KEY-TABLE.
The latter must be an alist whose car's are strings describing key sequences in
- [nongnu] branch elpa/treeview created (now 09c8c1d045), ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview d8b8b4a533 02/25: First version of README.md, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 2d6b185055 10/25: Updated package URL and years in copyright, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview b53c339572 13/25: Bugfix for updating hidden nodes, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview a058a07149 12/25: Minor changes in library header comments, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 6b22e03b15 21/25: Implemented selection of nodes, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 09c8c1d045 25/25: Additions to documentation, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 3130757444 05/25: Added new function treeview-call-for-node-at-point, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 0044b119e7 11/25: Updated documentation, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 86d6734aef 15/25: Renamed function treeview-display-node-internal to treeview-render-node, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview ad9c094d89 23/25: Implemented selection of files and highlighting of nodes,
ELPA Syncer <=
- [nongnu] elpa/treeview 0681739fdd 01/25: Initial commit, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 0d66ef2322 22/25: Made treeview-after-node-expanded-function and treeview-after-node-folded-function buffer-local, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 00a4ab92bd 19/25: Changed http to https in link to GNU licenses, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview e601230367 20/25: Removed needless intern statements, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 07ea52cd7f 16/25: Added package dependency on emacs 24.4, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 8382de4bdd 18/25: Sharp-quoted function name, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview f0c0711070 04/25: Insering/removing nodes; treeview-after-node-expanded-function and treeview-after-node-folded-function, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 5dff23aac0 09/25: New functions for navigation; misc. improvements, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 3038ebf96e 08/25: Fixed bug when removing first child, ELPA Syncer, 2022/09/10
- [nongnu] elpa/treeview 34ecd7a320 24/25: Fixed issues detected by flycheck; updated documentation, ELPA Syncer, 2022/09/10