diff --git a/client/pubspec.lock b/client/pubspec.lock index 15578f76e2..2ef3a23aa7 100644 --- a/client/pubspec.lock +++ b/client/pubspec.lock @@ -245,10 +245,10 @@ packages: dependency: transitive description: name: file_picker - sha256: ef7d2a085c1b1d69d17b6842d0734aad90156de08df6bd3c12496d0bd6ddf8e2 + sha256: e7e16c9d15c36330b94ca0e2ad8cb61f93cd5282d0158c09805aed13b5452f22 url: "https://pub.dev" source: hosted - version: "10.3.1" + version: "10.3.2" fixnum: dependency: transitive description: @@ -277,7 +277,7 @@ packages: description: path: "src/flutter/flet_ads" ref: main - resolved-ref: e847a431388733d6bcd81748c617a3b962c5efa9 + resolved-ref: aa05773138be06e69353e2a223bd23c51b36dd3f url: "https://github.com/flet-dev/flet-ads.git" source: git version: "0.2.0" @@ -286,7 +286,7 @@ packages: description: path: "src/flutter/flet_audio" ref: main - resolved-ref: "5611fa1ef47c2faeeb6317671932cfd3ee2888c3" + resolved-ref: "06fb901f133fab54e603f8039bc9a1d707d19068" url: "https://github.com/flet-dev/flet-audio.git" source: git version: "0.2.0" @@ -295,7 +295,7 @@ packages: description: path: "src/flutter/flet_audio_recorder" ref: main - resolved-ref: "10c9108060410c3c4e2435311c8e4ee70daf24bf" + resolved-ref: "62a1934a34514e92617f4e090b53828474f5969e" url: "https://github.com/flet-dev/flet-audio-recorder.git" source: git version: "0.2.0" @@ -313,7 +313,7 @@ packages: description: path: "src/flutter/flet_datatable2" ref: main - resolved-ref: ebd7adc75486b276df382ae6401037c45a6df2a3 + resolved-ref: bf6af9c7a9c1962c36512ff5ab48eec9f14ef81a url: "https://github.com/flet-dev/flet-datatable2.git" source: git version: "0.1.0" @@ -322,7 +322,7 @@ packages: description: path: "src/flutter/flet_flashlight" ref: main - resolved-ref: "88fb80a6b4032956282a4be9c60f3c25f3cfccb5" + resolved-ref: def30504c3ed6786dc2a1fdb4f18b226a284a7d2 url: "https://github.com/flet-dev/flet-flashlight.git" source: git version: "0.2.0" @@ -331,7 +331,7 @@ packages: description: path: "src/flutter/flet_geolocator" ref: main - resolved-ref: "94ed74df1a8b791d0afaccc2f9caac3456698f78" + resolved-ref: "25efd0a9d15f23bf284912814a131388f8de9ec4" url: "https://github.com/flet-dev/flet-geolocator.git" source: git version: "0.25.2" @@ -340,7 +340,7 @@ packages: description: path: "src/flutter/flet_lottie" ref: main - resolved-ref: "86eaa0b59f3cc54f9b2fb57abce9c0d22de253ca" + resolved-ref: "5187fcf6bcb37f4bfa59cad127f6444d40cdb48c" url: "https://github.com/flet-dev/flet-lottie.git" source: git version: "0.2.0" @@ -349,7 +349,7 @@ packages: description: path: "src/flutter/flet_map" ref: main - resolved-ref: "8507cda6616f555974fbdcd3df05c3f2b02c043f" + resolved-ref: d79ebf24ebad208a543b73a7f7511cd4da1d7ea9 url: "https://github.com/flet-dev/flet-map.git" source: git version: "0.2.0" @@ -358,7 +358,7 @@ packages: description: path: "src/flutter/flet_permission_handler" ref: main - resolved-ref: "2a56423dd77d220a0067f4097f9e25659b2f9b36" + resolved-ref: dbd04f183b8452a5247f2807007cc40a2381a172 url: "https://github.com/flet-dev/flet-permission-handler.git" source: git version: "0.2.0" @@ -367,7 +367,7 @@ packages: description: path: "src/flutter/flet_rive" ref: main - resolved-ref: "67256e81ec7c906ae03790b0c180c9be018ed7a4" + resolved-ref: "6d78b068940afa5126fc38374ea326e710d43862" url: "https://github.com/flet-dev/flet-rive.git" source: git version: "0.2.0" @@ -376,7 +376,7 @@ packages: description: path: "src/flutter/flet_video" ref: main - resolved-ref: a086b89d74f96e052a450d6c2a50c812a035ce45 + resolved-ref: abeea4e9a3a2864299743726b26d5a245a4389d6 url: "https://github.com/flet-dev/flet-video.git" source: git version: "0.2.0" @@ -385,7 +385,7 @@ packages: description: path: "src/flutter/flet_webview" ref: main - resolved-ref: "9e2b64171f81cbe72a8a61ee9ba9d2af69587837" + resolved-ref: cb3d07bfb84ae1b51be25388ca04c03a9dafd7f3 url: "https://github.com/flet-dev/flet-webview.git" source: git version: "0.2.0" @@ -1028,18 +1028,18 @@ packages: dependency: transitive description: name: record_android - sha256: "8b170e33d9866f9b51e01a767d7e1ecb97b9ecd629950bd87a47c79359ec57f8" + sha256: "8361a791c9a3fa5c065f0b8b5adb10f12531f8538c86b19474cf7b56ea80d426" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" record_ios: dependency: transitive description: name: record_ios - sha256: ad97d0a75933c44bcf5aff648e86e32fc05eb61f8fbef190f14968c8eaf86692 + sha256: "13e241ed9cbc220534a40ae6b66222e21288db364d96dd66fb762ebd3cb77c71" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" record_linux: dependency: transitive description: @@ -1052,10 +1052,10 @@ packages: dependency: transitive description: name: record_macos - sha256: f1399bca76a1634da109e5b0cba764ed8332a2b4da49c704c66d2c553405ed81 + sha256: "2849068bb59072f300ad63ed146e543d66afaef8263edba4de4834fc7c8d4d35" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" record_platform_interface: dependency: transitive description: @@ -1076,10 +1076,10 @@ packages: dependency: transitive description: name: record_windows - sha256: "85a22fc97f6d73ecd67c8ba5f2f472b74ef1d906f795b7970f771a0914167e99" + sha256: "223258060a1d25c62bae18282c16783f28581ec19401d17e56b5205b9f039d78" url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.7" rive: dependency: transitive description: diff --git a/packages/flet/lib/src/controls/dropdown.dart b/packages/flet/lib/src/controls/dropdown.dart index 72e380e2c9..037807893f 100644 --- a/packages/flet/lib/src/controls/dropdown.dart +++ b/packages/flet/lib/src/controls/dropdown.dart @@ -15,13 +15,27 @@ class DropdownControl extends StatefulWidget { class _DropdownControlState extends State { late final FocusNode _focusNode; + late final TextEditingController _controller; @override void initState() { super.initState(); _focusNode = FocusNode(); + + _controller = + TextEditingController(text: widget.control.getString("value")); _focusNode.addListener(_onFocusChange); widget.control.addInvokeMethodListener(_invokeMethod); + + _controller.addListener(_onTextChange); + } + + void _onTextChange() { + debugPrint("Typed text: ${_controller.text}"); + if (_controller.text != widget.control.getString("value")) { + widget.control.updateProperties({"value": _controller.text}); + widget.control.triggerEvent("text_change", _controller.text); + } } void _onFocusChange() { @@ -33,6 +47,7 @@ class _DropdownControlState extends State { _focusNode.removeListener(_onFocusChange); _focusNode.dispose(); widget.control.removeInvokeMethodListener(_invokeMethod); + _controller.dispose(); super.dispose(); } @@ -182,6 +197,7 @@ class _DropdownControlState extends State { Widget dropDown = DropdownMenu( enabled: !widget.control.disabled, focusNode: _focusNode, + controller: _controller, initialSelection: value, enableFilter: widget.control.getBool("enable_filter", false)!, enableSearch: widget.control.getBool("enable_search", true)!, diff --git a/packages/flet/lib/src/controls/search_bar.dart b/packages/flet/lib/src/controls/search_bar.dart index e4f8137a5a..d9bffb1132 100644 --- a/packages/flet/lib/src/controls/search_bar.dart +++ b/packages/flet/lib/src/controls/search_bar.dart @@ -171,6 +171,9 @@ class _SearchBarControlState extends State { headerTextStyle: widget.control.getTextStyle("view_header_text_style", theme), viewSide: widget.control.getBorderSide("view_side", theme), + viewPadding: widget.control.getPadding("view_padding"), + viewBarPadding: widget.control.getPadding("view_bar_padding"), + shrinkWrap: widget.control.getBool("shrink_wrap"), isFullScreen: widget.control.getBool("full_screen", false), viewBackgroundColor: widget.control.getColor("view_bgcolor", context), dividerColor: widget.control.getColor("divider_color", context), @@ -208,6 +211,8 @@ class _SearchBarControlState extends State { shape: widget.control.getWidgetStateOutlinedBorder("bar_shape", theme), padding: widget.control.getWidgetStatePadding("bar_padding"), + constraints: + widget.control.getBoxConstraints("bar_size_constraints"), textStyle: widget.control.getWidgetStateTextStyle("bar_text_style", theme), hintStyle: widget.control diff --git a/packages/flet/lib/src/controls/segmented_button.dart b/packages/flet/lib/src/controls/segmented_button.dart index d6d9133a74..b3ece2e7c2 100644 --- a/packages/flet/lib/src/controls/segmented_button.dart +++ b/packages/flet/lib/src/controls/segmented_button.dart @@ -84,7 +84,7 @@ class _SegmentedButtonControlState extends State selected: selected, showSelectedIcon: widget.control.getBool("show_selected_icon", true)!, style: style, - selectedIcon: widget.control.buildWidget("selected_icon"), + selectedIcon: widget.control.buildIconOrWidget("selected_icon"), onSelectionChanged: !widget.control.disabled ? (newSelection) => onChange(newSelection) : null, diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon/basic.png new file mode 100644 index 0000000000..ab71dbee7c Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon/icon_basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon/icon_basic.png deleted file mode 100644 index cf4d854505..0000000000 Binary files a/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon/icon_basic.png and /dev/null differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon/theme_1.png new file mode 100644 index 0000000000..5a2b9bc831 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/navigation_bar.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/basic.png similarity index 100% rename from sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/navigation_bar.png rename to sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/basic.png diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/theme_1.png new file mode 100644 index 0000000000..9c0cc19faf Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/theme_2.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/theme_2.png new file mode 100644 index 0000000000..29213fb68b Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/theme_2.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/theme_3.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/theme_3.png new file mode 100644 index 0000000000..ef9b08a344 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_bar/theme_3.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/navigation_drawer_default_position.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/default_position.png similarity index 100% rename from sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/navigation_drawer_default_position.png rename to sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/default_position.png diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/navigation_drawer_position_end.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/end_position.png similarity index 100% rename from sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/navigation_drawer_position_end.png rename to sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/end_position.png diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/theme.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/theme.png new file mode 100644 index 0000000000..9080848ff9 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/navigation_drawer/theme.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/basic.png new file mode 100644 index 0000000000..28789b096f Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/basic_opened.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/basic_opened.png new file mode 100644 index 0000000000..683a1142bb Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/basic_opened.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/theme.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/theme.png new file mode 100644 index 0000000000..219f650d0e Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/theme.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/theme_hovered.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/theme_hovered.png new file mode 100644 index 0000000000..0b38d22629 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/theme_hovered.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/theme_opened.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/theme_opened.png new file mode 100644 index 0000000000..9256af075e Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/search_bar/theme_opened.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/segmented_button/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/segmented_button/basic.png new file mode 100644 index 0000000000..a4d8bd51aa Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/segmented_button/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/segmented_button/segmented_button_basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/segmented_button/segmented_button_basic.png deleted file mode 100644 index 601078f83e..0000000000 Binary files a/sdk/python/packages/flet/integration_tests/controls/golden/macos/segmented_button/segmented_button_basic.png and /dev/null differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/segmented_button/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/segmented_button/theme_1.png new file mode 100644 index 0000000000..0f011fc39d Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/segmented_button/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/test_icon.py b/sdk/python/packages/flet/integration_tests/controls/test_icon.py index b2a15040dc..de74f20278 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_icon.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_icon.py @@ -1,11 +1,18 @@ import pytest +import pytest_asyncio import flet as ft import flet.testing as ftt -@pytest.mark.asyncio(loop_scope="module") -async def test_icon_basic(flet_app: ftt.FletTestApp, request): +# Create a new flet_app instance for each test method +@pytest_asyncio.fixture(scope="function", autouse=True) +def flet_app(flet_app_function): + return flet_app_function + + +@pytest.mark.asyncio(loop_scope="function") +async def test_basic(flet_app: ftt.FletTestApp, request): await flet_app.assert_control_screenshot( request.node.name, ft.Column( @@ -42,3 +49,99 @@ async def test_icon_basic(flet_app: ftt.FletTestApp, request): ] ), ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_theme(flet_app: ftt.FletTestApp): + flet_app.page.theme = ft.Theme( + icon_theme=ft.IconTheme( + color=ft.Colors.GREEN_900, + size=100, + apply_text_scaling=True, # doesn't show on screenshot + fill=0.5, # doesn't show on screenshow + opacity=0.5, + optical_size=48, # doesn't show pon screenshot + grade=-10, # doesn't show on screenshot + weight=10, # doesn't show on screenshot + shadows=ft.BoxShadow(color=ft.Colors.YELLOW, blur_radius=10), + ) + ) + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot( + ft.Column( + [ # material + ft.Row( + controls=[ + ft.Icon( + ft.Icons.ABC, + fill=0, + # color=ft.Colors.PINK, + apply_text_scaling=False, + opacity=0.1, + optical_size=200, + ), + ft.Icon( + ft.Icons.AUDIOTRACK, + color=ft.Colors.GREEN_400, + size=30, + shadows=[ + ft.BoxShadow(color=ft.Colors.YELLOW, blur_radius=10), + ft.BoxShadow(color=ft.Colors.RED, blur_radius=5), + ], + ), + ft.Icon( + ft.Icons.AC_UNIT, + color=ft.Colors.BLUE, + size=50, + ), + ft.Icon( + ft.Icons.SETTINGS, + color="#c1c1c1", + ), + ft.Icon( + ft.Icons.ALARM, + size=40, + ), + ] + ), + # cupertino + ft.Row( + controls=[ + ft.Icon( + ft.CupertinoIcons.AIRPLANE, + # color=ft.Colors.PINK, + ), + ft.Icon( + icon=ft.CupertinoIcons.CUBE_BOX, + color=ft.Colors.GREEN_400, + size=30, + ), + ft.Icon( + icon=ft.CupertinoIcons.ARCHIVEBOX, + color=ft.Colors.BLUE, + size=50, + ), + ft.Icon( + icon=ft.CupertinoIcons.BAG, + color="#c1c1c1", + ), + ft.Icon( + ft.CupertinoIcons.ALARM, + size=40, + ), + ] + ), + ] + ), + ) + flet_app.page.add(scr_1) + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "theme_1", + await scr_1.capture(pixel_ratio=flet_app.screenshots_pixel_ratio), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_navigation_bar.py b/sdk/python/packages/flet/integration_tests/controls/test_navigation_bar.py index b79d7b7ef3..2fd0852ff7 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_navigation_bar.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_navigation_bar.py @@ -1,11 +1,18 @@ import pytest +import pytest_asyncio import flet as ft import flet.testing as ftt -@pytest.mark.asyncio(loop_scope="module") -async def test_navigation_bar(flet_app: ftt.FletTestApp, request): +# Create a new flet_app instance for each test method +@pytest_asyncio.fixture(scope="function", autouse=True) +def flet_app(flet_app_function): + return flet_app_function + + +@pytest.mark.asyncio(loop_scope="function") +async def test_basic(flet_app: ftt.FletTestApp, request): await flet_app.assert_control_screenshot( request.node.name, ft.NavigationBar( @@ -20,3 +27,72 @@ async def test_navigation_bar(flet_app: ftt.FletTestApp, request): ] ), ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_theme(flet_app: ftt.FletTestApp): + flet_app.page.theme = ft.Theme( + navigation_bar_theme=ft.NavigationBarTheme( + bgcolor=ft.Colors.GREEN_200, + shadow_color=ft.Colors.ORANGE_500, # not shows in the screenshot + elevation=50, # not shows in the screenshot + indicator_color=ft.Colors.GREEN, + overlay_color=ft.Colors.YELLOW_300, + height=200, + label_text_style=ft.TextStyle(color=ft.Colors.ORANGE_900, size=20), + indicator_shape=ft.RoundedRectangleBorder( + radius=ft.BorderRadius.all(10), + side=ft.BorderSide(color=ft.Colors.PURPLE, width=3), + ), + label_behavior=ft.NavigationBarLabelBehavior.ONLY_SHOW_SELECTED, + label_padding=ft.Padding.all(20), + ) + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot( + ft.NavigationBar( + key="nb", + elevation=100, + destinations=[ + ft.NavigationBarDestination(icon=ft.Icons.EXPLORE, label="Explore"), + ft.NavigationBarDestination(key="add", icon=ft.Icon(ft.Icons.ADD)), + ft.NavigationBarDestination( + icon=ft.Icons.PHONE_ENABLED, + label="Explore", + ), + ], + ) + ) + flet_app.page.add(scr_1) + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "theme_1", + await scr_1.capture(pixel_ratio=flet_app.screenshots_pixel_ratio), + ) + + # hover to check overlay color + add = await flet_app.tester.find_by_key("add") + assert add.count == 1 + await flet_app.tester.mouse_hover(add) + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "theme_2", + await scr_1.capture(pixel_ratio=flet_app.screenshots_pixel_ratio), + ) + + # click to check label behaviour + await flet_app.tester.tap(add) + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "theme_3", + await scr_1.capture(pixel_ratio=flet_app.screenshots_pixel_ratio), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_navigation_drawer.py b/sdk/python/packages/flet/integration_tests/controls/test_navigation_drawer.py index 9a8fc2a0d7..b7d62357c5 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_navigation_drawer.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_navigation_drawer.py @@ -1,11 +1,17 @@ import pytest +import pytest_asyncio import flet as ft import flet.testing as ftt -@pytest.mark.asyncio(loop_scope="module") -async def test_navigation_drawer_position_end(flet_app: ftt.FletTestApp, request): +@pytest_asyncio.fixture(scope="function", autouse=True) +def flet_app(flet_app_function): + return flet_app_function + + +@pytest.mark.asyncio(loop_scope="function") +async def test_end_position(flet_app: ftt.FletTestApp, request): end_drawer = ft.NavigationDrawer( position=ft.NavigationDrawerPosition.END, controls=[ @@ -28,15 +34,60 @@ async def test_navigation_drawer_position_end(flet_app: ftt.FletTestApp, request await flet_app.tester.pump_and_settle() flet_app.assert_screenshot( - "navigation_drawer_position_end", + "end_position", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_default_position(flet_app: ftt.FletTestApp, request): + end_drawer = ft.NavigationDrawer( + controls=[ + ft.NavigationDrawerDestination( + icon=ft.Icons.ADD_TO_HOME_SCREEN_SHARP, + label="Item 1", + ), + ft.NavigationDrawerDestination( + icon=ft.Icon(ft.Icons.ADD_COMMENT), + label="Item 2", + ), + ], + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.show_dialog(end_drawer) + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + # normal state + flet_app.assert_screenshot( + "default_position", await flet_app.page.take_screenshot( pixel_ratio=flet_app.screenshots_pixel_ratio ), ) -@pytest.mark.asyncio(loop_scope="module") -async def test_navigation_drawer_default_position(flet_app: ftt.FletTestApp, request): +@pytest.mark.asyncio(loop_scope="function") +async def test_theme(flet_app: ftt.FletTestApp, request): + flet_app.page.theme = ft.Theme( + navigation_drawer_theme=ft.NavigationDrawerTheme( + bgcolor=ft.Colors.BLUE_GREY_200, + elevation=20, + shadow_color=ft.Colors.RED, + indicator_color=ft.Colors.ORANGE, + indicator_shape=ft.RoundedRectangleBorder( + radius=ft.BorderRadius.all(10), + ), + indicator_size=ft.Size(200, 50), + label_text_style=ft.TextStyle(color=ft.Colors.GREEN), + tile_height=100, + ) + ) end_drawer = ft.NavigationDrawer( controls=[ ft.NavigationDrawerDestination( @@ -59,7 +110,7 @@ async def test_navigation_drawer_default_position(flet_app: ftt.FletTestApp, req # normal state flet_app.assert_screenshot( - "navigation_drawer_default_position", + "theme", await flet_app.page.take_screenshot( pixel_ratio=flet_app.screenshots_pixel_ratio ), diff --git a/sdk/python/packages/flet/integration_tests/controls/test_search_bar.py b/sdk/python/packages/flet/integration_tests/controls/test_search_bar.py new file mode 100644 index 0000000000..4cb79c6fce --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_search_bar.py @@ -0,0 +1,135 @@ +import pytest +import pytest_asyncio + +import flet as ft +import flet.testing as ftt + + +@pytest_asyncio.fixture(scope="function", autouse=True) +def flet_app(flet_app_function): + return flet_app_function + + +@pytest.mark.asyncio(loop_scope="function") +async def test_basic(flet_app: ftt.FletTestApp, request): + async def handle_tap(e: ft.Event[ft.SearchBar]): + print("handle_tap") + await sb.open_view() + + sb = ft.SearchBar( + key="sb", + bar_hint_text="Search colors...", + view_hint_text="Choose a color from the suggestions...", + on_tap=handle_tap, + controls=[ft.ListTile(title=ft.Text(f"Color {i}")) for i in range(10)], + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.controls = [sb] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + # normal state + flet_app.assert_screenshot( + "basic", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # open state + await flet_app.tester.tap(await flet_app.tester.find_by_key("sb")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "basic_opened", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_theme(flet_app: ftt.FletTestApp, request): + flet_app.page.theme = ft.Theme( + search_bar_theme=ft.SearchBarTheme( + bgcolor=ft.Colors.SURFACE_CONTAINER_HIGHEST, + text_capitalization=ft.TextCapitalization.SENTENCES, + shadow_color=ft.Colors.YELLOW, + overlay_color=ft.Colors.PURPLE, + padding=ft.Padding(10, 20, 50, 20), + elevation=100, + text_style=ft.TextStyle(color=ft.Colors.RED, italic=True, size=30), + hint_style=ft.TextStyle(color=ft.Colors.PINK, size=20, italic=True), + shape=ft.RoundedRectangleBorder( + radius=ft.BorderRadius.all(50), + ), + border_side=ft.BorderSide(color=ft.Colors.PURPLE, width=2), + ), + search_view_theme=ft.SearchViewTheme( + bgcolor=ft.Colors.PURPLE_200, + divider_color=ft.Colors.BLUE_800, + elevation=30, + header_hint_text_style=ft.TextStyle( + color=ft.Colors.BLUE, size=20, italic=True + ), + header_text_style=ft.TextStyle(color=ft.Colors.GREEN, size=20, italic=True), + shape=ft.RoundedRectangleBorder(radius=ft.BorderRadius.all(20)), + border_side=ft.BorderSide(color=ft.Colors.PURPLE, width=2), + size_constraints=ft.BoxConstraints( + min_width=400, max_width=400, min_height=400, max_height=400 + ), + header_height=100, + padding=ft.Padding(10, 20, 50, 20), + bar_padding=ft.Padding.all(5), + shrink_wrap=True, + ), + ) + + async def handle_tap(e: ft.Event[ft.SearchBar]): + print("handle_tap") + await sb.open_view() + + sb = ft.SearchBar( + key="sb", + bar_hint_text="Search colors...", + view_hint_text="Choose a color from the suggestions...", + on_tap=handle_tap, + controls=[ft.ListTile(title=ft.Text(f"Color {i}")) for i in range(10)], + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.controls = [sb] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + # normal state + flet_app.assert_screenshot( + "theme", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # hover to check overlay color + await flet_app.tester.mouse_hover(await flet_app.tester.find_by_key("sb")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "theme_hovered", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # open state + await flet_app.tester.tap(await flet_app.tester.find_by_key("sb")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "theme_opened", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_segmented_button.py b/sdk/python/packages/flet/integration_tests/controls/test_segmented_button.py index 8b9b56fae5..173cf27f07 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_segmented_button.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_segmented_button.py @@ -1,23 +1,27 @@ import pytest +import pytest_asyncio import flet as ft import flet.testing as ftt -@pytest.mark.asyncio(loop_scope="module") -async def test_segmented_button_basic(flet_app: ftt.FletTestApp, request): +# Create a new flet_app instance for each test method +@pytest_asyncio.fixture(scope="function", autouse=True) +def flet_app(flet_app_function): + return flet_app_function + + +@pytest.mark.asyncio(loop_scope="function") +async def test_basic(flet_app: ftt.FletTestApp, request): await flet_app.assert_control_screenshot( request.node.name, ft.SegmentedButton( - selected_icon=ft.Icon(ft.Icons.CHECK_SHARP), selected=["1"], - allow_empty_selection=True, - allow_multiple_selection=True, segments=[ ft.Segment( value="1", - label=ft.Text("1"), - icon=ft.Icon(ft.Icons.LOOKS_ONE), + label="1", + icon=ft.Icons.LOOKS_ONE, ), ft.Segment( value="2", @@ -27,13 +31,61 @@ async def test_segmented_button_basic(flet_app: ftt.FletTestApp, request): ft.Segment( value="3", label=ft.Text("3"), - icon=ft.Icon(ft.Icons.LOOKS_3), ), ft.Segment( value="4", - label=ft.Text("4"), - icon=ft.Icon(ft.Icons.LOOKS_4), + icon=ft.Icons.LOOKS_4, ), ], ), ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_theme(flet_app: ftt.FletTestApp): + flet_app.page.theme = ft.Theme( + segmented_button_theme=ft.SegmentedButtonTheme( + selected_icon=ft.Icons.HOME, + style=ft.ButtonStyle( + bgcolor=ft.Colors.BLUE, shape=ft.BeveledRectangleBorder() + ), + ) + ) + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot( + ft.SegmentedButton( + selected=["1"], + segments=[ + ft.Segment( + value="1", + label="1", + icon=ft.Icons.LOOKS_ONE, + ), + ft.Segment( + value="2", + label=ft.Text("2"), + icon=ft.Icon(ft.Icons.LOOKS_TWO), + ), + ft.Segment( + value="3", + label=ft.Text("3"), + ), + ft.Segment( + value="4", + icon=ft.Icons.LOOKS_4, + ), + ], + ), + key="sb", + ) + flet_app.page.add(scr_1) + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "theme_1", + await scr_1.capture(pixel_ratio=flet_app.screenshots_pixel_ratio), + ) diff --git a/sdk/python/packages/flet/src/flet/controls/material/dropdown.py b/sdk/python/packages/flet/src/flet/controls/material/dropdown.py index 083dbde3da..e3bd52bcc4 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/dropdown.py +++ b/sdk/python/packages/flet/src/flet/controls/material/dropdown.py @@ -194,6 +194,11 @@ class Dropdown(ConstrainedControl): Called when the selected item of this dropdown has changed. """ + on_text_change: Optional[ControlEventHandler["Dropdown"]] = None + """ + Called when the text input of this dropdown has changed. + """ + on_focus: Optional[ControlEventHandler["Dropdown"]] = None """ Called when the control has received focus. @@ -346,7 +351,8 @@ class Dropdown(ConstrainedControl): def before_update(self): super().before_update() - self.expand_loose = self.expand # to fix a display issue + if isinstance(self.expand, bool): + self.expand_loose = self.expand # to fix a display issue def __contains__(self, item): return item in self.options diff --git a/sdk/python/packages/flet/src/flet/controls/material/navigation_bar.py b/sdk/python/packages/flet/src/flet/controls/material/navigation_bar.py index 3bcd04b1ab..2146374f38 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/navigation_bar.py +++ b/sdk/python/packages/flet/src/flet/controls/material/navigation_bar.py @@ -10,6 +10,7 @@ from flet.controls.control_event import ControlEventHandler from flet.controls.control_state import ControlStateValue from flet.controls.duration import DurationValue +from flet.controls.padding import PaddingValue from flet.controls.types import ( ColorValue, IconDataOrControl, @@ -126,6 +127,12 @@ class NavigationBar(ConstrainedControl, AdaptiveControl): Defaults to `NavigationBarLabelBehavior.ALWAYS_SHOW`. """ + label_padding: Optional[PaddingValue] = None + """ + The padding around the + [`NavigationBarDestination.label`][flet.NavigationBarDestination.label]. + """ + elevation: Optional[Number] = None """ The elevation of the navigation bar itself. @@ -160,8 +167,7 @@ class NavigationBar(ConstrainedControl, AdaptiveControl): overlay_color: Optional[ControlStateValue[ColorValue]] = None """ - The highlight color of the - `NavigationDestination` in various + The highlight color of the `NavigationBarDestination` in various [`ControlState`][flet.ControlState] states. The following [`ControlState`][flet.ControlState] diff --git a/sdk/python/packages/flet/src/flet/controls/material/search_bar.py b/sdk/python/packages/flet/src/flet/controls/material/search_bar.py index bbd003dd64..1b96f042a0 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/search_bar.py +++ b/sdk/python/packages/flet/src/flet/controls/material/search_bar.py @@ -78,37 +78,44 @@ class SearchBar(ConstrainedControl): bar_shadow_color: Optional[ControlStateValue[ColorValue]] = None """ - TBD + The shadow color of the search bar. """ bar_elevation: Optional[ControlStateValue[Optional[Number]]] = None """ - TBD + The elevation of the search bar. """ bar_border_side: Optional[ControlStateValue[BorderSide]] = None """ - TBD + The color and weight of the search bar's outline. + + This value is combined with [`SearchBar.bar_shape`][flet.SearchBar.bar_shape] to + create a shape decorated with an outline. """ bar_shape: Optional[ControlStateValue[OutlinedBorder]] = None """ - TBD + The shape of the search bar. + + This shape is combined with + [`SearchBar.bar_border_side`][flet.SearchBar.bar_border_side] to create a shape + decorated with an outline. """ bar_text_style: Optional[ControlStateValue[TextStyle]] = None """ - TBD + The style to use for the text being edited. """ bar_hint_text_style: Optional[ControlStateValue[TextStyle]] = None """ - TBD + The style to use for the [`SearchBar.bar_hint_text`][flet.SearchBar.bar_hint_text]. """ bar_padding: Optional[ControlStateValue[PaddingValue]] = None """ - TBD + The padding between the search bar's boundary and its contents. """ bar_scroll_padding: PaddingValue = 20 @@ -120,6 +127,11 @@ class SearchBar(ConstrainedControl): distance from the Scrollable edges. """ + bar_size_constraints: Optional[BoxConstraints] = None + """ + Optional size constraints for the search bar. + """ + view_leading: Optional[Control] = None """ A `Control` to display before the text input field when the search view is open. @@ -176,12 +188,36 @@ class SearchBar(ConstrainedControl): view_size_constraints: Optional[BoxConstraints] = None """ - TBD + Optional size constraints for the search view. + + By default, the search view has the same width as the search bar and is 2/3 the + height of the screen. If the width and height of the view are within the + view_size_constraints, the view will show its default size. Otherwise, the size of + the view will be constrained by this property. """ view_header_height: Optional[Number] = None """ - TBD + The height of the search field on the search view. + """ + + view_padding: Optional[PaddingValue] = None + """ + The padding to use for the search view. + + Has no effect if the search view is full-screen. + """ + + view_bar_padding: Optional[PaddingValue] = None + """ + The padding to use for the search view's search bar. + + If null, then the default value is 8.0 horizontally. + """ + + shrink_wrap: Optional[bool] = None + """ + Whether the search view should shrink-wrap its contents. """ divider_color: Optional[ColorValue] = None diff --git a/sdk/python/packages/flet/src/flet/controls/material/segmented_button.py b/sdk/python/packages/flet/src/flet/controls/material/segmented_button.py index b395e39458..14e8865c64 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/segmented_button.py +++ b/sdk/python/packages/flet/src/flet/controls/material/segmented_button.py @@ -105,7 +105,7 @@ class SegmentedButton(ConstrainedControl): when the user (un)selects a segment. """ - selected_icon: Optional[Control] = None + selected_icon: Optional[IconDataOrControl] = None """ An `Icon` control that is used to indicate a segment is selected. diff --git a/sdk/python/packages/flet/src/flet/controls/material/tabs.py b/sdk/python/packages/flet/src/flet/controls/material/tabs.py index 800d6af03a..238127d44f 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/tabs.py +++ b/sdk/python/packages/flet/src/flet/controls/material/tabs.py @@ -413,8 +413,7 @@ class TabBar(ConstrainedControl, AdaptiveControl): The selected tab's location appearance can be refined further with the [`indicator_color`][flet.TabBar.indicator_color], [`indicator_thickness`][flet.TabBar.indicator_thickness], - [`indicator_padding`][flet.TabBar.indicator_padding], and - [`indicator`][flet.TabBar.indicator] properties. + and [`indicator`][flet.TabBar.indicator] properties. """ indicator_animation: Optional[TabIndicatorAnimation] = None diff --git a/sdk/python/packages/flet/src/flet/controls/theme.py b/sdk/python/packages/flet/src/flet/controls/theme.py index 232ceac4c8..ac2cb59226 100644 --- a/sdk/python/packages/flet/src/flet/controls/theme.py +++ b/sdk/python/packages/flet/src/flet/controls/theme.py @@ -5,7 +5,7 @@ from flet.controls.alignment import Alignment from flet.controls.border import BorderSide from flet.controls.border_radius import BorderRadiusValue -from flet.controls.box import BoxConstraints, BoxDecoration, BoxShadow +from flet.controls.box import BoxConstraints, BoxDecoration, BoxShadowValue from flet.controls.buttons import ButtonStyle, OutlinedBorder from flet.controls.control_state import ControlStateValue from flet.controls.duration import DurationValue @@ -2875,94 +2875,449 @@ class SearchBarTheme: """ shadow_color: Optional[ControlStateValue[ColorValue]] = None + """ + Overrides the default value of + [`SearchBar.bar_shadow_color`][flet.SearchBar.bar_shadow_color] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + overlay_color: Optional[ControlStateValue[ColorValue]] = None + """ + Overrides the default value of + [`SearchBar.bar_overlay_color`][flet.SearchBar.bar_overlay_color] in all + descendant [`SearchBar`][flet.SearchBar] controls. + """ + elevation: Optional[ControlStateValue[Optional[Number]]] = None + """ + Overrides the default value of + [`SearchBar.bar_elevation`][flet.SearchBar.bar_elevation] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + text_style: Optional[ControlStateValue[TextStyle]] = None + """ + Overrides the default value of + [`SearchBar.bar_text_style`][flet.SearchBar.bar_text_style] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + hint_style: Optional[ControlStateValue[TextStyle]] = None + """ + Overrides the default value of + [`SearchBar.bar_hint_text_style`][flet.SearchBar.bar_hint_text_style] in all + descendant [`SearchBar`][flet.SearchBar] controls. + """ + shape: Optional[ControlStateValue[OutlinedBorder]] = None + """ + Overrides the default value of + [`SearchBar.bar_shape`][flet.SearchBar.bar_shape] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + padding: Optional[ControlStateValue[PaddingValue]] = None + """ + Overrides the default value of + [`SearchBar.bar_padding`][flet.SearchBar.bar_padding] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + size_constraints: Optional[BoxConstraints] = None + """ + Overrides the default value of + [`SearchBar.bar_size_constraints`][flet.SearchBar.bar_size_constraints] in all + descendant [`SearchBar`][flet.SearchBar] controls. + """ + border_side: Optional[ControlStateValue[BorderSide]] = None + """ + Overrides the default value of + [`SearchBar.bar_border_side`][flet.SearchBar.bar_border_side] in all + descendant [`SearchBar`][flet.SearchBar] controls. + """ @dataclass class SearchViewTheme: + """ + Customizes the appearance of [`SearchBar`][flet.SearchBar] controls across the + app. + """ + bgcolor: Optional[ColorValue] = None + """ + Overrides the default value of + [`SearchBar.view_bgcolor`][flet.SearchBar.view_bgcolor] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + divider_color: Optional[ColorValue] = None + """ + Overrides the default value of + [`SearchBar.divider_color`][flet.SearchBar.divider_color] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + elevation: Optional[Number] = None + """ + Overrides the default value of + [`SearchBar.view_elevation`][flet.SearchBar.view_elevation] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + header_hint_text_style: Optional[TextStyle] = None + """ + Overrides the default value of + [`SearchBar.view_hint_text_style`][flet.SearchBar.view_hint_text_style] in all + descendant [`SearchBar`][flet.SearchBar] controls. + """ + header_text_style: Optional[TextStyle] = None + """ + Overrides the default value of + [`SearchBar.view_header_text_style`][flet.SearchBar.view_header_text_style] in all + descendant [`SearchBar`][flet.SearchBar] controls. + """ + shape: Optional[OutlinedBorder] = None + """ + Overrides the default value of + [`SearchBar.view_shape`][flet.SearchBar.view_shape] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + border_side: Optional[BorderSide] = None + """ Overrides the default value of + [`SearchBar.view_side`][flet.SearchBar.view_side] in all + descendant [`SearchBar`][flet.SearchBar] controls. + """ + size_constraints: Optional[BoxConstraints] = None + """ + Overrides the default value of + [`SearchBar.view_size_constraints`][flet.SearchBar.view_size_constraints] in all + descendant [`SearchBar`][flet.SearchBar] controls. + """ + header_height: Optional[Number] = None + """ + Overrides the default value of + [`SearchBar.view_header_height`][flet.SearchBar.view_header_height] in all + descendant [`SearchBar`][flet.SearchBar] controls. + """ + padding: Optional[PaddingValue] = None + """ + Overrides the default value of + [`SearchBar.view_padding`][flet.SearchBar.view_padding] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + bar_padding: Optional[PaddingValue] = None + """ + Overrides the default value of + [`SearchBar.view_bar_padding`][flet.SearchBar.view_bar_padding] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ + shrink_wrap: Optional[bool] = None + """ + Overrides the default value of + [`SearchBar.shrink_wrap`][flet.SearchBar.shrink_wrap] in all descendant + [`SearchBar`][flet.SearchBar] controls. + """ @dataclass class NavigationDrawerTheme: + """ + Customizes the appearance of descendant [`NavigationDrawer`][flet.NavigationDrawer] + controls. + """ + bgcolor: Optional[ColorValue] = None + """ + Overrides the default value for + [`NavigationDrawer.bgcolor`][flet.NavigationDrawer.bgcolor]. + """ + shadow_color: Optional[ColorValue] = None + """ + Overrides the default value for + [`NavigationDrawer.shadow_color`][flet.NavigationDrawer.shadow_color]. + """ + indicator_color: Optional[ColorValue] = None + """ + Overrides the default value for + [`NavigationDrawer.indicator_color`][flet.NavigationDrawer.indicator_color]. + """ + elevation: Optional[Number] = None + """ + Overrides the default value for + [`NavigationDrawer.elevation`][flet.NavigationDrawer.elevation]. + """ + tile_height: Optional[Number] = None + """ + Overrides the default height of + [`NavigationDrawerDestination`][flet.NavigationDrawerDestination]. + """ + label_text_style: Optional[ControlStateValue[TextStyle]] = None + """ + The style to merge with the default text style for + [`NavigationDrawerDestination`][flet.NavigationDrawerDestination] labels. + """ + indicator_shape: Optional[OutlinedBorder] = None + """ + Overrides the default value for + [`NavigationDrawer.indicator_shape`][flet.NavigationDrawer.indicator_shape]. + """ + indicator_size: Optional[Size] = None + """ + Overrides the default size of the [`NavigationDrawer`][flet.NavigationDrawer]'s + selection indicator. + """ @dataclass class NavigationBarTheme: + """ + Customizes the appearance of [`NavigationBar`][flet.NavigationBar] + controls across the + app. + """ + bgcolor: Optional[ColorValue] = None + """Overrides the default value for + [`NavigationBar.bgcolor`][flet.NavigationBar.bgcolor]. + """ + shadow_color: Optional[ColorValue] = None + """ + Overrides the default value for + [`NavigationBar.shadow_color`][flet.NavigationBar.shadow_color]. + """ + indicator_color: Optional[ColorValue] = None + """ + Overrides the default value for + [`NavigationBar.indicator_color`][flet.NavigationBar.indicator_color]. + """ + overlay_color: Optional[ControlStateValue[ColorValue]] = None + """ + Overrides the default value for + [`NavigationBar.overlay_color`][flet.NavigationBar.overlay_color]. + """ + elevation: Optional[Number] = None + """ + Overrides the default value for + [`NavigationBar.elevation`][flet.NavigationBar.elevation]. + """ + height: Optional[Number] = None + """ + Overrides the default value for NavigationBar height. + """ + label_text_style: Optional[ControlStateValue[TextStyle]] = None + """ + The style to merge with the default text style for + [`NavigationBarDestination`][flet.NavigationBarDestination] labels. + """ + indicator_shape: Optional[OutlinedBorder] = None + """ + Overrides the default value for + [`NavigationBar.indicator_shape`][flet.NavigationBar.indicator_shape]. + """ + label_behavior: Optional[NavigationBarLabelBehavior] = None + """ + Overrides the default value for + [`NavigationBar.label_behavior`][flet.NavigationBar.label_behavior]. + """ + label_padding: Optional[PaddingValue] = None + """ + Overrides the default value for + [`NavigationBar.label_padding`][flet.NavigationBar.label_padding]. + """ @dataclass class SegmentedButtonTheme: + """ + Customizes the appearance of [`SegmentedButton`][flet.SegmentedButton] + controls across the app. + """ + selected_icon: Optional[IconData] = None + """ + Overrides the default value for + [`SegmentedButton.selected_icon`][flet.SegmentedButton.selected_icon]. + """ + style: Optional[ButtonStyle] = None + """ + Overrides the default value for + [`SegmentedButton.style`][flet.SegmentedButton.style]. + """ @dataclass class IconTheme: + """ + Customizes the appearance of [`Icon`][flet.Icon] controls across the app. + """ + color: Optional[ColorValue] = None + """ + Overrides the default value for [`Icon.color`][flet.Icon.color]. + """ + apply_text_scaling: Optional[bool] = None + """ + Overrides the default value for + [`Icon.apply_text_scaling`][flet.Icon.apply_text_scaling]. + """ + fill: Optional[Number] = None + """ + Overrides the default value for [`Icon.fill`][flet.Icon.fill]. + """ + opacity: Optional[Number] = None + """ + An opacity to apply to both explicit and default icon colors. + """ + size: Optional[Number] = None + """ + Overrides the default value for [`Icon.size`][flet.Icon.size]. + """ + optical_size: Optional[Number] = None + """ + Overrides the default value for [`Icon.optical_size`][flet.Icon.optical_size]. + """ + grade: Optional[Number] = None + """ + Overrides the default value for [`Icon.grade`][flet.Icon.grade]. + """ + weight: Optional[Number] = None - shadows: Optional[list[BoxShadow]] = None + """ + Overrides the default value for [`Icon.weight`][flet.Icon.weight]. + """ + + shadows: Optional[BoxShadowValue] = None + """ + Overrides the default value for [`Icon.shadows`][flet.Icon.shadows]. + """ @dataclass class DataTableTheme: + """ + Customizes the appearance of [`DataTable`][flet.DataTable] controls across the app. + """ + checkbox_horizontal_margin: Optional[Number] = None + """ + Overrides the default value for + [`DataTable.checkbox_horizontal_margin`][flet.DataTable.checkbox_horizontal_margin]. + """ + column_spacing: Optional[Number] = None + """ + Overrides the default value for + [`DataTable.column_spacing`][flet.DataTable.column_spacing]. + """ + data_row_max_height: Optional[Number] = None + """ + Overrides the default value for + [`DataTable.data_row_max_height`][flet.DataTable.data_row_max_height]. + """ + data_row_min_height: Optional[Number] = None + """ + Overrides the default value for + [`DataTable.data_row_min_height`][flet.DataTable.data_row_min_height]. + """ + data_row_color: Optional[ControlStateValue[ColorValue]] = None + """ + Overrides the default value for + [`DataTable.data_row_color`][flet.DataTable.data_row_color]. + """ + data_text_style: Optional[TextStyle] = None + """ + Overrides the default value for + [`DataTable.data_text_style`][flet.DataTable.data_text_style]. + """ + divider_thickness: Optional[Number] = None + """ + Overrides the default value for + [`DataTable.divider_thickness`][flet.DataTable.divider_thickness]. + """ + horizontal_margin: Optional[Number] = None + """ + Overrides the default value for + [`DataTable.horizontal_margin`][flet.DataTable.horizontal_margin]. + """ + heading_text_style: Optional[TextStyle] = None + """ + Overrides the default value for + [`DataTable.heading_text_style`][flet.DataTable.heading_text_style]. + """ + heading_row_color: Optional[ControlStateValue[ColorValue]] = None + """ + Overrides the default value for + [`DataTable.heading_row_color`][flet.DataTable.heading_row_color]. + """ + heading_row_height: Optional[Number] = None + """ + Overrides the default value for + [`DataTable.heading_row_height`][flet.DataTable.heading_row_height]. + """ + data_row_cursor: Optional[ControlStateValue[MouseCursor]] = None + """ + Overrides the default value for [`DataRow`][flet.DataRow] mouse cursor. + """ + decoration: Optional[BoxDecoration] = None + """ + Overrides the default value for [`DataTable`][flet.DataTable] decoration. + """ + heading_row_alignment: Optional[MainAxisAlignment] = None + """ + Overrides the default value for + [`DataColumn.heading_row_alignment`][flet.DataColumn.heading_row_alignment]. + """ + heading_cell_cursor: Optional[ControlStateValue[MouseCursor]] = None + """ + Overrides the default value for + [`DataColumn`][flet.DataColumn] mouse cursor. + """ @dataclass