From 1bebb8f02fa19798d70c556a97bd3d3471eb17f9 Mon Sep 17 00:00:00 2001 From: Adam Porter Date: Wed, 28 Jul 2021 23:22:03 -0500 Subject: [PATCH] Add: (ement-room-list) Direct column --- ement-room-list.el | 23 ++++++++++++++--------- ement-room.el | 12 ++++++++++++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/ement-room-list.el b/ement-room-list.el index 72d8aa3..4193107 100644 --- a/ement-room-list.el +++ b/ement-room-list.el @@ -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)))) diff --git a/ement-room.el b/ement-room.el index fe9ed72..1d40f94 100644 --- a/ement-room.el +++ b/ement-room.el @@ -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