ui: fix scrollbar rendering bugs

This commit is contained in:
rr-
2018-11-09 00:56:38 +01:00
parent 70ab6eab48
commit 8e25fbea04
2 changed files with 20 additions and 17 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ import urwid
class CustomProgressBar(urwid.Widget): class CustomProgressBar(urwid.Widget):
_sizing = frozenset(["flow"]) _sizing = frozenset(["flow"])
text_align = "center" text_align = "center"
eighths = u" ▏▎▍▌▋▊▉" eighths = " ▏▎▍▌▋▊▉"
def __init__(self) -> None: def __init__(self) -> None:
self.position = 0.0 self.position = 0.0
+19 -16
View File
@@ -72,12 +72,6 @@ class EmptyCanvas(urwid.Canvas):
class _Scrollable(urwid.WidgetDecoration): class _Scrollable(urwid.WidgetDecoration):
def sizing(self):
return frozenset([BOX])
def selectable(self):
return True
def __init__(self, widget): def __init__(self, widget):
"""Box widget that makes a fixed or flow widget vertically scrollable """Box widget that makes a fixed or flow widget vertically scrollable
@@ -98,6 +92,12 @@ class _Scrollable(urwid.WidgetDecoration):
self._rows_max_cached = 0 self._rows_max_cached = 0
super().__init__(widget) super().__init__(widget)
def sizing(self):
return frozenset([BOX])
def selectable(self):
return True
def render(self, size, focus=False): def render(self, size, focus=False):
maxcol, maxrow = size maxcol, maxrow = size
@@ -360,6 +360,12 @@ class _ScrollBar(urwid.WidgetDecoration):
def render(self, size, focus=False): def render(self, size, focus=False):
maxcol, maxrow = size maxcol, maxrow = size
sb_width = self._scrollbar_width
pad_width = self._padding_width
self._original_widget_size = ow_size = (
maxcol - sb_width - pad_width,
maxrow,
)
ow = self._original_widget ow = self._original_widget
ow_base = self.scrolling_base_widget ow_base = self.scrolling_base_widget
@@ -368,13 +374,8 @@ class _ScrollBar(urwid.WidgetDecoration):
# Canvas fits without scrolling - no scrollbar needed # Canvas fits without scrolling - no scrollbar needed
self._original_widget_size = size self._original_widget_size = size
return ow.render(size, focus) return ow.render(size, focus)
ow_rows_max = ow_base.rows_max(ow_size, focus)
sb_width = self._scrollbar_width
pad_width = self._padding_width
self._original_widget_size = ow_size = (
maxcol - sb_width - pad_width,
maxrow,
)
ow_canv = ow.render(ow_size, focus) ow_canv = ow.render(ow_size, focus)
pos = ow_base.get_scrollpos(ow_size, focus) pos = ow_base.get_scrollpos(ow_size, focus)
@@ -396,11 +397,13 @@ class _ScrollBar(urwid.WidgetDecoration):
assert thumb_height + top_height + bottom_height == maxrow assert thumb_height + top_height + bottom_height == maxrow
# Create scrollbar canvas # Create scrollbar canvas
top = urwid.SolidCanvas(self._trough_char, sb_width, top_height) top = urwid.SolidCanvas(self._trough_char, sb_width, 1)
thumb = urwid.SolidCanvas(self._thumb_char, sb_width, thumb_height) thumb = urwid.SolidCanvas(self._thumb_char, sb_width, 1)
bottom = urwid.SolidCanvas(self._trough_char, sb_width, bottom_height) bottom = urwid.SolidCanvas(self._trough_char, sb_width, 1)
sb_canv = urwid.CanvasCombine( sb_canv = urwid.CanvasCombine(
[(top, None, False), (thumb, None, False), (bottom, None, False)] [(top, None, False)] * top_height
+ [(thumb, None, False)] * thumb_height
+ [(bottom, None, False)] * bottom_height
) )
# Create padding canvas # Create padding canvas