dotfiles/emacs/.emacs.d/elpa/forge-20260815.1911/forge-tablist.el

95 lines
3.7 KiB
EmacsLisp

;;; forge-tablist.el --- Tabulated-list interface -*- lexical-binding:t -*-
;; Copyright (C) 2018-2026 Jonas Bernoulli
;; Author: Jonas Bernoulli <emacs.forge@jonas.bernoulli.dev>
;; Maintainer: Jonas Bernoulli <emacs.forge@jonas.bernoulli.dev>
;; SPDX-License-Identifier: GPL-3.0-or-later
;; This file is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published
;; by the Free Software Foundation, either version 3 of the License,
;; or (at your option) any later version.
;;
;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this file. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
(require 'tabulated-list)
(require 'forge)
(defconst forge--tablist-columns-type
'(repeat
(list :tag "Column"
(string :tag "Header Label")
(choice :tag "Value source"
function
(symbol :tag "Object slot"))
(integer :tag "Column Width")
(choice :tag "Sort predicate"
(const :tag "Don't sort" nil)
(const :tag "Default" t)
function)
(plist :tag "Properties"
:key-type (choice :tag "Property"
(const :right-align)
(const :pad-right)
symbol)
:value-type (sexp :tag "Value")))))
(defvar-local forge--tabulated-list-columns nil)
(put 'forge--tabulated-list-columns 'permanent-local t)
(defvar-local forge--tabulated-list-query nil)
(put 'forge--tabulated-list-query 'permanent-local t)
(defun forge--tablist-refresh ()
(setq tabulated-list-format
(vconcat (mapcar (pcase-lambda (`(,name ,_get ,width ,sort ,props))
`(,name ,width ,sort . ,props))
forge--tabulated-list-columns)))
(tabulated-list-init-header)
(setq tabulated-list-entries
(mapcar
(lambda (obj)
(list (oref obj id)
(vconcat
(mapcar (pcase-lambda (`(,_name ,get ,_width ,_sort ,_props))
(let ((val (cond
((functionp get)
(funcall get obj))
((eq (car-safe get) 'repository)
(eieio-oref (forge-get-repository obj)
(cadr get)))
((eieio-oref obj get)))))
(cond ((stringp val) val)
((null val) "")
((format "%s" val)))))
forge--tabulated-list-columns))))
(funcall forge--tabulated-list-query))))
;;; _
;; Local Variables:
;; read-symbol-shorthands: (
;; ("and$" . "cond-let--and$")
;; ("thread$" . "cond-let--thread$")
;; ("when$" . "cond-let--when$")
;; ("and-let*" . "cond-let--and-let*")
;; ("and-let" . "cond-let--and-let")
;; ("if-let*" . "cond-let--if-let*")
;; ("if-let" . "cond-let--if-let")
;; ("when-let*" . "cond-let--when-let*")
;; ("when-let" . "cond-let--when-let")
;; ("while-let*" . "cond-let--while-let*")
;; ("while-let" . "cond-let--while-let"))
;; End:
(provide 'forge-tablist)
;;; forge-tablist.el ends here