diff --git a/cheuph/euphoria/euph_config.py b/cheuph/euphoria/euph_config.py index 938b749..562e287 100644 --- a/cheuph/euphoria/euph_config.py +++ b/cheuph/euphoria/euph_config.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, TypeVar +from typing import Any, Dict, List, Optional, Set, TypeVar from ..config import (ConfigValueException, Kind, Option, TransparentConfig, TreeLoader) @@ -10,6 +10,8 @@ class EuphConfig(TransparentConfig): def __init__(self, parent: Optional[TransparentConfig] = None) -> None: super().__init__(parent) + # basic styles + @property def room_style(self) -> str: return self["visual.room_style"] @@ -84,6 +86,46 @@ class EuphConfig(TransparentConfig): def cursor_fill_style(self) -> str: return self["visual.cursor.fill.style"] + # indent + + @property + def indent_width(self) -> int: + return self["visual.indent.width"] + + @property + def indent_char(self) -> str: + return self["visual.indent.char"] + + @property + def indent_fill(self) -> str: + return self["visual.indent.fill"] + + @property + def indent_style(self) -> str: + return self["visual.indent.style"] + + @property + def indent_cursor_char(self) -> str: + return self["visual.indent.cursor.char"] + + @property + def indent_cursor_corner(self) -> str: + return self["visual.indent.cursor.corner"] + + @property + def indent_cursor_fill(self) -> str: + return self["visual.indent.cursor.fill"] + + @property + def indent_cursor_style(self) -> str: + return self["visual.indent.cursor.style"] + + # other + + @property + def scrolloff(self) -> int: + return self["visual.scrolloff"] + @property def palette(self) -> Any: return self["palette"] @@ -95,6 +137,8 @@ class EuphLoader(TreeLoader): "bold": {"fg": "bold"}, "gray": {"fg": "dark gray"}, + "cursor": {"fg": "bold, light green"}, + "room": {"fg": "bold, light blue"}, "nick": {"fg": "light cyan"}, "own_nick": {"fg": "yellow"}, @@ -105,12 +149,15 @@ class EuphLoader(TreeLoader): # Various conditions SINGLE_CHAR = (lambda x: len(x) == 1, "must be single character") + AT_LEAST_0 = (lambda x: x >= 0, "must be at least 0") + AT_LEAST_1 = (lambda x: x >= 1, "must be at least 1") def __init__(self) -> None: super().__init__() self._styles: Set[str] = set() + # basic styles self.add_style("visual.room_style", "room") self.add_style("visual.nick_style", "nick") self.add_style("visual.own_nick_style", "own_nick") @@ -124,18 +171,31 @@ class EuphLoader(TreeLoader): self.add_style("visual.meta.style", "none") # surround - self.add("visual.surround.left", Kind.STR, "[", [self.SINGLE_CHAR]) - self.add("visual.surround.right", Kind.STR, "]", [self.SINGLE_CHAR]) - self.add_style("visual.surround.style", "none") + self.add("visual.surround.left", Kind.STR, "[", self.SINGLE_CHAR) + self.add("visual.surround.right", Kind.STR, "]", self.SINGLE_CHAR) + self.add_style("visual.surround.style", "bold") # cursor - self.add("visual.cursor.surround.left", Kind.STR, "<", [self.SINGLE_CHAR]) - self.add("visual.cursor.surround.right", Kind.STR, ">", [self.SINGLE_CHAR]) - self.add_style("visual.cursor.surround.style", "none") - self.add_style("visual.cursor.own_nick_style", "own_nick") - self.add("visual.cursor.fill.char", Kind.STR, " ", [self.SINGLE_CHAR]) + self.add("visual.cursor.surround.left", Kind.STR, "<", self.SINGLE_CHAR) + self.add("visual.cursor.surround.right", Kind.STR, ">", self.SINGLE_CHAR) + self.add_style("visual.cursor.surround.style", "cursor") + self.add_style("visual.cursor.own_nick_style", "cursor") + self.add("visual.cursor.fill.char", Kind.STR, " ", self.SINGLE_CHAR) self.add_style("visual.cursor.fill.style", "none") + # indent + self.add("visual.indent.width", Kind.INT, 2, self.AT_LEAST_1) + self.add("visual.indent.char", Kind.STR, "│", self.SINGLE_CHAR) + self.add("visual.indent.fill", Kind.STR, " ", self.SINGLE_CHAR) + self.add_style("visual.indent.style", "gray") + self.add("visual.indent.cursor.char", Kind.STR, "┃", self.SINGLE_CHAR) + self.add("visual.indent.cursor.corner", Kind.STR, "┗", self.SINGLE_CHAR) + self.add("visual.indent.cursor.fill", Kind.STR, "━", self.SINGLE_CHAR) + self.add_style("visual.indent.cursor.style", "cursor") + + # other + self.add("visual.scrolloff", Kind.INT, 3, self.AT_LEAST_0) + self.add("styles", Kind.DICT, self.DEFAULT_STYLES) def add_style(self, name: str, default: str) -> None: diff --git a/cheuph/euphoria/room_widget.py b/cheuph/euphoria/room_widget.py index c843cc3..ea44c0c 100644 --- a/cheuph/euphoria/room_widget.py +++ b/cheuph/euphoria/room_widget.py @@ -2,16 +2,17 @@ import asyncio from typing import Any, Awaitable, Callable, List, Optional, Tuple, TypeVar import urwid + import yaboli from ..attributed_text_widget import ATWidget -from ..cursor_rendering import CursorTreeRenderer +from ..cursor_rendering import CursorRenderer, CursorTreeRenderer from ..cursor_tree_widget import CursorTreeWidget from ..element import Message, RenderedMessage -from ..element_supply import InMemorySupply -from .euph_config import EuphConfig +from ..element_supply import ElementSupply, InMemorySupply from ..markup import AT, AttributedText, Attributes from .edit_widgets import EditWidget +from .euph_config import EuphConfig from .euph_renderer import EuphRenderer __all__ = ["RoomWidget"] @@ -185,7 +186,8 @@ class RoomWidget(urwid.WidgetWrap): self._supply = InMemorySupply[Message]() self._renderer = self._create_euph_renderer() - self._tree = CursorTreeRenderer[Message](self._supply, self._renderer) + self._tree = self._create_cursor_tree_renderer(self._supply, + self._renderer) # All of the widgets @@ -243,6 +245,23 @@ class RoomWidget(urwid.WidgetWrap): own_nick_attrs={"style": self.c.own_nick_style}, ) + def _create_cursor_tree_renderer(self, + supply: ElementSupply, + renderer: CursorRenderer, + ) -> CursorTreeRenderer: + + return CursorTreeRenderer(supply, renderer, + indent_width=self.c.indent_width, + indent=self.c.indent_char, + indent_fill=self.c.indent_fill, + indent_attrs={"style": self.c.indent_style}, + cursor_indent=self.c.indent_cursor_char, + cursor_corner=self.c.indent_cursor_corner, + cursor_fill=self.c.indent_cursor_fill, + cursor_indent_attrs={"style": self.c.indent_cursor_style}, + scrolloff=self.c.scrolloff, + ) + def _create_connecting_widget(self) -> Any: text = ( AT("Connecting to ") +