mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
grid
This commit is contained in:
@@ -12,13 +12,13 @@ class GridTest(App):
|
||||
async def on_startup(self, event: events.Startup) -> None:
|
||||
|
||||
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(size=30, name="center")
|
||||
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=1, name="bottom")
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ from __future__ import annotations
|
||||
from collections import defaultdict
|
||||
from dataclasses import dataclass
|
||||
from operator import itemgetter
|
||||
from logging import getLogger
|
||||
from itertools import cycle, product
|
||||
import sys
|
||||
from typing import Iterable, NamedTuple
|
||||
@@ -19,6 +20,7 @@ if sys.version_info >= (3, 8):
|
||||
else:
|
||||
from typing_extensions import Literal
|
||||
|
||||
log = getLogger("rich")
|
||||
|
||||
GridAlign = Literal["start", "end", "center", "stretch"]
|
||||
|
||||
@@ -252,19 +254,22 @@ class GridLayout(Layout):
|
||||
def resolve(
|
||||
size: int, edges: list[GridOptions], gap: int, repeat: bool
|
||||
) -> Iterable[tuple[int, int]]:
|
||||
total_gap = gap * (len(edges) - 1)
|
||||
tracks = [
|
||||
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:
|
||||
tracks = cycle(tracks)
|
||||
total = 0
|
||||
edge_count = len(edges)
|
||||
for index, track in enumerate(tracks):
|
||||
yield total, total + track - gap if total + track < size else total + track
|
||||
total += track
|
||||
if total >= size and index >= edge_count:
|
||||
if total + track >= size and index >= edge_count:
|
||||
break
|
||||
yield total, total + track
|
||||
total += track + gap
|
||||
# if index >= edge_count:
|
||||
# break
|
||||
|
||||
def resolve_tracks(
|
||||
grid: list[GridOptions], size: int, gap: int, repeat: bool
|
||||
@@ -273,18 +278,21 @@ class GridLayout(Layout):
|
||||
(options.name, span)
|
||||
for options, span in zip(cycle(grid), resolve(size, grid, gap, repeat))
|
||||
]
|
||||
names = [name for name, _span in spans]
|
||||
|
||||
max_size = 0
|
||||
tracks: dict[str, tuple[int, int]] = {}
|
||||
counts = defaultdict(int)
|
||||
if repeat:
|
||||
names = []
|
||||
for index, (name, (start, end)) in enumerate(spans):
|
||||
max_size = max(max_size, end)
|
||||
counts[name] += 1
|
||||
count = counts[name]
|
||||
names.append(f"{name}-{count}")
|
||||
tracks[f"{name}-{count}-start"] = (index, start)
|
||||
tracks[f"{name}-{count}-end"] = (index, end)
|
||||
else:
|
||||
names = [name for name, _span in spans]
|
||||
for index, (name, (start, end)) in enumerate(spans):
|
||||
max_size = max(max_size, end)
|
||||
tracks[f"{name}-start"] = (index, start)
|
||||
@@ -320,6 +328,7 @@ class GridLayout(Layout):
|
||||
self.row_gap,
|
||||
self.row_repeat,
|
||||
)
|
||||
log.debug("%s", column_names)
|
||||
grid_size = Dimensions(column_size, row_size)
|
||||
|
||||
widget_areas = (
|
||||
@@ -357,7 +366,6 @@ class GridLayout(Layout):
|
||||
self.column_align,
|
||||
self.row_align,
|
||||
)
|
||||
# map[widget] = OrderedRegion(region + gutter + offset, (0, order))
|
||||
add_widget(widget, region + gutter, (0, order))
|
||||
order += 1
|
||||
|
||||
@@ -390,7 +398,6 @@ class GridLayout(Layout):
|
||||
self.column_align,
|
||||
self.row_align,
|
||||
)
|
||||
# map[widget] = OrderedRegion(region + gutter + offset, (0, order))
|
||||
add_widget(widget, region + gutter, (0, order))
|
||||
order += 1
|
||||
|
||||
|
||||
Reference in New Issue
Block a user