Restructure element classes yet again
This commit is contained in:
parent
c035817ba8
commit
75a5ae5758
3 changed files with 78 additions and 60 deletions
|
|
@ -1,17 +1,85 @@
|
||||||
from dataclasses import dataclass
|
import datetime
|
||||||
from typing import Hashable, Optional
|
from typing import Hashable, List, Optional
|
||||||
|
|
||||||
__all__ = ["Id", "Element", "RenderedElement"]
|
from .markup import AttributedText
|
||||||
|
|
||||||
|
__all__ = ["Id", "Element", "RenderedElement", "Message", "RenderedMessage"]
|
||||||
|
|
||||||
Id = Hashable
|
Id = Hashable
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Element:
|
class Element:
|
||||||
id: Id
|
|
||||||
parent_id: Optional[Id]
|
|
||||||
|
|
||||||
@dataclass
|
def __init__(self,
|
||||||
|
id: Id,
|
||||||
|
parent_id: Optional[Id],
|
||||||
|
) -> None:
|
||||||
|
|
||||||
|
self._id = id
|
||||||
|
self._parent_id = parent_id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def id(self) -> Id:
|
||||||
|
return self._id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def parent_id(self) -> Optional[Id]:
|
||||||
|
return self._parent_id
|
||||||
|
|
||||||
class RenderedElement:
|
class RenderedElement:
|
||||||
id: Id
|
def __init__(self,
|
||||||
meta: AttributedText
|
id: Id,
|
||||||
lines: List[AttributedText]
|
lines: List[AttributedText],
|
||||||
|
) -> None:
|
||||||
|
|
||||||
|
self._id = id
|
||||||
|
self._lines = lines
|
||||||
|
|
||||||
|
@property
|
||||||
|
def id(self) -> Id:
|
||||||
|
return self._id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def lines(self) -> List[AttributedText]:
|
||||||
|
return self._lines
|
||||||
|
|
||||||
|
class Message(Element):
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
id: Id,
|
||||||
|
parent_id: Optional[Id],
|
||||||
|
timestamp: datetime.datetime,
|
||||||
|
nick: str,
|
||||||
|
content: str,
|
||||||
|
) -> None:
|
||||||
|
|
||||||
|
super().__init__(id, parent_id)
|
||||||
|
self._timestamp = timestamp
|
||||||
|
self._nick = nick
|
||||||
|
self._content = content
|
||||||
|
|
||||||
|
@property
|
||||||
|
def timestamp(self) -> datetime.datetime:
|
||||||
|
return self._timestamp
|
||||||
|
|
||||||
|
@property
|
||||||
|
def nick(self) -> str:
|
||||||
|
return self._nick
|
||||||
|
|
||||||
|
@property
|
||||||
|
def content(self) -> str:
|
||||||
|
return self._content
|
||||||
|
|
||||||
|
class RenderedMessage(RenderedElement):
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
id: Id,
|
||||||
|
lines: List[AttributedText],
|
||||||
|
meta: AttributedText,
|
||||||
|
) -> None:
|
||||||
|
|
||||||
|
super().__init__(id, lines)
|
||||||
|
self._meta = meta
|
||||||
|
|
||||||
|
@property
|
||||||
|
def meta(self) -> AttributedText:
|
||||||
|
return self._meta
|
||||||
|
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
from abc import ABC, abstractmethod
|
|
||||||
from typing import Generic, List, TypeVar
|
|
||||||
|
|
||||||
from .element import Element, RenderedElement, MetaRenderedElement
|
|
||||||
from .markup import AttributedText
|
|
||||||
|
|
||||||
__all__ = ["ElementRenderer"]
|
|
||||||
|
|
||||||
E = TypeVar("E", bound=Element)
|
|
||||||
|
|
||||||
class ElementRenderer(ABC, Generic[E]):
|
|
||||||
"""
|
|
||||||
Knows how to render elements.
|
|
||||||
"""
|
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
def render(self, element: E, width: int) -> RenderedElement:
|
|
||||||
pass
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
from abc import ABC, abstractmethod
|
|
||||||
from dataclasses import dataclass
|
|
||||||
from typing import Generic, TypeVar
|
|
||||||
|
|
||||||
from .attributed_lines import AttributedLines
|
|
||||||
from .element import Element, Id
|
|
||||||
from .element_renderer import ElementRenderer
|
|
||||||
from .element_supply import ElementSupply
|
|
||||||
|
|
||||||
__all__ = ["ElementTreeRenderer", "CursorTreeRenderer"]
|
|
||||||
|
|
||||||
E = TypeVar("E", bound=Element)
|
|
||||||
|
|
||||||
class ElementTreeRenderer(ABC, Generic[E]):
|
|
||||||
def __init__(self,
|
|
||||||
supply: ElementSupply[E],
|
|
||||||
renderer: ElementRenderer[E],
|
|
||||||
) -> None:
|
|
||||||
self.supply = supply
|
|
||||||
self.renderer = renderer
|
|
||||||
|
|
||||||
self.lines = AttributedLines()
|
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
def rerender(self) -> None:
|
|
||||||
pass
|
|
||||||
|
|
||||||
class CursorTreeRenderer(ElementTreeRenderer[E]):
|
|
||||||
pass # TODO
|
|
||||||
|
|
||||||
#class HighlightTreeRenderer(ElementTreeRenderer[E]):
|
|
||||||
# pass
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue