From 58fc4b159341b174a71fbb4244ce25f0696aac57 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Sun, 17 Aug 2025 19:43:23 +0200 Subject: [PATCH 1/4] fix: correct parameter order in parseTextStyle function --- packages/flet/lib/src/utils/text.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flet/lib/src/utils/text.dart b/packages/flet/lib/src/utils/text.dart index 036d7d42fb..8ed752173c 100644 --- a/packages/flet/lib/src/utils/text.dart +++ b/packages/flet/lib/src/utils/text.dart @@ -210,7 +210,7 @@ WidgetStateProperty? parseWidgetStateTextStyle( WidgetStateProperty? defaultValue}) { if (value == null) return defaultValue; return getWidgetStateProperty( - value, (jv) => parseTextStyle(theme, jv), defaultTextStyle); + value, (jv) => parseTextStyle(jv, theme), defaultTextStyle); } extension TextParsers on Control { From 60cd168b97cc7fde7eb62ba38f27beaf9a53100e Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Sun, 17 Aug 2025 19:44:00 +0200 Subject: [PATCH 2/4] fix: update Taskfile for improved test and installation commands --- sdk/python/Taskfile.yml | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/sdk/python/Taskfile.yml b/sdk/python/Taskfile.yml index a1f810bd61..97984620aa 100644 --- a/sdk/python/Taskfile.yml +++ b/sdk/python/Taskfile.yml @@ -15,7 +15,7 @@ tasks: setup: desc: "Setup environment by installing all pyproject.toml dependencies and pre-commit hooks." cmds: - - task: pyproject-setup + - task: install - task: pre-commit-install venv-init: @@ -25,22 +25,36 @@ tasks: cmds: - uv venv - tests: - desc: "Run unit tests." + unit-tests: + desc: "Run all unit tests." aliases: - test + - utest + - unit-test cmds: - uv run --group test pytest packages/flet/tests - control-tests: - desc: "Run integration tests for controls." + integration-tests: + desc: "Run all integration tests." + aliases: + - itest + - integration-test + cmds: + - uv run pytest -s -o log_cli=true -o log_cli_level=DEBUG packages/flet/integration_tests + + control-integration-tests: + desc: "Run all controls integration tests." + aliases: + - control-itest + - control-integration-test cmds: - uv run pytest -s -o log_cli=true -o log_cli_level=DEBUG packages/flet/integration_tests/controls - pyproject-setup: + install: desc: "Install all pyproject.toml dependencies present in 'all' dependency-group." aliases: - pyproject + - pyproject-setup cmds: - uv pip install -r pyproject.toml --group all From a6e27a11e1c3e0b925bf1a540ef15d17784b6bbe Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Tue, 19 Aug 2025 17:00:29 +0200 Subject: [PATCH 3/4] fix: mkdocs warnings --- packages/flet/lib/src/controls/container.dart | 5 +---- packages/flet/lib/src/utils/buttons.dart | 12 ++++++++---- sdk/python/packages/flet-cli/src/flet_cli/cli.py | 11 +++++------ .../flet/src/flet/controls/core/text_span.py | 16 +++++++++------- .../flet/controls/cupertino/cupertino_button.py | 2 +- .../controls/cupertino/cupertino_list_tile.py | 2 +- .../flet/src/flet/controls/material/container.py | 12 +++++++----- .../flet/controls/material/elevated_button.py | 2 +- .../controls/material/floating_action_button.py | 2 +- .../src/flet/controls/material/icon_button.py | 2 +- .../flet/src/flet/controls/material/list_tile.py | 2 +- .../flet/controls/material/outlined_button.py | 2 +- .../src/flet/controls/material/text_button.py | 4 ++-- sdk/python/pyproject.toml | 2 +- 14 files changed, 40 insertions(+), 36 deletions(-) diff --git a/packages/flet/lib/src/controls/container.dart b/packages/flet/lib/src/controls/container.dart index 3059836456..f55ae026da 100644 --- a/packages/flet/lib/src/controls/container.dart +++ b/packages/flet/lib/src/controls/container.dart @@ -199,9 +199,6 @@ class ContainerControl extends StatelessWidget with FletStoreMixin { container = IgnorePointer(child: container); } - return ConstrainedControl( - control: control, - child: container, - ); + return ConstrainedControl(control: control, child: container); } } diff --git a/packages/flet/lib/src/utils/buttons.dart b/packages/flet/lib/src/utils/buttons.dart index 0661e08a1f..106e2a8623 100644 --- a/packages/flet/lib/src/utils/buttons.dart +++ b/packages/flet/lib/src/utils/buttons.dart @@ -3,14 +3,15 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import '../models/control.dart'; -import '../utils/text.dart'; -import '../utils/theme.dart'; -import '../utils/time.dart'; -import '../utils/transforms.dart'; +import 'text.dart'; +import 'theme.dart'; +import 'time.dart'; +import 'transforms.dart'; import 'alignment.dart'; import 'borders.dart'; import 'colors.dart'; import 'edge_insets.dart'; +import 'geometry.dart'; import 'material_state.dart'; import 'mouse.dart'; import 'numbers.dart'; @@ -60,6 +61,9 @@ ButtonStyle? parseButtonStyle(dynamic value, ThemeData theme, iconSize: parseWidgetStateDouble(value["icon_size"]), visualDensity: parseVisualDensity(value["visual_density"]), mouseCursor: parseWidgetStateMouseCursor(value["mouse_cursor"]), + fixedSize: parseWidgetStateSize(value["fixed_size"]), + maximumSize: parseWidgetStateSize(value["maximum_size"]), + minimumSize: parseWidgetStateSize(value["minimum_size"]), ); } diff --git a/sdk/python/packages/flet-cli/src/flet_cli/cli.py b/sdk/python/packages/flet-cli/src/flet_cli/cli.py index ba5c4fb274..62b50ad924 100644 --- a/sdk/python/packages/flet-cli/src/flet_cli/cli.py +++ b/sdk/python/packages/flet-cli/src/flet_cli/cli.py @@ -21,12 +21,11 @@ def set_default_subparser( This should be called after setting up the argument parser but before `parse_args()`. - Parameters: - - name (str): The name of the default subparser to use. - - args (list, optional): A list of arguments passed to `parse_args()`. Defaults - to None. - - index (int): Position in `sys.argv` where the default subparser should be - inserted. Defaults to 0. + Args: + name: The name of the default subparser to use. + args: A list of arguments passed to `parse_args()`. + index: Position in `sys.argv` where the default subparser should be + inserted. """ # exit if help or version flags are present diff --git a/sdk/python/packages/flet/src/flet/controls/core/text_span.py b/sdk/python/packages/flet/src/flet/controls/core/text_span.py index 1df5ba501b..6501b67338 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/text_span.py +++ b/sdk/python/packages/flet/src/flet/controls/core/text_span.py @@ -47,7 +47,7 @@ class TextSpan(Control): """ The URL to open when this button is clicked. - Additionally, if [`on_click`][ft.TextSpan.on_click] event callback is provided, + Additionally, if [`on_click`][flet.TextSpan.on_click] event callback is provided, it is fired after that. """ @@ -61,18 +61,20 @@ class TextSpan(Control): spell_out: Optional[bool] = None """ - Whether the assistive technologies should spell out this text character by character. + Whether the assistive technologies should spell out this text + character by character. - If the text is 'hello world', setting this to true causes the assistive technologies, - such as VoiceOver or TalkBack, to pronounce 'h-e-l-l-o-space-w-o-r-l-d' instead of complete words. + If the text is 'hello world', setting this to true causes the assistive + technologies, such as VoiceOver or TalkBack, to pronounce + 'h-e-l-l-o-space-w-o-r-l-d' instead of complete words. This is useful for texts, such as passwords or verification codes. If this span contains other text span children, they also inherit the property from this span unless explicitly set. - If the property is not set, this text span inherits the spell out setting from its parent. - If this text span does not have a parent or the parent does not have a spell out setting, - this text span does not spell out the text by default. + If the property is not set, this text span inherits the spell out setting + from its parent. If this text span does not have a parent or the parent does + not have a spell out setting, this text span does not spell out the text by default. """ on_click: Optional[ControlEventHandler["TextSpan"]] = None diff --git a/sdk/python/packages/flet/src/flet/controls/cupertino/cupertino_button.py b/sdk/python/packages/flet/src/flet/controls/cupertino/cupertino_button.py index b472e5a142..4c4f974b61 100644 --- a/sdk/python/packages/flet/src/flet/controls/cupertino/cupertino_button.py +++ b/sdk/python/packages/flet/src/flet/controls/cupertino/cupertino_button.py @@ -110,7 +110,7 @@ class CupertinoButton(ConstrainedControl): """ The URL to open when this button is clicked. - Additionally, if [`on_click`][ft.CupertinoButton.on_click] event callback is + Additionally, if [`on_click`][flet.CupertinoButton.on_click] event callback is provided, it is fired after that. """ diff --git a/sdk/python/packages/flet/src/flet/controls/cupertino/cupertino_list_tile.py b/sdk/python/packages/flet/src/flet/controls/cupertino/cupertino_list_tile.py index 000371e498..88aae3cded 100644 --- a/sdk/python/packages/flet/src/flet/controls/cupertino/cupertino_list_tile.py +++ b/sdk/python/packages/flet/src/flet/controls/cupertino/cupertino_list_tile.py @@ -78,7 +78,7 @@ class CupertinoListTile(ConstrainedControl): """ The URL to open when this button is clicked. - Additionally, if [`on_click`][ft.CupertinoListTile.on_click] event callback is + Additionally, if [`on_click`][flet.CupertinoListTile.on_click] event callback is provided, it is fired after that. """ diff --git a/sdk/python/packages/flet/src/flet/controls/material/container.py b/sdk/python/packages/flet/src/flet/controls/material/container.py index c47b71815e..3063e7d047 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/container.py +++ b/sdk/python/packages/flet/src/flet/controls/material/container.py @@ -103,7 +103,8 @@ class Container(ConstrainedControl, AdaptiveControl): """ Defines how the [`content`][flet.Container.content] of the container is clipped. - Defaults to `ClipBehavior.ANTI_ALIAS` if [`border_radius`][flet.Container.border_radius] is not `None`; + Defaults to `ClipBehavior.ANTI_ALIAS` if + [`border_radius`][flet.Container.border_radius] is not `None`; otherwise `ClipBehavior.NONE`. """ @@ -180,7 +181,7 @@ class Container(ConstrainedControl, AdaptiveControl): """ The URL to open when this container is clicked. - Additionally, if [`on_click`][ft.Container.on_click] event callback is provided, + Additionally, if [`on_click`][flet.Container.on_click] event callback is provided, it is fired after that. """ @@ -241,7 +242,8 @@ def main(page: ft.Page): theme_mode: Optional[ThemeMode] = None """ "Resets" parent theme and creates a new, unique scheme for all - controls inside the container. Otherwise the styles defined in container's [`theme`][flet.Container.theme] + controls inside the container. Otherwise the styles defined in + container's [`theme`][flet.Container.theme] property override corresponding styles from the parent, inherited theme. Defaults to `ThemeMode.SYSTEM`. @@ -321,8 +323,8 @@ def on_tap_down(e: ft.ContainerTapEvent): """ Called when a mouse pointer enters or exists the container area. - The `data` property of the event handler argument is `True` when the cursor enters and - `False` when it exits. + The `data` property of the event handler argument is `True` + when the cursor enters and `False` when it exits. Example: A container changing its background color on mouse hover: diff --git a/sdk/python/packages/flet/src/flet/controls/material/elevated_button.py b/sdk/python/packages/flet/src/flet/controls/material/elevated_button.py index 6953836aba..3df80dcee8 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/elevated_button.py +++ b/sdk/python/packages/flet/src/flet/controls/material/elevated_button.py @@ -102,7 +102,7 @@ class ElevatedButton(ConstrainedControl, AdaptiveControl): """ The URL to open when this button is clicked. - Additionally, if [`on_click`][ft.ElevatedButton.on_click] event callback is + Additionally, if [`on_click`][flet.ElevatedButton.on_click] event callback is provided, it is fired after that. """ diff --git a/sdk/python/packages/flet/src/flet/controls/material/floating_action_button.py b/sdk/python/packages/flet/src/flet/controls/material/floating_action_button.py index 4d89ca0dd7..f63656b804 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/floating_action_button.py +++ b/sdk/python/packages/flet/src/flet/controls/material/floating_action_button.py @@ -144,7 +144,7 @@ class FloatingActionButton(ConstrainedControl): """ The URL to open when this button is clicked. - Additionally, if [`on_click`][ft.FloatingActionButton.on_click] event callback + Additionally, if [`on_click`][flet.FloatingActionButton.on_click] event callback is provided, it is fired after that. """ diff --git a/sdk/python/packages/flet/src/flet/controls/material/icon_button.py b/sdk/python/packages/flet/src/flet/controls/material/icon_button.py index d6ca32f026..f165a61f61 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/icon_button.py +++ b/sdk/python/packages/flet/src/flet/controls/material/icon_button.py @@ -197,7 +197,7 @@ def toggle_icon_button(e): """ The URL to open when this button is clicked. - Additionally, if [`on_click`][ft.IconButton.on_click] event callback is provided, + Additionally, if [`on_click`][flet.IconButton.on_click] event callback is provided, it is fired after that. """ diff --git a/sdk/python/packages/flet/src/flet/controls/material/list_tile.py b/sdk/python/packages/flet/src/flet/controls/material/list_tile.py index 134a5f6dfb..40e341f3a2 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/list_tile.py +++ b/sdk/python/packages/flet/src/flet/controls/material/list_tile.py @@ -184,7 +184,7 @@ class ListTile(ConstrainedControl, AdaptiveControl): """ The URL to open when this button is clicked. - Additionally, if [`on_click`][ft.ListTile.on_click] event callback is provided, + Additionally, if [`on_click`][flet.ListTile.on_click] event callback is provided, it is fired after that. """ diff --git a/sdk/python/packages/flet/src/flet/controls/material/outlined_button.py b/sdk/python/packages/flet/src/flet/controls/material/outlined_button.py index 5bebe71e02..29235a254d 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/outlined_button.py +++ b/sdk/python/packages/flet/src/flet/controls/material/outlined_button.py @@ -61,7 +61,7 @@ class OutlinedButton(ConstrainedControl, AdaptiveControl): """ The URL to open when this button is clicked. - Additionally, if [`on_click`][ft.OutlinedButton.on_click] event callback is + Additionally, if [`on_click`][flet.OutlinedButton.on_click] event callback is provided, it is fired after that. """ diff --git a/sdk/python/packages/flet/src/flet/controls/material/text_button.py b/sdk/python/packages/flet/src/flet/controls/material/text_button.py index 4ef555c68b..0d3714b0e1 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/text_button.py +++ b/sdk/python/packages/flet/src/flet/controls/material/text_button.py @@ -56,7 +56,7 @@ class TextButton(ConstrainedControl, AdaptiveControl): """ The URL to open when this button is clicked. - Additionally, if [`on_click`][ft.TextButton.on_click] event callback is + Additionally, if [`on_click`][flet.TextButton.on_click] event callback is provided, it is fired after that. """ @@ -79,7 +79,7 @@ class TextButton(ConstrainedControl, AdaptiveControl): """ Called when a mouse pointer enters or exists this button's response area. - The [`data`][ft.Event.data] property of event object is `True` when cursor + The [`data`][flet.Event.data] property of event object is `True` when cursor enters and `False` when it exits. """ diff --git a/sdk/python/pyproject.toml b/sdk/python/pyproject.toml index 4918150e8f..5b46844190 100644 --- a/sdk/python/pyproject.toml +++ b/sdk/python/pyproject.toml @@ -77,7 +77,7 @@ show-fixes = true [tool.ruff.lint] pydocstyle = { convention = 'google' } -isort = { known-first-party = ["flet"] } +isort = { known-first-party = ["flet", "flet_cli"] } preview = true select = [ # pycodestyle From 1be28032ef5cad58e2a7ea30f06294b4ebac6f88 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Tue, 19 Aug 2025 17:46:29 +0200 Subject: [PATCH 4/4] fix: enhance integration tests for ElevatedButton styles and conflicts --- .../{elevated_button_basic.png => basic.png} | Bin .../macos/elevated_button/button_style.png | Bin 0 -> 4928 bytes .../button_style_conflicts.png | Bin 0 -> 4998 bytes .../controls/test_elevated_button.py | 43 +++++++++++++++++- 4 files changed, 42 insertions(+), 1 deletion(-) rename sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/{elevated_button_basic.png => basic.png} (100%) create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/button_style.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/button_style_conflicts.png diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/elevated_button_basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/basic.png similarity index 100% rename from sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/elevated_button_basic.png rename to sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/basic.png diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/button_style.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/button_style.png new file mode 100644 index 0000000000000000000000000000000000000000..2292af455963bc233baa8de61a6ba1ce598ba9a0 GIT binary patch literal 4928 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 VS&hEI_+K#KiKc-@y_!Sp{{UHUh|K^1 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/button_style_conflicts.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/elevated_button/button_style_conflicts.png new file mode 100644 index 0000000000000000000000000000000000000000..dbaebcba091bbe7fafcc7e8563a03f1b941b8c5a GIT binary patch literal 4998 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 Q2><{907*qoM6N<$f|