Source code for svgen.element.mixins
"""
A module implementing svg element mixin classes.
"""
# built-in
from typing import Iterator, Optional
# internal
from svgen.attribute import Attribute, SimpleAttribute
from svgen.cartesian.rectangle import Rectangle
from svgen.color import Color, Colorlike
from svgen.element import Element
[docs]
class RectangularMixin:
"""A class mixin for rectangular entities."""
has_dimensions = True
def __init__(self, rect: Rectangle) -> None:
"""Initialize this instance."""
self.rect = rect
self.location = self.rect.location
self.dimensions = self.rect.dimensions
@property
def rect_attributes(self) -> Iterator[Attribute]:
"""Get attributes for this instance."""
yield from self.location.attrs
if self.has_dimensions:
yield from self.dimensions.attrs
[docs]
class RadiusXyMixin:
"""A class mixin for entities with 'rx' and 'ry' attributes."""
def __init__(self, rx: float = 0.0, ry: float = 0.0) -> None:
"""Initialize this instance."""
self.rx = rx
self.ry = ry
@property
def radius_xy_attributes(self) -> Iterator[Attribute]:
"""Get attributes for this instance."""
yield SimpleAttribute("rx", str(self.rx))
yield SimpleAttribute("ry", str(self.ry))
[docs]
class FillColorMixin(Element):
"""A mixin class for elements with a 'fill' color attribute."""
_fill_color: Optional[Color] = None
@property
def has_fill_color(self) -> bool:
"""Determine if this instance has a fill color."""
return self._fill_color is not None
@property
def fill_color(self) -> Color:
"""Get the fill color for this instance."""
assert self._fill_color is not None, "No fill color for this element!"
return self._fill_color
[docs]
def assign_fill_color(self, data: Colorlike) -> None:
"""Assign a fill color for this instance."""
assert not self.has_fill_color, (self._fill_color, data)
self._fill_color = Color.create(data)
self.style.add_color(self.fill_color, "fill")