Skip to content

Commit ae850fd

Browse files
authored
Restructure the UI related code. (#10)
* Restructure the UI related code. * Add new lines at the end of the files.
1 parent bd534c0 commit ae850fd

File tree

7 files changed

+119
-73
lines changed

7 files changed

+119
-73
lines changed

idd.py

Lines changed: 8 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2,83 +2,20 @@
22
from textual.app import App
33
from textual_inputs import TextInput
44
from textual.reactive import Reactive
5-
from textual.widget import Widget
6-
from textual.widgets import Footer, Header, Static
7-
from typing import Union
8-
9-
from rich.align import Align
10-
from rich.console import RenderableType
5+
from textual.widgets import Static
116
from rich.panel import Panel
12-
from rich.style import Style
13-
from rich.table import Table
14-
from rich.text import Text
157

168
from diff_driver import DiffDriver
17-
from ui.figlet_text import FigletText
9+
10+
from ui.header import Header
11+
from ui.footer import Footer
12+
from ui.scrollable_area import ScrollableArea
13+
from ui.diff_area import DiffArea
1814

1915
import argparse
2016
import sys
2117
import rich.box
2218

23-
class CustomHeader(Header):
24-
"""Override the default Header for Styling"""
25-
26-
def __init__(self) -> None:
27-
super().__init__()
28-
self.tall = False
29-
self.style = Style(color="white", bgcolor="rgb(98,98,98)")
30-
31-
def render(self) -> Table:
32-
header_table = Table.grid(padding=(0, 1), expand=True)
33-
header_table.add_column(justify="left", ratio=0, width=8)
34-
header_table.add_column("title", justify="center", ratio=1)
35-
header_table.add_column("clock", justify="right", width=8)
36-
header_table.add_row(
37-
"IDD", self.full_title, self.get_clock() if self.clock else ""
38-
)
39-
return header_table
40-
41-
async def on_click(self, event: events.Click) -> None:
42-
return await super().on_click(event)
43-
class TDiffFooter(Footer):
44-
"""Override the default Footer for Styling"""
45-
46-
def make_key_text(self) -> Text:
47-
"""Create text containing all the keys."""
48-
text = Text(
49-
style="white on rgb(98,98,98)",
50-
no_wrap=True,
51-
overflow="ellipsis",
52-
justify="left",
53-
end="",
54-
)
55-
for binding in self.app.bindings.shown_keys:
56-
key_display = (
57-
binding.key.upper()
58-
if binding.key_display is None
59-
else binding.key_display
60-
)
61-
hovered = self.highlight_key == binding.key
62-
key_text = Text.assemble(
63-
(f" {key_display} ", "reverse" if hovered else "default on default"),
64-
f" {binding.description} ",
65-
meta={"@click": f"app.press('{binding.key}')", "key": binding.key},
66-
)
67-
text.append_text(key_text)
68-
return text
69-
class DiffArea(Widget):
70-
"""The general widget for displaying diff data."""
71-
72-
value = Reactive("0")
73-
widget_title = "title"
74-
75-
def render(self) -> RenderableType:
76-
return Panel(
77-
Align.left(FigletText(self.value), vertical="top"),
78-
title = self.widget_title,
79-
style="white on rgb(51,51,51)"
80-
)
81-
8219
class DiffDebug(App):
8320
current_index: Reactive[int] = Reactive(-1)
8421
tab_index = ["parallel_command_bar", "base_command_bar", "regressed_command_bar"]
@@ -254,9 +191,9 @@ async def on_mount(self) -> None:
254191
self.bar.layout_offset_x = -40
255192
await self.view.dock(self.bar, edge="left", size=40, z=1)
256193

257-
self.header = CustomHeader()
194+
self.header = Header()
258195
await self.view.dock(self.header, edge="top")
259-
await self.view.dock(TDiffFooter(), edge="bottom")
196+
await self.view.dock(Footer(), edge="bottom")
260197
await self.view.dock(self.parallel_command_bar, edge="bottom", size=3)
261198

262199
self.diff_frames1 = DiffArea()

ui/diff_area.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from rich.align import Align
2+
from rich.console import RenderableType
3+
from rich.panel import Panel
4+
5+
from textual.reactive import Reactive
6+
from textual.widget import Widget
7+
8+
from ui.figlet_text import FigletText
9+
10+
class DiffArea(Widget):
11+
"""The general widget for displaying diff data."""
12+
13+
value = Reactive("0")
14+
widget_title = "title"
15+
16+
def render(self) -> RenderableType:
17+
return Panel(
18+
Align.left(FigletText(self.value), vertical="top"),
19+
title = self.widget_title,
20+
style="white on rgb(51,51,51)"
21+
)

ui/figlet_text.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ def __rich_console__(
1010
self, console: Console, options: ConsoleOptions
1111
) -> RenderResult:
1212
"""Build a Rich renderable to render the Figlet text."""
13-
return self.text
13+
return self.text

ui/footer.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from rich.text import Text
2+
3+
from textual.widgets import Footer
4+
5+
class Footer(Footer):
6+
"""Override the default Footer for Styling"""
7+
8+
def make_key_text(self) -> Text:
9+
"""Create text containing all the keys."""
10+
text = Text(
11+
style="white on rgb(98,98,98)",
12+
no_wrap=True,
13+
overflow="ellipsis",
14+
justify="left",
15+
end="",
16+
)
17+
for binding in self.app.bindings.shown_keys:
18+
key_display = (
19+
binding.key.upper()
20+
if binding.key_display is None
21+
else binding.key_display
22+
)
23+
hovered = self.highlight_key == binding.key
24+
key_text = Text.assemble(
25+
(f" {key_display} ", "reverse" if hovered else "default on default"),
26+
f" {binding.description} ",
27+
meta={"@click": f"app.press('{binding.key}')", "key": binding.key},
28+
)
29+
text.append_text(key_text)
30+
return text

ui/header.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from rich.style import Style
2+
from rich.table import Table
3+
4+
from textual.widgets import Header
5+
from textual import events
6+
7+
class Header(Header):
8+
"""Override the default Header for Styling"""
9+
10+
def __init__(self) -> None:
11+
super().__init__()
12+
self.tall = False
13+
self.style = Style(color="white", bgcolor="rgb(98,98,98)")
14+
15+
def render(self) -> Table:
16+
header_table = Table.grid(padding=(0, 1), expand=True)
17+
header_table.add_column(justify="left", ratio=0, width=8)
18+
header_table.add_column("title", justify="center", ratio=1)
19+
header_table.add_column("clock", justify="right", width=8)
20+
header_table.add_row(
21+
"IDD", self.full_title, self.get_clock() if self.clock else ""
22+
)
23+
return header_table
24+
25+
async def on_click(self, event: events.Click) -> None:
26+
return await super().on_click(event)

ui/scroll_window.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from rich.text import Text
21
from textual.widgets import ScrollView
32

43
class ScrollWindow(ScrollView):

ui/scrollable_area.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from textual.reactive import Reactive
2+
from textual.widgets import Static, ScrollView
3+
4+
class ScrollableArea(ScrollView):
5+
"""A scrollable view for displaying long text content."""
6+
7+
content: Reactive[str] = Reactive("")
8+
9+
def __init__(self, text: str, **kwargs):
10+
super().__init__(**kwargs)
11+
self.border_title = "border_title"
12+
self.content = text
13+
14+
async def on_mount(self) -> None:
15+
"""Called when the widget is mounted."""
16+
# Add the long text to the scrollable area
17+
static = Static(self.content)
18+
await self.update(static)
19+
20+
async def set_text(self, text: str) -> None:
21+
"""Set the text content of the scrollable area."""
22+
self.content = text
23+
static = Static(self.content)
24+
await self.update(static)
25+
26+
async def append_text(self, text: str) -> None:
27+
"""Set the text content of the scrollable area."""
28+
self.content += "\n"
29+
self.content += text
30+
static = Static(self.content)
31+
await self.update(static)
32+
33+
self.window.scroll_y = self.max_scroll_y

0 commit comments

Comments
 (0)