mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
[css] Address PR feedback for our new "scrollbar-size" CSS properties
This commit is contained in:
@@ -74,7 +74,7 @@ App > Screen {
|
|||||||
|
|
||||||
|
|
||||||
Tweet {
|
Tweet {
|
||||||
height: auto;
|
height: 12;
|
||||||
width: 80;
|
width: 80;
|
||||||
|
|
||||||
margin: 1 3;
|
margin: 1 3;
|
||||||
@@ -90,6 +90,15 @@ Tweet {
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Tweet.scrollbar-size-custom {
|
||||||
|
scrollbar-size-vertical: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Tweet.scroll-horizontal {
|
||||||
|
scrollbar-size-horizontal: 2;
|
||||||
|
}
|
||||||
|
|
||||||
.scrollable {
|
.scrollable {
|
||||||
width: 80;
|
width: 80;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
@@ -114,12 +123,15 @@ TweetHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TweetBody {
|
TweetBody {
|
||||||
width: 130%;
|
width: 100%;
|
||||||
background: $panel;
|
background: $panel;
|
||||||
color: $text-panel;
|
color: $text-panel;
|
||||||
height: auto;
|
height: auto;
|
||||||
padding: 0 1 0 0;
|
padding: 0 1 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Tweet.scroll-horizontal TweetBody {
|
||||||
|
width: 130%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
|
|||||||
@@ -107,15 +107,15 @@ class BasicApp(App, css_path="basic.css"):
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
content=Widget(
|
content=Widget(
|
||||||
Tweet(TweetBody(), classes="scrollbar-size-test"),
|
Tweet(TweetBody()),
|
||||||
Widget(
|
Widget(
|
||||||
Static(Syntax(CODE, "python"), classes="code"),
|
Static(Syntax(CODE, "python"), classes="code"),
|
||||||
classes="scrollable",
|
classes="scrollable",
|
||||||
),
|
),
|
||||||
Error(),
|
Error(),
|
||||||
Tweet(TweetBody()),
|
Tweet(TweetBody(), classes="scrollbar-size-custom"),
|
||||||
Warning(),
|
Warning(),
|
||||||
Tweet(TweetBody()),
|
Tweet(TweetBody(), classes="scroll-horizontal"),
|
||||||
Success(),
|
Success(),
|
||||||
),
|
),
|
||||||
footer=Widget(),
|
footer=Widget(),
|
||||||
|
|||||||
@@ -646,7 +646,9 @@ def scrollbar_size_property_help_text(context: StylingContext) -> HelpText:
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
).get_by_context(context),
|
).get_by_context(context),
|
||||||
Bullet("<horizontal> and <vertical> must be positive integers"),
|
Bullet(
|
||||||
|
"<horizontal> and <vertical> must be positive integers, greater than zero"
|
||||||
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -664,7 +666,7 @@ def scrollbar_size_single_axis_help_text(property_name: str) -> HelpText:
|
|||||||
summary=f"Invalid value for [i]{property_name}[/]",
|
summary=f"Invalid value for [i]{property_name}[/]",
|
||||||
bullets=[
|
bullets=[
|
||||||
Bullet(
|
Bullet(
|
||||||
markup=f"The [i]{property_name}[/] property can only be set to a positive integer",
|
markup=f"The [i]{property_name}[/] property can only be set to a positive integer, greather than zero",
|
||||||
examples=[
|
examples=[
|
||||||
Example(f"{property_name}: 2;"),
|
Example(f"{property_name}: 2;"),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -802,7 +802,12 @@ class StylesBuilder:
|
|||||||
if token2.name != "number" or not token2.value.isdigit():
|
if token2.name != "number" or not token2.value.isdigit():
|
||||||
scrollbar_size_error(name, token2)
|
scrollbar_size_error(name, token2)
|
||||||
|
|
||||||
horizontal, vertical = int(token1.value), int(token2.value)
|
horizontal = int(token1.value)
|
||||||
|
if horizontal == 0:
|
||||||
|
scrollbar_size_error(name, token1)
|
||||||
|
vertical = int(token2.value)
|
||||||
|
if vertical == 0:
|
||||||
|
scrollbar_size_error(name, token2)
|
||||||
self.styles._rules["scrollbar_size_horizontal"] = horizontal
|
self.styles._rules["scrollbar_size_horizontal"] = horizontal
|
||||||
self.styles._rules["scrollbar_size_vertical"] = vertical
|
self.styles._rules["scrollbar_size_vertical"] = vertical
|
||||||
|
|
||||||
@@ -815,7 +820,10 @@ class StylesBuilder:
|
|||||||
token = tokens[0]
|
token = tokens[0]
|
||||||
if token.name != "number" or not token.value.isdigit():
|
if token.name != "number" or not token.value.isdigit():
|
||||||
self.error(name, token, scrollbar_size_single_axis_help_text(name))
|
self.error(name, token, scrollbar_size_single_axis_help_text(name))
|
||||||
self.styles._rules["scrollbar_size_vertical"] = int(token.value)
|
value = int(token.value)
|
||||||
|
if value == 0:
|
||||||
|
self.error(name, token, scrollbar_size_single_axis_help_text(name))
|
||||||
|
self.styles._rules["scrollbar_size_vertical"] = value
|
||||||
|
|
||||||
def process_scrollbar_size_horizontal(self, name: str, tokens: list[Token]) -> None:
|
def process_scrollbar_size_horizontal(self, name: str, tokens: list[Token]) -> None:
|
||||||
if not tokens:
|
if not tokens:
|
||||||
@@ -826,7 +834,10 @@ class StylesBuilder:
|
|||||||
token = tokens[0]
|
token = tokens[0]
|
||||||
if token.name != "number" or not token.value.isdigit():
|
if token.name != "number" or not token.value.isdigit():
|
||||||
self.error(name, token, scrollbar_size_single_axis_help_text(name))
|
self.error(name, token, scrollbar_size_single_axis_help_text(name))
|
||||||
self.styles._rules["scrollbar_size_horizontal"] = int(token.value)
|
value = int(token.value)
|
||||||
|
if value == 0:
|
||||||
|
self.error(name, token, scrollbar_size_single_axis_help_text(name))
|
||||||
|
self.styles._rules["scrollbar_size_horizontal"] = value
|
||||||
|
|
||||||
def _get_suggested_property_name_for_rule(self, rule_name: str) -> str | None:
|
def _get_suggested_property_name_for_rule(self, rule_name: str) -> str | None:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -288,13 +288,9 @@ class Widget(DOMNode):
|
|||||||
|
|
||||||
if self._vertical_scrollbar is not None:
|
if self._vertical_scrollbar is not None:
|
||||||
return self._vertical_scrollbar
|
return self._vertical_scrollbar
|
||||||
thickness = (
|
(vertical_scrollbar_thickness, _) = self._get_scrollbar_thicknesses()
|
||||||
1
|
|
||||||
if self.styles.scrollbar_size_vertical is None
|
|
||||||
else int(self.styles.scrollbar_size_vertical.value)
|
|
||||||
)
|
|
||||||
self._vertical_scrollbar = scroll_bar = ScrollBar(
|
self._vertical_scrollbar = scroll_bar = ScrollBar(
|
||||||
vertical=True, name="vertical", thickness=thickness
|
vertical=True, name="vertical", thickness=vertical_scrollbar_thickness
|
||||||
)
|
)
|
||||||
self.app.start_widget(self, scroll_bar)
|
self.app.start_widget(self, scroll_bar)
|
||||||
return scroll_bar
|
return scroll_bar
|
||||||
@@ -310,13 +306,9 @@ class Widget(DOMNode):
|
|||||||
|
|
||||||
if self._horizontal_scrollbar is not None:
|
if self._horizontal_scrollbar is not None:
|
||||||
return self._horizontal_scrollbar
|
return self._horizontal_scrollbar
|
||||||
thickness = (
|
(_, horizontal_scrollbar_thickness) = self._get_scrollbar_thicknesses()
|
||||||
1
|
|
||||||
if self.styles.scrollbar_size_horizontal is None
|
|
||||||
else int(self.styles.scrollbar_size_horizontal.value)
|
|
||||||
)
|
|
||||||
self._horizontal_scrollbar = scroll_bar = ScrollBar(
|
self._horizontal_scrollbar = scroll_bar = ScrollBar(
|
||||||
vertical=False, name="horizontal", thickness=thickness
|
vertical=False, name="horizontal", thickness=horizontal_scrollbar_thickness
|
||||||
)
|
)
|
||||||
|
|
||||||
self.app.start_widget(self, scroll_bar)
|
self.app.start_widget(self, scroll_bar)
|
||||||
@@ -330,9 +322,6 @@ class Widget(DOMNode):
|
|||||||
styles = self.styles
|
styles = self.styles
|
||||||
overflow_x = styles.overflow_x
|
overflow_x = styles.overflow_x
|
||||||
overflow_y = styles.overflow_y
|
overflow_y = styles.overflow_y
|
||||||
scrollbar_size_horizontal = styles.scrollbar_size_horizontal
|
|
||||||
scrollbar_size_vertical = styles.scrollbar_size_vertical
|
|
||||||
overflow_y = styles.overflow_y
|
|
||||||
width, height = self.container_size
|
width, height = self.container_size
|
||||||
|
|
||||||
show_horizontal = self.show_horizontal_scrollbar
|
show_horizontal = self.show_horizontal_scrollbar
|
||||||
@@ -342,11 +331,6 @@ class Widget(DOMNode):
|
|||||||
show_horizontal = True
|
show_horizontal = True
|
||||||
elif overflow_x == "auto":
|
elif overflow_x == "auto":
|
||||||
show_horizontal = self.virtual_size.width > width
|
show_horizontal = self.virtual_size.width > width
|
||||||
if (
|
|
||||||
scrollbar_size_horizontal is not None
|
|
||||||
and scrollbar_size_horizontal.value == 0
|
|
||||||
):
|
|
||||||
show_horizontal = False
|
|
||||||
|
|
||||||
show_vertical = self.show_vertical_scrollbar
|
show_vertical = self.show_vertical_scrollbar
|
||||||
if overflow_y == "hidden":
|
if overflow_y == "hidden":
|
||||||
@@ -355,8 +339,6 @@ class Widget(DOMNode):
|
|||||||
show_vertical = True
|
show_vertical = True
|
||||||
elif overflow_y == "auto":
|
elif overflow_y == "auto":
|
||||||
show_vertical = self.virtual_size.height > height
|
show_vertical = self.virtual_size.height > height
|
||||||
if scrollbar_size_vertical is not None and scrollbar_size_vertical.value == 0:
|
|
||||||
show_vertical = False
|
|
||||||
|
|
||||||
self.show_horizontal_scrollbar = show_horizontal
|
self.show_horizontal_scrollbar = show_horizontal
|
||||||
self.show_vertical_scrollbar = show_vertical
|
self.show_vertical_scrollbar = show_vertical
|
||||||
|
|||||||
@@ -266,8 +266,6 @@ async def test_border_edge_types_impact_on_widget_size(
|
|||||||
("overflow: auto", "scrollbar-size: 3 3"),
|
("overflow: auto", "scrollbar-size: 3 3"),
|
||||||
Size(20, 17),
|
Size(20, 17),
|
||||||
],
|
],
|
||||||
# edge case: scrollbars should not be displayed at all if their size is set to 0
|
|
||||||
[Size(30, 30), ("overflow: auto", "scrollbar-size: 0 0"), Size(20, 20)],
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def test_scrollbar_size_impact_on_the_layout(
|
async def test_scrollbar_size_impact_on_the_layout(
|
||||||
|
|||||||
Reference in New Issue
Block a user