mirror of
https://github.com/vale981/ement.el
synced 2025-03-05 17:21:41 -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
|
(defvar-local ement-session nil
|
||||||
"Ement session for current buffer.")
|
"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")
|
(declare-function ement-view-room "ement.el")
|
||||||
(defvar ement-room-mode-map
|
(defvar ement-room-mode-map
|
||||||
(let ((map (make-sparse-keymap)))
|
(let ((map (make-sparse-keymap)))
|
||||||
|
@ -64,6 +68,7 @@
|
||||||
(define-key map (kbd "<backtab>") #'ement-room-goto-prev)
|
(define-key map (kbd "<backtab>") #'ement-room-goto-prev)
|
||||||
(define-key map (kbd "TAB") #'ement-room-goto-next)
|
(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 scroll-down-command] #'ement-room-scroll-down-command)
|
||||||
|
(define-key map [remap mwheel-scroll] #'ement-room-mwheel-scroll)
|
||||||
map)
|
map)
|
||||||
"Keymap for Ement room buffers.")
|
"Keymap for Ement room buffers.")
|
||||||
|
|
||||||
|
@ -132,7 +137,7 @@ See Info node `(elisp)Other Display Specs'."
|
||||||
(ewoc-goto-next ement-ewoc num))
|
(ewoc-goto-next ement-ewoc num))
|
||||||
|
|
||||||
(defun ement-room-scroll-down-command ()
|
(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)
|
(interactive)
|
||||||
(condition-case _err
|
(condition-case _err
|
||||||
(scroll-down nil)
|
(scroll-down nil)
|
||||||
|
@ -140,6 +145,15 @@ See Info node `(elisp)Other Display Specs'."
|
||||||
(message "Loading earlier messages...")
|
(message "Loading earlier messages...")
|
||||||
(call-interactively #'ement-room-retro))))
|
(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)
|
(defun ement-room-retro (session room number)
|
||||||
;; FIXME: Naming things is hard.
|
;; FIXME: Naming things is hard.
|
||||||
"Retrieve NUMBER older messages in ROOM on SESSION."
|
"Retrieve NUMBER older messages in ROOM on SESSION."
|
||||||
|
@ -147,14 +161,21 @@ See Info node `(elisp)Other Display Specs'."
|
||||||
(if current-prefix-arg
|
(if current-prefix-arg
|
||||||
(read-number "Number of messages: ")
|
(read-number "Number of messages: ")
|
||||||
10)))
|
10)))
|
||||||
|
(unless ement-room-retro-loading
|
||||||
(pcase-let* (((cl-struct ement-session server token) session)
|
(pcase-let* (((cl-struct ement-session server token) session)
|
||||||
((cl-struct ement-room id prev-batch) room)
|
((cl-struct ement-room id prev-batch) room)
|
||||||
(endpoint (format "rooms/%s/messages" (url-hexify-string id))))
|
(endpoint (format "rooms/%s/messages" (url-hexify-string id)))
|
||||||
|
(buffer (current-buffer)))
|
||||||
(ement-api server token endpoint
|
(ement-api server token endpoint
|
||||||
(apply-partially #'ement-room-retro-callback room)
|
(apply-partially #'ement-room-retro-callback room)
|
||||||
:params (list (list "from" prev-batch)
|
:params (list (list "from" prev-batch)
|
||||||
(list "dir" "b")
|
(list "dir" "b")
|
||||||
(list "limit" (number-to-string number))))))
|
(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")
|
(declare-function ement--make-event "ement.el")
|
||||||
(defun ement-room-retro-callback (room data)
|
(defun ement-room-retro-callback (room data)
|
||||||
|
@ -176,7 +197,8 @@ See Info node `(elisp)Other Display Specs'."
|
||||||
(with-current-buffer buffer
|
(with-current-buffer buffer
|
||||||
(cl-loop for event across chunk
|
(cl-loop for event across chunk
|
||||||
do (ement-room--insert-event event))))
|
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?
|
;; FIXME: What is the best way to do this, with ement--sync being in another file?
|
||||||
(declare-function ement--sync "ement.el")
|
(declare-function ement--sync "ement.el")
|
||||||
|
|
Loading…
Add table
Reference in a new issue