Add: (ement-room-list) Direct column

This commit is contained in:
Adam Porter 2021-07-28 23:22:03 -05:00
parent 77613a34a3
commit 1bebb8f02f
2 changed files with 26 additions and 9 deletions

View file

@ -110,10 +110,12 @@ call `pop-to-buffer'."
"Ement room list"
:group 'ement
(setf tabulated-list-format (vector ;; '("U" 1 t) '("🐱" 4 t)
'("D" 1 t) ; Direct
'("Name" 25 t) '("Topic" 35 t)
'("Latest" 20 ement-room-list-latest<)
'("Members" 7 ement-room-list-members<)
;; '("D" 1 t) '("P" 1 t) '("Tags" 15 t)
;; '("P" 1 t) '("Tags" 15 t)
'("Session" 15 t))
tabulated-list-sort-key '("Latest" . t))
(add-hook 'tabulated-list-revert-hook #'ement-room-list--set-entries nil 'local)
@ -126,7 +128,7 @@ call `pop-to-buffer'."
(interactive "e")
(mouse-set-point event)
(pcase-let* ((room (tabulated-list-get-id))
(`[,_name ,_topic ,_latest ,_members ,user-id]
(`[,_direct ,_name ,_topic ,_latest ,_members ,user-id]
(tabulated-list-get-entry))
(session (cl-loop for session in ement-sessions
when (equal user-id (ement-user-id (ement-session-user session)))
@ -196,14 +198,17 @@ call `pop-to-buffer'."
(e-session (propertize (ement-user-id (ement-session-user session))
'value session))
;; ((e-tags favorite-p low-priority-p) (ement-room-list--tags room))
;; (e-direct-p (if (matrix-room-direct-p id session) "D" ""))
(e-direct-p (if (ement-room--direct-p room session)
(propertize "D" 'help-echo "Direct room")
""))
;; (e-priority (cond (favorite-p "F")
;; (low-priority-p "l")
;; ("N")))
(e-members (number-to-string member-count)))
(list room (vector ;; e-unread
(list room (vector ;; e-unread
e-direct-p
e-name e-topic e-latest e-members
;; e-direct-p e-priority e-tags
;; e-priority e-tags
e-session
;; e-avatar
))))
@ -213,15 +218,15 @@ call `pop-to-buffer'."
(defun ement-room-list-members< (a b)
"Return non-nil if entry A has fewer members than room B.
A and B should be entries from `tabulated-list-mode'."
(pcase-let* ((`(,_room [,_name-for-list ,_topic ,_latest ,a-members ,_session]) a)
(`(,_room [,_name-for-list ,_topic ,_latest ,b-members ,_session]) b))
(pcase-let* ((`(,_room [,_direct ,_name-for-list ,_topic ,_latest ,a-members ,_session]) a)
(`(,_room [,_direct ,_name-for-list ,_topic ,_latest ,b-members ,_session]) b))
(< (string-to-number a-members) (string-to-number b-members))))
(defun ement-room-list-latest< (a b)
"Return non-nil if entry A has fewer members than room B.
A and B should be entries from `tabulated-list-mode'."
(pcase-let* ((`(,_room [,_name-for-list ,_topic ,a-latest ,_a-members ,_session]) a)
(`(,_room [,_name-for-list ,_topic ,b-latest ,_b-members ,_session]) b))
(pcase-let* ((`(,_room-a [,_direct ,_name-for-list ,_topic ,a-latest ,_a-members ,_session]) a)
(`(,_room-b [,_direct ,_name-for-list ,_topic ,b-latest ,_b-members ,_session]) b))
(< (get-text-property 0 'value a-latest)
(get-text-property 0 'value b-latest))))

View file

@ -718,6 +718,18 @@ DATA is an unsent message event's data alist."
;;;; Functions
(defun ement-room--direct-p (room session)
"Return non-nil if ROOM on SESSION is a direct chat."
(cl-labels ((content-contains-room-id
(content room-id) (cl-loop for (_user-id . room-ids) in content
;; NOTE: room-ids is a vector.
thereis (seq-contains room-ids room-id))))
(pcase-let* (((cl-struct ement-session account-data) session)
((cl-struct ement-room id) room))
(cl-loop for event in account-data
when (equal "m.direct" (alist-get 'type event))
thereis (content-contains-room-id (alist-get 'content event) id)))))
(define-derived-mode ement-room-mode fundamental-mode "Ement Room"
"Major mode for Ement room buffers.
This mode initializes a buffer to be used for showing events in