mirror of
https://github.com/rr-/pq-cli.git
synced 2026-09-28 22:33:59 -06:00
ui: add padding to scrollbar
This commit is contained in:
@@ -27,8 +27,8 @@ PALETTE: T.List[T.Tuple[str, ...]] = [
|
|||||||
("progressbar-normal", "", "", "standout"),
|
("progressbar-normal", "", "", "standout"),
|
||||||
("progressbar-done", "black", "light red"),
|
("progressbar-done", "black", "light red"),
|
||||||
("progressbar-smooth", "light red", ""),
|
("progressbar-smooth", "light red", ""),
|
||||||
("scrollbar", "dark gray", ""),
|
("scrollbar", "light gray", "black"),
|
||||||
("scrollbar-focus", "light red", ""),
|
("scrollbar-focus", "light red", "black"),
|
||||||
("scrollable", "", ""),
|
("scrollable", "", ""),
|
||||||
("scrollable-focus", "", ""),
|
("scrollable-focus", "", ""),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ class InventoryView(DoubleLineBox):
|
|||||||
)
|
)
|
||||||
|
|
||||||
super().__init__(
|
super().__init__(
|
||||||
top_widget=ScrollBar(self.scrollable),
|
top_widget=ScrollBar(self.scrollable, padding=1),
|
||||||
top_title="Inventory",
|
top_title="Inventory",
|
||||||
bottom_widget=self.encumbrance_bar,
|
bottom_widget=self.encumbrance_bar,
|
||||||
bottom_title="Encumbrance",
|
bottom_title="Encumbrance",
|
||||||
|
|||||||
+55
-3
@@ -13,6 +13,9 @@
|
|||||||
# Changes compared to upstream:
|
# Changes compared to upstream:
|
||||||
# - reformatted the code
|
# - reformatted the code
|
||||||
# - added AttrMap wrapping
|
# - added AttrMap wrapping
|
||||||
|
# - added padding support
|
||||||
|
|
||||||
|
import typing as T
|
||||||
|
|
||||||
import urwid
|
import urwid
|
||||||
from urwid.widget import BOX, FLOW, FIXED
|
from urwid.widget import BOX, FLOW, FIXED
|
||||||
@@ -30,6 +33,43 @@ SCROLLBAR_LEFT = "left"
|
|||||||
SCROLLBAR_RIGHT = "right"
|
SCROLLBAR_RIGHT = "right"
|
||||||
|
|
||||||
|
|
||||||
|
class EmptyCanvas(urwid.Canvas):
|
||||||
|
def __init__(self, cols: int, rows: int) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self._text, cs = urwid.apply_target_encoding(" ")
|
||||||
|
self._cs = cs[0][0]
|
||||||
|
self.size = cols, rows
|
||||||
|
self.cursor = None
|
||||||
|
|
||||||
|
def cols(self) -> int:
|
||||||
|
return self.size[0]
|
||||||
|
|
||||||
|
def rows(self) -> int:
|
||||||
|
return self.size[1]
|
||||||
|
|
||||||
|
def content(
|
||||||
|
self,
|
||||||
|
trim_left: int = 0,
|
||||||
|
trim_top: int = 0,
|
||||||
|
cols: T.Optional[int] = None,
|
||||||
|
rows: T.Optional[int] = None,
|
||||||
|
attr: T.Optional[str] = None,
|
||||||
|
) -> T.Generator:
|
||||||
|
if cols is None:
|
||||||
|
cols = self.size[0]
|
||||||
|
if rows is None:
|
||||||
|
rows = self.size[1]
|
||||||
|
|
||||||
|
line = [(None, self._cs, self._text * cols)]
|
||||||
|
for i in range(rows):
|
||||||
|
yield line
|
||||||
|
|
||||||
|
def content_delta(self, other: T.Any) -> T.Any:
|
||||||
|
if other is self:
|
||||||
|
return [self.cols()] * self.rows()
|
||||||
|
return self.content()
|
||||||
|
|
||||||
|
|
||||||
class _Scrollable(urwid.WidgetDecoration):
|
class _Scrollable(urwid.WidgetDecoration):
|
||||||
def sizing(self):
|
def sizing(self):
|
||||||
return frozenset([BOX])
|
return frozenset([BOX])
|
||||||
@@ -287,6 +327,7 @@ class _ScrollBar(urwid.WidgetDecoration):
|
|||||||
trough_char=" ",
|
trough_char=" ",
|
||||||
side=SCROLLBAR_RIGHT,
|
side=SCROLLBAR_RIGHT,
|
||||||
width=1,
|
width=1,
|
||||||
|
padding=0,
|
||||||
):
|
):
|
||||||
"""Box widget that adds a scrollbar to `widget`
|
"""Box widget that adds a scrollbar to `widget`
|
||||||
|
|
||||||
@@ -302,14 +343,17 @@ class _ScrollBar(urwid.WidgetDecoration):
|
|||||||
`trough_char` is used for the space above and below the handle.
|
`trough_char` is used for the space above and below the handle.
|
||||||
`side` must be 'left' or 'right'.
|
`side` must be 'left' or 'right'.
|
||||||
`width` specifies the number of columns the scrollbar uses.
|
`width` specifies the number of columns the scrollbar uses.
|
||||||
|
`padding` specifies the number of columns the scrollbar is separated
|
||||||
|
from the content by.
|
||||||
"""
|
"""
|
||||||
if BOX not in widget.sizing():
|
if BOX not in widget.sizing():
|
||||||
raise ValueError("Not a box widget: %r" % widget)
|
raise ValueError("Not a box widget: %r" % widget)
|
||||||
super().__init__(widget)
|
super().__init__(widget)
|
||||||
self._thumb_char = thumb_char
|
self._thumb_char = thumb_char
|
||||||
self._trough_char = trough_char
|
self._trough_char = trough_char
|
||||||
self.scrollbar_side = side
|
self._scrollbar_side = side
|
||||||
self.scrollbar_width = max(1, width)
|
self._scrollbar_width = max(1, width)
|
||||||
|
self._padding_width = padding
|
||||||
self._original_widget_size = (0, 0)
|
self._original_widget_size = (0, 0)
|
||||||
|
|
||||||
def sizing(self):
|
def sizing(self):
|
||||||
@@ -330,7 +374,11 @@ class _ScrollBar(urwid.WidgetDecoration):
|
|||||||
return ow.render(size, focus)
|
return ow.render(size, focus)
|
||||||
|
|
||||||
sb_width = self._scrollbar_width
|
sb_width = self._scrollbar_width
|
||||||
self._original_widget_size = ow_size = (maxcol - sb_width, maxrow)
|
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)
|
||||||
@@ -359,8 +407,12 @@ class _ScrollBar(urwid.WidgetDecoration):
|
|||||||
[(top, None, False), (thumb, None, False), (bottom, None, False)]
|
[(top, None, False), (thumb, None, False), (bottom, None, False)]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Create padding canvas
|
||||||
|
pad_canv = EmptyCanvas(pad_width, maxrow)
|
||||||
|
|
||||||
combinelist = [
|
combinelist = [
|
||||||
(ow_canv, None, True, ow_size[0]),
|
(ow_canv, None, True, ow_size[0]),
|
||||||
|
(pad_canv, None, False, pad_width),
|
||||||
(sb_canv, None, False, sb_width),
|
(sb_canv, None, False, sb_width),
|
||||||
]
|
]
|
||||||
if self._scrollbar_side != SCROLLBAR_LEFT:
|
if self._scrollbar_side != SCROLLBAR_LEFT:
|
||||||
|
|||||||
Reference in New Issue
Block a user