1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
from __future__ import annotations
from textual.app import App, ComposeResult
from textual.containers import Container
from textual.widget import Widget
from textual.widgets import Input, Label, Switch
class BitSwitch(Widget):
"""A Switch with a numeric label above it."""
DEFAULT_CSS = """
BitSwitch {
layout: vertical;
width: auto;
height: auto;
}
BitSwitch > Label {
text-align: center;
width: 100%;
}
"""
def __init__(self, bit: int) -> None:
self.bit = bit
super().__init__()
def compose(self) -> ComposeResult:
yield Label(str(self.bit))
yield Switch()
class ByteInput(Widget):
"""A compound widget with 8 switches."""
DEFAULT_CSS = """
ByteInput {
width: auto;
height: auto;
border: blank;
layout: horizontal;
}
ByteInput:focus-within {
border: heavy $secondary;
}
"""
def compose(self) -> ComposeResult:
for bit in reversed(range(8)):
yield BitSwitch(bit)
class ByteEditor(Widget):
DEFAULT_CSS = """
ByteEditor > Container {
height: 1fr;
align: center middle;
}
ByteEditor > Container.top {
background: $boost;
}
ByteEditor Input {
width: 16;
}
"""
def compose(self) -> ComposeResult:
with Container(classes="top"):
yield Input(placeholder="byte")
with Container():
yield ByteInput()
class ByteInputApp(App):
def compose(self) -> ComposeResult:
yield ByteEditor()
if __name__ == "__main__":
app = ByteInputApp()
app.run()
|