Skip to content

Commit

Permalink
Merge 34563cf into 5d4977f
Browse files Browse the repository at this point in the history
  • Loading branch information
penguinolog committed Jan 17, 2024
2 parents 5d4977f + 34563cf commit a5a5870
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 4 deletions.
61 changes: 58 additions & 3 deletions tests/test_grid_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
from unittest import mock

import urwid
from urwid import GridFlow


class GridFlowTest(unittest.TestCase):
def test_fixed(self):
grid = GridFlow(
grid = urwid.GridFlow(
(urwid.Button(tag, align=urwid.CENTER) for tag in ("OK", "Cancel", "Help")),
cell_width=10,
h_sep=1,
Expand All @@ -23,7 +22,63 @@ def test_fixed(self):
canvas = grid.render(())
self.assertEqual(cols, canvas.cols())
self.assertEqual(rows, canvas.rows())
self.assertEqual([b'< OK > < Cancel > < Help >'], canvas.text)
self.assertEqual([b"< OK > < Cancel > < Help >"], canvas.text)

def test_default_focus(self):
with self.subTest("Simple"):
grid = urwid.GridFlow(
(urwid.Button("btn"), urwid.Button("btn")),
cell_width=10,
h_sep=1,
v_sep=1,
align=urwid.CENTER,
)
self.assertTrue(grid.selectable())
self.assertEqual(0, grid.focus_position)

with self.subTest("Simple not selectable"):
grid = urwid.GridFlow(
(urwid.Text("btn"), urwid.Text("btn")),
cell_width=10,
h_sep=1,
v_sep=1,
align=urwid.CENTER,
)
self.assertFalse(grid.selectable())
self.assertEqual(0, grid.focus_position)

with self.subTest("Explicit index"):
grid = urwid.GridFlow(
(urwid.Button("btn"), urwid.Button("btn")),
cell_width=10,
h_sep=1,
v_sep=1,
align=urwid.CENTER,
focus=1,
)
self.assertEqual(1, grid.focus_position)

with self.subTest("Explicit widget"):
btn2 = urwid.Button("btn 2")
grid = urwid.GridFlow(
(urwid.Button("btn"), btn2),
cell_width=10,
h_sep=1,
v_sep=1,
align=urwid.CENTER,
focus=btn2,
)
self.assertEqual(1, grid.focus_position)

with self.subTest("Selectable not first"):
grid = urwid.GridFlow(
(urwid.Text("text"), urwid.Button("btn")),
cell_width=10,
h_sep=1,
v_sep=1,
align=urwid.CENTER,
)
self.assertEqual(1, grid.focus_position)

def test_cell_width(self):
gf = urwid.GridFlow([], 5, 0, 0, "left")
Expand Down
15 changes: 14 additions & 1 deletion urwid/widget/grid_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def __init__(
h_sep: int,
v_sep: int,
align: Literal["left", "center", "right"] | Align | tuple[Literal["relative", WHSettings.RELATIVE], int],
focus: int | Widget | None = None,
):
"""
:param cells: iterable of flow widgets to display
Expand All @@ -49,8 +50,20 @@ def __init__(
(if more than one row is required to display all the cells)
:param align: horizontal alignment of cells, one of:
'left', 'center', 'right', ('relative', percentage 0=left 100=right)
:param focus: widget index or widget instance to focus on
"""
self._contents = MonitoredFocusList([(w, (WHSettings.GIVEN, cell_width)) for w in cells])
prepared_contents: list[tuple[Widget, tuple[Literal[WHSettings.GIVEN], int]]] = []
focus_position: int = -1

for idx, widget in enumerate(cells):
prepared_contents.append((widget, (WHSettings.GIVEN, cell_width)))
if focus_position < 0 and (widget == focus or idx == focus or (focus is None and widget.selectable())):
focus_position = idx

if focus_position < 0:
focus_position = 0

self._contents = MonitoredFocusList(prepared_contents, focus=focus_position)
self._contents.set_modified_callback(self._invalidate)
self._contents.set_focus_changed_callback(lambda f: self._invalidate())
self._contents.set_validate_contents_modified(self._contents_modified)
Expand Down

0 comments on commit a5a5870

Please sign in to comment.