From f861681faef595d3dd6a9d77515b8fdfba72c298 Mon Sep 17 00:00:00 2001 From: slook <88614182+slook@users.noreply.github.com> Date: Mon, 22 Dec 2025 20:00:54 +0000 Subject: [PATCH] fix(scrollbar): show in small viewport (#515) Co-authored-by: Pier CeccoPierangioliEugenio --- .../TermTk/TTkAbstract/abstractscrollarea.py | 12 +++++------- libs/pyTermTk/TermTk/TTkCore/canvas.py | 5 ++--- libs/pyTermTk/TermTk/TTkWidgets/scrollbar.py | 9 ++------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/libs/pyTermTk/TermTk/TTkAbstract/abstractscrollarea.py b/libs/pyTermTk/TermTk/TTkAbstract/abstractscrollarea.py index f5e55b70..a2a285a5 100644 --- a/libs/pyTermTk/TermTk/TTkAbstract/abstractscrollarea.py +++ b/libs/pyTermTk/TermTk/TTkAbstract/abstractscrollarea.py @@ -106,7 +106,7 @@ class TTkAbstractScrollArea(TTkContainer): @pyTTkSlot() def _viewportChanged(self) -> None: ''' Internal slot to handle viewport changes and update scroll bar ranges and visibility ''' - if not self._viewport or not self.isVisible(): return + if self._processing or not self._viewport or not self.isVisible(): return w,h = self.size() fw, fh = self._viewport.viewFullAreaSize() dw, dh = self._viewport.viewDisplayedSize() @@ -126,10 +126,9 @@ class TTkAbstractScrollArea(TTkContainer): self._horizontalScrollBar.setValue(ox) if self._verticalScrollBarPolicy == TTkK.ScrollBarAsNeeded: - if h<=4 or w<=1 or vrange<=0: + if w<=self._verticalScrollBar.minimumWidth() or vrange<=0: self._verticalScrollBar.hide() - elif dh>self._verticalScrollBar.minimumHeight()+1: - # we need enough space to display the bar to avoid endless loop + elif dh>=self._verticalScrollBar.minimumHeight(): self._verticalScrollBar.show() elif self._verticalScrollBarPolicy == TTkK.ScrollBarAlwaysOn: self._verticalScrollBar.show() @@ -137,10 +136,9 @@ class TTkAbstractScrollArea(TTkContainer): self._verticalScrollBar.hide() if self._horizontalScrollBarPolicy == TTkK.ScrollBarAsNeeded: - if w<=4 or h<=1 or hrange<=0: + if h<=self._horizontalScrollBar.minimumHeight() or hrange<=0: self._horizontalScrollBar.hide() - elif dw>self._horizontalScrollBar.minimumWidth()+1: - # we need enough space to display the bar to avoid endless loop + elif dw>=self._horizontalScrollBar.minimumWidth(): self._horizontalScrollBar.show() elif self._horizontalScrollBarPolicy == TTkK.ScrollBarAlwaysOn: self._horizontalScrollBar.show() diff --git a/libs/pyTermTk/TermTk/TTkCore/canvas.py b/libs/pyTermTk/TermTk/TTkCore/canvas.py index acfc0603..4f42744e 100644 --- a/libs/pyTermTk/TermTk/TTkCore/canvas.py +++ b/libs/pyTermTk/TermTk/TTkCore/canvas.py @@ -390,16 +390,15 @@ class TTkCanvas(): self._set(y,x+i, TTkCfg.theme.hscroll[1], color) for i in range(f,t): # Slider self._set(y,x+i, TTkCfg.theme.hscroll[2], color) - self._set(y,x, TTkCfg.theme.hscroll[0], color) # Left Arrow self._set(y,x+size-1, TTkCfg.theme.hscroll[3], color) # Right Arrow + self._set(y,x, TTkCfg.theme.hscroll[0], color) # Left Arrow else: for i in range(y+1,y+size-1): # V line self._set(y+i,x, TTkCfg.theme.vscroll[1], color) for i in range(f,t): # Slider self._set(y+i,x, TTkCfg.theme.vscroll[2], color) - self._set(y,x, TTkCfg.theme.vscroll[0], color) # Up Arrow self._set(y+size-1,x, TTkCfg.theme.vscroll[3], color) # Down Arrow - pass + self._set(y,x, TTkCfg.theme.vscroll[0], color) # Up Arrow def drawTabMenuButton( self, pos, size, text, slim=False, diff --git a/libs/pyTermTk/TermTk/TTkWidgets/scrollbar.py b/libs/pyTermTk/TermTk/TTkWidgets/scrollbar.py index 3362bf48..33ed4425 100644 --- a/libs/pyTermTk/TermTk/TTkWidgets/scrollbar.py +++ b/libs/pyTermTk/TermTk/TTkWidgets/scrollbar.py @@ -84,12 +84,7 @@ class TTkScrollBar(TTkWidget): TTkWidget.__init__(self, **kwargs) - if self._orientation == TTkK.VERTICAL: - self.setMaximumWidth(1) - self.setMinimumSize(1,3) - else: - self.setMaximumHeight(1) - self.setMinimumSize(3,1) + self.setMinimumSize(1,1) self.setFocusPolicy(TTkK.ClickFocus) def orientation(self): @@ -181,7 +176,7 @@ class TTkScrollBar(TTkWidget): size2 = size-2 asciiStep = self._screenScroller[1] - self._screenScroller[0] - asciiDrawingSize = size2 - asciiStep + asciiDrawingSize = max(1, size2 - asciiStep) a = aa * (self._maximum - self._minimum) // asciiDrawingSize