From 7460d784b63e7fca9014c1838a8c1350b0c80e13 Mon Sep 17 00:00:00 2001 From: SpookyDervish Date: Fri, 23 Jan 2026 18:06:07 +1100 Subject: [PATCH] add search and back button to docs --- dig/docs.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++- setup.py | 3 ++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/dig/docs.py b/dig/docs.py index fe82d49..afdd5e6 100644 --- a/dig/docs.py +++ b/dig/docs.py @@ -3,7 +3,10 @@ import os, sys from rich.console import Console from textual.app import App, ComposeResult -from textual.widgets import MarkdownViewer, Header, Footer +from textual.widgets import MarkdownViewer, Header, Footer, Input, Button +from textual.containers import Horizontal +from textual_autocomplete import PathAutoComplete +from textual import on console = Console() @@ -13,9 +16,45 @@ class DocsApp(App): TITLE = "Digpkg Docs" SUB_TITLE = "made with ❤️ by SpookyDervish" + CSS = """ + #search { + margin: 1; + width: 1fr; + } + + #back { + margin-top: 1; + margin-left: 1; + } + + #bottom { + height: 5; + } + """ + def __init__(self, inital_markdown_path: str): + super().__init__() self.inital_markdown_path = inital_markdown_path + self.docs_folder = os.path.join(os.path.dirname(self.inital_markdown_path), "docs") + + async def on_input_submitted(self, event: Input.Submitted): + if event.input.id == "search": + + if not os.path.isdir(self.docs_folder): + return + + file_path = os.path.join(self.docs_folder, event.input.value) + if os.path.isfile(file_path): + event.input.clear() + event.input.focus() + await self.query_one(MarkdownViewer).go(file_path) + else: + self.notify("That file wasn't found.", title="Uh oh", severity="error") + + async def on_button_pressed(self, event: Button.Pressed): + if event.button.id == "back": + await self.query_one(MarkdownViewer).back() def compose(self) -> ComposeResult: with open(self.inital_markdown_path, "r") as f: @@ -23,6 +62,22 @@ class DocsApp(App): yield Header() yield MarkdownViewer(markdown) + + with Horizontal(id="bottom"): + yield Button(label="Back", id="back", flat=True, variant="error") + search_input = Input(id="search", placeholder="Search . . .") + yield search_input + + + if os.path.isdir(self.docs_folder): + yield PathAutoComplete( + search_input, + path=self.docs_folder + ) + else: + search_input.disabled = True + search_input.tooltip = "This mineral doesn't have a docs folder and can't be searched." + yield Footer() diff --git a/setup.py b/setup.py index 483f796..e977101 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,8 @@ setup( packages=find_packages(), install_requires=[ "textual>=7.3.0", - "requests>=2.32.5" + "requests>=2.32.5", + "textual-autocomplete>=4.0.6" ], entry_points={ "console_scripts": [