Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: expose more properties in Controls #4105

Merged
merged 31 commits into from
Oct 29, 2024
Merged
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
aa03e37
nav bar/drawer/rail
ndonkoHenri Sep 22, 2024
69e63ce
TooltipDirection enum has wrong values
ndonkoHenri Sep 22, 2024
f26c80f
Text and TextSpan
ndonkoHenri Sep 23, 2024
30f4721
GestureDetector
ndonkoHenri Sep 23, 2024
d370c00
deprecate MapPointerDeviceType in favor of PointerDeviceType
ndonkoHenri Sep 23, 2024
7874d9e
create BoxConstraints dataclass
ndonkoHenri Sep 22, 2024
e99fe89
update utils
ndonkoHenri Sep 24, 2024
7901af7
fix navbar appearance when disabled
ndonkoHenri Sep 24, 2024
ca7aee8
PopupMenu new props
ndonkoHenri Sep 24, 2024
84daa44
move AnimationValue from types.py to animation.py
ndonkoHenri Sep 24, 2024
f31c377
update
ndonkoHenri Sep 30, 2024
bd12d20
Tab: icon_content, height, icon_margin
ndonkoHenri Oct 4, 2024
c8c587e
New props: TextField, Dropdown, CupertinoTextField
ndonkoHenri Oct 5, 2024
de5e4cb
FormField: make suffix_icon and prefix_icon support both string and C…
ndonkoHenri Oct 5, 2024
bb283a4
refactor ControlState props
ndonkoHenri Oct 5, 2024
36ab786
properly disable navbar
ndonkoHenri Oct 5, 2024
a65be58
fix failing CI: NoneType is not available in py3.8
ndonkoHenri Oct 5, 2024
d8ffc0d
fix failing CI: update expected test value
ndonkoHenri Oct 5, 2024
a4ccf64
fix failing CI: import ControlState
ndonkoHenri Oct 5, 2024
810126c
FormField: add `collapsed` prop which fits field's content (#4106)
ndonkoHenri Oct 6, 2024
f2d94b9
remove _set_control_state_attr_json; add wrap_attr_dict boolean prop …
ndonkoHenri Oct 10, 2024
26ef254
FormField: fit_parent_size prop
ndonkoHenri Oct 10, 2024
fb71143
Define __post_init__ method for Dataclasses making use of ControlState
ndonkoHenri Oct 11, 2024
2d673ed
Merge branch 'main' into new-props
ndonkoHenri Oct 18, 2024
e3cf7e8
merge 'main' branch
ndonkoHenri Oct 19, 2024
a28398f
remove Optional in AnimationValue
ndonkoHenri Oct 25, 2024
ce8fdee
Merge 'main' branch
ndonkoHenri Oct 25, 2024
83042c7
`FormField.label` as a Control
ndonkoHenri Oct 26, 2024
612c8ae
Merge branch 'main' into new-props
FeodorFitsner Oct 29, 2024
0a3afdd
Fix wrapping ListTile to Material widget
FeodorFitsner Oct 29, 2024
a44bcde
Merge branch 'main' into new-props
FeodorFitsner Oct 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactor ControlState props
  • Loading branch information
ndonkoHenri committed Oct 5, 2024
commit bb283a45089e7d5336a6399d748985d7a46d71a3
38 changes: 16 additions & 22 deletions sdk/python/packages/flet-core/src/flet_core/buttons.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
from dataclasses import dataclass, field
from typing import Dict, Optional, Union
from typing import Optional

from flet_core.alignment import Alignment
from flet_core.border import BorderSide
from flet_core.text_style import TextStyle
from flet_core.types import (
BorderRadiusValue,
ControlState,
PaddingValue,
Number,
VisualDensity,
MouseCursor,
ControlStateValue,
OptionalNumber,
)


@@ -56,26 +56,20 @@ def __post_init__(self):

