From 4fdf0ddf37399eb2b8c75639c7f8ff40897e45b6 Mon Sep 17 00:00:00 2001 From: Adam Porter Date: Thu, 22 Jul 2021 10:30:28 -0500 Subject: [PATCH] WIP: Key face, and fix help-echo Remaining issue is that reactions still insert empty events in the buffer. --- ement-room.el | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/ement-room.el b/ement-room.el index 7dd5def..32289fd 100644 --- a/ement-room.el +++ b/ement-room.el @@ -193,7 +193,14 @@ See Info node `(elisp)Specified Space'." (defface ement-room-reactions '((t (:inherit font-lock-comment-face :height 0.9))) - "Reactions to messages.") + "Reactions to messages (including the user count).") + +(defface ement-room-reactions-key + '((t (:inherit ement-room-reactions :height 1.5))) + "Reactions to messages (the key, i.e. the emoji part). +Uses a separate face to allow the key to be shown at a different +size, because in some fonts, emojis are too small relative to +normal text.") (defface ement-room-timestamp '((t (:inherit font-lock-comment-face))) @@ -821,20 +828,31 @@ seconds." (propertize " " 'display ement-room-event-separator-display-property))) + + (defun ement-room--format-reactions (event) "Return formatted reactions to EVENT." + ;; TODO: Like other events, pop to a buffer showing the raw reaction events when a key is pressed. (if-let ((reactions (map-elt (ement-event-local event) 'reactions))) - (cl-labels ((format-key-senders - (ks) (pcase-let ((`(,key . ,senders) ks)) - (propertize (format "%s (%s)" key (length senders)) - 'help-echo (string-join senders ", "))))) + (cl-labels ((format-reaction + (ks) (pcase-let* ((`(,key . ,senders) ks) + (key (propertize key 'face 'ement-room-reactions-key)) + (count (propertize (format "(%s)" (length senders)) + 'face 'ement-room-reactions))) + (propertize (concat key " " count) + 'help-echo (lambda (_window buffer _pos) + (senders-names senders (buffer-local-value 'ement-room buffer)))))) + (senders-names + (senders room) (cl-loop for sender in senders + collect (ement-room--user-display-name sender room) + into names + finally return (string-join names ", ")))) (cl-loop with keys-senders for reaction in reactions for key = (map-nested-elt (ement-event-content reaction) '(m.relates_to key)) - for sender-name = (ement-room--user-display-name (ement-event-sender reaction) ement-room) - do (push sender-name (alist-get key keys-senders nil nil #'string=)) - finally return (propertize (concat "\n " (string-join (mapcar #'format-key-senders keys-senders) " ")) - 'face 'ement-room-reactions))) + for sender = (ement-event-sender reaction) + do (push sender (alist-get key keys-senders nil nil #'string=)) + finally return (concat "\n " (string-join (mapcar #'format-reaction keys-senders) " ")))) "")) (cl-defun ement-room--format-message (event &optional (format ement-room-message-format-spec))