From 1b9625b8ff84bed132c0674eba370039537c8857 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 10 Jul 2021 08:18:50 +0100 Subject: [PATCH] implemented gutter --- examples/calculator.py | 1 + src/textual/layouts/grid.py | 24 ++++++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/examples/calculator.py b/examples/calculator.py index 9c56f5e39..8aeee45a8 100644 --- a/examples/calculator.py +++ b/examples/calculator.py @@ -36,6 +36,7 @@ class GridTest(App): layout.add_widget(Placeholder(name="="), area="equals") layout.set_gap(1) + layout.set_gutter(1) layout.set_align("center", "center") diff --git a/src/textual/layouts/grid.py b/src/textual/layouts/grid.py index 2a77323b2..45420b243 100644 --- a/src/textual/layouts/grid.py +++ b/src/textual/layouts/grid.py @@ -49,6 +49,8 @@ class GridLayout(Layout): self.row_repeat = False self.column_align: GridAlign = "start" self.row_align: GridAlign = "start" + self.column_gutter: int = 0 + self.row_gutter: int = 0 super().__init__() @@ -110,6 +112,10 @@ class GridLayout(Layout): self.column_gap = column self.row_gap = column if row is None else row + def set_gutter(self, column: int, row: int | None = None) -> None: + self.column_gutter = column + self.row_gutter = column if row is None else row + def add_widget(self, widget: Widget, area: str | None = None) -> Widget: self.widgets[widget] = area return widget @@ -187,13 +193,15 @@ class GridLayout(Layout): tracks[f"{name}-end"].append(end) return tracks, max_size + container = Dimensions( + width - self.column_gutter * 2, height - self.row_gutter * 2 + ) column_tracks, column_size = resolve_tracks( - self.columns, width, self.column_gap, self.column_repeat + self.columns, container.width, self.column_gap, self.column_repeat ) row_tracks, row_size = resolve_tracks( - self.rows, height, self.row_gap, self.row_repeat + self.rows, container.height, self.row_gap, self.row_repeat ) - container_size = Dimensions(width, height) grid_size = Dimensions(column_size, row_size) widget_areas = ( @@ -205,6 +213,7 @@ class GridLayout(Layout): map = {} order = 1 from_corners = Region.from_corners + gutter = Point(self.column_gutter, self.row_gutter) for widget, area in widget_areas: column_start, column_end, row_start, row_end = self.areas[area] try: @@ -215,11 +224,14 @@ class GridLayout(Layout): except (KeyError, IndexError): continue - region = from_corners(x1, y1, x2, y2) region = self._align( - region, grid_size, container_size, self.column_align, self.row_align + from_corners(x1, y1, x2, y2), + grid_size, + container, + self.column_align, + self.row_align, ) - map[widget] = OrderedRegion(region, (0, order)) + map[widget] = OrderedRegion(region + gutter, (0, order)) order += 1 # Widgets with no area assigned.