@dataclass
class ButtonStyle:
color: Union[None, str, Dict[Union[str, ControlState], str]] = None
bgcolor: Union[None, str, Dict[Union[str, ControlState], str]] = None
overlay_color: Union[None, str, Dict[Union[str, ControlState], str]] = None
shadow_color: Union[None, str, Dict[Union[str, ControlState], str]] = None
surface_tint_color: Union[None, str, Dict[Union[str, ControlState], str]] = None
elevation: Union[
None, float, int, Dict[Union[str, ControlState], Union[float, int]]
] = None
color: ControlStateValue[str] = None
bgcolor: ControlStateValue[str] = None
overlay_color: ControlStateValue[str] = None
shadow_color: ControlStateValue[str] = None
surface_tint_color: ControlStateValue[str] = None
elevation: ControlStateValue[OptionalNumber] = None
animation_duration: Optional[int] = None
padding: Union[PaddingValue, Dict[Union[str, ControlState], PaddingValue]] = None
side: Union[None, BorderSide, Dict[Union[str, ControlState], BorderSide]] = None
shape: Union[
None, OutlinedBorder, Dict[Union[str, ControlState], OutlinedBorder]
] = None
padding: ControlStateValue[PaddingValue] = None
side: ControlStateValue[BorderSide] = None
shape: ControlStateValue[OutlinedBorder] = None
alignment: Optional[Alignment] = None
enable_feedback: Optional[bool] = None
text_style: Union[None, TextStyle, Dict[Union[str, ControlState], TextStyle]] = None
icon_size: Union[None, Number, Dict[Union[str, ControlState], Number]] = None
icon_color: Union[None, str, Dict[Union[str, ControlState], str]] = None
text_style: ControlStateValue[TextStyle] = None
icon_size: ControlStateValue[OptionalNumber] = None
icon_color: ControlStateValue[str] = None
visual_density: Optional[VisualDensity] = None
mouse_cursor: Union[
None, MouseCursor, Dict[Union[str, ControlState], MouseCursor]
] = None
mouse_cursor: ControlStateValue[MouseCursor] = None
30 changes: 14 additions & 16 deletions sdk/python/packages/flet-core/src/flet_core/checkbox.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, Dict, Optional, Union
from typing import Any, Optional, Union

from flet_core.adaptive_control import AdaptiveControl
from flet_core.animation import AnimationValue
@@ -11,7 +11,6 @@
from flet_core.tooltip import TooltipValue
from flet_core.types import (
LabelPosition,
ControlState,
MouseCursor,
OffsetValue,
ResponsiveNumber,
@@ -20,6 +19,7 @@
ThemeVisualDensity,
VisualDensity,
OptionalControlEventCallable,
ControlStateValue,
)


@@ -65,16 +65,16 @@ def __init__(
label_style: Optional[TextStyle] = None,
tristate: Optional[bool] = None,
autofocus: Optional[bool] = None,
fill_color: Union[None, str, Dict[ControlState, str]] = None,
overlay_color: Union[None, str, Dict[ControlState, str]] = None,
fill_color: ControlStateValue[str] = None,
overlay_color: ControlStateValue[str] = None,
check_color: Optional[str] = None,
active_color: Optional[str] = None,
hover_color: Optional[str] = None,
focus_color: Optional[str] = None,
semantics_label: Optional[str] = None,
shape: Optional[OutlinedBorder] = None,
splash_radius: OptionalNumber = None,
border_side: Union[None, BorderSide, Dict[ControlState, BorderSide]] = None,
border_side: ControlStateValue[BorderSide] = None,
is_error: Optional[bool] = None,
visual_density: Union[None, ThemeVisualDensity, VisualDensity] = None,
mouse_cursor: Optional[MouseCursor] = None,
@@ -174,10 +174,10 @@ def _get_control_name(self):

def before_update(self):
super().before_update()
self._set_attr_json("fillColor", self.__fill_color)
self._set_attr_json("overlayColor", self.__overlay_color)
self._set_control_state_attr_json("fillColor", self.__fill_color)
self._set_control_state_attr_json("overlayColor", self.__overlay_color)
self._set_control_state_attr_json("borderSide", self.__border_side)
self._set_attr_json("shape", self.__shape)
self._set_attr_json("borderSide", self.__border_side)
if isinstance(self.__label_style, TextStyle):
self._set_attr_json("labelStyle", self.__label_style)

@@ -287,20 +287,20 @@ def hover_color(self, value: Optional[str]):

# fill_color
@property
def fill_color(self) -> Union[None, str, Dict[ControlState, str]]:
def fill_color(self) -> ControlStateValue[str]:
return self.__fill_color

@fill_color.setter
def fill_color(self, value: Union[None, str, Dict[ControlState, str]]):
def fill_color(self, value: ControlStateValue[str]):
self.__fill_color = value

# overlay_color
@property
def overlay_color(self) -> Union[None, str, Dict[ControlState, str]]:
def overlay_color(self) -> ControlStateValue[str]:
return self.__overlay_color

@overlay_color.setter
def overlay_color(self, value: Union[None, str, Dict[ControlState, str]]):
def overlay_color(self, value: ControlStateValue[str]):
self.__overlay_color = value

# label_style
@@ -350,13 +350,11 @@ def is_error(self, value: Optional[bool]):

# border_side
@property
def border_side(self) -> Union[None, BorderSide, Dict[ControlState, BorderSide]]:
def border_side(self) -> ControlStateValue[BorderSide]:
return self.__border_side

@border_side.setter
def border_side(
self, value: Union[None, BorderSide, Dict[ControlState, BorderSide]]
):
def border_side(self, value: ControlStateValue[BorderSide]):
self.__border_side = value

# on_change
12 changes: 6 additions & 6 deletions sdk/python/packages/flet-core/src/flet_core/chip.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, Optional, Union, Dict
from typing import Any, Optional, Union

from flet_core.animation import AnimationValue
from flet_core.border import BorderSide
@@ -15,10 +15,10 @@
RotateValue,
ScaleValue,
ClipBehavior,
ControlState,
ThemeVisualDensity,
VisualDensity,
OptionalControlEventCallable,
ControlStateValue,
)


