From f135292e53d81510c7d224f856468e306426f518 Mon Sep 17 00:00:00 2001 From: cage Date: Sun, 6 Sep 2020 17:28:16 +0200 Subject: [PATCH] - basics chats works. --- etc/init.lisp | 22 ++++++++++++++++++++++ src/chats-list-window.lisp | 2 +- src/keybindings.lisp | 3 +++ src/main.lisp | 2 +- src/message-window.lisp | 4 ++++ src/package.lisp | 2 ++ src/program-events.lisp | 14 +++++++++++--- src/scheduled-events.lisp | 8 ++++++-- src/ui-goodies.lisp | 5 +++-- 9 files changed, 53 insertions(+), 9 deletions(-) diff --git a/etc/init.lisp b/etc/init.lisp index 433069e..30e4d38 100644 --- a/etc/init.lisp +++ b/etc/init.lisp @@ -373,6 +373,28 @@ (define-key "C-J" #'show-chat-to-screen *chats-list-keymap*) +;; chats + +(defun write-to-chat () + (chat-loop (message-window:metadata specials:*message-window*))) + +(define-key "M-c" #'write-to-chat *chat-message-keymap*) + +(define-key "up" #'message-scroll-up *chat-message-keymap*) + +(define-key "down" #'message-scroll-down *chat-message-keymap*) + +(define-key "home" #'message-scroll-begin *chat-message-keymap*) + +(define-key "end" #'message-scroll-end *chat-message-keymap*) + +(define-key "/" #'message-search-regex *chat-message-keymap*) + +(define-key "npage" #'message-scroll-next-page *chat-message-keymap*) + +(define-key "ppage" #'message-scroll-previous-page *chat-message-keymap*) + + ;;;; hooks ;;; this hooks will skips toots with contain less than 20 words diff --git a/src/chats-list-window.lisp b/src/chats-list-window.lisp index b84ee52..ee68498 100644 --- a/src/chats-list-window.lisp +++ b/src/chats-list-window.lisp @@ -64,7 +64,7 @@ (_ "~a ~a wrote:~%~a ~a~2%") formatted-created-date username - content + (html-utils:html->text content) attachment-type)))))) (defmethod resync-rows-db ((object chats-list-window) diff --git a/src/keybindings.lisp b/src/keybindings.lisp index 96cf44b..685a505 100644 --- a/src/keybindings.lisp +++ b/src/keybindings.lisp @@ -258,6 +258,9 @@ produces a tree and graft the latter on `existing-tree'" (defparameter *chats-list-keymap* (make-starting-comand-tree) "The keymap for window that shows all the chats.") +(defparameter *chat-message-keymap* (make-starting-comand-tree) + "The keymap for message-window when shows chat.") + (defun define-key (key-sequence function &optional (existing-keymap *global-keymap*)) "Define a key sequence that trigger a function: diff --git a/src/main.lisp b/src/main.lisp index 95cce2a..5191c75 100644 --- a/src/main.lisp +++ b/src/main.lisp @@ -56,7 +56,7 @@ etc.) happened" (declare (ignore w e)) (incf-dt) (incf-ticks) - ;(scheduled-events:run-scheduled-events *ticks*) + (scheduled-events:run-scheduled-events *ticks*) (program-events:dispatch-program-events) (windows:calculate-all +dt+))))) diff --git a/src/message-window.lisp b/src/message-window.lisp index 1c4ae30..3973f4a 100644 --- a/src/message-window.lisp +++ b/src/message-window.lisp @@ -37,6 +37,10 @@ (eq (keybindings window) keybindings:*gemini-message-keymap*)) +(defun display-chat-p (window) + (eq (keybindings window) + keybindings:*chat-message-keymap*)) + (defun prepare-for-display-status-mode (window) (setf (keybindings window) keybindings:*message-keymap*)) diff --git a/src/package.lisp b/src/package.lisp index 9187b17..5b8069e 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -1388,6 +1388,7 @@ :*open-gemini-link-keymap* :*gemini-downloads-keymap* :*chats-list-keymap* + :*chat-message-keymap* :define-key :init-keyboard-mapping :find-keymap-node @@ -1761,6 +1762,7 @@ :source-text :metadata :display-gemini-text-p + :display-chat-p :prepare-for-display-status-mode :append-source-text :scroll-down diff --git a/src/program-events.lisp b/src/program-events.lisp index 3c44d8b..0dc5b81 100644 --- a/src/program-events.lisp +++ b/src/program-events.lisp @@ -68,6 +68,10 @@ (defgeneric process-event (object)) +#+debug +(defmethod process-event :before (object) + (misc:dbg "processing event ~a" object)) + (defgeneric reinitialize-id (object)) (defmacro wrapped-in-lock ((queue) &body body) @@ -1016,9 +1020,9 @@ (dolist (chat all-chats) (let* ((chat-id (db:row-id chat)) (min-id (db:last-chat-message-id chat-id))) - (program-events:push-event (make-instance 'program-events:get-chat-messages-event - :chat-id chat-id - :min-message-id min-id)))))) + (process-event (make-instance 'program-events:get-chat-messages-event + :chat-id chat-id + :min-message-id min-id)))))) (defclass chat-show-event (program-event) ((chat @@ -1030,9 +1034,13 @@ (with-accessors ((chat chat)) object (let* ((chat-id (db:row-id chat))) (db:mark-all-chat-messages-read chat-id) + (setf (windows:keybindings specials:*message-window*) + keybindings:*chat-message-keymap*) (setf (message-window:source-text specials:*message-window*) (chats-list-window:chat->text chat)) (message-window:scroll-end specials:*message-window*) + (setf (message-window:metadata specials:*message-window*) + chat) (windows:draw specials:*message-window*)))) (defclass chat-post-message-event (program-event) diff --git a/src/scheduled-events.lisp b/src/scheduled-events.lisp index 4c20d49..ae093b9 100644 --- a/src/scheduled-events.lisp +++ b/src/scheduled-events.lisp @@ -19,7 +19,7 @@ (define-constant +refresh-all-chats-data-frequency+ 10000 :test #'=) -(define-constant +refresh-all-chats-messages-frequency+ 1000 :test #'=) +(define-constant +refresh-all-chats-messages-frequency+ 50 :test #'=) (defun triggedp (ticks frequency) (= (rem ticks frequency) @@ -37,7 +37,11 @@ (gen-scheduler-function (refresh-refresh-all-chats-messages +refresh-all-chats-messages-frequency+) - (ui:update-all-chats-messages)) + (ui:update-all-chats-messages) + (when (message-window:display-chat-p *message-window*) + (let ((show-event (make-instance 'program-events:chat-show-event + :chat (message-window:metadata *message-window*)))) + (program-events:push-event show-event)))) (defun run-scheduled-events (ticks) (refresh-refresh-all-chats-messages ticks) diff --git a/src/ui-goodies.lisp b/src/ui-goodies.lisp index d43de65..1d45e2f 100644 --- a/src/ui-goodies.lisp +++ b/src/ui-goodies.lisp @@ -1444,6 +1444,7 @@ mot recent updated to least recent" (chat-loop chat))) (defun chat-loop (chat) + "Start writing to chat" (labels ((post-message (message) (let ((event (make-instance 'program-events:chat-post-message-event :priority +maximum-event-priority+ @@ -1456,8 +1457,8 @@ mot recent updated to least recent" (post-message message) (update-all-chats-messages) (let ((show-event (make-instance 'program-events:chat-show-event - :priority +minimum-event-priority+ - :chat chat))) + :priority +minimum-event-priority+ + :chat chat))) (push-event show-event) (%loop)))) (ask-fn ()