2026-03-08 14:09:43 +11:00
|
|
|
from textual.containers import Vertical, VerticalScroll, VerticalGroup, HorizontalGroup
|
2026-03-08 07:40:27 +11:00
|
|
|
from textual.widgets import Input, Button, Static
|
2026-03-08 14:09:43 +11:00
|
|
|
from api.message import Message
|
|
|
|
|
from api.node import MeshNode
|
2026-03-08 07:40:27 +11:00
|
|
|
|
|
|
|
|
|
2026-03-08 14:09:43 +11:00
|
|
|
class MessageView(VerticalGroup):
|
|
|
|
|
DEFAULT_CSS = """
|
|
|
|
|
MessageView {
|
|
|
|
|
margin-bottom: 1;
|
|
|
|
|
|
|
|
|
|
#message-text {
|
|
|
|
|
background: $surface;
|
|
|
|
|
padding: 1;
|
|
|
|
|
width: auto;
|
|
|
|
|
max-width: 25;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#triangle {
|
|
|
|
|
color: $surface;
|
|
|
|
|
width: auto;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
&.right {
|
|
|
|
|
align-horizontal: right;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, message: Message):
|
2026-03-08 07:40:27 +11:00
|
|
|
super().__init__()
|
2026-03-08 14:09:43 +11:00
|
|
|
self.message = message
|
|
|
|
|
|
|
|
|
|
if self.message.sender != self.app.mesh_node:
|
|
|
|
|
self.notify("right side")
|
|
|
|
|
self.add_class("right")
|
|
|
|
|
|
|
|
|
|
def compose(self):
|
|
|
|
|
user_name = self.message.sender.name
|
|
|
|
|
if self.message.sender == self.app.mesh_node:
|
|
|
|
|
user_name += " (You)"
|
|
|
|
|
|
|
|
|
|
yield Static(f"[b u cyan]{user_name}[/]\n{self.message.content}", id="message-text")
|
|
|
|
|
yield Static("", id="triangle")
|
2026-03-08 07:40:27 +11:00
|
|
|
|
|
|
|
|
class ChatWindow(Vertical):
|
2026-03-08 14:09:43 +11:00
|
|
|
DEFAULT_CSS = """
|
|
|
|
|
ChatWindow {
|
|
|
|
|
#message-history {
|
|
|
|
|
padding: 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#message-box {
|
|
|
|
|
margin-right: 2;
|
|
|
|
|
align: left middle;
|
|
|
|
|
|
|
|
|
|
#message-input {
|
|
|
|
|
margin: 1;
|
|
|
|
|
width: 90%;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#send-btn {
|
|
|
|
|
max-width: 10%;
|
|
|
|
|
margin: 1 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
"""
|
|
|
|
|
|
2026-03-08 07:40:27 +11:00
|
|
|
def compose(self):
|
2026-03-08 14:09:43 +11:00
|
|
|
with VerticalScroll(id="message-history"):
|
|
|
|
|
fake = MeshNode(None, self.app)
|
|
|
|
|
fake.name = "billy"
|
|
|
|
|
yield MessageView(Message("hi!!!", fake))
|
|
|
|
|
yield MessageView(Message("hi!!!", fake))
|
|
|
|
|
yield MessageView(Message("hi!!!", self.app.mesh_node))
|
2026-03-08 07:40:27 +11:00
|
|
|
|
2026-03-08 14:09:43 +11:00
|
|
|
with HorizontalGroup(id="message-box"):
|
|
|
|
|
yield Input(placeholder="Send a message", id="message-input")
|
|
|
|
|
yield Button("", flat=True, id="send-btn")
|