@@ -90,7 +90,7 @@ def __init__(
selected_shadow_color: Optional[str] = None,
autofocus: Optional[bool] = None,
surface_tint_color: Optional[str] = None,
color: Union[None, str, Dict[Union[ControlState, str], str]] = None,
color: ControlStateValue[str] = None,
click_elevation: OptionalNumber = None,
clip_behavior: Optional[ClipBehavior] = None,
visual_density: Union[None, ThemeVisualDensity, VisualDensity] = None,
@@ -205,7 +205,7 @@ def before_update(self):
self._set_attr_json("labelStyle", self.__label_style)
self._set_attr_json("padding", self.__padding)
self._set_attr_json("shape", self.__shape)
self._set_attr_json("color", self.__color)
self._set_control_state_attr_json("color", self.__color)

def _get_children(self):
self.__label._set_attr_internal("n", "label")
@@ -319,11 +319,11 @@ def disabled_color(self, value: Optional[str]):

# color
@property
def color(self) -> Union[None, str, Dict[ControlState, str]]:
def color(self) -> ControlStateValue[str]:
return self.__color

@color.setter
def color(self, value: Union[None, str, Dict[ControlState, str]]):
def color(self, value: ControlStateValue[str]):
self.__color = value

# autofocus
8 changes: 8 additions & 0 deletions sdk/python/packages/flet-core/src/flet_core/control.py
Original file line number Diff line number Diff line change
@@ -179,6 +179,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=(",", ":"))
24 changes: 12 additions & 12 deletions sdk/python/packages/flet-core/src/flet_core/datatable.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import json
from typing import Any, Dict, List, Optional, Union
from typing import Any, List, Optional, Union

from flet_core.animation import AnimationValue
from flet_core.border import Border, BorderSide
@@ -14,7 +14,6 @@
from flet_core.tooltip import TooltipValue
from flet_core.types import (
BorderRadiusValue,
ControlState,
OffsetValue,
ResponsiveNumber,
RotateValue,
@@ -23,6 +22,7 @@
OptionalEventCallable,
OptionalControlEventCallable,
MainAxisAlignment,
ControlStateValue,
)


