Skip to content

Commit 6c4e475

Browse files
authored
Added TextStyle for the Text control (#2270)
* add TextStyle for Text * fix * add theme_style * fix types * fix types * change to _before_build_command() * fix
1 parent cf82811 commit 6c4e475

File tree

4 files changed

+70
-15
lines changed

4 files changed

+70
-15
lines changed

package/lib/src/controls/text.dart

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ class TextControl extends StatelessWidget {
1717
final Control control;
1818
final bool parentDisabled;
1919

20-
const TextControl(
21-
{super.key,
22-
required this.parent,
23-
required this.control,
24-
required this.parentDisabled});
20+
const TextControl({
21+
super.key,
22+
required this.parent,
23+
required this.control,
24+
required this.parentDisabled,
25+
});
2526

2627
@override
2728
Widget build(BuildContext context) {
@@ -34,16 +35,39 @@ class TextControl extends StatelessWidget {
3435
bool disabled = control.isDisabled || parentDisabled;
3536

3637
String text = control.attrString("value", "")!;
37-
List<InlineSpan>? spans = parseTextSpans(Theme.of(context), viewModel,
38-
disabled, FletAppServices.of(context).server);
38+
List<InlineSpan>? spans = parseTextSpans(
39+
Theme.of(context),
40+
viewModel,
41+
disabled,
42+
FletAppServices.of(context).server,
43+
);
3944
String? semanticsLabel = control.attrString("semanticsLabel");
4045
bool noWrap = control.attrBool("noWrap", false)!;
4146
int? maxLines = control.attrInt("maxLines");
4247

4348
TextStyle? style;
44-
var styleName = control.attrString("style", null);
49+
var styleNameOrData = control.attrString("style", null);
50+
if (styleNameOrData != null) {
51+
style = getTextStyle(context, styleNameOrData);
52+
}
53+
if (style == null && styleNameOrData != null) {
54+
try {
55+
style = parseTextStyle(Theme.of(context), control, "style");
56+
} on FormatException catch (_) {
57+
style = null;
58+
}
59+
}
60+
61+
TextStyle? themeStyle;
62+
var styleName = control.attrString("theme_style", null);
4563
if (styleName != null) {
46-
style = getTextStyle(context, styleName);
64+
themeStyle = getTextStyle(context, styleName);
65+
}
66+
67+
if (style == null && themeStyle != null) {
68+
style = themeStyle;
69+
} else if (style != null && themeStyle != null) {
70+
style = themeStyle.merge(style);
4771
}
4872

4973
var fontWeight = control.attrString("weight", "")!;
@@ -57,8 +81,12 @@ class TextControl extends StatelessWidget {
5781
style = (style ?? const TextStyle()).copyWith(
5882
fontSize: control.attrDouble("size", null),
5983
fontWeight: getFontWeight(fontWeight),
60-
fontStyle:
61-
control.attrBool("italic", false)! ? FontStyle.italic : null,
84+
fontStyle: control.attrBool(
85+
"italic",
86+
false,
87+
)!
88+
? FontStyle.italic
89+
: null,
6290
fontFamily: control.attrString("fontFamily"),
6391
fontVariations: variations,
6492
color: HexColor.fromString(

package/lib/src/utils/text.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ TextStyle textStyleFromJson(ThemeData theme, Map<String, dynamic> json) {
181181
: null,
182182
fontFamily: json["font_family"],
183183
fontVariations: variations,
184+
height: json["height"] != null ? parseDouble(json["height"]) : null,
184185
decoration:
185186
decorations.isNotEmpty ? TextDecoration.combine(decorations) : null,
186187
decorationStyle: json["decoration_style"] != null

sdk/python/packages/flet-core/src/flet_core/text.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import dataclasses
12
from enum import Enum
23
from typing import Any, List, Optional, Union
34

45
from flet_core.constrained_control import ConstrainedControl
56
from flet_core.control import OptionalNumber
67
from flet_core.ref import Ref
78
from flet_core.text_span import TextSpan
9+
from flet_core.text_style import TextStyle
810
from flet_core.types import (
911
AnimationValue,
1012
FontWeight,
@@ -137,7 +139,8 @@ def __init__(
137139
size: OptionalNumber = None,
138140
weight: Optional[FontWeight] = None,
139141
italic: Optional[bool] = None,
140-
style: Optional[TextThemeStyle] = None,
142+
style: Optional[Union[TextThemeStyle, TextStyle]] = None,
143+
theme_style: Optional[TextThemeStyle] = None,
141144
max_lines: Optional[int] = None,
142145
overflow: TextOverflow = TextOverflow.NONE,
143146
selectable: Optional[bool] = None,
@@ -185,6 +188,7 @@ def __init__(
185188
self.italic = italic
186189
self.no_wrap = no_wrap
187190
self.style = style
191+
self.theme_style = theme_style
188192
self.max_lines = max_lines
189193
self.overflow = overflow
190194
self.selectable = selectable
@@ -199,6 +203,11 @@ def _get_children(self):
199203
children = []
200204
children.extend(self.__spans)
201205
return children
206+
207+
def _before_build_command(self):
208+
super()._before_build_command()
209+
if dataclasses.is_dataclass(self.__style):
210+
self._set_attr_json("style", self.__style)
202211

203212
# value
204213
@property
@@ -270,20 +279,36 @@ def __set_weight(self, value: FontWeightString):
270279

271280
# style
272281
@property
273-
def style(self) -> Optional[TextThemeStyle]:
282+
def style(self) -> Optional[Union[TextThemeStyle, TextStyle, TextThemeStyleString]]:
274283
return self.__style
275284

276285
@style.setter
277-
def style(self, value: Optional[TextThemeStyle]):
286+
def style(self, value: Optional[Union[TextThemeStyle, TextStyle, TextThemeStyleString]]):
278287
self.__style = value
279288
if isinstance(value, TextThemeStyle):
280289
self._set_attr("style", value.value)
281290
else:
282291
self.__set_style(value)
283292

284-
def __set_style(self, value: Optional[TextThemeStyleString]):
293+
def __set_style(self, value: Optional[Union[TextStyle, TextThemeStyleString]]):
285294
self._set_attr("style", value)
286295

296+
# theme_style
297+
@property
298+
def theme_style(self) -> Optional[Union[TextThemeStyle, TextThemeStyleString]]:
299+
return self.__theme_style
300+
301+
@theme_style.setter
302+
def theme_style(self, value: Optional[Union[TextThemeStyle, TextThemeStyleString]]):
303+
self.__theme_style = value
304+
if isinstance(value, TextThemeStyle):
305+
self._set_attr("theme_style", value.value)
306+
else:
307+
self.__set_theme_style(value)
308+
309+
def __set_theme_style(self, value: Optional[TextThemeStyleString]):
310+
self._set_attr("theme_style", value)
311+
287312
# italic
288313
@property
289314
def italic(self) -> Optional[bool]:

sdk/python/packages/flet-core/src/flet_core/text_style.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class TextDecorationStyle(Enum):
2727
@dataclasses.dataclass
2828
class TextStyle:
2929
size: Union[None, int, float] = field(default=None)
30+
height: Union[None, int, float] = field(default=None)
3031
weight: Optional[FontWeight] = field(default=None)
3132
italic: Optional[bool] = field(default=None)
3233
decoration: Optional[TextDecoration] = field(default=None)

0 commit comments

Comments
 (0)