5 Stimmen

Ändern Sie den Text des Baumnavigationsknotens

Ich habe ein Stück Code geschrieben, das ein Baum-Widget erstellt:

(require 'tree-widget)

(defun my-create-tree-widget ()
  (interactive)
  (with-current-buffer 
    (get-buffer-create "*my-tree-widget*")
    (setq-local my-tree-widget
        (widget-create
         'tree-widget
         :open t
         :tag "one"
         :args
         (list (widget-convert
            'tree-widget
            :tag "two"
            :args (mapcar 
                    (apply-partially #'widget-convert 'item)
                    '("three" "four"))))))
    (switch-to-buffer (current-buffer))))

Das resultierende Baum-Widget sieht folgendermaßen aus, wobei die :tag-Argumente zu den Beschriftungen der Knoten werden:

[-] one
 `-[+] two

Jetzt möchte ich die Beschriftungen aus meinem Programm ändern, aber das Setzen des Werts von :tag mit widget-put ändert nichts im Puffer. Wie kann ich das erreichen?

4voto

legoscia Punkte 38918

Aus irgendeinem Grund wird das Etikett eines Baum-Widget-Knotens als erstes Element in der :children-Eigenschaft gespeichert, daher müssen Sie diesen Wert abrufen und die :tag-Eigenschaft ändern, nicht die :tag-Eigenschaft des Baum-Widgets selbst.

Nachdem Sie die :tag-Eigenschaft geändert haben, müssen Sie das Widget zur Aktualisierung zwingen. Dies können Sie mit widget-value-set tun. Da Sie den Wert nicht tatsächlich ändern möchten, weisen Sie einfach wieder denselben Wert zu; dies führt immer noch dazu, dass das Widget neu gezeichnet wird.

Zum Beispiel, um den Top-Level-Knoten zu aktualisieren:

(defun mein-baum-widget-erstes-level-aendern ()
  (interaktiv)
  (let ((knoten (car (widget-get mein-baum-widget :children))))
    (widget-put knoten :tag (format-time-string "%T"))
    ;; Neu zeichnen
    (widget-value-set knoten (widget-value knoten))))

Dies führt zu:

[-] 12:39:19
 `-[+] two

Um einen untergeordneten Knoten zu aktualisieren, graben Sie einfach mit der :children-Eigenschaft weiter, wobei Sie daran denken, dass das erste "Kind"-Element streng genommen kein Kind ist:

(defun mein-baum-widget-zweites-level-aendern ()
  (interaktiv)
  (let ((zweites-level (cadr (widget-get mein-baum-widget :children))))
    (unless (tree-widget-p zweites-level)
      (error "Dies ist nicht das Baum-Widget"))
    (let ((knoten (car (widget-get zweites-level :children))))
      (widget-put knoten :tag (format-time-string "%T"))
      ;; Neu zeichnen
      (widget-value-set knoten (widget-value knoten)))))

Mit diesem endgültigen Ergebnis:

[-] 12:39:19
 `-[+] 12:40:41

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X