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:
|
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")
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user