mirror of
https://github.com/vale981/ement.el
synced 2025-03-04 17:01:39 -05:00
Wheel loading
This commit is contained in:
parent
1212252175
commit
c675ede327
1 changed files with 35 additions and 13 deletions
|
@ -53,6 +53,10 @@
|
|||
(defvar-local ement-session nil
|
||||
"Ement session for current buffer.")
|
||||
|
||||
(defvar-local ement-room-retro-loading nil
|
||||
"Non-nil when earlier messages are being loaded.
|
||||
Used to avoid overlapping requests.")
|
||||
|
||||
(declare-function ement-view-room "ement.el")
|
||||
(defvar ement-room-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
|
@ -64,6 +68,7 @@
|
|||
(define-key map (kbd "<backtab>") #'ement-room-goto-prev)
|
||||
(define-key map (kbd "TAB") #'ement-room-goto-next)
|
||||
(define-key map [remap scroll-down-command] #'ement-room-scroll-down-command)
|
||||
(define-key map [remap mwheel-scroll] #'ement-room-mwheel-scroll)
|
||||
map)
|
||||
"Keymap for Ement room buffers.")
|
||||
|
||||
|
@ -132,7 +137,7 @@ See Info node `(elisp)Other Display Specs'."
|
|||
(ewoc-goto-next ement-ewoc num))
|
||||
|
||||
(defun ement-room-scroll-down-command ()
|
||||
"Scroll down, and load NUMBER older messages when at top."
|
||||
"Scroll down, and load NUMBER earlier messages when at top."
|
||||
(interactive)
|
||||
(condition-case _err
|
||||
(scroll-down nil)
|
||||
|
@ -140,21 +145,37 @@ See Info node `(elisp)Other Display Specs'."
|
|||
(message "Loading earlier messages...")
|
||||
(call-interactively #'ement-room-retro))))
|
||||
|
||||
(defun ement-room-mwheel-scroll (event)
|
||||
"Scroll according to EVENT, loading earlier messages when at top."
|
||||
(interactive "e")
|
||||
(condition-case _err
|
||||
(mwheel-scroll event)
|
||||
(beginning-of-buffer
|
||||
(message "Loading earlier messages...")
|
||||
(call-interactively #'ement-room-retro))))
|
||||
|
||||
(defun ement-room-retro (session room number)
|
||||
;; FIXME: Naming things is hard.
|
||||
"Retrieve NUMBER older messages in ROOM on SESSION."
|
||||
(interactive (list ement-session ement-room
|
||||
(if current-prefix-arg
|
||||
(read-number "Number of messages: ")
|
||||
10)))
|
||||
(pcase-let* (((cl-struct ement-session server token) session)
|
||||
((cl-struct ement-room id prev-batch) room)
|
||||
(endpoint (format "rooms/%s/messages" (url-hexify-string id))))
|
||||
(ement-api server token endpoint
|
||||
(apply-partially #'ement-room-retro-callback room)
|
||||
:params (list (list "from" prev-batch)
|
||||
(list "dir" "b")
|
||||
(list "limit" (number-to-string number))))))
|
||||
(if current-prefix-arg
|
||||
(read-number "Number of messages: ")
|
||||
10)))
|
||||
(unless ement-room-retro-loading
|
||||
(pcase-let* (((cl-struct ement-session server token) session)
|
||||
((cl-struct ement-room id prev-batch) room)
|
||||
(endpoint (format "rooms/%s/messages" (url-hexify-string id)))
|
||||
(buffer (current-buffer)))
|
||||
(ement-api server token endpoint
|
||||
(apply-partially #'ement-room-retro-callback room)
|
||||
:params (list (list "from" prev-batch)
|
||||
(list "dir" "b")
|
||||
(list "limit" (number-to-string number)))
|
||||
:else (lambda (&rest args)
|
||||
(with-current-buffer buffer
|
||||
(setf ement-room-retro-loading nil)
|
||||
(apply #'ement-api-error args))))
|
||||
(setf ement-room-retro-loading t))))
|
||||
|
||||
(declare-function ement--make-event "ement.el")
|
||||
(defun ement-room-retro-callback (room data)
|
||||
|
@ -176,7 +197,8 @@ See Info node `(elisp)Other Display Specs'."
|
|||
(with-current-buffer buffer
|
||||
(cl-loop for event across chunk
|
||||
do (ement-room--insert-event event))))
|
||||
(setf (ement-room-prev-batch room) end)))
|
||||
(setf (ement-room-prev-batch room) end
|
||||
ement-room-retro-loading nil)))
|
||||
|
||||
;; FIXME: What is the best way to do this, with ement--sync being in another file?
|
||||
(declare-function ement--sync "ement.el")
|
||||
|
|
Loading…
Add table
Reference in a new issue