OPEN SOURCE
software/src/tui/app.py
このサイトで読み、必要なファイルを保存できます。
日常訳はAIを用いて作成された翻訳です。人間の聖書学・原語の専門家による全訳の検証は確認されていません。既存の翻訳や原語資料と照らし合わせてお読みください。
1"""Main Textual application for the Translation Viewer TUI."""23from __future__ import annotations45from pathlib import Path67from textual.app import App, ComposeResult8from textual.binding import Binding9from textual.containers import Horizontal, ScrollableContainer10from textual.widgets import Footer, Header1112from src.tui.data_provider import TUIDataProvider13from src.tui.widgets import DetailPanel, VerseSelected, VerseTree141516class TranslationViewerApp(App):17"""TUI for viewing Bible translations and evaluations."""1819TITLE = "Japanese Bible Translator Viewer"20CSS = """21Screen {22layout: horizontal;23}2425#tree-container {26width: 30%;27min-width: 25;28height: 100%;29border: solid $primary;30}3132#tree {33width: 100%;34height: 100%;35}3637#detail-container {38width: 70%;39height: 100%;40border: solid $secondary;41}4243#detail {44width: 100%;45height: auto;46padding: 1;47}48"""4950BINDINGS = [51Binding("q", "quit", "Quit"),52Binding("d", "toggle_dark_mode", "Toggle dark mode"),53Binding("r", "refresh", "Refresh"),54]5556def __init__(self, data_dir: Path | str = "data") -> None:57"""Initialize the app.5859Args:60data_dir: Path to the data directory.61"""62super().__init__()63self.data_dir = Path(data_dir)64self.data_provider = TUIDataProvider(self.data_dir)6566def compose(self) -> ComposeResult: # pragma: no cover67"""Compose the application layout."""68yield Header()69with Horizontal():70with ScrollableContainer(id="tree-container"):71yield VerseTree(self.data_provider, id="tree")72with ScrollableContainer(id="detail-container"):73yield DetailPanel(self.data_provider, id="detail")74yield Footer()7576def on_verse_selected(self, message: VerseSelected) -> None: # pragma: no cover77"""Handle verse selection from the tree."""78detail_panel = self.query_one("#detail", DetailPanel)79detail_panel.update_verse(message.book, message.chapter, message.verse)8081def action_toggle_dark_mode(self) -> None: # pragma: no cover82"""Toggle dark mode."""83self.theme = (84"textual-light" if self.theme == "textual-dark" else "textual-dark"85)8687def action_refresh(self) -> None: # pragma: no cover88"""Refresh the tree view."""89tree = self.query_one("#tree", VerseTree)90tree.clear()91tree._populate_tree()929394def run_tui(data_dir: Path | str = "data") -> None: # pragma: no cover95"""Run the TUI application.9697Args:98data_dir: Path to the data directory.99"""100app = TranslationViewerApp(data_dir=data_dir)101app.run()102103104if __name__ == "__main__":105run_tui()106