mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
fix broken align and error logic
This commit is contained in:
@@ -28,7 +28,7 @@ class BasicApp(App):
|
|||||||
Widget(id="uber2-child1"),
|
Widget(id="uber2-child1"),
|
||||||
Widget(id="uber2-child2"),
|
Widget(id="uber2-child2"),
|
||||||
)
|
)
|
||||||
first_child = Placeholder(id="child1", classes={"list-item"})
|
first_child = Placeholder(id="child1", classes="list-item")
|
||||||
uber1 = Widget(
|
uber1 = Widget(
|
||||||
Placeholder(id="child1", classes="list-item"),
|
Placeholder(id="child1", classes="list-item"),
|
||||||
Placeholder(id="child2", classes="list-item"),
|
Placeholder(id="child2", classes="list-item"),
|
||||||
|
|||||||
@@ -504,6 +504,7 @@ class App(Generic[ReturnType], DOMNode):
|
|||||||
try:
|
try:
|
||||||
if self.css_file is not None:
|
if self.css_file is not None:
|
||||||
self.stylesheet.read(self.css_file)
|
self.stylesheet.read(self.css_file)
|
||||||
|
self.stylesheet.parse()
|
||||||
if self.css is not None:
|
if self.css is not None:
|
||||||
self.stylesheet.add_source(
|
self.stylesheet.add_source(
|
||||||
self.css, path=f"<{self.__class__.__name__}>"
|
self.css, path=f"<{self.__class__.__name__}>"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
from typing import Iterable
|
||||||
|
|
||||||
from textual.css._help_renderables import Example, Bullet, HelpText
|
from textual.css._help_renderables import Example, Bullet, HelpText
|
||||||
from textual.css.constants import (
|
from textual.css.constants import (
|
||||||
@@ -229,7 +230,7 @@ def scalar_help_text(
|
|||||||
|
|
||||||
def string_enum_help_text(
|
def string_enum_help_text(
|
||||||
property_name: str,
|
property_name: str,
|
||||||
valid_values: list[str],
|
valid_values: Iterable[str],
|
||||||
context: StylingContext,
|
context: StylingContext,
|
||||||
) -> HelpText:
|
) -> HelpText:
|
||||||
"""Help text to show when the user supplies an invalid value for a string
|
"""Help text to show when the user supplies an invalid value for a string
|
||||||
|
|||||||
@@ -683,7 +683,7 @@ class StylesBuilder:
|
|||||||
|
|
||||||
if token_vertical.name != "token":
|
if token_vertical.name != "token":
|
||||||
align_error(name, token_vertical)
|
align_error(name, token_vertical)
|
||||||
elif token_horizontal.value not in VALID_ALIGN_VERTICAL:
|
elif token_vertical.value not in VALID_ALIGN_VERTICAL:
|
||||||
align_error(name, token_horizontal)
|
align_error(name, token_horizontal)
|
||||||
|
|
||||||
name = name.replace("-", "_")
|
name = name.replace("-", "_")
|
||||||
@@ -693,24 +693,26 @@ class StylesBuilder:
|
|||||||
def process_align_horizontal(self, name: str, tokens: list[Token]) -> None:
|
def process_align_horizontal(self, name: str, tokens: list[Token]) -> None:
|
||||||
try:
|
try:
|
||||||
value = self._process_enum(name, tokens, VALID_ALIGN_HORIZONTAL)
|
value = self._process_enum(name, tokens, VALID_ALIGN_HORIZONTAL)
|
||||||
self.styles._rules[name.replace("-", "_")] = value
|
|
||||||
except StyleValueError:
|
except StyleValueError:
|
||||||
self.error(
|
self.error(
|
||||||
name,
|
name,
|
||||||
tokens[0],
|
tokens[0],
|
||||||
string_enum_help_text(name, VALID_ALIGN_HORIZONTAL, context="css"),
|
string_enum_help_text(name, VALID_ALIGN_HORIZONTAL, context="css"),
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
self.styles._rules[name.replace("-", "_")] = value
|
||||||
|
|
||||||
def process_align_vertical(self, name: str, tokens: list[Token]) -> None:
|
def process_align_vertical(self, name: str, tokens: list[Token]) -> None:
|
||||||
try:
|
try:
|
||||||
value = self._process_enum(name, tokens, VALID_ALIGN_VERTICAL)
|
value = self._process_enum(name, tokens, VALID_ALIGN_VERTICAL)
|
||||||
self.styles._rules[name.replace("-", "_")] = value
|
|
||||||
except StyleValueError:
|
except StyleValueError:
|
||||||
self.error(
|
self.error(
|
||||||
name,
|
name,
|
||||||
tokens[0],
|
tokens[0],
|
||||||
string_enum_help_text(name, VALID_ALIGN_VERTICAL, context="css"),
|
string_enum_help_text(name, VALID_ALIGN_VERTICAL, context="css"),
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
self.styles._rules[name.replace("-", "_")] = value
|
||||||
|
|
||||||
process_content_align = process_align
|
process_content_align = process_align
|
||||||
process_content_align_horizontal = process_align_horizontal
|
process_content_align_horizontal = process_align_horizontal
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ from rich.style import Style
|
|||||||
from rich.syntax import Syntax
|
from rich.syntax import Syntax
|
||||||
from rich.text import Text
|
from rich.text import Text
|
||||||
|
|
||||||
from textual._loop import loop_last
|
from .._loop import loop_last
|
||||||
|
from .. import log
|
||||||
from .errors import StylesheetError
|
from .errors import StylesheetError
|
||||||
from .match import _check_selectors
|
from .match import _check_selectors
|
||||||
from .model import RuleSet
|
from .model import RuleSet
|
||||||
@@ -39,9 +40,9 @@ class StylesheetParseError(StylesheetError):
|
|||||||
|
|
||||||
class StylesheetErrors:
|
class StylesheetErrors:
|
||||||
def __init__(
|
def __init__(
|
||||||
self, stylesheet: "Stylesheet", variables: dict[str, str] | None = None
|
self, rules: list[RuleSet], variables: dict[str, str] | None = None
|
||||||
) -> None:
|
) -> None:
|
||||||
self.stylesheet = stylesheet
|
self.rules = rules
|
||||||
self.variables: dict[str, str] = {}
|
self.variables: dict[str, str] = {}
|
||||||
self._css_variables: dict[str, list[Token]] = {}
|
self._css_variables: dict[str, list[Token]] = {}
|
||||||
if variables:
|
if variables:
|
||||||
@@ -69,7 +70,7 @@ class StylesheetErrors:
|
|||||||
self, console: Console, options: ConsoleOptions
|
self, console: Console, options: ConsoleOptions
|
||||||
) -> RenderableType:
|
) -> RenderableType:
|
||||||
error_count = 0
|
error_count = 0
|
||||||
for rule in self.stylesheet.rules:
|
for rule in self.rules:
|
||||||
for is_last, (token, message) in loop_last(rule.errors):
|
for is_last, (token, message) in loop_last(rule.errors):
|
||||||
error_count += 1
|
error_count += 1
|
||||||
|
|
||||||
@@ -140,10 +141,6 @@ class Stylesheet:
|
|||||||
def css(self) -> str:
|
def css(self) -> str:
|
||||||
return "\n\n".join(rule_set.css for rule_set in self.rules)
|
return "\n\n".join(rule_set.css for rule_set in self.rules)
|
||||||
|
|
||||||
@property
|
|
||||||
def error_renderable(self) -> StylesheetErrors:
|
|
||||||
return StylesheetErrors(self)
|
|
||||||
|
|
||||||
def set_variables(self, variables: dict[str, str]) -> None:
|
def set_variables(self, variables: dict[str, str]) -> None:
|
||||||
"""Set CSS variables.
|
"""Set CSS variables.
|
||||||
|
|
||||||
@@ -226,7 +223,8 @@ class Stylesheet:
|
|||||||
for path, css in self.source.items():
|
for path, css in self.source.items():
|
||||||
css_rules = self._parse_rules(css, path)
|
css_rules = self._parse_rules(css, path)
|
||||||
if any(rule.errors for rule in css_rules):
|
if any(rule.errors for rule in css_rules):
|
||||||
raise StylesheetParseError(self.error_renderable)
|
error_renderable = StylesheetErrors(css_rules)
|
||||||
|
raise StylesheetParseError(error_renderable)
|
||||||
add_rules(css_rules)
|
add_rules(css_rules)
|
||||||
self._rules = rules
|
self._rules = rules
|
||||||
self._require_parse = False
|
self._require_parse = False
|
||||||
@@ -244,7 +242,7 @@ class Stylesheet:
|
|||||||
for path, css in self.source.items():
|
for path, css in self.source.items():
|
||||||
stylesheet.add_source(css, path)
|
stylesheet.add_source(css, path)
|
||||||
stylesheet.parse()
|
stylesheet.parse()
|
||||||
self.rules = stylesheet.rules
|
self._rules = stylesheet.rules
|
||||||
self.source = stylesheet.source
|
self.source = stylesheet.source
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class ScrollBarRender:
|
|||||||
position: float = 0,
|
position: float = 0,
|
||||||
thickness: int = 1,
|
thickness: int = 1,
|
||||||
vertical: bool = True,
|
vertical: bool = True,
|
||||||
style: StyleType = "ansi_bright_magenta on #555555",
|
style: StyleType = "bright_magenta on #555555",
|
||||||
) -> None:
|
) -> None:
|
||||||
self.virtual_size = virtual_size
|
self.virtual_size = virtual_size
|
||||||
self.window_size = window_size
|
self.window_size = window_size
|
||||||
@@ -89,7 +89,7 @@ class ScrollBarRender:
|
|||||||
thickness: int = 1,
|
thickness: int = 1,
|
||||||
vertical: bool = True,
|
vertical: bool = True,
|
||||||
back_color: Color = Color.parse("#555555"),
|
back_color: Color = Color.parse("#555555"),
|
||||||
bar_color: Color = Color.parse("ansi_bright_magenta"),
|
bar_color: Color = Color.parse("bright_magenta"),
|
||||||
) -> Segments:
|
) -> Segments:
|
||||||
|
|
||||||
if vertical:
|
if vertical:
|
||||||
@@ -181,7 +181,7 @@ class ScrollBarRender:
|
|||||||
vertical=self.vertical,
|
vertical=self.vertical,
|
||||||
thickness=thickness,
|
thickness=thickness,
|
||||||
back_color=_style.bgcolor or Color.parse("#555555"),
|
back_color=_style.bgcolor or Color.parse("#555555"),
|
||||||
bar_color=_style.color or Color.parse("ansi_bright_magenta"),
|
bar_color=_style.color or Color.parse("bright_magenta"),
|
||||||
)
|
)
|
||||||
yield bar
|
yield bar
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user