Pilgrim/src/pilgrim/ui/screens/edit_diary_modal.py

60 lines
2.6 KiB
Python

from textual.app import ComposeResult
from textual.binding import Binding
from textual.containers import Vertical, Horizontal
from textual.screen import ModalScreen
from textual.widgets import Label, Input, Button
class EditDiaryModal(ModalScreen[tuple[int,str]]):
BINDINGS = [
Binding("escape", "cancel", "Cancel"),
Binding("enter", "edit_diary", "Save",priority=True),
]
def __init__(self, diary_id: int):
super().__init__()
self.diary_id = diary_id
self.current_diary_name = self.app.service_manager.get_travel_diary_service().read_by_id(self.diary_id).name
self.name_input = Input(value=self.current_diary_name, id="edit_diary_name_input", classes="EditDiaryModal-NameInput")
def compose(self) -> ComposeResult:
with Vertical(id="edit_diary_dialog", classes="EditDiaryModal-Dialog"):
yield Label("Edit Diary", classes="EditDiaryModal-Title")
yield Label("New Diary Name:")
yield self.name_input
with Horizontal(classes="EditDiaryModal-ButtonsContainer"):
yield Button("Save", variant="primary", id="save_diary_button", classes="EditDiaryModal-SaveButton")
yield Button("Cancel", variant="default", id="cancel_button", classes="EditDiaryModal-CancelButton")
def on_mount(self) -> None:
"""Focuses on the input field and moves cursor to the end of text."""
self.name_input.focus()
self.name_input.cursor_position = len(self.name_input.value)
def on_button_pressed(self, event: Button.Pressed) -> None:
if event.button.id == "save_diary_button":
self.action_edit_diary()
elif event.button.id == "cancel_button":
self.dismiss(None)
def on_key(self, event):
if event.key == "enter":
self.action_edit_diary()
event.prevent_default()
def action_edit_diary(self) -> None:
new_diary_name = self.name_input.value.strip()
if new_diary_name and new_diary_name != self.current_diary_name:
self.dismiss((self.diary_id, new_diary_name))
elif new_diary_name == self.current_diary_name:
self.notify("No changes made.", severity="warning")
self.dismiss(None)
else:
self.notify("Diary name cannot be empty.", severity="warning")
self.name_input.focus()
def on_input_submitted(self, event: Input.Submitted) -> None:
if event.input.id == "edit_diary_name_input":
self.action_edit_diary()
def action_cancel(self) -> None:
self.dismiss(None)