This commit is contained in:
Will McGugan
2021-07-11 21:38:17 +01:00
parent 2b752ea8a3
commit c6a0a61db8
2 changed files with 16 additions and 9 deletions

View File

@@ -12,13 +12,13 @@ class GridTest(App):
async def on_startup(self, event: events.Startup) -> None: async def on_startup(self, event: events.Startup) -> None:
layout = GridLayout() layout = GridLayout()
view = await self.push_view(View(layout=layout)) await self.push_view(View(layout=layout))
layout.add_column(fraction=1, name="left", min_size=20) layout.add_column(fraction=1, name="left", min_size=20)
layout.add_column(size=30, name="center") layout.add_column(size=30, name="center")
layout.add_column(fraction=1, name="right") layout.add_column(fraction=1, name="right")
layout.add_row(fraction=1, name="top") layout.add_row(fraction=1, name="top", min_size=2)
layout.add_row(fraction=2, name="middle") layout.add_row(fraction=2, name="middle")
layout.add_row(fraction=1, name="bottom") layout.add_row(fraction=1, name="bottom")

View File

@@ -3,6 +3,7 @@ from __future__ import annotations
from collections import defaultdict from collections import defaultdict
from dataclasses import dataclass from dataclasses import dataclass
from operator import itemgetter from operator import itemgetter
from logging import getLogger
from itertools import cycle, product from itertools import cycle, product
import sys import sys
from typing import Iterable, NamedTuple from typing import Iterable, NamedTuple
@@ -19,6 +20,7 @@ if sys.version_info >= (3, 8):
else: else:
from typing_extensions import Literal from typing_extensions import Literal
log = getLogger("rich")
GridAlign = Literal["start", "end", "center", "stretch"] GridAlign = Literal["start", "end", "center", "stretch"]
@@ -252,19 +254,22 @@ class GridLayout(Layout):
def resolve( def resolve(
size: int, edges: list[GridOptions], gap: int, repeat: bool size: int, edges: list[GridOptions], gap: int, repeat: bool
) -> Iterable[tuple[int, int]]: ) -> Iterable[tuple[int, int]]:
total_gap = gap * (len(edges) - 1)
tracks = [ tracks = [
track if edge.max_size is None else min(edge.max_size, track) track if edge.max_size is None else min(edge.max_size, track)
for track, edge in zip(layout_resolve(size, edges), edges) for track, edge in zip(layout_resolve(size - total_gap, edges), edges)
] ]
if repeat: if repeat:
tracks = cycle(tracks) tracks = cycle(tracks)
total = 0 total = 0
edge_count = len(edges) edge_count = len(edges)
for index, track in enumerate(tracks): for index, track in enumerate(tracks):
yield total, total + track - gap if total + track < size else total + track if total + track >= size and index >= edge_count:
total += track
if total >= size and index >= edge_count:
break break
yield total, total + track
total += track + gap
# if index >= edge_count:
# break
def resolve_tracks( def resolve_tracks(
grid: list[GridOptions], size: int, gap: int, repeat: bool grid: list[GridOptions], size: int, gap: int, repeat: bool
@@ -273,18 +278,21 @@ class GridLayout(Layout):
(options.name, span) (options.name, span)
for options, span in zip(cycle(grid), resolve(size, grid, gap, repeat)) for options, span in zip(cycle(grid), resolve(size, grid, gap, repeat))
] ]
names = [name for name, _span in spans]
max_size = 0 max_size = 0
tracks: dict[str, tuple[int, int]] = {} tracks: dict[str, tuple[int, int]] = {}
counts = defaultdict(int) counts = defaultdict(int)
if repeat: if repeat:
names = []
for index, (name, (start, end)) in enumerate(spans): for index, (name, (start, end)) in enumerate(spans):
max_size = max(max_size, end) max_size = max(max_size, end)
counts[name] += 1 counts[name] += 1
count = counts[name] count = counts[name]
names.append(f"{name}-{count}")
tracks[f"{name}-{count}-start"] = (index, start) tracks[f"{name}-{count}-start"] = (index, start)
tracks[f"{name}-{count}-end"] = (index, end) tracks[f"{name}-{count}-end"] = (index, end)
else: else:
names = [name for name, _span in spans]
for index, (name, (start, end)) in enumerate(spans): for index, (name, (start, end)) in enumerate(spans):
max_size = max(max_size, end) max_size = max(max_size, end)
tracks[f"{name}-start"] = (index, start) tracks[f"{name}-start"] = (index, start)
@@ -320,6 +328,7 @@ class GridLayout(Layout):
self.row_gap, self.row_gap,
self.row_repeat, self.row_repeat,
) )
log.debug("%s", column_names)
grid_size = Dimensions(column_size, row_size) grid_size = Dimensions(column_size, row_size)
widget_areas = ( widget_areas = (
@@ -357,7 +366,6 @@ class GridLayout(Layout):
self.column_align, self.column_align,
self.row_align, self.row_align,
) )
# map[widget] = OrderedRegion(region + gutter + offset, (0, order))
add_widget(widget, region + gutter, (0, order)) add_widget(widget, region + gutter, (0, order))
order += 1 order += 1
@@ -390,7 +398,6 @@ class GridLayout(Layout):
self.column_align, self.column_align,
self.row_align, self.row_align,
) )
# map[widget] = OrderedRegion(region + gutter + offset, (0, order))
add_widget(widget, region + gutter, (0, order)) add_widget(widget, region + gutter, (0, order))
order += 1 order += 1