diff --git a/packages/flet/lib/src/controls/datatable.dart b/packages/flet/lib/src/controls/datatable.dart index 01601bbd7..e181971b7 100644 --- a/packages/flet/lib/src/controls/datatable.dart +++ b/packages/flet/lib/src/controls/datatable.dart @@ -29,15 +29,16 @@ class DataTableControl extends StatelessWidget { var gradient = control.getGradient("gradient", theme); var horizontalLines = control.getBorderSide("horizontal_lLines", theme); var verticalLines = control.getBorderSide("vertical_lines", theme); - var defaultDecoration = - theme.dataTableTheme.decoration ?? const BoxDecoration(); + var defaultDecoration = theme.dataTableTheme.decoration as BoxDecoration? ?? + const BoxDecoration(); BoxDecoration? decoration; + if (bgcolor != null || border != null || borderRadius != null || gradient != null) { - decoration = (defaultDecoration as BoxDecoration).copyWith( + decoration = defaultDecoration.copyWith( color: parseColor(bgcolor, theme), border: border, borderRadius: borderRadius, @@ -45,7 +46,7 @@ class DataTableControl extends StatelessWidget { } var datatable = DataTable( - decoration: decoration, + decoration: decoration ?? defaultDecoration, border: (horizontalLines != null || verticalLines != null) ? TableBorder( horizontalInside: horizontalLines ?? BorderSide.none, diff --git a/packages/flet/lib/src/controls/dropdown.dart b/packages/flet/lib/src/controls/dropdown.dart index b6753e166..d534be100 100644 --- a/packages/flet/lib/src/controls/dropdown.dart +++ b/packages/flet/lib/src/controls/dropdown.dart @@ -81,7 +81,9 @@ class _DropdownControlState extends State { widget.control.getColor("focused_border_color", context); var borderWidth = widget.control.getDouble("border_width"); var focusedBorderWidth = widget.control.getDouble("focused_border_width"); - var menuWidth = widget.control.getDouble("menu_width", double.infinity)!; + var menuWidth = widget.control.getDouble("menu_width"); + var bgColor = widget.control.getWidgetStateColor("bgcolor", theme); + var elevation = widget.control.getWidgetStateDouble("elevation"); FormFieldInputBorder inputBorder = widget.control .getFormFieldInputBorder("border", FormFieldInputBorder.outline)!; @@ -148,8 +150,30 @@ class _DropdownControlState extends State { TextStyle? textStyle = widget.control.getTextStyle("text_style", theme); if (textSize != null || color != null) { - textStyle = (textStyle ?? const TextStyle()).copyWith( - fontSize: textSize, color: color ?? theme.colorScheme.onSurface); + textStyle = + (textStyle ?? theme.dropdownMenuTheme.textStyle ?? const TextStyle()) + .copyWith( + fontSize: textSize, + color: color ?? theme.colorScheme.onSurface); + } + + MenuStyle? menuStyle = widget.control.getMenuStyle("menu_style", theme); + if (bgColor != null || elevation != null || menuWidth != null) { + menuStyle = + (menuStyle ?? theme.dropdownMenuTheme.menuStyle ?? const MenuStyle()) + .copyWith( + backgroundColor: bgColor, + elevation: elevation, + fixedSize: WidgetStateProperty.all( + Size.fromWidth(menuWidth ?? double.infinity))); + } + + if (textSize != null || color != null) { + textStyle = + (textStyle ?? theme.dropdownMenuTheme.textStyle ?? const TextStyle()) + .copyWith( + fontSize: textSize, + color: color ?? theme.colorScheme.onSurface); } var items = widget.control @@ -213,11 +237,12 @@ class _DropdownControlState extends State { errorText: widget.control.getString("error_text"), hintText: widget.control.getString("hint_text"), helperText: widget.control.getString("helper_text"), - menuStyle: MenuStyle( - backgroundColor: widget.control.getWidgetStateColor("bgcolor", theme), - elevation: widget.control.getWidgetStateDouble("elevation"), - fixedSize: WidgetStateProperty.all(Size.fromWidth(menuWidth)), - ), + // menuStyle: MenuStyle( + // backgroundColor: widget.control.getWidgetStateColor("bgcolor", theme), + // elevation: widget.control.getWidgetStateDouble("elevation"), + // fixedSize: WidgetStateProperty.all(Size.fromWidth(menuWidth)), + // ), + menuStyle: menuStyle, inputDecorationTheme: inputDecorationTheme, onSelected: widget.control.disabled ? null diff --git a/packages/flet/lib/src/controls/expansion_tile.dart b/packages/flet/lib/src/controls/expansion_tile.dart index 05344976a..f1d2144fc 100644 --- a/packages/flet/lib/src/controls/expansion_tile.dart +++ b/packages/flet/lib/src/controls/expansion_tile.dart @@ -52,8 +52,7 @@ class ExpansionTileControl extends StatelessWidget { var affinity = control.getListTileControlAffinity( "affinity", ListTileControlAffinity.platform)!; - var clipBehavior = - parseClip(control.getString("clip_behavior"), Clip.none)!; + var clipBehavior = parseClip(control.getString("clip_behavior")); var expandedCrossAxisAlignment = control.getCrossAxisAlignment( "expanded_cross_axis_alignment", CrossAxisAlignment.center)!; diff --git a/packages/flet/lib/src/controls/list_tile.dart b/packages/flet/lib/src/controls/list_tile.dart index bea5172e4..629c7be3c 100644 --- a/packages/flet/lib/src/controls/list_tile.dart +++ b/packages/flet/lib/src/controls/list_tile.dart @@ -74,9 +74,9 @@ class ListTileControl extends StatelessWidget with FletStoreMixin { Widget tile = ListTile( autofocus: control.getBool("autofocus", false)!, contentPadding: control.getPadding("content_padding"), - isThreeLine: control.getBool("is_three_line", false)!, + isThreeLine: control.getBool("is_three_line"), selected: control.getBool("selected", false)!, - dense: control.getBool("dense", false)!, + dense: control.getBool("dense"), onTap: onPressed, onLongPress: onLongPress, enabled: !control.disabled, @@ -89,7 +89,7 @@ class ListTileControl extends StatelessWidget with FletStoreMixin { selectedColor: control.getColor("selected_color", context), focusColor: control.getColor("focus_color", context), tileColor: control.getColor("bgcolor", context), - splashColor: control.getColor("bgcolor_activated", context), + splashColor: control.getColor("splash_color", context), hoverColor: control.getColor("hover_color", context), iconColor: control.getColor("icon_color", context), textColor: control.getColor("text_color", context), diff --git a/packages/flet/lib/src/utils/theme.dart b/packages/flet/lib/src/utils/theme.dart index 36b4057e9..c8195d952 100644 --- a/packages/flet/lib/src/utils/theme.dart +++ b/packages/flet/lib/src/utils/theme.dart @@ -94,25 +94,21 @@ ThemeData parseTheme( {ThemeData? parentTheme}) { ThemeData? theme = parentTheme; - var primarySwatch = parseColor(value?["primary_swatch"], theme); - var colorSchemeSeed = parseColor(value?["color_scheme_seed"], theme); - - if (colorSchemeSeed != null) primarySwatch = null; - - if (colorSchemeSeed == null && primarySwatch == null) { - colorSchemeSeed = Colors.blue; - } + var colorSchemeSeed = + parseColor(value?["color_scheme_seed"], theme) ?? Colors.blue; // create new theme theme ??= ThemeData( - primarySwatch: - primarySwatch != null ? primarySwatch as MaterialColor : null, colorSchemeSeed: colorSchemeSeed, fontFamily: value?["font_family"], brightness: brightness, - useMaterial3: value?["use_material3"] ?? primarySwatch == null, + useMaterial3: value?["use_material3"], ); + ColorScheme? colorScheme = parseColorScheme(value?["color_scheme"], theme); + DividerThemeData? dividerTheme = + parseDividerTheme(value?["divider_theme"], theme); + theme = theme.copyWith( extensions: { SystemUiOverlayStyleTheme(value?["system_overlay_style"] != null @@ -124,7 +120,7 @@ ThemeData parseTheme( parseVisualDensity(value?["visual_density"], theme.visualDensity)!, pageTransitionsTheme: parsePageTransitions( value?["page_transitions"], theme.pageTransitionsTheme)!, - colorScheme: parseColorScheme(value?["color_scheme"], theme), + colorScheme: colorScheme, textTheme: parseTextTheme(value?["text_theme"], theme, theme.textTheme), primaryTextTheme: parseTextTheme( value?["primary_text_theme"], theme, theme.primaryTextTheme), @@ -140,13 +136,10 @@ ThemeData parseTheme( canvasColor: parseColor(value?["canvas_color"], theme), scaffoldBackgroundColor: parseColor(value?["scaffold_bgcolor"], theme), cardColor: parseColor(value?["card_bgcolor"], theme), - dividerColor: parseColor(value?["divider_color"], theme), + dividerColor: dividerTheme?.color, hintColor: parseColor(value?["hint_color"], theme), - shadowColor: parseColor(value?["shadow_color"], theme), + shadowColor: colorScheme?.shadow, secondaryHeaderColor: parseColor(value?["secondary_header_color"], theme), - primaryColor: parseColor(value?["primary_color"], theme), - primaryColorLight: parseColor(value?["primary_color_light"], theme), - primaryColorDark: parseColor(value?["primary_color_dark"], theme), dialogTheme: parseDialogTheme(value?["dialog_theme"], theme), bottomSheetTheme: parseBottomSheetTheme(value?["bottom_sheet_theme"], theme), @@ -160,15 +153,14 @@ ThemeData parseTheme( radioTheme: parseRadioTheme(value?["radio_theme"], theme), badgeTheme: parseBadgeTheme(value?["badge_theme"], theme), switchTheme: parseSwitchTheme(value?["switch_theme"], context), - dividerTheme: parseDividerTheme(value?["divider_theme"], theme), + dividerTheme: dividerTheme, snackBarTheme: parseSnackBarTheme(value?["snackbar_theme"], theme), bannerTheme: parseBannerTheme(value?["banner_theme"], theme), datePickerTheme: parseDatePickerTheme(value?["date_picker_theme"], theme), navigationRailTheme: parseNavigationRailTheme(value?["navigation_rail_theme"], theme), appBarTheme: parseAppBarTheme(value?["appbar_theme"], theme), - dropdownMenuTheme: - parseDropdownMenuTheme(value?["dropdown_menu_theme"], theme), + dropdownMenuTheme: parseDropdownMenuTheme(value?["dropdown_theme"], theme), listTileTheme: parseListTileTheme(value?["list_tile_theme"], theme), tooltipTheme: parseTooltipTheme(value?["tooltip_theme"], context), expansionTileTheme: @@ -538,8 +530,8 @@ FloatingActionButtonThemeData? parseFloatingActionButtonTheme( shape: parseShape(value["shape"], theme), enableFeedback: parseBool(value["enable_feedback"]), extendedPadding: parsePadding(value["extended_padding"]), - extendedTextStyle: parseTextStyle(value["extended_text_style"], theme), - extendedIconLabelSpacing: parseDouble(value["extended_icon_label_spacing"]), + extendedTextStyle: parseTextStyle(value["text_style"], theme), + extendedIconLabelSpacing: parseDouble(value["icon_label_spacing"]), mouseCursor: parseWidgetStateMouseCursor(value["mouse_cursor"]), iconSize: parseDouble(value["icon_size"]), extendedSizeConstraints: @@ -858,7 +850,7 @@ ListTileThemeData? parseListTileTheme( leadingAndTrailingTextStyle: parseTextStyle(value["leading_and_trailing_text_style"], theme), mouseCursor: parseWidgetStateMouseCursor(value["mouse_cursor"]), - minTileHeight: parseDouble(value["min_tile_height"]), + minTileHeight: parseDouble(value["min_height"]), ); } diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/button_theme/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/button_theme/theme_1.png new file mode 100644 index 000000000..978a1aeeb Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/button_theme/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/data_table/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/data_table/basic.png new file mode 100644 index 000000000..fc008f1b2 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/data_table/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/data_table/data_table_basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/data_table/data_table_basic.png deleted file mode 100644 index 3b40a46de..000000000 Binary files a/sdk/python/packages/flet/integration_tests/controls/golden/macos/data_table/data_table_basic.png and /dev/null differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/data_table/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/data_table/theme_1.png new file mode 100644 index 000000000..c0aab672d Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/data_table/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/divider/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/divider/basic.png new file mode 100644 index 000000000..20beecece Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/divider/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/divider/properties.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/divider/properties.png new file mode 100644 index 000000000..3f1e991ff Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/divider/properties.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/divider/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/divider/theme_1.png new file mode 100644 index 000000000..26d3db5b7 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/divider/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/basic_0.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/basic_0.png new file mode 100644 index 000000000..cdc604a8c Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/basic_0.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/basic_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/basic_1.png new file mode 100644 index 000000000..79b8847b0 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/basic_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/dropdown_0.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/dropdown_0.png deleted file mode 100644 index 35e1c066c..000000000 Binary files a/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/dropdown_0.png and /dev/null differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/dropdown_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/dropdown_1.png deleted file mode 100644 index a99f36051..000000000 Binary files a/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/dropdown_1.png and /dev/null differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/theme_0.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/theme_0.png new file mode 100644 index 000000000..bf94f5d0f Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/theme_0.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/theme_1.png new file mode 100644 index 000000000..510236927 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/dropdown/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/basic.png new file mode 100644 index 000000000..86bb4f6d3 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/collapsed.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/collapsed.png new file mode 100644 index 000000000..2395f8160 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/collapsed.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/expanded.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/expanded.png new file mode 100644 index 000000000..23a34b19d Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/expanded.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/expansion_tile_basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/expansion_tile_basic.png deleted file mode 100644 index 1f4968637..000000000 Binary files a/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile/expansion_tile_basic.png and /dev/null differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile_theme/collapsed.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile_theme/collapsed.png new file mode 100644 index 000000000..58ff0632c Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile_theme/collapsed.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile_theme/expanded.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile_theme/expanded.png new file mode 100644 index 000000000..2be68eead Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/expansion_tile_theme/expanded.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/filled_button_theme/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/filled_button_theme/theme_1.png new file mode 100644 index 000000000..a854a023b Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/filled_button_theme/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/floating_action_button_basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/basic.png similarity index 100% rename from sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/floating_action_button_basic.png rename to sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/basic.png diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/center_top_location.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/center_top_location.png new file mode 100644 index 000000000..34c8f03b4 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/center_top_location.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/disabled.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/disabled.png new file mode 100644 index 000000000..ad61aade6 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/disabled.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/elevation.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/elevation.png new file mode 100644 index 000000000..444160455 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/elevation.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/end_top_location.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/end_top_location.png new file mode 100644 index 000000000..cf44eb9e5 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/end_top_location.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/focus.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/focus.png new file mode 100644 index 000000000..ecc51407d Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/focus.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/hover.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/hover.png new file mode 100644 index 000000000..f652b8ec1 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/hover.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/properties1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/properties1.png new file mode 100644 index 000000000..fb2be22ef Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button/properties1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button_theme/theme_focus_disabled.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button_theme/theme_focus_disabled.png new file mode 100644 index 000000000..ea472c91a Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button_theme/theme_focus_disabled.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button_theme/theme_hover.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button_theme/theme_hover.png new file mode 100644 index 000000000..c532630c4 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button_theme/theme_hover.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button_theme/theme_normal.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button_theme/theme_normal.png new file mode 100644 index 000000000..5336ca38a Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/floating_action_button_theme/theme_normal.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon_button_theme/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon_button_theme/theme_1.png new file mode 100644 index 000000000..34e385a95 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/icon_button_theme/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/basic.png new file mode 100644 index 000000000..6ba25bdef Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/list_tile_basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/list_tile_basic.png deleted file mode 100644 index b41842213..000000000 Binary files a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/list_tile_basic.png and /dev/null differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/list_tile_properties1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/list_tile_properties1.png deleted file mode 100644 index 0c9abbbf4..000000000 Binary files a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/list_tile_properties1.png and /dev/null differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/properties1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/properties1.png new file mode 100644 index 000000000..0c6caaafc Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/properties1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/properties2.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/properties2.png new file mode 100644 index 000000000..8b7eab046 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/properties2.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/properties3.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/properties3.png new file mode 100644 index 000000000..1b886a722 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/properties3.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/toggle_inputs_click1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/toggle_inputs_click1.png new file mode 100644 index 000000000..f20d29327 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/toggle_inputs_click1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/toggle_inputs_hover.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/toggle_inputs_hover.png new file mode 100644 index 000000000..c29b6395c Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/toggle_inputs_hover.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/toggle_inputs_initial.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/toggle_inputs_initial.png new file mode 100644 index 000000000..f537694f5 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile/toggle_inputs_initial.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile_theme/theme1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile_theme/theme1.png new file mode 100644 index 000000000..0422d4099 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/list_tile_theme/theme1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/outlined_button_theme/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/outlined_button_theme/theme_1.png new file mode 100644 index 000000000..978a1aeeb Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/outlined_button_theme/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/text_button_theme/theme_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/text_button_theme/theme_1.png new file mode 100644 index 000000000..978a1aeeb Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/text_button_theme/theme_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/test_button_theme.py b/sdk/python/packages/flet/integration_tests/controls/test_button_theme.py new file mode 100644 index 000000000..9a011f4a9 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_button_theme.py @@ -0,0 +1,48 @@ +import pytest +import pytest_asyncio + +import flet as ft +import flet.testing as ftt + + +# 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_button_theme(flet_app: ftt.FletTestApp): + flet_app.page.theme = ft.Theme( + button_theme=ft.ButtonTheme( + style=ft.ButtonStyle( + bgcolor=ft.Colors.GREEN, + shape=ft.BeveledRectangleBorder( + radius=5, + ), + side=ft.BorderSide(width=5, color=ft.Colors.GREEN_900), + padding=ft.Padding.all(10), + # text_style=ft.TextStyle( + # size=15, + # italic=True, + # color=ft.Colors.ORANGE, # color is not shown on the button text, + # # use style.color instead + # ), + ), + ) + ) + + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot( + ft.Button(content="Button"), + ) + 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_data_table.py b/sdk/python/packages/flet/integration_tests/controls/test_data_table.py index e048d15fd..1d57441b8 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_data_table.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_data_table.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_data_table_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.DataTable( @@ -25,3 +32,76 @@ async def test_data_table_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( + data_table_theme=ft.DataTableTheme( + checkbox_horizontal_margin=10, + column_spacing=50, + data_row_max_height=200, + data_row_min_height=0, + data_row_color=ft.Colors.GREEN_200, + data_text_style=ft.TextStyle(color=ft.Colors.GREEN_800), + divider_thickness=10, + horizontal_margin=20, + heading_text_style=ft.TextStyle(italic=True), + heading_row_color=ft.Colors.ORANGE_200, + heading_row_height=100, + data_row_cursor=ft.MouseCursor.FORBIDDEN, # doesn't show on screenshot + heading_row_alignment=ft.MainAxisAlignment.START, + heading_cell_cursor=ft.MouseCursor.HELP, # doesn't show on screenshot + decoration=ft.BoxDecoration( + shape=ft.BoxShape.RECTANGLE, + bgcolor=ft.Colors.PURPLE_100, + border=ft.Border.all(color=ft.Colors.RED), + ), + ), + divider_theme=ft.DividerTheme( + color=ft.Colors.GREEN, + thickness=5, + ), + ) + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot( + ft.DataTable( + # bgcolor=ft.Colors.BLUE_100, + show_checkbox_column=True, + # border=ft.Border.all(color=ft.Colors.RED), + # border_radius=30, + columns=[ + ft.DataColumn(label="Column 1"), + ft.DataColumn(label=ft.Text("Column 2")), + ft.DataColumn(label=ft.Text("Column 3")), + ], + rows=[ + ft.DataRow( + on_select_change=lambda e: print(f"Selected row {e.data}"), + cells=[ + ft.DataCell("Item 1"), + ft.DataCell(ft.Text("Item 2")), + ft.DataCell(ft.Text("Item 3")), + ], + ), + ft.DataRow( + on_select_change=lambda e: print(f"Selected row {e.data}"), + cells=[ + ft.DataCell("Item 1"), + ft.DataCell(ft.Text("Item 2")), + ft.DataCell(ft.Text("Item 3")), + ], + ), + ], + ) + ) + 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_divider.py b/sdk/python/packages/flet/integration_tests/controls/test_divider.py index 77abc6f9b..841cdca84 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_divider.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_divider.py @@ -1,19 +1,26 @@ import pytest +import pytest_asyncio import flet as ft import flet.testing as ftt -@pytest.mark.asyncio(loop_scope="module") -async def test_divider_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.Divider(), ) -@pytest.mark.asyncio(loop_scope="module") -async def test_divider_properties(flet_app: ftt.FletTestApp, request): +@pytest.mark.asyncio(loop_scope="function") +async def test_properties(flet_app: ftt.FletTestApp, request): await flet_app.assert_control_screenshot( request.node.name, ft.Divider( @@ -24,3 +31,28 @@ async def test_divider_properties(flet_app: ftt.FletTestApp, request): trailing_indent=20, ), ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_theme(flet_app: ftt.FletTestApp): + flet_app.page.theme = ft.Theme( + divider_theme=ft.DividerTheme( + color=ft.Colors.GREEN, + thickness=5, + space=100, + leading_indent=20, + trailing_indent=20, + ), + ) + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot(ft.Divider()) + 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_dropdown.py b/sdk/python/packages/flet/integration_tests/controls/test_dropdown.py index 949ae8ea4..8c2e9e39e 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_dropdown.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_dropdown.py @@ -1,14 +1,22 @@ import pytest +import pytest_asyncio import flet as ft import flet.testing as ftt -@pytest.mark.asyncio(loop_scope="module") -async def test_dropdown_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): colors = [ft.Colors.RED, ft.Colors.BLUE, ft.Colors.GREEN] dd = ft.Dropdown( label="Color", + text="Select a color", options=[ ft.DropdownOption( key=color.value, content=ft.Text(value=color.value, color=color) @@ -26,7 +34,56 @@ async def test_dropdown_basic(flet_app: ftt.FletTestApp, request): # normal state flet_app.assert_screenshot( - "dropdown_0", + "basic_0", + 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("dd")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "basic_1", + 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( + dropdown_theme=ft.DropdownTheme( + text_style=ft.TextStyle(color=ft.Colors.PURPLE, size=20), + menu_style=ft.MenuStyle( + alignment=ft.Alignment.BOTTOM_CENTER, + elevation=10, + bgcolor=ft.Colors.GREEN_300, + ), + ) + ) + colors = [ft.Colors.RED, ft.Colors.BLUE, ft.Colors.GREEN] + dd = ft.Dropdown( + label="Color", + text="Select a color", + options=[ + ft.DropdownOption(key=color.value, content=ft.Text(value=color.value)) + for color in colors + ], + key="dd", + ) + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + flet_app.page.controls = [dd] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + # normal state + flet_app.assert_screenshot( + "theme_0", await flet_app.page.take_screenshot( pixel_ratio=flet_app.screenshots_pixel_ratio ), @@ -36,7 +93,7 @@ async def test_dropdown_basic(flet_app: ftt.FletTestApp, request): await flet_app.tester.tap(await flet_app.tester.find_by_key("dd")) await flet_app.tester.pump_and_settle() flet_app.assert_screenshot( - "dropdown_1", + "theme_1", await flet_app.page.take_screenshot( pixel_ratio=flet_app.screenshots_pixel_ratio ), diff --git a/sdk/python/packages/flet/integration_tests/controls/test_expansion_tile.py b/sdk/python/packages/flet/integration_tests/controls/test_expansion_tile.py index f06adbea5..7ad6ec147 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_expansion_tile.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_expansion_tile.py @@ -1,11 +1,61 @@ import pytest +import pytest_asyncio import flet as ft import flet.testing as ftt -@pytest.mark.asyncio(loop_scope="module") -async def test_expansion_tile_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.ExpansionTile("ExpansionTile Title") ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_expanded(flet_app: ftt.FletTestApp, request): + et = ft.ExpansionTile( + key="et", + title="ExpansionTile Title", + subtitle="ExpansionTile Subtitle", + # leading=ft.Icons.UMBRELLA, + trailing=ft.Icons.SUNNY, + controls=[ + ft.Text("ExpansionTile Content"), + ft.Text("More Content"), + ], + controls_padding=ft.Padding.all(10), + tile_padding=ft.Padding.all(20), + affinity=ft.TileAffinity.LEADING, + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.controls = [et] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + # normal state + flet_app.assert_screenshot( + "collapsed", + 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("et")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "expanded", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_expansion_tile_theme.py b/sdk/python/packages/flet/integration_tests/controls/test_expansion_tile_theme.py new file mode 100644 index 000000000..5c50aa635 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_expansion_tile_theme.py @@ -0,0 +1,69 @@ +import pytest +import pytest_asyncio + +import flet as ft +import flet.testing as ftt + + +# 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_expansion_tile_theme(flet_app: ftt.FletTestApp, request): + flet_app.page.theme = ft.Theme( + expansion_tile_theme=ft.ExpansionTileTheme( + bgcolor=ft.Colors.GREEN_200, + icon_color=ft.Colors.PINK, + text_color=ft.Colors.ORANGE, + collapsed_bgcolor=ft.Colors.YELLOW, + collapsed_icon_color=ft.Colors.BLUE, + collapsed_text_color=ft.Colors.PURPLE, + tile_padding=ft.Padding.all(10), + controls_padding=ft.Padding(bottom=100), + expanded_alignment=ft.Alignment.BOTTOM_RIGHT, + clip_behavior=ft.ClipBehavior.HARD_EDGE, + ) + ) + + et = ft.ExpansionTile( + key="et", + title="ExpansionTile Title", + subtitle="ExpansionTile Subtitle", + # leading=ft.Icons.UMBRELLA, + trailing=ft.Icons.SUNNY, + controls=[ + ft.Text("ExpansionTile Content"), + ft.Text("More Content"), + ], + controls_padding=ft.Padding.all(10), + tile_padding=ft.Padding.all(20), + affinity=ft.TileAffinity.LEADING, + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.controls = [et] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + # normal state + flet_app.assert_screenshot( + "collapsed", + 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("et")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "expanded", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_filled_button_theme.py b/sdk/python/packages/flet/integration_tests/controls/test_filled_button_theme.py new file mode 100644 index 000000000..dc68f548e --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_filled_button_theme.py @@ -0,0 +1,48 @@ +import pytest +import pytest_asyncio + +import flet as ft +import flet.testing as ftt + + +# 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_filled_button_theme(flet_app: ftt.FletTestApp): + flet_app.page.theme = ft.Theme( + filled_button_theme=ft.FilledButtonTheme( + style=ft.ButtonStyle( + bgcolor=ft.Colors.GREEN, + shape=ft.BeveledRectangleBorder( + radius=5, + ), + side=ft.BorderSide(width=5, color=ft.Colors.GREEN_900), + padding=ft.Padding.all(10), + # text_style=ft.TextStyle( + # size=15, + # italic=True, + # color=ft.Colors.ORANGE, # color is not shown on the button text, + # # use style.color instead + # ), + ), + ) + ) + + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot( + ft.FilledButton(content="Button"), + ) + 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_floating_action_button.py b/sdk/python/packages/flet/integration_tests/controls/test_floating_action_button.py index d8453ee9b..b1c8498a2 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_floating_action_button.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_floating_action_button.py @@ -1,12 +1,146 @@ import pytest +import pytest_asyncio import flet as ft import flet.testing as ftt -@pytest.mark.asyncio(loop_scope="module") -async def test_floating_action_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.FloatingActionButton("OK"), ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_properties1(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.FloatingActionButton( + content="Add", + icon=ft.Icons.ADD, + bgcolor=ft.Colors.GREEN, + shape=ft.RoundedRectangleBorder( + radius=4, side=ft.BorderSide(color=ft.Colors.RED, width=2.0) + ), + autofocus=False, + foreground_color=ft.Colors.PURPLE, + clip_behavior=ft.ClipBehavior.ANTI_ALIAS, # not shows on screenshot + ), + ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_properties2(flet_app: ftt.FletTestApp, request): + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + fab = ft.FloatingActionButton( + key="fab", + content="Add", + bgcolor=ft.Colors.GREEN, + focus_color=ft.Colors.YELLOW, + elevation=20, + focus_elevation=50, + disabled_elevation=30, + hover_elevation=100, + hover_color=ft.Colors.BLUE, + highlight_elevation=50, # is not shown on screenshots + splash_color=ft.Colors.ORANGE, # is not shown on screenshots + enable_feedback=True, # is not shown on screenshots + url="https://example.com", # is not shown on screenshots + mouse_cursor=ft.MouseCursor.COPY, # is not shown on screenshots + ) + flet_app.page.add(fab) + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "elevation", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # test focus color + fab.autofocus = True + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "focus", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # test disabled + fab.autofocus = False + fab.disabled = True + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "disabled", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # test hover + fab.disabled = False + flet_app.page.update() + await flet_app.tester.pump_and_settle() + button = await flet_app.tester.find_by_key("fab") + assert button.count == 1 + await flet_app.tester.mouse_hover(button) + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "hover", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_location(flet_app: ftt.FletTestApp, request): + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.floating_action_button = ft.FloatingActionButton("OK") + + # center_top_location + loc = ft.FloatingActionButtonLocation.CENTER_TOP + flet_app.page.floating_action_button_location = loc + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "center_top_location", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # end_top_location + loc = ft.FloatingActionButtonLocation.END_TOP + flet_app.page.floating_action_button_location = loc + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "end_top_location", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_floating_action_button_theme.py b/sdk/python/packages/flet/integration_tests/controls/test_floating_action_button_theme.py new file mode 100644 index 000000000..cd0cc861e --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_floating_action_button_theme.py @@ -0,0 +1,99 @@ +import pytest +import pytest_asyncio + +import flet as ft +import flet.testing as ftt + + +# 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_theme(flet_app: ftt.FletTestApp, request): + flet_app.page.theme = ft.Theme( + floating_action_button_theme=ft.FloatingActionButtonTheme( + bgcolor=ft.Colors.ORANGE, + hover_color=ft.Colors.GREEN, + focus_color=ft.Colors.RED, + foreground_color=ft.Colors.PINK, + splash_color=ft.Colors.YELLOW, + shape=ft.RoundedRectangleBorder( + radius=4, side=ft.BorderSide(color=ft.Colors.BLUE, width=2.0) + ), + elevation=20, + hover_elevation=30, + focus_elevation=40, + disabled_elevation=50, + highlight_elevation=60, + enable_feedback=True, + extended_padding=ft.Padding.all(5), + text_style=ft.TextStyle(italic=True), + icon_label_spacing=20, + extended_size_constraints=ft.BoxConstraints( + min_width=200, + max_width=200, + min_height=200, + max_height=200, + ), + size_constraints=ft.BoxConstraints( + min_width=100, + max_width=100, + min_height=100, + max_height=100, + ), + ) + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + fab1 = ft.FloatingActionButton( + key="fab1", + content="Add", + icon=ft.Icons.ADD, + ) + fab2 = ft.FloatingActionButton(ft.Text("Text", color=ft.Colors.GREEN), mini=True) + fab3 = ft.FloatingActionButton("Text", disabled=True) + fab4 = ft.FloatingActionButton("Long Long Long Long Text", disabled=True) + flet_app.page.add(fab1, fab2, fab3, fab4) + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "theme_normal", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # test focus and disabled + fab2.autofocus = True + fab3.disabled = True + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "theme_focus_disabled", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # test hover + flet_app.page.update() + await flet_app.tester.pump_and_settle() + button = await flet_app.tester.find_by_key("fab1") + assert button.count == 1 + await flet_app.tester.mouse_hover(button) + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "theme_hover", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_icon_button_theme.py b/sdk/python/packages/flet/integration_tests/controls/test_icon_button_theme.py new file mode 100644 index 000000000..b0149c3f1 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_icon_button_theme.py @@ -0,0 +1,48 @@ +import pytest +import pytest_asyncio + +import flet as ft +import flet.testing as ftt + + +# 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_icon_button_theme(flet_app: ftt.FletTestApp): + flet_app.page.theme = ft.Theme( + icon_button_theme=ft.IconButtonTheme( + style=ft.ButtonStyle( + bgcolor=ft.Colors.GREEN, + shape=ft.BeveledRectangleBorder( + radius=5, + ), + side=ft.BorderSide(width=5, color=ft.Colors.GREEN_900), + padding=ft.Padding.all(10), + # text_style=ft.TextStyle( + # size=15, + # italic=True, + # color=ft.Colors.ORANGE, # color is not shown on the button text, + # # use style.color instead + # ), + ), + ) + ) + + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot( + ft.IconButton(icon=ft.Icons.UMBRELLA), + ) + 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_list_tile.py b/sdk/python/packages/flet/integration_tests/controls/test_list_tile.py index e98179481..b843f6286 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_list_tile.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_list_tile.py @@ -1,27 +1,286 @@ import pytest +import pytest_asyncio import flet as ft import flet.testing as ftt -@pytest.mark.asyncio(loop_scope="module") -async def test_list_tile_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.ListTile("List Tile"), ) -@pytest.mark.asyncio(loop_scope="module") -async def test_list_tile_properties1(flet_app: ftt.FletTestApp, request): +@pytest.mark.asyncio(loop_scope="function") +async def test_properties1(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.Column( + [ + ft.ListTile( + "List Tile with custom shape", + subtitle="Subtitle", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + shape=ft.RoundedRectangleBorder( + radius=10, side=ft.BorderSide(color=ft.Colors.RED, width=2.0) + ), + ), + ft.ListTile( + "Dense List Tile", + subtitle="Subtitle", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + dense=True, + ), + ft.ListTile( + "List Tile with Content Padding", + subtitle="Subtitle", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + content_padding=ft.Padding.all(20), + ), + ft.ListTile( + "List Tile with autofocus", + subtitle="Subtitle", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + autofocus=True, + ), + ft.ListTile( + "Disabled List Tile", + subtitle="Subtitle", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + disabled=True, + ), + ft.ListTile( + "Selected List Tile", + subtitle="Subtitle", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + selected=True, + selected_color=ft.Colors.PINK_200, + selected_tile_color=ft.Colors.PURPLE_200, + ), + ft.ListTile( + "Drawer style List Tile", + subtitle="Subtitle", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + style=ft.ListTileStyle.DRAWER, + ), + ] + ), + ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_properties2(flet_app: ftt.FletTestApp, request): await flet_app.assert_control_screenshot( request.node.name, - ft.ListTile( - "List Tile", - subtitle="Subtitle", - leading=ft.Icon(ft.Icons.STAR), - trailing=ft.Icon(ft.Icons.ARROW_FORWARD), - bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, - shape=ft.RoundedRectangleBorder(radius=10), + ft.Column( + [ + ft.ListTile( + title="List Tile with horizontal spacing", + subtitle="Subtitle", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + splash_color=ft.Colors.GREEN_200, # is not shown on screenshot + hover_color=ft.Colors.YELLOW_200, + horizontal_spacing=50, + title_alignment=ft.ListTileTitleAlignment.THREE_LINE, + ), + ft.ListTile( + title="List Tile with minimum leading width", + subtitle="Top Title Alignment", + is_three_line=True, + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + splash_color=ft.Colors.GREEN_200, # is not shown on screenshot + hover_color=ft.Colors.YELLOW_200, + min_leading_width=100, + title_alignment=ft.ListTileTitleAlignment.TOP, # default value + ), + ft.ListTile( + title="List Tile with minimum vertical padding", + subtitle="Center Title Alignment", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + splash_color=ft.Colors.GREEN_200, # is not shown on screenshot + hover_color=ft.Colors.YELLOW_200, + min_vertical_padding=30, + title_alignment=ft.ListTileTitleAlignment.CENTER, + ), + ft.ListTile( + title="List Tile with icon color and text color and styles", + subtitle="Bottom Title Alignment", + icon_color=ft.Colors.RED, + text_color=ft.Colors.PURPLE, + title_text_style=ft.TextStyle(size=20, weight=ft.FontWeight.BOLD), + subtitle_text_style=ft.TextStyle(size=10, italic=True), + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + title_alignment=ft.ListTileTitleAlignment.BOTTOM, + ), + ft.ListTile( + title="List Tile with leading and trailing text style", + subtitle="Title Height Title Alignment", + icon_color=ft.Colors.PINK, + leading=ft.Text("Leading"), + trailing=ft.Text("Trailing"), + leading_and_trailing_text_style=ft.TextStyle( + color=ft.Colors.RED, + size=12, + ), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + title_alignment=ft.ListTileTitleAlignment.TITLE_HEIGHT, + ), + ft.ListTile( + title="List Tile with minimum height", + subtitle="Title Height Title Alignment", + icon_color=ft.Colors.RED, + leading=ft.Text("Leading"), + trailing=ft.Text("Trailing"), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + min_height=150, + title_alignment=ft.ListTileTitleAlignment.TITLE_HEIGHT, + ), + ] + ), + ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_properties3(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.Column( + controls=[ + ft.ListTile( + title="List Tile without three line", + subtitle="Long Long Long Long Long Long Long Long Long Long Long " + "Long Long Long Long Long Long Long Long Long Long Long" + "Long Subtitle with is_three_line = False", + # is_three_line=True, + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + ), + ft.ListTile( + title="List Tile with three line", + subtitle="Long Long Long Long Long Long Long Long Long Long Long " + "Long Long Long Long Long Long Long Long Long Long Long" + "Long Subtitle with is_three_line = True", + is_three_line=True, # not sure if this behaviour is correct or not. + # Tested it in flutter, it also shows more than 3 lines + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + ), + ft.ListTile( + title="List Tile with Compact visual density", + subtitle="Long Long Long Long Long Long Long Long Long Long Long " + "Long Long Long Long Long Long Long Long Long Long Long" + "Long Subtitle with is_three_line = False", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + visual_density=ft.VisualDensity.COMPACT, + ), + ft.ListTile( + title="List Tile with Standard visual density", + subtitle="Long Long Long Long Long Long Long Long Long Long Long " + "Long Long Long Long Long Long Long Long Long Long Long" + "Long Subtitle with is_three_line = False", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Icon(ft.Icons.ARROW_FORWARD), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + visual_density=ft.VisualDensity.STANDARD, + ), + ] + ), + ) + + +@pytest.mark.asyncio(loop_scope="function") +async def test_toggle_inputs(flet_app: ftt.FletTestApp, request): + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + lt = ft.ListTile( + key="lt", + title="ListTileStyle with toggle inputs", + subtitle="List", + leading=ft.Icon(ft.Icons.STAR), + trailing=ft.Checkbox(), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + style=ft.ListTileStyle.LIST, + hover_color=ft.Colors.YELLOW_200, + toggle_inputs=True, + ) + + flet_app.page.add(lt) + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "toggle_inputs_initial", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # test hover + tile = await flet_app.tester.find_by_key("lt") + assert tile.count == 1 + await flet_app.tester.mouse_hover(tile) + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "toggle_inputs_hover", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + await flet_app.tester.tap(tile) + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "toggle_inputs_click1", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio ), ) + + # test click2 - issue #5627 + # await flet_app.tester.tap(tile) + # await flet_app.tester.pump_and_settle() + + # flet_app.assert_screenshot( + # "toggle_click2", + # await flet_app.page.take_screenshot( + # pixel_ratio=flet_app.screenshots_pixel_ratio + # ), + # ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_list_tile_theme.py b/sdk/python/packages/flet/integration_tests/controls/test_list_tile_theme.py new file mode 100644 index 000000000..434005085 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_list_tile_theme.py @@ -0,0 +1,98 @@ +import pytest +import pytest_asyncio + +import flet as ft +import flet.testing as ftt + + +# 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_theme(flet_app: ftt.FletTestApp, request): + flet_app.page.theme = ft.Theme( + list_tile_theme=ft.ListTileTheme( + icon_color=ft.Colors.PURPLE, + text_color=ft.Colors.PINK, + bgcolor=ft.Colors.LIGHT_GREEN_ACCENT_100, + selected_tile_color=ft.Colors.LIGHT_GREEN_ACCENT_400, + selected_color=ft.Colors.GREEN_700, + is_three_line=True, + enable_feedback=False, + dense=True, + shape=ft.RoundedRectangleBorder( + radius=10, side=ft.BorderSide(color=ft.Colors.RED, width=2.0) + ), + visual_density=ft.VisualDensity.COMFORTABLE, + content_padding=ft.Padding.symmetric(horizontal=20, vertical=10), + min_vertical_padding=50, + horizontal_spacing=30, + min_leading_width=80, + title_text_style=ft.TextStyle( + color=ft.Colors.GREEN, italic=True, weight=ft.FontWeight.BOLD + ), + subtitle_text_style=ft.TextStyle( + color=ft.Colors.GREEN, italic=True, weight=ft.FontWeight.W_200 + ), + leading_and_trailing_text_style=ft.TextStyle( + color=ft.Colors.BLUE, + bgcolor=ft.Colors.GREEN_200, + italic=True, + weight=ft.FontWeight.W_200, + ), + mouse_cursor=ft.MouseCursor.FORBIDDEN, + min_height=100, + ) + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + lt1 = ft.ListTile( + "ListTile with is_three_line = False", + subtitle="List", + leading=ft.Icon(ft.Icons.STAR), + is_three_line=False, + trailing=ft.Checkbox(), + # bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + style=ft.ListTileStyle.LIST, + toggle_inputs=True, + visual_density=ft.VisualDensity.COMPACT, + ) + lt2 = ft.ListTile( + "ListTile default is_three_line", + subtitle="List", + leading=ft.Icon(ft.Icons.STAR), + # is_three_line=True, + trailing=ft.Checkbox(), + selected=True, + # bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + style=ft.ListTileStyle.LIST, + toggle_inputs=False, + ) + lt3 = ft.ListTile( + title="ListTile is_three_line = True", + subtitle="Subtitle", + is_three_line=True, + leading=ft.Text("Leading"), + trailing=ft.Text("Trailing"), + bgcolor=ft.Colors.LIGHT_BLUE_ACCENT_100, + hover_color=ft.Colors.YELLOW_200, + style=ft.ListTileStyle.DRAWER, + shape=ft.RoundedRectangleBorder(radius=10), + ) + + flet_app.page.add(lt1, lt2, lt3) + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "theme1", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_outlined_button_theme.py b/sdk/python/packages/flet/integration_tests/controls/test_outlined_button_theme.py new file mode 100644 index 000000000..b89af305b --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_outlined_button_theme.py @@ -0,0 +1,47 @@ +import pytest +import pytest_asyncio + +import flet as ft +import flet.testing as ftt + + +# 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_outlined_button_theme(flet_app: ftt.FletTestApp): + flet_app.page.theme = ft.Theme( + outlined_button_theme=ft.OutlinedButtonTheme( + style=ft.ButtonStyle( + bgcolor=ft.Colors.GREEN, + shape=ft.BeveledRectangleBorder( + radius=5, + ), + side=ft.BorderSide(width=5, color=ft.Colors.GREEN_900), + padding=ft.Padding.all(10), + # text_style=ft.TextStyle( + # size=15, + # italic=True, + # color=ft.Colors.ORANGE, + # ), + ), + ) + ) + + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot( + ft.OutlinedButton(content="Button"), + ) + 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_text_button_theme.py b/sdk/python/packages/flet/integration_tests/controls/test_text_button_theme.py new file mode 100644 index 000000000..0e2ebd49f --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_text_button_theme.py @@ -0,0 +1,48 @@ +import pytest +import pytest_asyncio + +import flet as ft +import flet.testing as ftt + + +# 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_text_button_theme(flet_app: ftt.FletTestApp): + flet_app.page.theme = ft.Theme( + text_button_theme=ft.TextButtonTheme( + style=ft.ButtonStyle( + bgcolor=ft.Colors.GREEN, + shape=ft.BeveledRectangleBorder( + radius=5, + ), + side=ft.BorderSide(width=5, color=ft.Colors.GREEN_900), + padding=ft.Padding.all(10), + # text_style=ft.TextStyle( + # size=15, + # italic=True, + # color=ft.Colors.ORANGE, # color is not shown on the button text, + # # use style.color instead + # ), + ), + ) + ) + + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + + scr_1 = ft.Screenshot( + ft.TextButton(content="Button"), + ) + 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 13e6ab5a1..1a1960f8d 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/dropdown.py +++ b/sdk/python/packages/flet/src/flet/controls/material/dropdown.py @@ -10,6 +10,7 @@ from flet.controls.layout_control import LayoutControl from flet.controls.material.form_field_control import InputBorder from flet.controls.material.icons import Icons +from flet.controls.material.menu_bar import MenuStyle from flet.controls.material.textfield import InputFilter, TextCapitalization from flet.controls.padding import PaddingValue from flet.controls.text_style import TextStyle @@ -148,6 +149,13 @@ class Dropdown(LayoutControl): input textfield width. """ + menu_style: Optional[MenuStyle] = None + """ + The menu style that defines the visual attributes of the menu. + + The default width of the menu is set to the width of the text field. + """ + expanded_insets: Optional[PaddingValue] = None """ The insets for the expanded dropdown menu. 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 6ad7a4f83..873d73a48 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 @@ -30,6 +30,14 @@ class ListTileTitleAlignment(Enum): class ListTileStyle(Enum): + """ + Defines the title font used for ListTile descendants of a ListTileTheme. + + List tiles that appear in a Drawer use the theme's TextTheme.body_large text style, + which is a little smaller than the theme's TextTheme.title_medium text style, which + is used by default. + """ + LIST = "list" DRAWER = "drawer" @@ -62,7 +70,7 @@ class ListTile(LayoutControl, AdaptiveControl): Typically a [`Text`][flet.Text] control. """ - is_three_line: bool = False + is_three_line: Optional[bool] = None """ Whether this list tile is intended to display three lines of text. @@ -100,15 +108,14 @@ class ListTile(LayoutControl, AdaptiveControl): The list tile's background color. """ - bgcolor_activated: Optional[str] = None + splash_color: Optional[ColorValue] = None """ - The list tile's splash color after the - being was tapped. + The list tile's splash color after the control has been tapped. """ hover_color: Optional[ColorValue] = None """ - The tile's color when hovered. + The tile's color when hovered. Only shows if `toggle_inputs` is True. """ selected: bool = False @@ -117,7 +124,7 @@ class ListTile(LayoutControl, AdaptiveControl): By default the selected color is the theme's primary color. """ - dense: bool = False + dense: Optional[bool] = None """ Whether this list tile is part of a vertically dense list. @@ -156,26 +163,26 @@ class ListTile(LayoutControl, AdaptiveControl): Defaults to `ListTileStyle.LIST`. """ - enable_feedback: bool = True + enable_feedback: Optional[bool] = None """ Whether detected gestures should provide acoustic and/or haptic feedback. On Android, for example, setting this to `True` produce a click sound and a long-press will produce a short vibration. """ - horizontal_spacing: Number = 16.0 + horizontal_spacing: Optional[Number] = None """ The horizontal gap between the `title` and the [`leading`][flet.ListTile.leading] and [`trailing`][flet.ListTile.trailing] controls. """ - min_leading_width: Number = 40.0 + min_leading_width: Optional[Number] = None """ The minimum width allocated for the `leading` control. """ - min_vertical_padding: Number = 4.0 + min_vertical_padding: Optional[Number] = None """ The minimum padding on the top and bottom of the `title` and `subtitle` controls. """ diff --git a/sdk/python/packages/flet/src/flet/controls/theme.py b/sdk/python/packages/flet/src/flet/controls/theme.py index af869be86..2b9d86f0f 100644 --- a/sdk/python/packages/flet/src/flet/controls/theme.py +++ b/sdk/python/packages/flet/src/flet/controls/theme.py @@ -1127,32 +1127,33 @@ class FloatingActionButtonTheme: extended_padding: Optional[PaddingValue] = None """ - The padding for an extended [`FloatingActionButton`][flet.FloatingActionButton]'s - content. + The padding for a [`FloatingActionButton`][flet.FloatingActionButton]'s + that has both icon and content. """ - extended_text_style: Optional[TextStyle] = None + text_style: Optional[TextStyle] = None """ - The text style for an extended - [`FloatingActionButton`][flet.FloatingActionButton]. + Text style merged into default text style of + [`FloatingActionButton.label`][flet.FloatingActionButton.label]. """ - extended_icon_label_spacing: Optional[Number] = None + icon_label_spacing: Optional[Number] = None """ - The spacing between the icon and the label for an extended + The spacing between the icon and the label for [`FloatingActionButton`][flet.FloatingActionButton]. """ extended_size_constraints: Optional[BoxConstraints] = None """ Overrides the default size constraints of - extended [`FloatingActionButton`][flet.FloatingActionButton]. + [`FloatingActionButton`][flet.FloatingActionButton] that has both icon and content. """ size_constraints: Optional[BoxConstraints] = None """ Overrides the default size constraints of - [`FloatingActionButton`][flet.FloatingActionButton]. + [`FloatingActionButton`][flet.FloatingActionButton] that has either icon or content + and is not a mini button. """ # large_size_constraints: Optional[BoxConstraints] = None @@ -2225,18 +2226,13 @@ class TimePickerTheme: @dataclass class DropdownTheme: """ - Overrides the default values of visual properties for descendant - [`Dropdown`][flet.Dropdown] controls. + Customizes the appearance of [`Dropdown`][flet.Dropdown] across the app. """ menu_style: Optional[MenuStyle] = None """ - The menu style for descendant [`Dropdown`][flet.Dropdown] controls. If `elevation`, - `bgcolor` and/or `menu_width` are provided for the [`MenuStyle`][flet.MenuStyle] - then they will override the default values for - [`DropdownMenu.elevation`][flet.Dropdown.elevation], - [`DropdownMenu.bgcolor`][flet.Dropdown.bgcolor] and - [`DropdownMenu.menu_width`][flet.Dropdown.menu_width]. + Overrides the default value for + [`Dropdown.menu_style`][flet.Dropdown.menu_style]. """ text_style: Optional[TextStyle] = None @@ -2355,7 +2351,7 @@ class ListTileTheme: [`ListTile.mouse_cursor`][flet.ListTile.mouse_cursor]. """ - min_tile_height: Optional[Number] = None + min_height: Optional[Number] = None """ Overrides the default value for [`ListTile.min_height`][flet.ListTile.min_height]. @@ -3322,8 +3318,16 @@ class DataTableTheme: @dataclass class Theme: + """ + Customizes the overall appearance of the application. + """ + color_scheme_seed: Optional[ColorValue] = None - primary_swatch: Optional[ColorValue] = None + """ + Overrides the default color scheme seed used to generate + [`ColorScheme`][flet.ColorScheme]. The default color is blue. + """ + font_family: Optional[str] = None use_material3: Optional[bool] = None appbar_theme: Optional[AppBarTheme] = None @@ -3334,21 +3338,81 @@ class Theme: card_theme: Optional[CardTheme] = None checkbox_theme: Optional[CheckboxTheme] = None chip_theme: Optional[ChipTheme] = None + """ + Customizes the appearance of [`Chip`][flet.Chip] across the app. + """ + color_scheme: Optional[ColorScheme] = None + """ + Overrides the default [`ColorScheme`][flet.ColorScheme] used for the application. + """ + data_table_theme: Optional[DataTableTheme] = None date_picker_theme: Optional[DatePickerTheme] = None dialog_theme: Optional[DialogTheme] = None + """ + Customizes the appearance of [`AlertDialog`][flet.AlertDialog] across the app. + """ + divider_theme: Optional[DividerTheme] = None + """ + Defines the visual properties of [`Divider`][flet.Divider], + [`VerticalDivider`][flet.VerticalDivider], dividers between + [`ListTile`][flet.ListTile]s, and dividers between rows in + [`DataTable`][flet.DataTable]. + """ + dropdown_theme: Optional[DropdownTheme] = None + """ + Customizes the appearance of [`Dropdown`][flet.Dropdown] across the app. + """ + button_theme: Optional[ButtonTheme] = None + """ + Customizes the appearance of [`Button`][flet.Button] across the app. + """ + outlined_button_theme: Optional[OutlinedButtonTheme] = None + """ + Customizes the appearance of [`OutlinedButton`][flet.OutlinedButton] across the app. + """ + text_button_theme: Optional[TextButtonTheme] = None + """ + Customizes the appearance of [`TextButton`][flet.TextButton] across the app. + """ + filled_button_theme: Optional[FilledButtonTheme] = None + """ + Customizes the appearance of [`FilledButton`][flet.FilledButton] across the app. + """ + icon_button_theme: Optional[IconButtonTheme] = None + """ + Customizes the appearance of [`IconButton`][flet.IconButton] across the app. + """ + expansion_tile_theme: Optional[ExpansionTileTheme] = None + """ + Customizes the appearance of [`ExpansionTile`][flet.ExpansionTile] across the app. + """ + floating_action_button_theme: Optional[FloatingActionButtonTheme] = None + """ + Customizes the appearance of [`FloatingActionButton`][flet.FloatingActionButton] + across the app. + """ + icon_theme: Optional[IconTheme] = None + """ + Customizes the appearance of [`Icon`][flet.Icon] across the app. + """ + list_tile_theme: Optional[ListTileTheme] = None + """ + Customizes the appearance of [`ListTile`][flet.ListTile] across the app. + """ + navigation_bar_theme: Optional[NavigationBarTheme] = None navigation_drawer_theme: Optional[NavigationDrawerTheme] = None navigation_rail_theme: Optional[NavigationRailTheme] = None @@ -3363,13 +3427,8 @@ class Theme: canvas_color: Optional[ColorValue] = None scaffold_bgcolor: Optional[ColorValue] = None card_bgcolor: Optional[ColorValue] = None - divider_color: Optional[ColorValue] = None hint_color: Optional[ColorValue] = None - shadow_color: Optional[ColorValue] = None secondary_header_color: Optional[ColorValue] = None - primary_color: Optional[ColorValue] = None - primary_color_dark: Optional[ColorValue] = None - primary_color_light: Optional[ColorValue] = None primary_text_theme: Optional[TextTheme] = None progress_indicator_theme: Optional[ProgressIndicatorTheme] = None radio_theme: Optional[RadioTheme] = None