From 6135cc5c028fd3b81e26f63dd3208fd31a5ce213 Mon Sep 17 00:00:00 2001 From: cage Date: Sun, 6 Sep 2020 11:18:49 +0200 Subject: [PATCH] - fixed 'line-oriented-window:row-move' must return always a number (0), not nil, when no movement occurs; - fixed vertical scrolling boundaries of messages window. --- src/line-oriented-window.lisp | 25 +++++++++++++------------ src/message-window.lisp | 28 +++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/line-oriented-window.lisp b/src/line-oriented-window.lisp index cf09e7e..9ca3ee2 100644 --- a/src/line-oriented-window.lisp +++ b/src/line-oriented-window.lisp @@ -221,18 +221,19 @@ actual of rows moved. This can be different from `amount' if moving this exact quantity wold go beyond the length or fows or zero." (with-accessors ((rows rows) (row-selected-index row-selected-index)) object - (when (/= 0 amount) - (let* ((desired-amount (+ amount row-selected-index)) - (actual-amount (if (< amount 0) - (max (- desired-amount - row-selected-index) - (- row-selected-index)) - (- (min desired-amount - (1- (length rows))) - row-selected-index)))) - (select-row object (+ row-selected-index - actual-amount)) - actual-amount)))) + (if (/= 0 amount) + (let* ((desired-amount (+ amount row-selected-index)) + (actual-amount (if (< amount 0) + (max (- desired-amount + row-selected-index) + (- row-selected-index)) + (- (min desired-amount + (1- (length rows))) + row-selected-index)))) + (select-row object (+ row-selected-index + actual-amount)) + actual-amount) + 0))) (defclass simple-line-navigation-window (wrapper-window row-oriented-widget border-window) ((selected-line-bg diff --git a/src/message-window.lisp b/src/message-window.lisp index ed6b646..0a55800 100644 --- a/src/message-window.lisp +++ b/src/message-window.lisp @@ -166,9 +166,26 @@ (when prepare-for-rendering (prepare-for-rendering object :jump-to-first-row jump-to-first-row)))) +(defun offset-to-move-end (win) + (with-accessors ((rows rows) + (row-selected-index row-selected-index)) win + (let ((win-height (win-height-no-border win))) + (- (- (length rows) + (- win-height 1)) + row-selected-index)))) + +(defun scroll-end-reached-p (win) + (with-accessors ((rows rows) + (row-selected-index row-selected-index)) win + (let* ((win-height (win-height-no-border win)) + (rows-left (- (length rows) row-selected-index))) + (< rows-left + win-height)))) + (defmethod scroll-down ((object message-window) &optional (amount 1)) - (when (/= (row-move object amount) - 0) + (when (not (or (scroll-end-reached-p object) + (= (row-move object amount) + 0))) (draw object))) (defmethod scroll-up ((object message-window) &optional (amount 1)) @@ -179,9 +196,10 @@ (defmethod scroll-end ((object message-window)) (with-accessors ((rows rows) (row-selected-index row-selected-index)) object - (when (/= (row-move object (- (length rows) row-selected-index)) - 0) - (draw object)))) + (let ((offset (offset-to-move-end object))) + (when (/= (row-move object offset) + 0) + (draw object))))) (defmethod scroll-begin ((object message-window)) (with-accessors ((rows rows)