mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Merge branch 'main' into add-containers
This commit is contained in:
189
tests/snapshot_tests/snapshot_apps/auto-table.py
Normal file
189
tests/snapshot_tests/snapshot_apps/auto-table.py
Normal file
@@ -0,0 +1,189 @@
|
||||
from os import urandom
|
||||
from random import randrange
|
||||
|
||||
from textual.app import App
|
||||
from textual.containers import Container, Horizontal, Vertical
|
||||
from textual.screen import Screen
|
||||
from textual.widgets import DataTable, Header, Label
|
||||
|
||||
|
||||
class LabeledBox(Container):
|
||||
DEFAULT_CSS = """
|
||||
LabeledBox {
|
||||
layers: base_ top_;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
LabeledBox > Container {
|
||||
layer: base_;
|
||||
border: round $primary;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
layout: vertical;
|
||||
}
|
||||
|
||||
LabeledBox > Label {
|
||||
layer: top_;
|
||||
offset-x: 2;
|
||||
}
|
||||
"""
|
||||
|
||||
def __init__(self, title, *args, **kwargs):
|
||||
self.__label = Label(title)
|
||||
|
||||
super().__init__(self.__label, Container(*args, **kwargs))
|
||||
|
||||
@property
|
||||
def label(self):
|
||||
return self.__label
|
||||
|
||||
|
||||
class StatusTable(DataTable):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.cursor_type = "row"
|
||||
self.show_cursor = False
|
||||
self.add_column("Foo")
|
||||
self.add_column("Bar")
|
||||
self.add_column("Baz")
|
||||
|
||||
for _ in range(50):
|
||||
self.add_row(
|
||||
"ABCDEFGH",
|
||||
"0123456789",
|
||||
"IJKLMNOPQRSTUVWXYZ",
|
||||
)
|
||||
|
||||
|
||||
class Status(LabeledBox):
|
||||
DEFAULT_CSS = """
|
||||
Status {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
Status Container {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
Status StatusTable {
|
||||
width: auto;
|
||||
margin-top: 1;
|
||||
scrollbar-gutter: stable;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
"""
|
||||
|
||||
def __init__(self, name: str):
|
||||
self.__name = name
|
||||
self.__table = StatusTable()
|
||||
|
||||
super().__init__(f" {self.__name} ", self.__table)
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self.__name
|
||||
|
||||
@property
|
||||
def table(self) -> StatusTable:
|
||||
return self.__table
|
||||
|
||||
|
||||
class Rendering(LabeledBox):
|
||||
DEFAULT_CSS = """
|
||||
#issue-info {
|
||||
height: auto;
|
||||
border-bottom: dashed #632CA6;
|
||||
}
|
||||
|
||||
#statuses-box {
|
||||
height: 1fr;
|
||||
width: auto;
|
||||
}
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.__info = Label("test")
|
||||
|
||||
super().__init__(
|
||||
"",
|
||||
Container(
|
||||
Horizontal(self.__info, id="issue-info"),
|
||||
Horizontal(*[Status(str(i)) for i in range(4)], id="statuses-box"),
|
||||
id="issues-box",
|
||||
),
|
||||
)
|
||||
|
||||
@property
|
||||
def info(self) -> Label:
|
||||
return self.__info
|
||||
|
||||
|
||||
class Sidebar(LabeledBox):
|
||||
DEFAULT_CSS = """
|
||||
#sidebar-status {
|
||||
height: auto;
|
||||
border-bottom: dashed #632CA6;
|
||||
}
|
||||
|
||||
#sidebar-options {
|
||||
height: 1fr;
|
||||
}
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.__status = Label("ok")
|
||||
self.__options = Vertical()
|
||||
|
||||
super().__init__(
|
||||
"",
|
||||
Container(self.__status, id="sidebar-status"),
|
||||
Container(self.__options, id="sidebar-options"),
|
||||
)
|
||||
|
||||
@property
|
||||
def status(self) -> Label:
|
||||
return self.__status
|
||||
|
||||
@property
|
||||
def options(self) -> Vertical:
|
||||
return self.__options
|
||||
|
||||
|
||||
class MyScreen(Screen):
|
||||
DEFAULT_CSS = """
|
||||
#main-content {
|
||||
layout: grid;
|
||||
grid-size: 2;
|
||||
grid-columns: 1fr 5fr;
|
||||
grid-rows: 1fr;
|
||||
}
|
||||
|
||||
#main-content-sidebar {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#main-content-rendering {
|
||||
height: 100%;
|
||||
}
|
||||
"""
|
||||
|
||||
def compose(self):
|
||||
yield Header()
|
||||
yield Container(
|
||||
Container(Sidebar(), id="main-content-sidebar"),
|
||||
Container(Rendering(), id="main-content-rendering"),
|
||||
id="main-content",
|
||||
)
|
||||
|
||||
|
||||
class MyApp(App):
|
||||
async def on_mount(self):
|
||||
self.install_screen(MyScreen(), "myscreen")
|
||||
await self.push_screen("myscreen")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = MyApp()
|
||||
app.run()
|
||||
38
tests/snapshot_tests/snapshot_apps/remove_auto.py
Normal file
38
tests/snapshot_tests/snapshot_apps/remove_auto.py
Normal file
@@ -0,0 +1,38 @@
|
||||
from textual.app import App, ComposeResult
|
||||
from textual.containers import Vertical
|
||||
from textual.widgets import Header, Footer, Label
|
||||
|
||||
|
||||
class VerticalRemoveApp(App[None]):
|
||||
CSS = """
|
||||
Vertical {
|
||||
border: round green;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
Label {
|
||||
border: round yellow;
|
||||
background: red;
|
||||
color: yellow;
|
||||
}
|
||||
"""
|
||||
BINDINGS = [
|
||||
("a", "add", "Add"),
|
||||
("d", "del", "Delete"),
|
||||
]
|
||||
|
||||
def compose(self) -> ComposeResult:
|
||||
yield Header()
|
||||
yield Vertical()
|
||||
yield Footer()
|
||||
|
||||
def action_add(self) -> None:
|
||||
self.query_one(Vertical).mount(Label("This is a test label"))
|
||||
|
||||
def action_del(self) -> None:
|
||||
if self.query_one(Vertical).children:
|
||||
self.query_one(Vertical).children[-1].remove()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VerticalRemoveApp().run()
|
||||
Reference in New Issue
Block a user