From 84a8029c9a24eef6731559a759cdbcd25dd73d03 Mon Sep 17 00:00:00 2001 From: cage Date: Sun, 11 Apr 2021 11:06:39 +0200 Subject: [PATCH] - specialized message-window' to skip invisible rows. --- modules/rewrite-message-urls.lisp | 2 +- src/message-window.lisp | 60 +++++++++++++++++-------------- src/package.lisp | 7 ++-- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/modules/rewrite-message-urls.lisp b/modules/rewrite-message-urls.lisp index 1440257..9ca601e 100644 --- a/modules/rewrite-message-urls.lisp +++ b/modules/rewrite-message-urls.lisp @@ -58,7 +58,7 @@ So the whole list is like: '((\"foo\" \"bar\") (\"old\" \"new\") ...)") (defun %rewriting-link-rewrite-row (links-mapping) (lambda (row) - (let* ((original-type (message-window:line-get-original-object row)) + (let* ((original-type (message-window:row-get-original-object row)) (original-string (line-oriented-window:normal-text row)) (skipped-row-types (list 'gemini-parser:pre-line 'gemini-parser:vertical-space))) diff --git a/src/message-window.lisp b/src/message-window.lisp index 84ef7fa..730cd00 100644 --- a/src/message-window.lisp +++ b/src/message-window.lisp @@ -83,6 +83,9 @@ for y from 1 below (win-height-no-border window) do (cond + ;; testing invisibility should never returns true as + ;; the method `row' is specialized on message-window + ;; and always removes from the rows the invible ones. ((invisible-row-p line) (decf y)) ((not (vspace-row-p line)) @@ -128,14 +131,16 @@ (defgeneric text->rendered-lines-rows (window text)) -(defun line-add-original-object (line original-object) +(defgeneric colorize-lines (object)) + +(defun row-add-original-object (line original-object) (push original-object (fields line)) (push :original-object (fields line)) line) -(defun line-get-original-object (line) +(defun row-get-original-object (line) (getf (fields line) :original-object)) (defun make-render-vspace-row (&optional (original-object @@ -143,28 +148,40 @@ (let ((res (make-instance 'line :normal-text (make-tui-string (format nil "~%")) :fields (list :vertical-space 1)))) - (line-add-original-object res original-object) - res)) ; even if line-add-original-object returns the modified line explicit returns for clarity + (row-add-original-object res original-object) + res)) ; even if row-add-original-object returns the modified line explicit returns for clarity (defun vspace-row-p (row) (getf (fields row) :vertical-space)) -(defun make-invisible-row () - (make-instance 'line - :fields (list :invisible t) - :normal-text (make-tui-string ""))) +(defun make-invisible-row (original-object &optional (text "")) + (let ((res (make-instance 'line + :fields (list :invisible t) + :normal-text (make-tui-string text)))) + (row-add-original-object res original-object) + res)) ; even if row-add-original-object returns the modified line explicit returns for clarity (defun invisible-row-p (row) (getf (fields row) :invisible)) +(defun set-row-visible (row) + (with-accessors ((fields fields)) row + (when (not (invisible-row-p row)) + (push t fields) + (push :invisible fields)) + row)) + +(defun set-row-invisible (row) + (setf (fields row) (remove-from-plist (fields row) :inivisible))) + (defmethod text->rendered-lines-rows (window (text gemini-parser:vertical-space)) (make-render-vspace-row text)) (defmethod text->rendered-lines-rows (window (text gemini-parser:pre-start)) - (make-invisible-row)) + (make-invisible-row text (gemini-parser:alt-text text))) (defmethod text->rendered-lines-rows (window (text gemini-parser:pre-end)) - (make-invisible-row)) + (make-invisible-row text)) (defmethod text->rendered-lines-rows (window (text gemini-parser:pre-line)) (let ((res (make-instance 'line @@ -173,8 +190,8 @@ (text->rendered-lines-rows window (gemini-parser:lines text))) :fields (list :alt-text (gemini-parser:alt-text text) :group-id (gemini-parser:group-id text))))) - (line-add-original-object res text) - res)) ; even if line-add-original-object returns the modified line explicit returns for clarity + (row-add-original-object res text) + res)) ; even if row-add-original-object returns the modified line explicit returns for clarity (defmethod text->rendered-lines-rows (window (text list)) (flatten (loop for i in text @@ -216,24 +233,15 @@ :normal-text text-line))) new-rows)))) -;; (defmethod text->rendered-lines-rows (window (text null)) -;; (make-render-vspace-row)) +(defun remove-invisible-rows (rows) + (remove-if #'invisible-row-p rows)) (defmethod text->rendered-lines-rows (window (text line)) text) -(defmethod update-all-rows :around ((object message-window) (new-rows sequence)) - (let ((actual-rows (remove-if #'invisible-row-p new-rows))) - (call-next-method object actual-rows))) - -(defmethod append-new-rows :around ((object message-window) (new-rows sequence)) - (let ((new-rows (loop for new-row in new-rows - when (not (invisible-row-p new-row)) - collect - new-row))) - (call-next-method object new-rows))) - -(defgeneric colorize-lines (object)) +(defmethod rows ((object message-window)) + (with-slots (rows) object + (remove-invisible-rows rows))) (defmethod colorize-lines ((object line)) object) diff --git a/src/package.lisp b/src/package.lisp index b83d05c..98746f9 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -1803,7 +1803,7 @@ :row-oriented-widget :single-row-height :top-row-padding - ;;:rows + :rows :row-selected-index :y-current-row :top-rows-slice @@ -1934,7 +1934,10 @@ :gemini-window-p :display-gemini-text-p :display-chat-p - :line-get-original-object + :row-get-original-object + :invisible-row-p + :set-row-visible + :set-row-invisible :text->rendered-lines-rows :prepare-for-display-status-mode :prepare-for-rendering