This commit is contained in:
Will McGugan
2021-10-26 17:35:59 +01:00
parent 942b00f255
commit 0732247d1a
6 changed files with 89 additions and 19 deletions

View File

@@ -8,7 +8,7 @@ from rich.style import Style
from ..geometry import Offset, Spacing, SpacingDimensions
from .constants import NULL_SPACING, VALID_EDGE
from .errors import StyleValueError
from .errors import StyleTypeError, StyleValueError
from ._error_tools import friendly_list
if TYPE_CHECKING:
@@ -215,12 +215,15 @@ class DockEdgeProperty:
class IntegerProperty:
def __set_name__(self, owner: Styles, name: str) -> None:
self._name = name
self._internal_name = f"_{name}"
def __get__(self, obj: Styles, objtype: type[Styles] | None = None) -> int:
return getattr(obj, self._internal_name, 0)
def __set__(self, obj: Styles, value: int | None) -> int | None:
if not isinstance(value, int):
raise StyleTypeError(f"{self._name} must be a str")
setattr(obj, self._internal_name, value)
return value
@@ -235,7 +238,7 @@ class StringProperty:
self._internal_name = f"_{name}"
def __get__(self, obj: Styles, objtype: type[Styles] | None = None) -> str:
return getattr(obj, self._internal_name, self._default)
return getattr(obj, self._internal_name, None) or self._default
def __set__(self, obj: Styles, value: str | None = None) -> str | None:
if value is not None:
@@ -245,3 +248,42 @@ class StringProperty:
)
setattr(obj, self._internal_name, value)
return value
class NameProperty:
def __set_name__(self, owner: Styles, name: str) -> None:
self._name = name
self._internal_name = f"_{name}"
def __get__(self, obj: Styles, objtype: type[Styles] | None) -> str:
return getattr(obj, self._internal_name, None) or ""
def __set__(self, obj: Styles, name: str | None) -> str | None:
if not isinstance(name, str):
raise StyleTypeError(f"{self._name} must be a str")
setattr(obj, self._internal_name, name)
return name
class NameListProperty:
def __set_name__(self, owner: Styles, name: str) -> None:
self._name = name
self._internal_name = f"_{name}"
def __get__(
self, obj: Styles, objtype: type[Styles] | None = None
) -> tuple[str, ...]:
return getattr(obj, self._internal_name, None) or ()
def __set__(
self, obj: Styles, names: str | tuple[str] | None = None
) -> str | tuple[str] | None:
names_value: tuple[str, ...] | None = None
if isinstance(names, str):
names_value = tuple(name.strip().lower() for name in names.split(" "))
elif isinstance(names, tuple):
names_value = names
elif names is None:
names_value = None
setattr(obj, self._internal_name, names_value)
return names

View File

@@ -7,6 +7,10 @@ class DeclarationError(Exception):
super().__init__(message)
class StyleTypeError(TypeError):
pass
class StyleValueError(ValueError):
pass

View File

@@ -1,26 +1,23 @@
view.buttons {
layout: dock
layout: dock;
}
.buttons .button {
dock: top
size: 10px
dock: top;
size: 10px;
}
#widget {
visibility: visible;
text-style: bold;
visibility: visible;
text-style: bold;
border: dashed !important;
border-top: dashed green;
border-bottom: red;
border: dashed !important;
border-top: dashed green;
border-bottom: red;
padding: 1 0;
margin: 1;
layout: dock
dock-edge: left;
padding: 1 0;
margin: 1;
layout: dock;
dock-edge: left;
}

View File

@@ -23,6 +23,8 @@ from ._style_properties import (
DockGroupProperty,
IntegerProperty,
OffsetProperty,
NameProperty,
NameListProperty,
SpacingProperty,
StringProperty,
StyleProperty,
@@ -61,6 +63,9 @@ class Styles:
_dock_edge: str | None = None
_docks: tuple[str, ...] | None = None
_layers: str | None = None
_layer: tuple[str, ...] | None = None
important: set[str] = field(default_factory=set)
display = StringProperty(VALID_DISPLAY, "block")
@@ -93,6 +98,9 @@ class Styles:
docks = DocksProperty()
dock_edge = DockEdgeProperty()
layer = NameProperty()
layers = NameListProperty()
@property
def has_border(self) -> bool:
"""Check in a border is present."""
@@ -117,6 +125,8 @@ class Styles:
yield "padding", self.padding, NULL_SPACING
yield "text", self.text, ""
yield "visibility", self.visibility, "visible"
yield "layers", self.layers, ()
yield "layer", self.layer, ""
if self.important:
yield "important", self.important
@@ -196,6 +206,11 @@ class Styles:
append_declaration("docks", " ".join(self._docks))
if self._dock_edge:
append_declaration("dock-edge", self._dock_edge)
if self._layers is not None:
append_declaration("layers", " ".join(self.layers))
if self._layer is not None:
append_declaration("layer", self.layer)
lines.sort()
return lines
@@ -214,6 +229,7 @@ if __name__ == "__main__":
styles.docks = "foo bar"
styles.text = "italic blue"
styles.dock_group = "bar"
styles.layers = "foo bar"
from rich import inspect, print

View File

@@ -6,18 +6,25 @@ from operator import itemgetter
from logging import getLogger
from itertools import cycle, product
import sys
from typing import Iterable, NamedTuple
from typing import Iterable, NamedTuple, TYPE_CHECKING
from .._layout_resolve import layout_resolve
from ..geometry import Size, Offset, Region
from ..layout import Layout, WidgetPlacement
from ..widget import Widget
if TYPE_CHECKING:
from ..widget import Widget
from ..view import View
if sys.version_info >= (3, 8):
from typing import Literal
else:
from typing_extensions import Literal
log = getLogger("rich")
GridAlign = Literal["start", "end", "center", "stretch"]

View File

@@ -1,12 +1,16 @@
from __future__ import annotations
from typing import Iterable
from typing import Iterable, TYPE_CHECKING
from ..geometry import Offset, Region, Size, Spacing, SpacingDimensions
from ..layout import Layout, WidgetPlacement
from ..widget import Widget
from .._loop import loop_last
if TYPE_CHECKING:
from ..widget import Widget
from ..view import View
class VerticalLayout(Layout):
def __init__(