Function: treemacs--insert-node-in-flattened-directory

treemacs--insert-node-in-flattened-directory is a byte-compiled function defined in treemacs-rendering.el.

Signature

(treemacs--insert-node-in-flattened-directory CREATED-PATH PARENT-BTN PARENT-DOM-NODE FLATTEN-INFO)

Documentation

Insert new CREATED-PATH below flattened directory at PARENT-BTN.

Will take care of every part necessary for adding a new node under a flattened directory - adjusting the label, the state PARENT-DOM-NODE, the FLATTEN-INFO and path text properties, the filewatch entries. It will also differentiate between creating new files and new directories and re-open the node accordingly.

PATH: File Path PARENT-BTN: Button PARENT-DOM-NODE: Dom Node Struct FLATTEN-INFO [Int File Path...]

Source Code

;; Defined in ~/.emacs.d/elpa/treemacs-20251226.1307/treemacs-rendering.el
(defun treemacs--insert-node-in-flattened-directory (created-path parent-btn parent-dom-node flatten-info)
  "Insert new CREATED-PATH below flattened directory at PARENT-BTN.

Will take care of every part necessary for adding a new node under a flattened
directory - adjusting the label, the state PARENT-DOM-NODE, the FLATTEN-INFO and
path text properties, the filewatch entries.  It will also differentiate between
creating new files and new directories and re-open the node accordingly.

PATH: File Path
PARENT-BTN: Button
PARENT-DOM-NODE: Dom Node Struct
FLATTEN-INFO [Int File Path...]"

  (treemacs-block
   (let ((is-file? (file-regular-p created-path))
         (insert-at-end? (treemacs-is-path created-path :in (-last-item flatten-info)))
         (is-expanded? (treemacs-is-node-expanded? parent-btn)))

     ;; Simple addition of a file
     (treemacs-return-if (and is-file? insert-at-end? is-expanded?)
       (treemacs--insert-single-node created-path parent-btn parent-dom-node))

     ;; Simple file addition at the end, but the node is collapsed so we do nothing
     (treemacs-return-if (and is-file? insert-at-end? (not is-expanded?))
       t)

     (let* ((properties (text-properties-at parent-btn))
            (current-base-path (treemacs-button-get parent-btn :key))
            ;; In case we either add a new file or a directory somewhere in the middle of the flattened paths
            ;; we move the `created-path' up a step because that means we do not simple add another directory to
            ;; the flattened path. Instead we remove everything *up to* the directory the new item was created in.
            ;; Pretending the `created-path' has moved up like is an easy way to make sure the new button label
            ;; and properties are determined correctly.
            (created-path (if (or is-file? (not insert-at-end?))
                              (treemacs--parent-dir created-path)
                            created-path))
            (new-path-tokens (treemacs--tokenize-path created-path current-base-path))
            (new-button-label (substring created-path (1+ (length (treemacs--parent-dir current-base-path)))))
            ;; TODO(2020/10/02): Check again when exactly this count is actually used
            ;; maybe it can be removed by now
            (new-flatten-info-count 0)
            (new-flatten-info (list current-base-path))
            (new-flatten-info-item current-base-path))

       ;; Do nothing if we add a new directory and we have already reached maximum length
       (unless (and insert-at-end?
                    (>= (car flatten-info) treemacs-collapse-dirs)
                    (not is-file?))

         ;; Create the path items of the new `:collapsed' property
         (dolist (token new-path-tokens)
           (cl-incf new-flatten-info-count)
           (setf new-flatten-info-item (treemacs-join-path new-flatten-info-item token))
           (push new-flatten-info-item new-flatten-info))
         (setf new-flatten-info (nreverse new-flatten-info))

         ;; Take care of filewatch and dom entries for all paths added and removed
         (let* ((old-flatten-paths (-difference (cdr flatten-info) new-flatten-info))
                (new-flatten-paths (-difference new-flatten-info (cdr flatten-info))))
           (dolist  (old-flatten-path old-flatten-paths)
             (treemacs--stop-watching old-flatten-path)
             (ht-set! treemacs-dom old-flatten-path nil))
           (dolist (new-flatten-path new-flatten-paths)
             (treemacs--start-watching new-flatten-path :flatten)
             (ht-set! treemacs-dom new-flatten-path parent-dom-node))
           (setf (treemacs-dom-node->collapse-keys parent-dom-node) (copy-sequence (cdr new-flatten-info))))

         ;; Update text properties with new state
         (setf new-flatten-info (when (> new-flatten-info-count 0)
                                  (cons new-flatten-info-count new-flatten-info)))
         (plist-put properties :collapsed new-flatten-info)
         (plist-put properties :path created-path)

         ;; Insert new label
         (goto-char parent-btn)
         (delete-region (point) (line-end-position))
         (insert (apply #'propertize new-button-label properties))

         ;; Fixing marker probably necessary since it's also in the dom
         (goto-char (- (point) (length new-button-label)))
         (set-marker parent-btn (point))

         (if (and insert-at-end? is-file?)


             ;; TODO(2020/10/01): this reopening is used multiple tims like this
             ;; it should be abstracted properly
             (funcall (alist-get (treemacs-button-get parent-btn :state) treemacs-TAB-actions-config))
           (funcall (alist-get (treemacs-button-get parent-btn :state) treemacs-TAB-actions-config))
           (setf (treemacs-dom-node->refresh-flag parent-dom-node) nil)))))))