Add column sorting order indicators to vtable

* lisp/emacs-lisp/vtable.el (vtable--indicator): New function.
(vtable--insert-header-line): Use it to display sorting order
indicators.
This commit is contained in:
Lars Ingebrigtsen 2022-02-19 14:21:10 +01:00
parent babfb064c4
commit d98b6fbba2
2 changed files with 29 additions and 11 deletions

View file

@ -474,21 +474,41 @@ This also updates the displayed table."
(when (eq direction 'descend)
(setcar cache (nreverse (car cache)))))))
(defun vtable--indicator (table index)
(let ((order (car (last (vtable-sort-by table)))))
(if (eq index (car order))
;; We're sorting by this column last, so return an indicator.
(catch 'found
(dolist (candidate (nth (if (eq (cdr order) 'ascend)
1
0)
'((?▼ ?v)
(?▲ ?^))))
(when (char-displayable-p candidate)
(throw 'found (string candidate)))))
"")))
(defun vtable--insert-header-line (table widths spacer)
;; Insert the header directly into the buffer.
(let ((start (point)))
(let* ((start (point)))
(seq-do-indexed
(lambda (column index)
(let ((name (propertize
(vtable-column-name column)
'face (list 'header-line (vtable-face table))))
(start (point))
displayed)
(let* ((name (propertize
(vtable-column-name column)
'face (list 'header-line (vtable-face table))))
(start (point))
(indicator (vtable--indicator table index))
(indicator-width (string-pixel-width indicator))
displayed)
(insert
(setq displayed
(if (> (string-pixel-width name) (elt widths index))
(vtable--limit-string name (elt widths index))
name))
(concat
(if (> (string-pixel-width name)
(- (elt widths index) indicator-width))
(vtable--limit-string
name (- (elt widths index) indicator-width))
name)
indicator))
(propertize " " 'display
(list 'space :width
(list (+ (- (elt widths index)