diff --git a/packages/flet/lib/src/controls/icon.dart b/packages/flet/lib/src/controls/icon.dart index d3c9f4065..fdf6e8cb4 100644 --- a/packages/flet/lib/src/controls/icon.dart +++ b/packages/flet/lib/src/controls/icon.dart @@ -18,7 +18,7 @@ class IconControl extends StatelessWidget { return constrainedControl( context, Icon( - parseIcon(control.attrString("name", "")!), + parseIcon(control.attrString("icon", "")!), size: control.attrDouble("size"), color: control.attrColor("color", context), semanticLabel: control.attrString("semanticsLabel"), diff --git a/packages/flet/lib/src/utils/icons.dart b/packages/flet/lib/src/utils/icons.dart index 2d2b82af9..ff4f2b323 100644 --- a/packages/flet/lib/src/utils/icons.dart +++ b/packages/flet/lib/src/utils/icons.dart @@ -7,11 +7,32 @@ import 'cupertino_icons.dart'; import 'material_icons.dart'; import 'material_state.dart'; -IconData? parseIcon(String? iconName, [IconData? defaultIcon]) { - if (iconName == null) { +IconData? parseIcon(String? icon, [IconData? defaultIcon]) { + if (icon == null) { return defaultIcon; } - return materialIcons[iconName.toLowerCase()] ?? cupertinoIcons[iconName.toLowerCase()]; + + final j1 = json.decode(icon); + return iconDataFromJson(j1, defaultIcon); +} + + +IconData? iconDataFromJson(dynamic json, [IconData? defaultIcon]) { + if (json == null) { + return defaultIcon; + } else if (json is String) { + String icon = json.toLowerCase(); + return materialIcons[icon] ?? cupertinoIcons[icon]; + } + return IconData( + json['code_point'] as int, + fontFamily: json['font_family'] as String?, + fontPackage: json['font_package'] as String?, + matchTextDirection: json['match_text_direction'] as bool? ?? false, + fontFamilyFallback: (json['font_family_fallback'] as List?) + ?.map((item) => item as String) + .toList(), + ); } WidgetStateProperty? parseWidgetStateIcon( diff --git a/sdk/python/packages/flet/src/flet/core/control.py b/sdk/python/packages/flet/src/flet/core/control.py index e09cba3e5..b98a72411 100644 --- a/sdk/python/packages/flet/src/flet/core/control.py +++ b/sdk/python/packages/flet/src/flet/core/control.py @@ -194,12 +194,12 @@ def _set_attr_json(self, name: str, value: V, wrap_attr_dict: bool = False) -> N if ov != nv: self._set_attr(name, nv) + def _set_attr_icon(self, name: str, value) -> None: + self._set_attr_json(name, value.value if isinstance(value, Enum) else value) + def _convert_attr_json(self, value: V) -> Optional[str]: - return ( - json.dumps(value, cls=EmbedJsonEncoder, separators=(",", ":")) - if value is not None - else None - ) + if value is not None: + return json.dumps(value, cls=EmbedJsonEncoder, separators=(",", ":")) def _wrap_attr_dict(self, value: Optional[Union[Dict, Any]]) -> Optional[Dict]: if value is None or isinstance(value, Dict): diff --git a/sdk/python/packages/flet/src/flet/core/cupertino_button.py b/sdk/python/packages/flet/src/flet/core/cupertino_button.py index c3390408b..37de47ca3 100644 --- a/sdk/python/packages/flet/src/flet/core/cupertino_button.py +++ b/sdk/python/packages/flet/src/flet/core/cupertino_button.py @@ -167,7 +167,7 @@ def icon(self): @icon.setter def icon(self, value): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # icon_color @property diff --git a/sdk/python/packages/flet/src/flet/core/cupertino_context_menu_action.py b/sdk/python/packages/flet/src/flet/core/cupertino_context_menu_action.py index d1a535ae0..f2598d6a3 100644 --- a/sdk/python/packages/flet/src/flet/core/cupertino_context_menu_action.py +++ b/sdk/python/packages/flet/src/flet/core/cupertino_context_menu_action.py @@ -81,7 +81,7 @@ def trailing_icon(self) -> Optional[IconValue]: @trailing_icon.setter def trailing_icon(self, value: Optional[IconValue]): self.__trailing_icon = value - self._set_enum_attr("trailingIcon", value, IconEnums) + self._set_attr_icon("trailingIcon", value) # text @property diff --git a/sdk/python/packages/flet/src/flet/core/date_picker.py b/sdk/python/packages/flet/src/flet/core/date_picker.py index fb570d060..666a374b6 100644 --- a/sdk/python/packages/flet/src/flet/core/date_picker.py +++ b/sdk/python/packages/flet/src/flet/core/date_picker.py @@ -321,7 +321,7 @@ def switch_to_calendar_icon(self) -> Optional[IconValue]: @switch_to_calendar_icon.setter def switch_to_calendar_icon(self, value: Optional[IconValue]): self.__switch_to_calendar_icon = value - self._set_enum_attr("switchToCalendarEntryModeIcon", value, IconEnums) + self._set_attr_icon("switchToCalendarEntryModeIcon", value) # switch_to_input_icon @property @@ -331,7 +331,7 @@ def switch_to_input_icon(self) -> Optional[IconValue]: @switch_to_input_icon.setter def switch_to_input_icon(self, value: Optional[IconValue]): self.__switch_to_input_icon = value - self._set_enum_attr("switchToInputEntryModeIcon", value, IconEnums) + self._set_attr_icon("switchToInputEntryModeIcon", value) # on_change @property diff --git a/sdk/python/packages/flet/src/flet/core/dropdown.py b/sdk/python/packages/flet/src/flet/core/dropdown.py index c490e37b9..83fb1a4ea 100644 --- a/sdk/python/packages/flet/src/flet/core/dropdown.py +++ b/sdk/python/packages/flet/src/flet/core/dropdown.py @@ -424,7 +424,7 @@ def select_icon(self) -> Optional[IconValueOrControl]: @select_icon.setter def select_icon(self, value: Optional[IconValueOrControl]): self.__select_icon = value - self._set_enum_attr("selectIcon", value, IconEnums) + self._set_attr_icon("selectIcon", value) # icon_content @property diff --git a/sdk/python/packages/flet/src/flet/core/elevated_button.py b/sdk/python/packages/flet/src/flet/core/elevated_button.py index f57a144dd..ab9389e1b 100644 --- a/sdk/python/packages/flet/src/flet/core/elevated_button.py +++ b/sdk/python/packages/flet/src/flet/core/elevated_button.py @@ -237,7 +237,7 @@ def icon(self) -> Optional[IconValue]: @icon.setter def icon(self, value: Optional[IconValue]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # icon_color @property diff --git a/sdk/python/packages/flet/src/flet/core/floating_action_button.py b/sdk/python/packages/flet/src/flet/core/floating_action_button.py index 5a4b12eba..c2fe6cdd0 100644 --- a/sdk/python/packages/flet/src/flet/core/floating_action_button.py +++ b/sdk/python/packages/flet/src/flet/core/floating_action_button.py @@ -212,7 +212,7 @@ def icon(self) -> Optional[IconValue]: @icon.setter def icon(self, value: Optional[IconValue]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # bgcolor @property diff --git a/sdk/python/packages/flet/src/flet/core/form_field_control.py b/sdk/python/packages/flet/src/flet/core/form_field_control.py index 2ab597900..c8eaabdd6 100644 --- a/sdk/python/packages/flet/src/flet/core/form_field_control.py +++ b/sdk/python/packages/flet/src/flet/core/form_field_control.py @@ -230,11 +230,11 @@ def before_update(self): ) self._set_attr_json("sizeConstraints", self.__size_constraints) if isinstance(self.__suffix_icon, str): - self._set_attr("suffixIcon", self.__suffix_icon) + self._set_attr_icon("suffixIcon", self.__suffix_icon) if isinstance(self.__prefix_icon, str): - self._set_attr("prefixIcon", self.__prefix_icon) + self._set_attr_icon("prefixIcon", self.__prefix_icon) if isinstance(self.__icon, str): - self._set_attr("icon", self.__icon) + self._set_attr_icon("icon", self.__icon) if isinstance(self.__label, str): self._set_attr("label", self.__label) @@ -300,7 +300,7 @@ def icon(self) -> Optional[IconValueOrControl]: @icon.setter def icon(self, value: Optional[IconValueOrControl]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # border @property @@ -653,7 +653,7 @@ def prefix_icon(self) -> Optional[IconValueOrControl]: @prefix_icon.setter def prefix_icon(self, value: Optional[IconValueOrControl]): self.__prefix_icon = value - self._set_enum_attr("prefixIcon", value, IconEnums) + self._set_attr_icon("prefixIcon", value) # prefix_text @property @@ -690,7 +690,7 @@ def suffix_icon(self) -> Optional[IconValueOrControl]: @suffix_icon.setter def suffix_icon(self, value: Optional[IconValueOrControl]): self.__suffix_icon = value - self._set_enum_attr("suffixIcon", value, IconEnums) + self._set_attr_icon("suffixIcon", value) # suffix_text @property diff --git a/sdk/python/packages/flet/src/flet/core/icon.py b/sdk/python/packages/flet/src/flet/core/icon.py index 5af67aa7b..1c9ea8d7a 100644 --- a/sdk/python/packages/flet/src/flet/core/icon.py +++ b/sdk/python/packages/flet/src/flet/core/icon.py @@ -53,7 +53,7 @@ def main(page: ft.Page): def __init__( self, - name: Optional[IconValue] = None, + icon: Optional[IconValue] = None, color: Optional[ColorValue] = None, size: OptionalNumber = None, semantics_label: Optional[str] = None, @@ -135,13 +135,13 @@ def before_update(self): # name @property - def name(self) -> Optional[IconValue]: - return self.__name + def icon(self) -> Optional[IconValue]: + return self.__icon - @name.setter - def name(self, value: Optional[IconValue]): - self.__name = value - self._set_enum_attr("name", value, IconEnums) + @icon.setter + def icon(self, value: Optional[IconValue]): + self.__icon = value + self._set_attr_icon("icon", value) # color @property diff --git a/sdk/python/packages/flet/src/flet/core/icon_button.py b/sdk/python/packages/flet/src/flet/core/icon_button.py index 5b1f85d74..e94f133f8 100644 --- a/sdk/python/packages/flet/src/flet/core/icon_button.py +++ b/sdk/python/packages/flet/src/flet/core/icon_button.py @@ -223,7 +223,7 @@ def icon(self) -> Optional[IconValue]: @icon.setter def icon(self, value: Optional[IconValue]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # selected_icon @property @@ -233,7 +233,7 @@ def selected_icon(self) -> Optional[IconValue]: @selected_icon.setter def selected_icon(self, value: Optional[IconValue]): self.__selected_icon = value - self._set_enum_attr("selectedIcon", value, IconEnums) + self._set_attr_icon("selectedIcon", value) # icon_size @property diff --git a/sdk/python/packages/flet/src/flet/core/icon_data.py b/sdk/python/packages/flet/src/flet/core/icon_data.py new file mode 100644 index 000000000..3753b9dc3 --- /dev/null +++ b/sdk/python/packages/flet/src/flet/core/icon_data.py @@ -0,0 +1,11 @@ +from dataclasses import dataclass +from typing import Optional, List + + +@dataclass +class IconData: + code_point: int + font_family: Optional[str] = None + font_package: Optional[str] = None + match_text_direction: bool = False + font_family_fallback: Optional[List[str]] = None diff --git a/sdk/python/packages/flet/src/flet/core/navigation_bar.py b/sdk/python/packages/flet/src/flet/core/navigation_bar.py index f160c79fb..89ce67f43 100644 --- a/sdk/python/packages/flet/src/flet/core/navigation_bar.py +++ b/sdk/python/packages/flet/src/flet/core/navigation_bar.py @@ -104,7 +104,7 @@ def icon(self) -> Optional[IconValueOrControl]: @icon.setter def icon(self, value: Optional[IconValueOrControl]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # icon_content @property @@ -136,7 +136,7 @@ def selected_icon(self) -> Optional[IconValueOrControl]: @selected_icon.setter def selected_icon(self, value: Optional[IconValueOrControl]): self.__selected_icon = value - self._set_enum_attr("selectedIcon", value, IconEnums) + self._set_attr_icon("selectedIcon", value) # selected_icon_content @property diff --git a/sdk/python/packages/flet/src/flet/core/navigation_drawer.py b/sdk/python/packages/flet/src/flet/core/navigation_drawer.py index 0b523d8d6..a4b0bc6a9 100644 --- a/sdk/python/packages/flet/src/flet/core/navigation_drawer.py +++ b/sdk/python/packages/flet/src/flet/core/navigation_drawer.py @@ -88,7 +88,7 @@ def icon(self) -> Optional[IconValueOrControl]: @icon.setter def icon(self, value: Optional[IconValueOrControl]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # icon_content @property @@ -120,7 +120,7 @@ def selected_icon(self) -> Optional[IconValueOrControl]: @selected_icon.setter def selected_icon(self, value: Optional[IconValueOrControl]): self.__selected_icon = value - self._set_enum_attr("selectedIcon", value, IconEnums) + self._set_attr_icon("selectedIcon", value) # selected_icon_content @property diff --git a/sdk/python/packages/flet/src/flet/core/navigation_rail.py b/sdk/python/packages/flet/src/flet/core/navigation_rail.py index 55316aaed..a7e897958 100644 --- a/sdk/python/packages/flet/src/flet/core/navigation_rail.py +++ b/sdk/python/packages/flet/src/flet/core/navigation_rail.py @@ -98,7 +98,7 @@ def icon(self) -> Optional[IconValueOrControl]: @icon.setter def icon(self, value: Optional[IconValueOrControl]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # icon_content @property @@ -130,7 +130,7 @@ def selected_icon(self) -> Optional[IconValueOrControl]: @selected_icon.setter def selected_icon(self, value: Optional[IconValueOrControl]): self.__selected_icon = value - self._set_enum_attr("selectedIcon", value, IconEnums) + self._set_attr_icon("selectedIcon", value) # selected_icon_content @property diff --git a/sdk/python/packages/flet/src/flet/core/outlined_button.py b/sdk/python/packages/flet/src/flet/core/outlined_button.py index 60be9edc4..01ff65225 100644 --- a/sdk/python/packages/flet/src/flet/core/outlined_button.py +++ b/sdk/python/packages/flet/src/flet/core/outlined_button.py @@ -185,7 +185,7 @@ def icon(self) -> Optional[IconValue]: @icon.setter def icon(self, value: Optional[IconValue]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # icon_color @property diff --git a/sdk/python/packages/flet/src/flet/core/popup_menu_button.py b/sdk/python/packages/flet/src/flet/core/popup_menu_button.py index 96134bdd1..4da714954 100644 --- a/sdk/python/packages/flet/src/flet/core/popup_menu_button.py +++ b/sdk/python/packages/flet/src/flet/core/popup_menu_button.py @@ -105,7 +105,7 @@ def icon(self) -> Optional[IconValue]: @icon.setter def icon(self, value: Optional[IconValue]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # text @property @@ -379,7 +379,7 @@ def icon(self) -> Optional[IconValue]: @icon.setter def icon(self, value: Optional[IconValue]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # icon_color @property diff --git a/sdk/python/packages/flet/src/flet/core/tabs.py b/sdk/python/packages/flet/src/flet/core/tabs.py index d87158ab6..33786bd4c 100644 --- a/sdk/python/packages/flet/src/flet/core/tabs.py +++ b/sdk/python/packages/flet/src/flet/core/tabs.py @@ -74,7 +74,7 @@ def before_update(self): super().before_update() self._set_attr_json("iconMargin", self.__icon_margin) if isinstance(self.__icon, IconValue): - self._set_enum_attr("icon", self.__icon, IconEnums) + self._set_attr_icon("icon", self.__icon) # text @property diff --git a/sdk/python/packages/flet/src/flet/core/text_button.py b/sdk/python/packages/flet/src/flet/core/text_button.py index 087fea8b3..54c7f594c 100644 --- a/sdk/python/packages/flet/src/flet/core/text_button.py +++ b/sdk/python/packages/flet/src/flet/core/text_button.py @@ -179,7 +179,7 @@ def icon(self) -> Optional[IconValue]: @icon.setter def icon(self, value: Optional[IconValue]): self.__icon = value - self._set_enum_attr("icon", value, IconEnums) + self._set_attr_icon("icon", value) # icon_color @property diff --git a/sdk/python/packages/flet/src/flet/core/types.py b/sdk/python/packages/flet/src/flet/core/types.py index 18d7fd0d1..441e690e2 100644 --- a/sdk/python/packages/flet/src/flet/core/types.py +++ b/sdk/python/packages/flet/src/flet/core/types.py @@ -10,6 +10,7 @@ from flet.core.cupertino_colors import CupertinoColors, cupertino_colors from flet.core.cupertino_icons import CupertinoIcons, cupertino_icons from flet.core.event import Event +from flet.core.icon_data import IconData from flet.core.icons import Icons, icons from flet.core.margin import Margin from flet.core.padding import Padding @@ -406,7 +407,7 @@ class LocaleConfiguration: # Icons IconEnums = (icons, Icons, cupertino_icons, CupertinoIcons) -IconValue = Union[str, icons, Icons, cupertino_icons, CupertinoIcons] +IconValue = Union[str, icons, Icons, cupertino_icons, CupertinoIcons, IconData] IconValueOrControl = Union[IconValue, "Control"] # ControlState