Restructure element classes yet again

This commit is contained in:
Joscha 2019-06-06 14:13:35 +00:00
parent c035817ba8
commit 75a5ae5758
3 changed files with 78 additions and 60 deletions

View file

@ -1,17 +1,85 @@
from dataclasses import dataclass
from typing import Hashable, Optional
import datetime
from typing import Hashable, List, Optional
__all__ = ["Id", "Element", "RenderedElement"]
from .markup import AttributedText
__all__ = ["Id", "Element", "RenderedElement", "Message", "RenderedMessage"]
Id = Hashable
@dataclass
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:
id: Id
meta: AttributedText
lines: List[AttributedText]
def __init__(self,
id: Id,
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

View file

@ -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

View file

@ -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