From da1862f3290cd31c3d6a7149dcfb9c48f460b627 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Sun, 22 Sep 2024 18:32:25 +0200 Subject: [PATCH 1/4] create BoxConstraints dataclass --- packages/flet/lib/src/utils/box.dart | 23 +++++++++++++++++++ .../flet-core/src/flet_core/__init__.py | 1 + .../packages/flet-core/src/flet_core/box.py | 8 +++++++ 3 files changed, 32 insertions(+) diff --git a/packages/flet/lib/src/utils/box.dart b/packages/flet/lib/src/utils/box.dart index 6647b27d8..4d92b7227 100644 --- a/packages/flet/lib/src/utils/box.dart +++ b/packages/flet/lib/src/utils/box.dart @@ -18,6 +18,29 @@ import 'numbers.dart'; import 'others.dart'; import 'transforms.dart'; +BoxConstraints? parseBoxConstraints(Control control, String propName) { + var v = control.attrString(propName); + if (v == null) { + return null; + } + + final j1 = json.decode(v); + return boxConstraintsFromJSON(j1); +} + +BoxConstraints? boxConstraintsFromJSON(dynamic json, + [BoxConstraints? defValue]) { + if (json == null) { + return null; + } + return BoxConstraints( + minHeight: parseDouble(json["min_height"], 0.0)!, + minWidth: parseDouble(json["min_width"], 0.0)!, + maxHeight: parseDouble(json["max_height"], 0.0)!, + maxWidth: parseDouble(json["max_width"], 0.0)!, + ); +} + List parseBoxShadow( ThemeData theme, Control control, String propName) { var v = control.attrString(propName); diff --git a/sdk/python/packages/flet-core/src/flet_core/__init__.py b/sdk/python/packages/flet-core/src/flet_core/__init__.py index 0aac0e90e..82ab2376a 100644 --- a/sdk/python/packages/flet-core/src/flet_core/__init__.py +++ b/sdk/python/packages/flet-core/src/flet_core/__init__.py @@ -56,6 +56,7 @@ ShadowBlurStyle, BoxDecoration, BoxShape, + BoxConstraints, DecorationImage, FilterQuality, ColorFilter, diff --git a/sdk/python/packages/flet-core/src/flet_core/box.py b/sdk/python/packages/flet-core/src/flet_core/box.py index c95bdd33d..80243a52c 100644 --- a/sdk/python/packages/flet-core/src/flet_core/box.py +++ b/sdk/python/packages/flet-core/src/flet_core/box.py @@ -75,3 +75,11 @@ class BoxDecoration: gradient: Optional[Gradient] = None shape: Optional[BoxShape] = None blend_mode: Optional[BlendMode] = None + + +@dataclass +class BoxConstraints: + min_width: OptionalNumber = None + min_height: OptionalNumber = None + max_width: OptionalNumber = None + max_height: OptionalNumber = None From 21cba785aace65bf0c184776f88acb1ca336675c Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Sun, 22 Sep 2024 18:35:39 +0200 Subject: [PATCH 2/4] SearchBar new props: view_size_constraints, view_header_height --- .../flet/lib/src/controls/search_anchor.dart | 4 +++ .../flet-core/src/flet_core/search_bar.py | 33 +++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/packages/flet/lib/src/controls/search_anchor.dart b/packages/flet/lib/src/controls/search_anchor.dart index 5731328b2..1f1642e4c 100644 --- a/packages/flet/lib/src/controls/search_anchor.dart +++ b/packages/flet/lib/src/controls/search_anchor.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import '../flet_control_backend.dart'; import '../models/control.dart'; import '../utils/borders.dart'; +import '../utils/box.dart'; import '../utils/colors.dart'; import '../utils/form_field.dart'; import '../utils/text.dart'; @@ -164,6 +165,9 @@ class _SearchAnchorControlState extends State { dividerColor: dividerColor, viewHintText: widget.control.attrString("viewHintText"), viewElevation: widget.control.attrDouble("viewElevation"), + headerHeight: widget.control.attrDouble("viewHeaderHeight"), + viewConstraints: + parseBoxConstraints(widget.control, "viewSizeConstraints"), viewShape: parseOutlinedBorder(widget.control, "viewShape"), viewTrailing: viewTrailingCtrls.isNotEmpty ? viewTrailingCtrls.map((ctrl) { diff --git a/sdk/python/packages/flet-core/src/flet_core/search_bar.py b/sdk/python/packages/flet-core/src/flet_core/search_bar.py index 470c55275..df43ca2f3 100644 --- a/sdk/python/packages/flet-core/src/flet_core/search_bar.py +++ b/sdk/python/packages/flet-core/src/flet_core/search_bar.py @@ -1,6 +1,7 @@ import time from typing import Any, Dict, List, Optional, Union, Sequence +from flet_core import BoxConstraints from flet_core.border import BorderSide from flet_core.buttons import OutlinedBorder from flet_core.constrained_control import ConstrainedControl @@ -49,6 +50,8 @@ def __init__( view_shape: Optional[OutlinedBorder] = None, view_header_text_style: Optional[TextStyle] = None, view_hint_text_style: Optional[TextStyle] = None, + view_size_constraints: Optional[BoxConstraints] = None, + view_header_height: OptionalNumber = None, divider_color: Optional[str] = None, capitalization: Optional[TextCapitalization] = None, full_screen: Optional[bool] = None, @@ -141,6 +144,8 @@ def __init__( self.keyboard_type = keyboard_type self.view_surface_tint_color = view_surface_tint_color self.autofocus = autofocus + self.view_header_height = view_header_height + self.view_size_constraints = view_size_constraints def _get_control_name(self): return "searchbar" @@ -150,12 +155,10 @@ def before_update(self): self._set_attr_json("barBgcolor", self.__bar_bgcolor) self._set_attr_json("barOverlayColor", self.__bar_overlay_color) self._set_attr_json("viewShape", self.__view_shape) - if isinstance(self.__view_header_text_style, TextStyle): - self._set_attr_json("viewHeaderTextStyle", self.__view_header_text_style) - if isinstance(self.__view_hint_text_style, TextStyle): - self._set_attr_json("viewHintTextStyle", self.__view_hint_text_style) - if isinstance(self.__view_side, BorderSide): - self._set_attr_json("viewSide", self.__view_side) + self._set_attr_json("viewHeaderTextStyle", self.__view_header_text_style) + self._set_attr_json("viewHintTextStyle", self.__view_hint_text_style) + self._set_attr_json("viewSide", self.__view_side) + self._set_attr_json("viewSizeConstraints", self.__view_size_constraints) def _get_children(self): children = [] @@ -297,6 +300,15 @@ def view_elevation(self) -> OptionalNumber: def view_elevation(self, value: OptionalNumber): self._set_attr("viewElevation", value) + # view_header_height + @property + def view_header_height(self) -> OptionalNumber: + return self._get_attr("viewHeaderHeight") + + @view_header_height.setter + def view_header_height(self, value: OptionalNumber): + self._set_attr("viewHeaderHeight", value) + # view_bgcolor @property def view_bgcolor(self) -> Optional[str]: @@ -351,6 +363,15 @@ def view_side(self) -> Optional[BorderSide]: def view_side(self, value: Optional[BorderSide]): self.__view_side = value + # view_size_constraints + @property + def view_size_constraints(self) -> Optional[BoxConstraints]: + return self.__view_size_constraints + + @view_size_constraints.setter + def view_size_constraints(self, value: Optional[BoxConstraints]): + self.__view_size_constraints = value + # full_screen @property def full_screen(self) -> bool: From 703da093d1931625be610d0b82d4327399f56dd7 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Fri, 4 Oct 2024 14:25:41 +0200 Subject: [PATCH 3/4] new parseWidgetState* utils: --- packages/flet/lib/src/utils/borders.dart | 12 ++++++ packages/flet/lib/src/utils/colors.dart | 10 ++--- packages/flet/lib/src/utils/edge_insets.dart | 13 +++++++ packages/flet/lib/src/utils/numbers.dart | 39 +++++++++++++++++++ packages/flet/lib/src/utils/text.dart | 11 ++++++ .../flet-core/src/flet_core/control.py | 9 +++++ 6 files changed, 89 insertions(+), 5 deletions(-) diff --git a/packages/flet/lib/src/utils/borders.dart b/packages/flet/lib/src/utils/borders.dart index 467352dfa..7a8dde4cd 100644 --- a/packages/flet/lib/src/utils/borders.dart +++ b/packages/flet/lib/src/utils/borders.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import '../models/control.dart'; import 'colors.dart'; +import 'material_state.dart'; import 'numbers.dart'; BorderRadius? parseBorderRadius(Control control, String propName, @@ -172,3 +173,14 @@ class WidgetStateBorderSideFromJSON extends WidgetStateBorderSide { return _defaultValue; } } + +WidgetStateProperty? parseWidgetStateOutlinedBorder( + Control control, String propName) { + var v = control.attrString(propName, null); + if (v == null) { + return null; + } + + return getWidgetStateProperty( + jsonDecode(v), (jv) => outlinedBorderFromJSON(jv), null); +} \ No newline at end of file diff --git a/packages/flet/lib/src/utils/colors.dart b/packages/flet/lib/src/utils/colors.dart index 4036f7224..bcc7bbe01 100644 --- a/packages/flet/lib/src/utils/colors.dart +++ b/packages/flet/lib/src/utils/colors.dart @@ -239,16 +239,16 @@ extension ColorExtension on Color { } } -WidgetStateProperty? parseWidgetStateColor( - ThemeData theme, Control control, String propName) { +WidgetStateProperty? parseWidgetStateColor(ThemeData theme, + Control control, String propName, + [Color? defaultValue]) { var v = control.attrString(propName, null); if (v == null) { return null; } - final j1 = json.decode(v); - return getWidgetStateProperty( - j1, (jv) => HexColor.fromString(theme, jv as String), null); + return getWidgetStateProperty(jsonDecode(v), + (jv) => HexColor.fromString(theme, jv as String), defaultValue); } Color? parseColor(ThemeData? theme, String? colorString, diff --git a/packages/flet/lib/src/utils/edge_insets.dart b/packages/flet/lib/src/utils/edge_insets.dart index b7ac48e08..0a562b061 100644 --- a/packages/flet/lib/src/utils/edge_insets.dart +++ b/packages/flet/lib/src/utils/edge_insets.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/widgets.dart'; import '../models/control.dart'; +import 'material_state.dart'; import 'numbers.dart'; EdgeInsets? parseEdgeInsets(Control control, String propName, @@ -54,3 +55,15 @@ EdgeInsetsDirectional? edgeInsetsDirectionalFromJson(dynamic json, parseDouble(json['r'], 0)!, parseDouble(json['b'], 0)!); } + +WidgetStateProperty? parseWidgetStateEdgeInsets( + Control control, String propName, + [EdgeInsets? defaultValue]) { + var v = control.attrString(propName, null); + if (v == null) { + return null; + } + + return getWidgetStateProperty( + jsonDecode(v), (jv) => edgeInsetsFromJson(jv), defaultValue); +} diff --git a/packages/flet/lib/src/utils/numbers.dart b/packages/flet/lib/src/utils/numbers.dart index 269df0b5b..6ce9d231b 100644 --- a/packages/flet/lib/src/utils/numbers.dart +++ b/packages/flet/lib/src/utils/numbers.dart @@ -1,3 +1,10 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import '../models/control.dart'; +import 'material_state.dart'; + double? parseDouble(dynamic v, [double? defValue]) { if (v is double) { return v; @@ -8,6 +15,17 @@ double? parseDouble(dynamic v, [double? defValue]) { } } +WidgetStateProperty? parseWidgetStateDouble( + Control control, String propName, + [double? defaultValue]) { + var v = control.attrString(propName, null); + if (v == null) { + return null; + } + return getWidgetStateProperty( + jsonDecode(v), (jv) => parseDouble(jv), defaultValue); +} + int? parseInt(dynamic v, [int? defValue]) { if (v is int) { return v; @@ -18,6 +36,16 @@ int? parseInt(dynamic v, [int? defValue]) { } } +WidgetStateProperty? parseWidgetStateInt(Control control, String propName, + [int? defaultValue]) { + var v = control.attrString(propName, null); + if (v == null) { + return null; + } + return getWidgetStateProperty( + jsonDecode(v), (jv) => parseInt(jv), defaultValue); +} + bool? parseBool(dynamic v, [bool? defValue]) { if (v is bool) { return v; @@ -27,3 +55,14 @@ bool? parseBool(dynamic v, [bool? defValue]) { return "true" == v.toString().toLowerCase(); } } + +WidgetStateProperty? parseWidgetStateBool( + Control control, String propName, + [bool? defaultValue]) { + var v = control.attrString(propName, null); + if (v == null) { + return null; + } + return getWidgetStateProperty( + jsonDecode(v), (jv) => parseBool(jv), defaultValue); +} diff --git a/packages/flet/lib/src/utils/text.dart b/packages/flet/lib/src/utils/text.dart index 6867244cb..ac178b5b4 100644 --- a/packages/flet/lib/src/utils/text.dart +++ b/packages/flet/lib/src/utils/text.dart @@ -11,6 +11,7 @@ import '../utils/drawing.dart'; import '../utils/numbers.dart'; import 'colors.dart'; import 'launch_url.dart'; +import 'material_state.dart'; TextStyle? getTextStyle(BuildContext context, String styleName) { var textTheme = Theme.of(context).textTheme; @@ -243,3 +244,13 @@ TextStyle? textStyleFromJson(ThemeData theme, Map? json) { textBaseline: parseTextBaseline(json['text_baseline']), ); } + +WidgetStateProperty? parseWidgetStateTextStyle( + ThemeData theme, Control control, String propName) { + var v = control.attrString(propName); + if (v == null) { + return null; + } + return getWidgetStateProperty( + jsonDecode(v), (jv) => textStyleFromJson(theme, jv), null); +} diff --git a/sdk/python/packages/flet-core/src/flet_core/control.py b/sdk/python/packages/flet-core/src/flet_core/control.py index e5a9bb643..28727d7bc 100644 --- a/sdk/python/packages/flet-core/src/flet_core/control.py +++ b/sdk/python/packages/flet-core/src/flet_core/control.py @@ -23,6 +23,7 @@ ResponsiveNumber, SupportsStr, OptionalControlEventCallable, + ControlState, ) from flet_core.utils import deprecated @@ -179,6 +180,14 @@ def _set_attr_json(self, name: str, value: V) -> None: if ov != nv: self._set_attr(name, nv) + def _set_control_state_attr_json(self, name: str, value: V) -> None: + if value is not None and not isinstance(value, dict): + value = {ControlState.DEFAULT: value} + ov = self._get_attr(name) + nv = self._convert_attr_json(value) + if ov != nv: + self._set_attr(name, nv) + def _convert_attr_json(self, value: V) -> str: return ( json.dumps(value, cls=EmbedJsonEncoder, separators=(",", ":")) From 4c1c8c71544c34d4393f5756fe006fe4a5746499 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Fri, 4 Oct 2024 14:26:37 +0200 Subject: [PATCH 4/4] SearchBar: expose more props --- .../flet/lib/src/controls/search_anchor.dart | 34 ++++- .../flet-core/src/flet_core/search_bar.py | 140 +++++++++++++++++- 2 files changed, 164 insertions(+), 10 deletions(-) diff --git a/packages/flet/lib/src/controls/search_anchor.dart b/packages/flet/lib/src/controls/search_anchor.dart index 1f1642e4c..f62cc00f4 100644 --- a/packages/flet/lib/src/controls/search_anchor.dart +++ b/packages/flet/lib/src/controls/search_anchor.dart @@ -7,7 +7,9 @@ import '../models/control.dart'; import '../utils/borders.dart'; import '../utils/box.dart'; import '../utils/colors.dart'; +import '../utils/edge_insets.dart'; import '../utils/form_field.dart'; +import '../utils/numbers.dart'; import '../utils/text.dart'; import 'create_control.dart'; @@ -53,7 +55,7 @@ class _SearchAnchorControlState extends State { }); widget.backend.triggerControlEvent( widget.control.id, _focusNode.hasFocus ? "focus" : "blur"); - } + } @override void dispose() { @@ -207,6 +209,19 @@ class _SearchAnchorControlState extends State { autoFocus: widget.control.attrBool("autoFocus", false)!, focusNode: _focusNode, hintText: widget.control.attrString("barHintText"), + elevation: parseWidgetStateDouble(widget.control, "barElevation"), + shape: parseWidgetStateOutlinedBorder(widget.control, "barShape"), + padding: parseWidgetStateEdgeInsets(widget.control, "barPadding"), + textStyle: parseWidgetStateTextStyle( + Theme.of(context), widget.control, "barTextStyle"), + hintStyle: parseWidgetStateTextStyle( + Theme.of(context), widget.control, "barHintTextStyle"), + shadowColor: parseWidgetStateColor( + Theme.of(context), widget.control, "barShadowColor"), + surfaceTintColor: parseWidgetStateColor( + Theme.of(context), widget.control, "barSurfaceTintColor"), + side: parseWidgetStateBorderSide( + Theme.of(context), widget.control, "barBorderSide"), backgroundColor: parseWidgetStateColor( Theme.of(context), widget.control, "barBgcolor"), overlayColor: parseWidgetStateColor( @@ -222,11 +237,18 @@ class _SearchAnchorControlState extends State { parentAdaptive: widget.parentAdaptive); }) : null, - onTap: () { - if (onTap) { - widget.backend.triggerControlEvent(widget.control.id, "tap"); - } - }, + onTap: onTap + ? () { + widget.backend + .triggerControlEvent(widget.control.id, "tap"); + } + : null, + onTapOutside: widget.control.attrBool("onTapOutsideBar", false)! + ? (PointerDownEvent? event) { + widget.backend.triggerControlEvent( + widget.control.id, "tapOutsideBar"); + } + : null, onSubmitted: onSubmit ? (String value) { debugPrint("SearchBar.onSubmit: $value"); diff --git a/sdk/python/packages/flet-core/src/flet_core/search_bar.py b/sdk/python/packages/flet-core/src/flet_core/search_bar.py index df43ca2f3..413bd8306 100644 --- a/sdk/python/packages/flet-core/src/flet_core/search_bar.py +++ b/sdk/python/packages/flet-core/src/flet_core/search_bar.py @@ -19,6 +19,8 @@ RotateValue, ScaleValue, OptionalControlEventCallable, + Number, + PaddingValue, ) from flet_core.utils import deprecated @@ -41,6 +43,18 @@ def __init__( bar_hint_text: Optional[str] = None, bar_bgcolor: Union[None, str, Dict[ControlState, str]] = None, bar_overlay_color: Union[None, str, Dict[ControlState, str]] = None, + bar_shadow_color: Union[None, str, Dict[ControlState, str]] = None, + bar_surface_tint_color: Union[None, str, Dict[ControlState, str]] = None, + bar_elevation: Union[OptionalNumber, Dict[ControlState, Number]] = None, + bar_border_side: Union[None, BorderSide, Dict[ControlState, BorderSide]] = None, + bar_shape: Union[ + None, OutlinedBorder, Dict[ControlState, OutlinedBorder] + ] = None, + bar_text_style: Union[None, TextStyle, Dict[ControlState, TextStyle]] = None, + bar_hint_text_style: Union[ + None, TextStyle, Dict[ControlState, TextStyle] + ] = None, + bar_padding: Union[PaddingValue, Dict[ControlState, PaddingValue]] = None, view_leading: Optional[Control] = None, view_trailing: Optional[List[Control]] = None, view_elevation: OptionalNumber = None, @@ -50,8 +64,8 @@ def __init__( view_shape: Optional[OutlinedBorder] = None, view_header_text_style: Optional[TextStyle] = None, view_hint_text_style: Optional[TextStyle] = None, - view_size_constraints: Optional[BoxConstraints] = None, - view_header_height: OptionalNumber = None, + view_size_constraints: Optional[BoxConstraints] = None, + view_header_height: OptionalNumber = None, divider_color: Optional[str] = None, capitalization: Optional[TextCapitalization] = None, full_screen: Optional[bool] = None, @@ -59,6 +73,7 @@ def __init__( view_surface_tint_color: Optional[str] = None, autofocus: Optional[bool] = None, on_tap: OptionalControlEventCallable = None, + on_tap_outside_bar: OptionalControlEventCallable = None, on_submit: OptionalControlEventCallable = None, on_change: OptionalControlEventCallable = None, on_focus: OptionalControlEventCallable = None, @@ -141,19 +156,40 @@ def __init__( self.on_tap = on_tap self.on_submit = on_submit self.on_change = on_change + self.on_tap_outside_bar = on_tap_outside_bar self.keyboard_type = keyboard_type self.view_surface_tint_color = view_surface_tint_color self.autofocus = autofocus self.view_header_height = view_header_height self.view_size_constraints = view_size_constraints + self.bar_surface_tint_color = bar_surface_tint_color + self.bar_elevation = bar_elevation + self.bar_border_side = bar_border_side + self.bar_shape = bar_shape + self.bar_text_style = bar_text_style + self.bar_hint_text_style = bar_hint_text_style + self.bar_padding = bar_padding + self.bar_shadow_color = bar_shadow_color def _get_control_name(self): return "searchbar" def before_update(self): super().before_update() - self._set_attr_json("barBgcolor", self.__bar_bgcolor) - self._set_attr_json("barOverlayColor", self.__bar_overlay_color) + self._set_control_state_attr_json("barBgcolor", self.__bar_bgcolor) + self._set_control_state_attr_json("barOverlayColor", self.__bar_overlay_color) + self._set_control_state_attr_json( + "barHintTextStyle", self.__bar_hint_text_style + ) + self._set_control_state_attr_json( + "barSurfaceTintColor", self.__bar_surface_tint_color + ) + self._set_control_state_attr_json("barElevation", self.__bar_elevation) + self._set_control_state_attr_json("barBorderSide", self.__bar_border_side) + self._set_control_state_attr_json("barShape", self.__bar_shape) + self._set_control_state_attr_json("barTextStyle", self.__bar_text_style) + self._set_control_state_attr_json("barPadding", self.__bar_padding) + self._set_control_state_attr_json("barShadowColor", self.__bar_shadow_color) self._set_attr_json("viewShape", self.__view_shape) self._set_attr_json("viewHeaderTextStyle", self.__view_header_text_style) self._set_attr_json("viewHintTextStyle", self.__view_hint_text_style) @@ -255,6 +291,92 @@ def bar_overlay_color(self) -> Union[None, str, Dict[ControlState, str]]: def bar_overlay_color(self, value: Union[None, str, Dict[ControlState, str]]): self.__bar_overlay_color = value + # bar_shadow_color + @property + def bar_shadow_color(self) -> Union[None, str, Dict[ControlState, str]]: + return self.__bar_shadow_color + + @bar_shadow_color.setter + def bar_shadow_color(self, value: Union[None, str, Dict[ControlState, str]]): + self.__bar_shadow_color = value + + # bar_surface_tint_color + @property + def bar_surface_tint_color(self) -> Union[None, str, Dict[ControlState, str]]: + return self.__bar_surface_tint_color + + @bar_surface_tint_color.setter + def bar_surface_tint_color(self, value: Union[None, str, Dict[ControlState, str]]): + self.__bar_surface_tint_color = value + + # bar_elevation + @property + def bar_elevation(self) -> Union[OptionalNumber, Dict[ControlState, Number]]: + return self.__bar_elevation + + @bar_elevation.setter + def bar_elevation(self, value: Union[OptionalNumber, Dict[ControlState, Number]]): + self.__bar_elevation = value + + # bar_border_side + @property + def bar_border_side( + self, + ) -> Union[None, BorderSide, Dict[ControlState, BorderSide]]: + return self.__bar_border_side + + @bar_border_side.setter + def bar_border_side( + self, value: Union[None, BorderSide, Dict[ControlState, BorderSide]] + ): + self.__bar_border_side = value + + # bar_shape + @property + def bar_shape( + self, + ) -> Union[None, OutlinedBorder, Dict[ControlState, OutlinedBorder]]: + return self.__bar_shape + + @bar_shape.setter + def bar_shape( + self, value: Union[None, OutlinedBorder, Dict[ControlState, OutlinedBorder]] + ): + self.__bar_shape = value + + # bar_text_style + @property + def bar_text_style(self) -> Union[None, TextStyle, Dict[ControlState, TextStyle]]: + return self.__bar_text_style + + @bar_text_style.setter + def bar_text_style( + self, value: Union[None, TextStyle, Dict[ControlState, TextStyle]] + ): + self.__bar_text_style = value + + # bar_hint_text_style + @property + def bar_hint_text_style( + self, + ) -> Union[None, TextStyle, Dict[ControlState, TextStyle]]: + return self.__bar_hint_text_style + + @bar_hint_text_style.setter + def bar_hint_text_style( + self, value: Union[None, TextStyle, Dict[ControlState, TextStyle]] + ): + self.__bar_hint_text_style = value + + # bar_padding + @property + def bar_padding(self) -> Union[PaddingValue, Dict[ControlState, PaddingValue]]: + return self.__bar_padding + + @bar_padding.setter + def bar_padding(self, value: Union[PaddingValue, Dict[ControlState, PaddingValue]]): + self.__bar_padding = value + # view_leading @property def view_leading(self) -> Optional[Control]: @@ -475,6 +597,16 @@ def on_tap(self, handler: OptionalControlEventCallable): self._add_event_handler("tap", handler) self._set_attr("ontap", True if handler is not None else None) + # on_tap_outside_bar + @property + def on_tap_outside_bar(self) -> OptionalControlEventCallable: + return self._get_event_handler("tapOutsideBar") + + @on_tap_outside_bar.setter + def on_tap_outside_bar(self, handler: OptionalControlEventCallable): + self._add_event_handler("tapOutsideBar", handler) + self._set_attr("onTapOutsideBar", True if handler is not None else None) + # on_submit @property def on_submit(self) -> OptionalControlEventCallable: