Source code for abacura.abacura

"""Main Textual App and Entrypoint"""
from pathlib import Path
import sys
from typing import TYPE_CHECKING, Dict, Optional
from collections import OrderedDict

import click
from serum import Context, inject
from textual.app import App
from textual.binding import Binding
from textual.screen import Screen


from abacura.config import Config
from abacura.mud.session import Session
from abacura.utils import pycharm

if TYPE_CHECKING:
    from typing_extensions import Self

[docs]@inject class Abacura(App): """A Textual mudclient""" screens: Dict[Session, Screen] config: Config inspector: bool = False AUTO_FOCUS = "InputBar" CSS_PATH = ["./css/abacura.css"] SCREENS = {} START_SESSION: Optional[str] = None BINDINGS = [ ("ctrl+d", "toggle_dark", "Toggle dark mode"), ("ctrl+q", "quit", "Quit"), ("f3", "reload_config", "f3"), Binding("f12", "toggle_inspector", ("Toggle Inspector")), ] def __init__(self): super().__init__() self.sessions: OrderedDict[str, Session] = OrderedDict() self.session = "null"
[docs] def on_mount(self) -> None: """When app is mounted, create first session""" self.create_session("null") if self.START_SESSION: self.sessions["null"].connect(self.START_SESSION)
[docs] def create_session(self, name: str) -> None: """Create a session""" with Context(config=self.config, abacura=self): self.sessions[name] = Session(name) self.session = name
[docs] def set_session(self, id: str) -> None: self.session = id self.push_screen(id) self.query_one(AbacuraFooter).session = id
[docs] def action_reload_config(self) -> None: tl = self.sessions[self.session].tl self.config.reload() tl.markup = True tl.write(f"[bold red]# CONFIG: Reloaded configuration file") tl.markup = False
[docs] def action_toggle_inspector(self) -> None: if self.inspector: from abacura import Inspector insp = self.query_one(Inspector) insp.display = not insp.display if not insp.display: insp.picking = False
@click.command() @click.option("-c","--config", 'config') @click.option("-d", "--debug", "debug", type=str) @click.option("-s", "--start", "start", type=str) @click.option("-i", "--inspector", "inspector", is_flag=True, default=False) def main(config, debug, start, inspector): if debug: host, port = debug.split(":") pycharm.PycharmDebugger().connect(host, int(port)) """Entry point for client""" _config = Config(config=config) mods_to_load = _config.get_specific_option("global","module_paths") if mods_to_load: if isinstance(mods_to_load, list): for path in mods_to_load: sys.path.append(str(Path(path).expanduser())) else: sys.path.append(str(Path(mods_to_load).expanduser())) usercss = _config.get_specific_option("global", "css_path") if usercss: if isinstance(usercss, str): usercss = [usercss] usercss.extend(Abacura.CSS_PATH) Abacura.CSS_PATH = usercss with Context(config=_config, inspector=inspector): app = Abacura() Abacura.START_SESSION = start app.run() if getattr(sys, 'frozen', False): main(sys.argv[1:])