公開前の確認用サイト
日常訳NICHIJOYAKUEnglish ↗

OPEN SOURCE

software/src/tui/app.py

このサイトで読み、必要なファイルを保存できます。

日常訳はAIを用いて作成された翻訳です。人間の聖書学・原語の専門家による全訳の検証は確認されていません。既存の翻訳や原語資料と照らし合わせてお読みください。

← オープンソースの案内へ

software/src/tui/app.py106 行このファイルを保存 ↓

ZIPに含まれるものと同じ公開ソースです。行番号から、その行へのリンクを保存できます。

ファイルの確認情報SHA-256 aa4d12dd463a36dfa4cc3b0c380da4e343d008bdc7d62f30e7c8d84bcd1b6af7
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."""1819    TITLE = "Japanese Bible Translator Viewer"20    CSS = """21    Screen {22        layout: horizontal;23    }2425    #tree-container {26        width: 30%;27        min-width: 25;28        height: 100%;29        border: solid $primary;30    }3132    #tree {33        width: 100%;34        height: 100%;35    }3637    #detail-container {38        width: 70%;39        height: 100%;40        border: solid $secondary;41    }4243    #detail {44        width: 100%;45        height: auto;46        padding: 1;47    }48    """4950    BINDINGS = [51        Binding("q", "quit", "Quit"),52        Binding("d", "toggle_dark_mode", "Toggle dark mode"),53        Binding("r", "refresh", "Refresh"),54    ]5556    def __init__(self, data_dir: Path | str = "data") -> None:57        """Initialize the app.5859        Args:60            data_dir: Path to the data directory.61        """62        super().__init__()63        self.data_dir = Path(data_dir)64        self.data_provider = TUIDataProvider(self.data_dir)6566    def compose(self) -> ComposeResult:  # pragma: no cover67        """Compose the application layout."""68        yield Header()69        with Horizontal():70            with ScrollableContainer(id="tree-container"):71                yield VerseTree(self.data_provider, id="tree")72            with ScrollableContainer(id="detail-container"):73                yield DetailPanel(self.data_provider, id="detail")74        yield Footer()7576    def on_verse_selected(self, message: VerseSelected) -> None:  # pragma: no cover77        """Handle verse selection from the tree."""78        detail_panel = self.query_one("#detail", DetailPanel)79        detail_panel.update_verse(message.book, message.chapter, message.verse)8081    def action_toggle_dark_mode(self) -> None:  # pragma: no cover82        """Toggle dark mode."""83        self.theme = (84            "textual-light" if self.theme == "textual-dark" else "textual-dark"85        )8687    def action_refresh(self) -> None:  # pragma: no cover88        """Refresh the tree view."""89        tree = self.query_one("#tree", VerseTree)90        tree.clear()91        tree._populate_tree()929394def run_tui(data_dir: Path | str = "data") -> None:  # pragma: no cover95    """Run the TUI application.9697    Args:98        data_dir: Path to the data directory.99    """100    app = TranslationViewerApp(data_dir=data_dir)101    app.run()102103104if __name__ == "__main__":105    run_tui()106