@@ -245,7 +245,7 @@ class DataRow(Control):
def __init__(
self,
cells: List[DataCell],
color: Union[None, str, Dict[ControlState, str]] = None,
color: ControlStateValue[str] = None,
selected: Optional[bool] = None,
on_long_press: OptionalControlEventCallable = None,
on_select_changed: OptionalControlEventCallable = None,
@@ -273,7 +273,7 @@ def before_update(self):
assert any(
cell.visible for cell in self.__cells
), "cells must contain at minimum one visible DataCell"
self._set_attr_json("color", self.__color)
self._set_control_state_attr_json("color", self.__color)

def _get_children(self):
return self.__cells
@@ -292,11 +292,11 @@ def cells(self, value: List[DataCell]):

# color
@property
def color(self) -> Union[None, str, Dict[ControlState, str]]:
def color(self) -> ControlStateValue[str]:
return self.__color

@color.setter
def color(self, value: Union[None, str, Dict[ControlState, str]]):
def color(self, value: ControlStateValue[str]):
self.__color = value

# selected
@@ -344,14 +344,14 @@ def __init__(
vertical_lines: Optional[BorderSide] = None,
checkbox_horizontal_margin: OptionalNumber = None,
column_spacing: OptionalNumber = None,
data_row_color: Union[None, str, Dict[ControlState, str]] = None,
data_row_color: ControlStateValue[str] = None,
data_row_min_height: OptionalNumber = None,
data_row_max_height: OptionalNumber = None,
data_text_style: Optional[TextStyle] = None,
bgcolor: Optional[str] = None,
gradient: Optional[Gradient] = None,
divider_thickness: OptionalNumber = None,
heading_row_color: Union[None, str, Dict[ControlState, str]] = None,
heading_row_color: ControlStateValue[str] = None,
heading_row_height: OptionalNumber = None,
heading_text_style: Optional[TextStyle] = None,
horizontal_margin: OptionalNumber = None,
@@ -581,11 +581,11 @@ def horizontal_margin(self, value: OptionalNumber):

# data_row_color
@property
def data_row_color(self) -> Union[None, str, Dict[ControlState, str]]:
def data_row_color(self) -> ControlStateValue[str]:
return self.__data_row_color

@data_row_color.setter
def data_row_color(self, value: Union[None, str, Dict[ControlState, str]]):
def data_row_color(self, value: ControlStateValue[str]):
self.__data_row_color = value

# data_row_min_height
@@ -635,11 +635,11 @@ def gradient(self, value: Optional[Gradient]):

# heading_row_color
@property
def heading_row_color(self) -> Union[None, str, Dict[ControlState, str]]:
def heading_row_color(self) -> ControlStateValue[str]:
return self.__heading_row_color

@heading_row_color.setter
def heading_row_color(self, value: Union[None, str, Dict[ControlState, str]]):
def heading_row_color(self, value: ControlStateValue[str]):
self.__heading_row_color = value

# heading_row_height
38 changes: 12 additions & 26 deletions sdk/python/packages/flet-core/src/flet_core/menu_bar.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional, Sequence, Union
from dataclasses import dataclass
from typing import Any, List, Optional, Sequence, Union

from flet_core.alignment import Alignment
from flet_core.border import BorderSide
@@ -8,39 +8,25 @@
from flet_core.ref import Ref
from flet_core.types import (
ClipBehavior,
ControlState,
MouseCursor,
OptionalNumber,
PaddingValue,
ResponsiveNumber,
ControlStateValue,
)


@dataclass
class MenuStyle:
alignment: Optional[Alignment] = field(default=None)
bgcolor: Union[None, str, Dict[Union[str, ControlState], str]] = field(default=None)
shadow_color: Union[None, str, Dict[Union[str, ControlState], str]] = field(
default=None
)
surface_tint_color: Union[None, str, Dict[Union[str, ControlState], str]] = field(
default=None
)
elevation: Union[
None, float, int, Dict[Union[str, ControlState], Union[float, int]]
] = field(default=None)
padding: Union[PaddingValue, Dict[Union[str, ControlState], PaddingValue]] = field(
default=None
)
side: Union[None, BorderSide, Dict[Union[str, ControlState], BorderSide]] = field(
default=None
)
shape: Union[
None, OutlinedBorder, Dict[Union[str, ControlState], OutlinedBorder]
] = field(default=None)
mouse_cursor: Union[
None, MouseCursor, Dict[Union[str, ControlState], MouseCursor]
] = field(default=None)
alignment: Optional[Alignment] = None
bgcolor: ControlStateValue[str] = None
shadow_color: ControlStateValue[str] = None
surface_tint_color: ControlStateValue[str] = None
elevation: ControlStateValue[OptionalNumber] = None
padding: ControlStateValue[PaddingValue] = None
side: ControlStateValue[BorderSide] = None
shape: ControlStateValue[OutlinedBorder] = None
mouse_cursor: ControlStateValue[MouseCursor] = None


class MenuBar(Control):
Loading