diff --git a/src/textual/_arrange.py b/src/textual/_arrange.py index 8b8b72476..6e133b1d3 100644 --- a/src/textual/_arrange.py +++ b/src/textual/_arrange.py @@ -13,6 +13,9 @@ from ._partition import partition if TYPE_CHECKING: from .widget import Widget +# TODO: This is a bit of a fudge, need to ensure it is impossible for layouts to generate this value +TOP_Z = 2**31 - 1 + def arrange( widget: Widget, children: Sequence[Widget], size: Size, viewport: Size @@ -43,10 +46,7 @@ def arrange( region = size.region _WidgetPlacement = WidgetPlacement - - # TODO: This is a bit of a fudge, need to ensure it is impossible for layouts to generate this value - top_z = 2**31 - 1 - + top_z = TOP_Z scroll_spacing = Spacing() get_dock = attrgetter("styles.dock") @@ -87,7 +87,7 @@ def arrange( right = max(right, dock_region.width) else: # Should not occur, mainly to keep Mypy happy - raise AssertionError("invalid value for edge") + raise AssertionError("invalid value for edge") # pragma: no-cover align_offset = dock_widget.styles.align_size( (widget_width, widget_height), size diff --git a/src/textual/dom.py b/src/textual/dom.py index 920cde011..ccccd19e2 100644 --- a/src/textual/dom.py +++ b/src/textual/dom.py @@ -12,7 +12,7 @@ from rich.tree import Tree from ._context import NoActiveAppError from ._node_list import NodeList -from .color import Color +from .color import Color, WHITE, BLACK from .css._error_tools import friendly_list from .css.constants import VALID_DISPLAY, VALID_VISIBILITY from .css.errors import StyleValueError @@ -379,7 +379,7 @@ class DOMNode(MessagePump): """ - base_background = background = Color(0, 0, 0, 0) + base_background = background = BLACK for node in reversed(self.ancestors): styles = node.styles @@ -395,8 +395,8 @@ class DOMNode(MessagePump): Returns: tuple[Color, Color, Color, Color]: Tuple of (base background, base color, background, color) """ - base_background = background = Color(0, 0, 0, 0) - base_color = color = Color(255, 255, 255, 0) + base_background = background = WHITE + base_color = color = BLACK for node in reversed(self.ancestors): styles = node.styles if styles.has_rule("background"): diff --git a/tests/test_arrange.py b/tests/test_arrange.py new file mode 100644 index 000000000..16680cc68 --- /dev/null +++ b/tests/test_arrange.py @@ -0,0 +1,109 @@ +from textual._arrange import arrange, TOP_Z +from textual._layout import WidgetPlacement +from textual.geometry import Region, Size, Spacing +from textual.widget import Widget + + +def test_arrange_empty(): + container = Widget(id="container") + + placements, widgets, spacing = arrange(container, [], Size(80, 24), Size(80, 24)) + assert placements == [] + assert widgets == set() + assert spacing == Spacing(0, 0, 0, 0) + + +def test_arrange_dock_top(): + container = Widget(id="container") + child = Widget(id="child") + header = Widget(id="header") + header.styles.dock = "top" + header.styles.height = "1" + + placements, widgets, spacing = arrange( + container, [child, header], Size(80, 24), Size(80, 24) + ) + assert placements == [ + WidgetPlacement(Region(0, 0, 80, 1), header, order=TOP_Z, fixed=True), + WidgetPlacement(Region(0, 1, 80, 23), child, order=0, fixed=False), + WidgetPlacement( + region=Region(x=0, y=1, width=80, height=23), + widget=None, + order=0, + fixed=False, + ), + ] + assert widgets == {child, header} + assert spacing == Spacing(1, 0, 0, 0) + + +def test_arrange_dock_left(): + container = Widget(id="container") + child = Widget(id="child") + header = Widget(id="header") + header.styles.dock = "left" + header.styles.width = "10" + + placements, widgets, spacing = arrange( + container, [child, header], Size(80, 24), Size(80, 24) + ) + assert placements == [ + WidgetPlacement(Region(0, 0, 10, 24), header, order=TOP_Z, fixed=True), + WidgetPlacement(Region(10, 0, 70, 24), child, order=0, fixed=False), + WidgetPlacement( + region=Region(x=10, y=0, width=70, height=24), + widget=None, + order=0, + fixed=False, + ), + ] + assert widgets == {child, header} + assert spacing == Spacing(0, 0, 0, 10) + + +def test_arrange_dock_right(): + container = Widget(id="container") + child = Widget(id="child") + header = Widget(id="header") + header.styles.dock = "right" + header.styles.width = "10" + + placements, widgets, spacing = arrange( + container, [child, header], Size(80, 24), Size(80, 24) + ) + assert placements == [ + WidgetPlacement(Region(70, 0, 10, 24), header, order=TOP_Z, fixed=True), + WidgetPlacement(Region(0, 0, 70, 24), child, order=0, fixed=False), + WidgetPlacement( + region=Region(x=0, y=0, width=70, height=24), + widget=None, + order=0, + fixed=False, + ), + ] + assert widgets == {child, header} + assert spacing == Spacing(0, 10, 0, 0) + + +def test_arrange_dock_bottom(): + container = Widget(id="container") + child = Widget(id="child") + header = Widget(id="header") + header.styles.dock = "bottom" + header.styles.height = "1" + + placements, widgets, spacing = arrange( + container, [child, header], Size(80, 24), Size(80, 24) + ) + assert placements == [ + WidgetPlacement(Region(0, 23, 80, 1), header, order=TOP_Z, fixed=True), + WidgetPlacement(Region(0, 0, 80, 23), child, order=0, fixed=False), + WidgetPlacement( + region=Region(x=0, y=0, width=80, height=23), + widget=None, + order=0, + fixed=False, + ), + ] + assert widgets == {child, header} + assert spacing == Spacing(0, 0, 1, 0)