From 86b7e90f7a986ae644484d6d2215f35cce980f20 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 11 Jul 2025 13:41:12 -0700 Subject: [PATCH 01/37] Draw image on Canvas - a working draft --- client/lib/main.dart | 4 +- packages/flet/lib/src/controls/canvas.dart | 89 +++++++++++++++++++ packages/flet/lib/src/controls/image.dart | 1 - packages/flet/lib/src/controls/markdown.dart | 4 - packages/flet/lib/src/utils/box.dart | 5 +- packages/flet/lib/src/utils/hashing.dart | 13 +++ .../packages/flet/src/flet/canvas/__init__.py | 2 + .../src/flet/controls/core/canvas/image.py | 52 +++++++++++ .../flet/src/flet/controls/core/image.py | 3 +- 9 files changed, 161 insertions(+), 12 deletions(-) create mode 100644 packages/flet/lib/src/utils/hashing.dart create mode 100644 sdk/python/packages/flet/src/flet/controls/core/canvas/image.py diff --git a/client/lib/main.dart b/client/lib/main.dart index c39536bd4..8fa2f62b9 100644 --- a/client/lib/main.dart +++ b/client/lib/main.dart @@ -7,6 +7,7 @@ import 'package:flet_audio/flet_audio.dart' as flet_audio; // --FAT_CLIENT_END-- import 'package:flet_audio_recorder/flet_audio_recorder.dart' as flet_audio_recorder; +import 'package:flet_charts/flet_charts.dart' as flet_charts; import 'package:flet_datatable2/flet_datatable2.dart' as flet_datatable2; import "package:flet_flashlight/flet_flashlight.dart" as flet_flashlight; import 'package:flet_geolocator/flet_geolocator.dart' as flet_geolocator; @@ -19,7 +20,6 @@ import 'package:flet_rive/flet_rive.dart' as flet_rive; import 'package:flet_video/flet_video.dart' as flet_video; // --FAT_CLIENT_END-- import 'package:flet_webview/flet_webview.dart' as flet_webview; -import 'package:flet_charts/flet_charts.dart' as flet_charts; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; @@ -64,7 +64,7 @@ void main([List? args]) async { //debugPrint("Uri.base: ${Uri.base}"); if (kDebugMode) { - pageUrl = "tcp://localhost:8550"; + pageUrl = "http://localhost:8550"; } if (kIsWeb) { diff --git a/packages/flet/lib/src/controls/canvas.dart b/packages/flet/lib/src/controls/canvas.dart index 5ce085f0b..d6eee91e7 100644 --- a/packages/flet/lib/src/controls/canvas.dart +++ b/packages/flet/lib/src/controls/canvas.dart @@ -1,3 +1,7 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flet/src/extensions/control.dart'; @@ -7,9 +11,11 @@ import 'package:flet/src/utils/colors.dart'; import 'package:flet/src/utils/drawing.dart'; import 'package:flet/src/utils/numbers.dart'; import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; import '../models/control.dart'; import '../utils/dash_path.dart'; +import '../utils/hashing.dart'; import '../utils/images.dart'; import '../utils/text.dart'; import '../utils/transforms.dart'; @@ -105,6 +111,8 @@ class FletCustomPainter extends CustomPainter { drawShadow(canvas, shape); } else if (shape.type == "Text") { drawText(context, canvas, shape); + } else if (shape.type == "Image") { + drawImage(canvas, shape); } } } @@ -260,6 +268,87 @@ class FletCustomPainter extends CustomPainter { canvas.drawShadow(path, color, elevation, transparentOccluder); } + Future loadCanvasImage(Control shape) async { + debugPrint("loadCanvasImage(${shape.id})"); + if (shape.get("_loading") == true) return; + shape.properties["_loading"] = true; + + final src = shape.getString("src"); + final srcBytes = shape.get("src_bytes") as Uint8List?; + final width = shape.getInt("width"); + final height = shape.getInt("height"); + + try { + Uint8List bytes; + + if (srcBytes != null) { + bytes = srcBytes; + } else if (src != null) { + var assetSrc = shape.backend.getAssetSource(src); + if (assetSrc.isFile) { + final file = File(assetSrc.path); + bytes = await file.readAsBytes(); + } else { + final resp = await http.get(Uri.parse(assetSrc.path)); + if (resp.statusCode != 200) { + throw Exception("HTTP ${resp.statusCode}"); + } + bytes = resp.bodyBytes; + } + } else if (src != null) { + bytes = base64Decode(src); + } else { + throw Exception("Missing image source: 'src' or 'src_bytes'"); + } + + final codec = await ui.instantiateImageCodec( + bytes, + targetWidth: width, + targetHeight: height, + ); + final frame = await codec.getNextFrame(); + shape.properties["_image"] = frame.image; + shape.updateProperties({"_hash": getImageHash(shape)}, + python: false, notify: true); + } catch (e) { + shape.properties["_image_error"] = e; + } finally { + shape.properties.remove("_loading"); + } + } + + int getImageHash(Control shape) { + final src = shape.getString("src"); + final srcBytes = shape.get("src_bytes") as Uint8List?; + return src != null + ? src.hashCode + : srcBytes != null + ? fnv1aHash(srcBytes) + : 0; + } + + void drawImage(Canvas canvas, Control shape) { + final paint = shape.getPaint("paint", theme, Paint())!; + final x = shape.getDouble("x")!; + final y = shape.getDouble("y")!; + final width = shape.getDouble("width"); + final height = shape.getDouble("height"); + + // Check if image is already loaded and stored + if (shape.get("_image") != null && + shape.get("_hash") == getImageHash(shape)) { + final img = shape.get("_image")!; + final srcRect = + Rect.fromLTWH(0, 0, img.width.toDouble(), img.height.toDouble()); + final dstRect = width != null && height != null + ? Rect.fromLTWH(x, y, width, height) + : Offset(x, y) & Size(img.width.toDouble(), img.height.toDouble()); + canvas.drawImageRect(img, srcRect, dstRect, paint); + } else { + loadCanvasImage(shape); + } + } + ui.Path buildPath(dynamic j) { var path = ui.Path(); if (j == null) { diff --git a/packages/flet/lib/src/controls/image.dart b/packages/flet/lib/src/controls/image.dart index 0593903ad..5cb2a984e 100644 --- a/packages/flet/lib/src/controls/image.dart +++ b/packages/flet/lib/src/controls/image.dart @@ -37,7 +37,6 @@ class ImageControl extends StatelessWidget { Widget? image = buildImage( context: context, - control: control, src: src, srcBase64: srcBase64, srcBytes: srcBytes, diff --git a/packages/flet/lib/src/controls/markdown.dart b/packages/flet/lib/src/controls/markdown.dart index 2a0e25f88..fdf7922af 100644 --- a/packages/flet/lib/src/controls/markdown.dart +++ b/packages/flet/lib/src/controls/markdown.dart @@ -1,5 +1,3 @@ -import 'dart:typed_data'; - import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:markdown/markdown.dart' as md; @@ -66,10 +64,8 @@ class MarkdownControl extends StatelessWidget { return buildImage( context: context, - control: control, src: src, srcBase64: srcBase64, - srcBytes: Uint8List(0), semanticsLabel: alt, disabled: control.disabled, errorCtrl: control.buildWidget("img_error_content")); diff --git a/packages/flet/lib/src/utils/box.dart b/packages/flet/lib/src/utils/box.dart index f632bc645..bcb2b04e4 100644 --- a/packages/flet/lib/src/utils/box.dart +++ b/packages/flet/lib/src/utils/box.dart @@ -170,11 +170,10 @@ ImageProvider? getImageProvider( Widget buildImage({ required BuildContext context, - required Control control, required Widget? errorCtrl, required String? src, required String? srcBase64, - required Uint8List srcBytes, + Uint8List? srcBytes, double? width, double? height, ImageRepeat repeat = ImageRepeat.noRepeat, @@ -193,7 +192,7 @@ Widget buildImage({ Widget? image; const String svgTag = " xmlns=\"http://www.w3.org/2000/svg\""; - Uint8List bytes = srcBytes; + Uint8List bytes = srcBytes ?? Uint8List(0); if (bytes.isEmpty && srcBase64 != null && srcBase64.isNotEmpty) { bytes = base64Decode(srcBase64); } diff --git a/packages/flet/lib/src/utils/hashing.dart b/packages/flet/lib/src/utils/hashing.dart new file mode 100644 index 000000000..f9d5423c2 --- /dev/null +++ b/packages/flet/lib/src/utils/hashing.dart @@ -0,0 +1,13 @@ +import 'dart:typed_data'; + +int fnv1aHash(Uint8List bytes) { + const int fnvOffset = 0x811C9DC5; + const int fnvPrime = 0x01000193; + + int hash = fnvOffset; + for (final byte in bytes) { + hash ^= byte; + hash = (hash * fnvPrime) & 0xFFFFFFFF; // 32-bit overflow + } + return hash; +} diff --git a/sdk/python/packages/flet/src/flet/canvas/__init__.py b/sdk/python/packages/flet/src/flet/canvas/__init__.py index 7cea3ddce..fdceb5093 100644 --- a/sdk/python/packages/flet/src/flet/canvas/__init__.py +++ b/sdk/python/packages/flet/src/flet/canvas/__init__.py @@ -3,6 +3,7 @@ from flet.controls.core.canvas.circle import Circle from flet.controls.core.canvas.color import Color from flet.controls.core.canvas.fill import Fill +from flet.controls.core.canvas.image import Image from flet.controls.core.canvas.line import Line from flet.controls.core.canvas.oval import Oval from flet.controls.core.canvas.path import Path @@ -26,4 +27,5 @@ "Rect", "Shadow", "Text", + "Image", ] diff --git a/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py b/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py new file mode 100644 index 000000000..2bbe3f105 --- /dev/null +++ b/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py @@ -0,0 +1,52 @@ +from typing import Optional + +from flet.controls.base_control import control +from flet.controls.core.canvas.shape import Shape +from flet.controls.painting import Paint +from flet.controls.types import OptionalNumber, OptionalString + + +@control("Image") +class Image(Shape): + """ + Draws an image. + """ + + src: OptionalString = None + """ + Draws an image from a source. + + This could be an external URL or a local + [asset file](https://flet.dev/docs/cookbook/assets). + """ + + src_bytes: Optional[bytes] = None + """ + Draws an image from a bytes array. + """ + + x: OptionalNumber = None + """ + The x-axis coordinate of the image's top-left corner. + """ + + y: OptionalNumber = None + """ + The y-axis coordinate of the image's top-left corner. + """ + + width: OptionalNumber = None + """ + The width of the rectangle to draw the image into. Use image width if None. + """ + + height: OptionalNumber = None + """ + The height of the rectangle to draw the image into. Use image height if None. + """ + + paint: Optional[Paint] = None + """ + A paint to composite the image into canvas. The value of this property + is the instance of [`Paint`](https://flet.dev/docs/reference/types/paint) class. + """ diff --git a/sdk/python/packages/flet/src/flet/controls/core/image.py b/sdk/python/packages/flet/src/flet/controls/core/image.py index ccc07ebec..1efab677a 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/image.py +++ b/sdk/python/packages/flet/src/flet/controls/core/image.py @@ -54,7 +54,7 @@ class Image(ConstrainedControl): src_bytes: Optional[bytes] = None """ - TBD + Displays an image from a bytes array. """ error_content: OptionalControl = None @@ -159,4 +159,3 @@ class Image(ConstrainedControl): Anti-aliasing alleviates the sawtooth artifact when the image is rotated. """ - From 720f05601dd8c5894251060850f50bf49cc5c745 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Mon, 14 Jul 2025 13:18:25 -0700 Subject: [PATCH 02/37] New Canvas methods: `capture()`, `get_capture()`, `clear_capture()` Other canvas changes: - canvas drawing is clipped - canvas size is stretched to maximum if `expand` is set --- .../flet/lib/src/controls/base_controls.dart | 2 +- packages/flet/lib/src/controls/canvas.dart | 242 +++++++++++++----- .../src/flet/controls/core/canvas/canvas.py | 24 ++ 3 files changed, 201 insertions(+), 67 deletions(-) diff --git a/packages/flet/lib/src/controls/base_controls.dart b/packages/flet/lib/src/controls/base_controls.dart index 78f79cc7d..985434965 100644 --- a/packages/flet/lib/src/controls/base_controls.dart +++ b/packages/flet/lib/src/controls/base_controls.dart @@ -249,7 +249,7 @@ Widget _sizedControl(Widget widget, Control control) { var width = control.getDouble("width"); var height = control.getDouble("height"); if ((width != null || height != null) && - !["container", "image"].contains(control.type)) { + !["Container", "Image"].contains(control.type)) { widget = ConstrainedBox( constraints: BoxConstraints.tightFor(width: width, height: height), child: widget, diff --git a/packages/flet/lib/src/controls/canvas.dart b/packages/flet/lib/src/controls/canvas.dart index d6eee91e7..731723eef 100644 --- a/packages/flet/lib/src/controls/canvas.dart +++ b/packages/flet/lib/src/controls/canvas.dart @@ -36,6 +36,93 @@ class CanvasControl extends StatefulWidget { class _CanvasControlState extends State { int _lastResize = DateTime.now().millisecondsSinceEpoch; Size? _lastSize; + ui.Image? _capturedImage; + Size? _capturedSize; + @override + void initState() { + super.initState(); + widget.control.addInvokeMethodListener(_invokeMethod); + } + + @override + void dispose() { + widget.control.removeInvokeMethodListener(_invokeMethod); + super.dispose(); + } + + Future _awaitImageLoads(List shapes) async { + final pending = []; + + for (final shape in shapes) { + if (shape.type == "Image") { + if (shape.get("_loading") != null) { + pending.add(shape.get("_loading").future); + } else if (shape.get("_image") == null || + shape.get("_hash") != getImageHash(shape)) { + final future = loadCanvasImage(shape); + pending.add(future); + } + } + } + + if (pending.isNotEmpty) { + await Future.wait(pending); + } + } + + Future _invokeMethod(String name, dynamic args) async { + debugPrint("Canvas.$name($args)"); + switch (name) { + case "capture": + final shapes = widget.control.children("shapes"); + final logicalSize = _lastSize; + if (logicalSize == null || logicalSize.isEmpty || shapes.isEmpty) { + return; + } + + // Wait for all images to load + await _awaitImageLoads(shapes); + + if (!mounted) return; + + final recorder = ui.PictureRecorder(); + final canvas = Canvas(recorder); + + final painter = FletCustomPainter( + context: context, + theme: Theme.of(context), + shapes: shapes, + onPaintCallback: (_) {}, + ); + + painter.paint(canvas, logicalSize); + + final picture = recorder.endRecording(); + _capturedImage = await picture.toImage( + logicalSize.width.ceil(), + logicalSize.height.ceil(), + ); + _capturedSize = logicalSize; + setState(() {}); // trigger rebuild + return; + + case "get_capture": + if (_capturedImage == null) return null; + final byteData = + await _capturedImage!.toByteData(format: ui.ImageByteFormat.png); + return byteData!.buffer.asUint8List(); + + case "clear_capture": + _capturedImage?.dispose(); + _capturedImage = null; + _capturedSize = null; + setState(() {}); + return; + + default: + throw Exception("Unknown Canvas method: $name"); + } + } @override Widget build(BuildContext context) { @@ -49,13 +136,15 @@ class _CanvasControlState extends State { context: context, theme: Theme.of(context), shapes: widget.control.children("shapes"), + capturedImage: _capturedImage, + capturedSize: _capturedSize, onPaintCallback: (size) { + _lastSize = size; if (onResize) { var now = DateTime.now().millisecondsSinceEpoch; if ((now - _lastResize > resizeInterval && _lastSize != size) || _lastSize == null) { _lastResize = now; - _lastSize = size; widget.control .triggerEvent("resize", {"w": size.width, "h": size.height}); } @@ -74,12 +163,17 @@ class FletCustomPainter extends CustomPainter { final ThemeData theme; final List shapes; final CanvasControlOnPaintCallback onPaintCallback; - - const FletCustomPainter( - {required this.context, - required this.theme, - required this.shapes, - required this.onPaintCallback}); + final ui.Image? capturedImage; + final Size? capturedSize; + + const FletCustomPainter({ + required this.context, + required this.theme, + required this.shapes, + required this.onPaintCallback, + this.capturedImage, + this.capturedSize, + }); @override void paint(Canvas canvas, Size size) { @@ -87,6 +181,17 @@ class FletCustomPainter extends CustomPainter { //debugPrint("SHAPE CONTROLS: $shapes"); + canvas.save(); + canvas.clipRect(Rect.fromLTWH(0, 0, size.width, size.height)); + + if (capturedImage != null && capturedSize != null) { + final src = Rect.fromLTWH(0, 0, capturedImage!.width.toDouble(), + capturedImage!.height.toDouble()); + final dst = + Rect.fromLTWH(0, 0, capturedSize!.width, capturedSize!.height); + canvas.drawImageRect(capturedImage!, src, dst, Paint()); + } + for (var shape in shapes) { shape.notifyParent = true; if (shape.type == "Line") { @@ -115,6 +220,8 @@ class FletCustomPainter extends CustomPainter { drawImage(canvas, shape); } } + + canvas.restore(); } @override @@ -268,65 +375,6 @@ class FletCustomPainter extends CustomPainter { canvas.drawShadow(path, color, elevation, transparentOccluder); } - Future loadCanvasImage(Control shape) async { - debugPrint("loadCanvasImage(${shape.id})"); - if (shape.get("_loading") == true) return; - shape.properties["_loading"] = true; - - final src = shape.getString("src"); - final srcBytes = shape.get("src_bytes") as Uint8List?; - final width = shape.getInt("width"); - final height = shape.getInt("height"); - - try { - Uint8List bytes; - - if (srcBytes != null) { - bytes = srcBytes; - } else if (src != null) { - var assetSrc = shape.backend.getAssetSource(src); - if (assetSrc.isFile) { - final file = File(assetSrc.path); - bytes = await file.readAsBytes(); - } else { - final resp = await http.get(Uri.parse(assetSrc.path)); - if (resp.statusCode != 200) { - throw Exception("HTTP ${resp.statusCode}"); - } - bytes = resp.bodyBytes; - } - } else if (src != null) { - bytes = base64Decode(src); - } else { - throw Exception("Missing image source: 'src' or 'src_bytes'"); - } - - final codec = await ui.instantiateImageCodec( - bytes, - targetWidth: width, - targetHeight: height, - ); - final frame = await codec.getNextFrame(); - shape.properties["_image"] = frame.image; - shape.updateProperties({"_hash": getImageHash(shape)}, - python: false, notify: true); - } catch (e) { - shape.properties["_image_error"] = e; - } finally { - shape.properties.remove("_loading"); - } - } - - int getImageHash(Control shape) { - final src = shape.getString("src"); - final srcBytes = shape.get("src_bytes") as Uint8List?; - return src != null - ? src.hashCode - : srcBytes != null - ? fnv1aHash(srcBytes) - : 0; - } - void drawImage(Canvas canvas, Control shape) { final paint = shape.getPaint("paint", theme, Paint())!; final x = shape.getDouble("x")!; @@ -419,3 +467,65 @@ class FletCustomPainter extends CustomPainter { return path; } } + +Future loadCanvasImage(Control shape) async { + debugPrint("loadCanvasImage(${shape.id})"); + if (shape.get("_loading") != null) return; + final completer = Completer(); + shape.properties["_loading"] = completer; + + final src = shape.getString("src"); + final srcBytes = shape.get("src_bytes") as Uint8List?; + final width = shape.getInt("width"); + final height = shape.getInt("height"); + + try { + Uint8List bytes; + + if (srcBytes != null) { + bytes = srcBytes; + } else if (src != null) { + var assetSrc = shape.backend.getAssetSource(src); + if (assetSrc.isFile) { + final file = File(assetSrc.path); + bytes = await file.readAsBytes(); + } else { + final resp = await http.get(Uri.parse(assetSrc.path)); + if (resp.statusCode != 200) { + throw Exception("HTTP ${resp.statusCode}"); + } + bytes = resp.bodyBytes; + } + } else if (src != null) { + bytes = base64Decode(src); + } else { + throw Exception("Missing image source: 'src' or 'src_bytes'"); + } + + final codec = await ui.instantiateImageCodec( + bytes, + targetWidth: width, + targetHeight: height, + ); + final frame = await codec.getNextFrame(); + shape.properties["_image"] = frame.image; + shape.updateProperties({"_hash": getImageHash(shape)}, + python: false, notify: true); + completer.complete(); + } catch (e) { + shape.properties["_image_error"] = e; + completer.completeError(e); + } finally { + shape.properties.remove("_loading"); + } +} + +int getImageHash(Control shape) { + final src = shape.getString("src"); + final srcBytes = shape.get("src_bytes") as Uint8List?; + return src != null + ? src.hashCode + : srcBytes != null + ? fnv1aHash(srcBytes) + : 0; +} diff --git a/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py b/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py index 5f6b1054c..750ce8f1e 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py +++ b/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py @@ -1,3 +1,4 @@ +import asyncio from dataclasses import dataclass, field from typing import Optional @@ -53,3 +54,26 @@ class Canvas(ConstrainedControl): Event object `e` is an instance of [CanvasResizeEvent](https://flet.dev/docs/reference/types/canvasresizeevent). """ + + def before_update(self): + super().before_update() + if self.expand: + if self.width is None: + self.width = float("inf") + if self.height is None: + self.height = float("inf") + + async def capture_async(self): + await self._invoke_method_async("capture") + + def capture(self): + asyncio.create_task(self.capture_async()) + + async def get_capture_async(self): + return await self._invoke_method_async("get_capture") + + async def clear_capture_async(self): + await self._invoke_method_async("capture") + + def clear_capture(self): + asyncio.create_task(self.clear_capture_async()) From cb2424f2ce485c6d4f3d28bccf13981812448a7b Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Mon, 14 Jul 2025 15:43:04 -0700 Subject: [PATCH 03/37] New `GestureDetector` events: `on_right_pan_start`, `on_right_pan_update`, `on_right_pan_end` --- .../lib/src/controls/gesture_detector.dart | 63 ++++++++++++++++--- .../flet_backend_channel_javascript_web.dart | 7 ++- .../flet_backend_channel_web_socket.dart | 4 +- .../flet/controls/core/gesture_detector.py | 28 +++++++++ 4 files changed, 91 insertions(+), 11 deletions(-) diff --git a/packages/flet/lib/src/controls/gesture_detector.dart b/packages/flet/lib/src/controls/gesture_detector.dart index 78ee26226..4b2f1a5f3 100644 --- a/packages/flet/lib/src/controls/gesture_detector.dart +++ b/packages/flet/lib/src/controls/gesture_detector.dart @@ -37,6 +37,10 @@ class _GestureDetectorControlState extends State { double _hoverX = 0; double _hoverY = 0; Timer? _debounce; + bool _rightPanActive = false; + int _rightPanTimestamp = DateTime.now().millisecondsSinceEpoch; + double _rightPanStartX = 0.0; + double _rightPanStartY = 0.0; @override void initState() { @@ -365,16 +369,57 @@ class _GestureDetectorControlState extends State { ) : result; - result = onScroll - ? Listener( - behavior: HitTestBehavior.translucent, - onPointerSignal: (details) { - if (details is PointerScrollEvent) { - widget.control.triggerEvent("scroll", details.toMap()); + var onRightPanStart = widget.control.getBool("on_right_pan_start", false)!; + var onRightPanUpdate = + widget.control.getBool("on_right_pan_update", false)!; + var onRightPanEnd = widget.control.getBool("on_right_pan_end", false)!; + + if (onScroll || onRightPanStart || onRightPanUpdate || onRightPanEnd) { + result = Listener( + behavior: HitTestBehavior.translucent, + onPointerSignal: onScroll + ? (details) { + if (details is PointerScrollEvent) { + widget.control.triggerEvent("scroll", details.toMap()); + } } - }, - child: result) - : result; + : null, + onPointerDown: onRightPanStart + ? (event) { + if (event.kind == PointerDeviceKind.mouse && + event.buttons == kSecondaryMouseButton) { + _rightPanActive = true; + _rightPanStartX = event.localPosition.dx; + _rightPanStartY = event.localPosition.dy; + widget.control.triggerEvent("right_pan_start", event.toMap()); + } + } + : null, + onPointerMove: onRightPanUpdate + ? (event) { + if (_rightPanActive && event.buttons == kSecondaryMouseButton) { + var now = DateTime.now().millisecondsSinceEpoch; + if (now - _rightPanTimestamp > dragInterval) { + _rightPanTimestamp = now; + widget.control.triggerEvent("right_pan_update", + event.toMap(_rightPanStartX, _rightPanStartY)); + _rightPanStartX = event.localPosition.dx; + _rightPanStartY = event.localPosition.dy; + } + } + } + : null, + onPointerUp: onRightPanEnd + ? (event) { + if (_rightPanActive) { + _rightPanActive = false; + widget.control.triggerEvent("right_pan_end", event.toMap()); + } + } + : null, + child: result, + ); + } var mouseCursor = parseMouseCursor(widget.control.getString("mouse_cursor")); diff --git a/packages/flet/lib/src/transport/flet_backend_channel_javascript_web.dart b/packages/flet/lib/src/transport/flet_backend_channel_javascript_web.dart index 93ea9ed54..08ce02eb4 100644 --- a/packages/flet/lib/src/transport/flet_backend_channel_javascript_web.dart +++ b/packages/flet/lib/src/transport/flet_backend_channel_javascript_web.dart @@ -5,6 +5,7 @@ import 'package:msgpack_dart/msgpack_dart.dart' as msgpack; import '../protocol/message.dart'; import 'flet_backend_channel.dart'; +import 'flet_msgpack_encoder.dart'; @JS() external JSPromise jsConnect( @@ -49,7 +50,11 @@ class FletJavaScriptBackendChannel implements FletBackendChannel { @override void send(Message message) { - jsSend(address, msgpack.serialize(message.toList()).toJS); + jsSend( + address, + msgpack + .serialize(message.toList(), extEncoder: FletMsgpackEncoder()) + .toJS); } @override diff --git a/packages/flet/lib/src/transport/flet_backend_channel_web_socket.dart b/packages/flet/lib/src/transport/flet_backend_channel_web_socket.dart index 908ffe03c..6a268e403 100644 --- a/packages/flet/lib/src/transport/flet_backend_channel_web_socket.dart +++ b/packages/flet/lib/src/transport/flet_backend_channel_web_socket.dart @@ -8,6 +8,7 @@ import '../utils/platform_utils_web.dart' if (dart.library.io) "../utils/platform_utils_non_web.dart"; import '../utils/uri.dart'; import 'flet_backend_channel.dart'; +import 'flet_msgpack_encoder.dart'; class FletWebSocketBackendChannel implements FletBackendChannel { late final String _wsUrl; @@ -60,7 +61,8 @@ class FletWebSocketBackendChannel implements FletBackendChannel { @override void send(Message message) { - _channel?.sink.add(msgpack.serialize(message.toList())); + _channel?.sink.add( + msgpack.serialize(message.toList(), extEncoder: FletMsgpackEncoder())); } @override diff --git a/sdk/python/packages/flet/src/flet/controls/core/gesture_detector.py b/sdk/python/packages/flet/src/flet/controls/core/gesture_detector.py index fc22e624b..522bf713f 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/gesture_detector.py +++ b/sdk/python/packages/flet/src/flet/controls/core/gesture_detector.py @@ -12,6 +12,7 @@ HoverEvent, LongPressEndEvent, LongPressStartEvent, + PointerEvent, ScaleEndEvent, ScaleStartEvent, ScaleUpdateEvent, @@ -294,6 +295,33 @@ class GestureDetector(ConstrainedControl, AdaptiveControl): [`DragEndEvent`](https://flet.dev/docs/reference/types/dragendevent). """ + on_right_pan_start: OptionalEventHandler[PointerEvent["GestureDetector"]] = None + """ + Pointer has contacted the screen while secondary button pressed + and has begun to move. + + Event handler argument is of type + [`PointerEvent`](https://flet.dev/docs/reference/types/PointerEvent). + """ + + on_right_pan_update: OptionalEventHandler[PointerEvent["GestureDetector"]] = None + """ + A pointer that is in contact with the screen, secondary button pressed + and moving has moved again. + + Event handler argument is of type + [`PointerEvent`](https://flet.dev/docs/reference/types/PointerEvent). + """ + + on_right_pan_end: OptionalEventHandler[PointerEvent["GestureDetector"]] = None + """ + A pointer with secondary button pressed is no longer in contact + and was moving at a specific velocity. + + Event handler argument is of type + [`PointerEvent`](https://flet.dev/docs/reference/types/PointerEvent). + """ + on_scale_start: OptionalEventHandler[ScaleStartEvent["GestureDetector"]] = None """ The pointers in contact with the screen have established a focal point and initial From 15af0f9fbf82f8b5633921a74dc464404aa03060 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Mon, 14 Jul 2025 18:02:17 -0700 Subject: [PATCH 04/37] Added `PageMediaData.device_pixel_ratio` property --- packages/flet/lib/src/flet_backend.dart | 3 ++- packages/flet/lib/src/protocol/page_media_data.dart | 8 ++++++-- packages/flet/lib/src/widgets/page_media.dart | 10 ++++------ .../packages/flet/src/flet/controls/page_view.py | 10 +++++++++- sdk/python/packages/flet/tests/test_from_dict.py | 1 + 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/flet/lib/src/flet_backend.dart b/packages/flet/lib/src/flet_backend.dart index c5d769479..ebee6e8af 100644 --- a/packages/flet/lib/src/flet_backend.dart +++ b/packages/flet/lib/src/flet_backend.dart @@ -73,7 +73,8 @@ class FletBackend extends ChangeNotifier { PageMediaData media = PageMediaData( padding: PaddingData(EdgeInsets.zero), viewPadding: PaddingData(EdgeInsets.zero), - viewInsets: PaddingData(EdgeInsets.zero)); + viewInsets: PaddingData(EdgeInsets.zero), + devicePixelRatio: 0); TargetPlatform platform = defaultTargetPlatform; late Control _page; diff --git a/packages/flet/lib/src/protocol/page_media_data.dart b/packages/flet/lib/src/protocol/page_media_data.dart index 49088e24b..69ea70324 100644 --- a/packages/flet/lib/src/protocol/page_media_data.dart +++ b/packages/flet/lib/src/protocol/page_media_data.dart @@ -5,20 +5,24 @@ class PageMediaData extends Equatable { final PaddingData padding; final PaddingData viewPadding; final PaddingData viewInsets; + final double devicePixelRatio; const PageMediaData( {required this.padding, required this.viewPadding, - required this.viewInsets}); + required this.viewInsets, + required this.devicePixelRatio}); Map toMap() => { 'padding': padding.toMap(), 'view_padding': viewPadding.toMap(), 'view_insets': viewInsets.toMap(), + 'device_pixel_ratio': devicePixelRatio }; @override - List get props => [padding, viewPadding, viewInsets]; + List get props => + [padding, viewPadding, viewInsets, devicePixelRatio]; } class PaddingData extends Equatable { diff --git a/packages/flet/lib/src/widgets/page_media.dart b/packages/flet/lib/src/widgets/page_media.dart index ca2dcec28..89dab74b8 100644 --- a/packages/flet/lib/src/widgets/page_media.dart +++ b/packages/flet/lib/src/widgets/page_media.dart @@ -52,13 +52,11 @@ class _PageMediaState extends State { _onPlatformBrightnessChanged(platformBrightness); } - var padding = MediaQuery.paddingOf(context); - var viewPadding = MediaQuery.viewPaddingOf(context); - var viewInsets = MediaQuery.viewInsetsOf(context); var newMedia = PageMediaData( - padding: PaddingData(padding), - viewPadding: PaddingData(viewPadding), - viewInsets: PaddingData(viewInsets)); + padding: PaddingData(MediaQuery.paddingOf(context)), + viewPadding: PaddingData(MediaQuery.viewPaddingOf(context)), + viewInsets: PaddingData(MediaQuery.viewInsetsOf(context)), + devicePixelRatio: MediaQuery.devicePixelRatioOf(context)); if (newMedia != backend.media || !pageSizeUpdated) { _onMediaChanged(newMedia); diff --git a/sdk/python/packages/flet/src/flet/controls/page_view.py b/sdk/python/packages/flet/src/flet/controls/page_view.py index caa467297..2163334d8 100644 --- a/sdk/python/packages/flet/src/flet/controls/page_view.py +++ b/sdk/python/packages/flet/src/flet/controls/page_view.py @@ -50,6 +50,7 @@ class PageMediaData: padding: Padding view_padding: Padding view_insets: Padding + device_pixel_ratio: float @dataclass @@ -100,7 +101,14 @@ class PageView(AdaptiveControl): width: OptionalNumber = None height: OptionalNumber = None title: Optional[str] = None - media: Optional[PageMediaData] = None + media: PageMediaData = field( + default_factory=lambda: PageMediaData( + padding=Padding.zero(), + view_padding=Padding.zero(), + view_insets=Padding.zero(), + device_pixel_ratio=0, + ) + ) scroll_event_interval: OptionalNumber = None on_resize: OptionalEventHandler["PageResizeEvent"] = None """ diff --git a/sdk/python/packages/flet/tests/test_from_dict.py b/sdk/python/packages/flet/tests/test_from_dict.py index 45b7e3d7c..49a55f4ed 100644 --- a/sdk/python/packages/flet/tests/test_from_dict.py +++ b/sdk/python/packages/flet/tests/test_from_dict.py @@ -14,6 +14,7 @@ def test_page_media_data(): "padding": {"left": 1, "top": 2, "right": 3, "bottom": 4}, "view_padding": {"left": 1, "top": 2, "right": 3, "bottom": 4}, "view_insets": {"left": 1, "top": 2, "right": 3, "bottom": 4}, + "device_pixel_ratio": 1, }, ) From effb0c2a0c4d5f973803f2929c9159c42a956978 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 16 Jul 2025 18:34:40 -0700 Subject: [PATCH 05/37] Canvas.capture() fixed for DPR --- .gitignore | 1 + packages/flet/lib/src/controls/canvas.dart | 81 ++++++++++++---------- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index 6712a75ab..4a09f882e 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ .python-version vendor/ /client/android/app/.cxx +client/devtools_options.yaml diff --git a/packages/flet/lib/src/controls/canvas.dart b/packages/flet/lib/src/controls/canvas.dart index 731723eef..1b19d8ed6 100644 --- a/packages/flet/lib/src/controls/canvas.dart +++ b/packages/flet/lib/src/controls/canvas.dart @@ -37,13 +37,24 @@ class _CanvasControlState extends State { int _lastResize = DateTime.now().millisecondsSinceEpoch; Size? _lastSize; ui.Image? _capturedImage; - Size? _capturedSize; + double _dpr = 1.0; + bool _initialized = false; + @override void initState() { super.initState(); widget.control.addInvokeMethodListener(_invokeMethod); } + @override + void didChangeDependencies() { + super.didChangeDependencies(); + if (!_initialized) { + _dpr = MediaQuery.devicePixelRatioOf(context); + _initialized = true; + } + } + @override void dispose() { widget.control.removeInvokeMethodListener(_invokeMethod); @@ -89,21 +100,23 @@ class _CanvasControlState extends State { final canvas = Canvas(recorder); final painter = FletCustomPainter( - context: context, - theme: Theme.of(context), - shapes: shapes, - onPaintCallback: (_) {}, - ); + context: context, + theme: Theme.of(context), + shapes: shapes, + capturedImage: _capturedImage, + onPaintCallback: (_) {}, + dpr: _dpr); - painter.paint(canvas, logicalSize); + var captureSize = + Size(logicalSize.width * _dpr, logicalSize.height * _dpr); + + painter.paint(canvas, captureSize); final picture = recorder.endRecording(); _capturedImage = await picture.toImage( - logicalSize.width.ceil(), - logicalSize.height.ceil(), + captureSize.width.toInt(), + captureSize.height.toInt(), ); - _capturedSize = logicalSize; - setState(() {}); // trigger rebuild return; case "get_capture": @@ -115,7 +128,6 @@ class _CanvasControlState extends State { case "clear_capture": _capturedImage?.dispose(); _capturedImage = null; - _capturedSize = null; setState(() {}); return; @@ -128,7 +140,6 @@ class _CanvasControlState extends State { Widget build(BuildContext context) { debugPrint("Canvas build: ${widget.control.id}"); - var onResize = widget.control.getBool("on_resize", false)!; var resizeInterval = widget.control.getInt("resize_interval", 10)!; var paint = CustomPaint( @@ -137,17 +148,15 @@ class _CanvasControlState extends State { theme: Theme.of(context), shapes: widget.control.children("shapes"), capturedImage: _capturedImage, - capturedSize: _capturedSize, + dpr: 1, onPaintCallback: (size) { - _lastSize = size; - if (onResize) { - var now = DateTime.now().millisecondsSinceEpoch; - if ((now - _lastResize > resizeInterval && _lastSize != size) || - _lastSize == null) { - _lastResize = now; - widget.control - .triggerEvent("resize", {"w": size.width, "h": size.height}); - } + var now = DateTime.now().millisecondsSinceEpoch; + if ((now - _lastResize > resizeInterval && _lastSize != size) || + _lastSize == null) { + _lastSize = size; + _lastResize = now; + widget.control + .triggerEvent("resize", {"w": size.width, "h": size.height}); } }, ), @@ -164,31 +173,31 @@ class FletCustomPainter extends CustomPainter { final List shapes; final CanvasControlOnPaintCallback onPaintCallback; final ui.Image? capturedImage; - final Size? capturedSize; + final double dpr; const FletCustomPainter({ required this.context, required this.theme, required this.shapes, required this.onPaintCallback, + required this.dpr, this.capturedImage, - this.capturedSize, }); @override void paint(Canvas canvas, Size size) { onPaintCallback(size); - //debugPrint("SHAPE CONTROLS: $shapes"); + debugPrint("paint.size: $size"); + //debugPrint("paint.shapes: $shapes"); canvas.save(); canvas.clipRect(Rect.fromLTWH(0, 0, size.width, size.height)); - if (capturedImage != null && capturedSize != null) { + if (capturedImage != null) { final src = Rect.fromLTWH(0, 0, capturedImage!.width.toDouble(), capturedImage!.height.toDouble()); - final dst = - Rect.fromLTWH(0, 0, capturedSize!.width, capturedSize!.height); + final dst = Rect.fromLTWH(0, 0, size.width, size.height); canvas.drawImageRect(capturedImage!, src, dst, Paint()); } @@ -389,8 +398,10 @@ class FletCustomPainter extends CustomPainter { final srcRect = Rect.fromLTWH(0, 0, img.width.toDouble(), img.height.toDouble()); final dstRect = width != null && height != null - ? Rect.fromLTWH(x, y, width, height) - : Offset(x, y) & Size(img.width.toDouble(), img.height.toDouble()); + ? Rect.fromLTWH(x * dpr, y * dpr, width * dpr, height * dpr) + : Offset(x * dpr, y * dpr) & + Size(img.width.toDouble() * dpr, img.height.toDouble() * dpr); + debugPrint("canvas.drawImageRect($srcRect, $dstRect)"); canvas.drawImageRect(img, srcRect, dstRect, paint); } else { loadCanvasImage(shape); @@ -476,8 +487,6 @@ Future loadCanvasImage(Control shape) async { final src = shape.getString("src"); final srcBytes = shape.get("src_bytes") as Uint8List?; - final width = shape.getInt("width"); - final height = shape.getInt("height"); try { Uint8List bytes; @@ -502,11 +511,7 @@ Future loadCanvasImage(Control shape) async { throw Exception("Missing image source: 'src' or 'src_bytes'"); } - final codec = await ui.instantiateImageCodec( - bytes, - targetWidth: width, - targetHeight: height, - ); + final codec = await ui.instantiateImageCodec(bytes); final frame = await codec.getNextFrame(); shape.properties["_image"] = frame.image; shape.updateProperties({"_hash": getImageHash(shape)}, From f4827698fdd19a08a47d826bc5b706cec44b7846 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Thu, 17 Jul 2025 16:51:32 -0700 Subject: [PATCH 06/37] BaseControl. _trigger_event, context moved to a separate module --- .../flet-web/src/flet_web/fastapi/flet_app.py | 5 +- sdk/python/packages/flet/src/flet/__init__.py | 2 +- sdk/python/packages/flet/src/flet/app.py | 5 +- .../flet/src/flet/controls/base_control.py | 76 ++++++++++++++++++ .../flet/src/flet/controls/context.py | 15 ++++ .../packages/flet/src/flet/controls/page.py | 16 +--- .../flet/src/flet/messaging/session.py | 77 ++----------------- 7 files changed, 108 insertions(+), 88 deletions(-) create mode 100644 sdk/python/packages/flet/src/flet/controls/context.py diff --git a/sdk/python/packages/flet-web/src/flet_web/fastapi/flet_app.py b/sdk/python/packages/flet-web/src/flet_web/fastapi/flet_app.py index 97019f86e..d894d91c1 100644 --- a/sdk/python/packages/flet-web/src/flet_web/fastapi/flet_app.py +++ b/sdk/python/packages/flet-web/src/flet_web/fastapi/flet_app.py @@ -11,7 +11,8 @@ import msgpack from fastapi import WebSocket, WebSocketDisconnect from flet.controls.base_control import BaseControl -from flet.controls.page import PageDisconnectedException, _session_page +from flet.controls.context import _context_page +from flet.controls.page import PageDisconnectedException from flet.controls.update_behavior import UpdateBehavior from flet.messaging.connection import Connection from flet.messaging.protocol import ( @@ -138,7 +139,7 @@ async def __on_session_created(self): logger.info(f"Start session: {self.__session.id}") try: assert self.__main is not None - _session_page.set(self.__session.page) + _context_page.set(self.__session.page) UpdateBehavior.reset() if asyncio.iscoroutinefunction(self.__main): diff --git a/sdk/python/packages/flet/src/flet/__init__.py b/sdk/python/packages/flet/src/flet/__init__.py index c0575635f..f1f9d1d6b 100644 --- a/sdk/python/packages/flet/src/flet/__init__.py +++ b/sdk/python/packages/flet/src/flet/__init__.py @@ -357,8 +357,8 @@ PageDisconnectedException, RouteChangeEvent, ViewPopEvent, - context, ) +from flet.controls.context import context from flet.controls.page_view import PageMediaData, PageResizeEvent, PageView from flet.controls.painting import ( Paint, diff --git a/sdk/python/packages/flet/src/flet/app.py b/sdk/python/packages/flet/src/flet/app.py index 90636aabc..47d65309e 100644 --- a/sdk/python/packages/flet/src/flet/app.py +++ b/sdk/python/packages/flet/src/flet/app.py @@ -10,7 +10,8 @@ from pathlib import Path from typing import TYPE_CHECKING, Any, Callable, Optional, Union -from flet.controls.page import Page, _session_page +from flet.controls.context import _context_page +from flet.controls.page import Page from flet.controls.types import AppView, RouteUrlStrategy, WebRenderer from flet.controls.update_behavior import UpdateBehavior from flet.messaging.session import Session @@ -253,7 +254,7 @@ async def on_session_created(session: Session): logger.info("App session started") try: assert main is not None - _session_page.set(session.page) + _context_page.set(session.page) UpdateBehavior.reset() if asyncio.iscoroutinefunction(main): await main(session.page) diff --git a/sdk/python/packages/flet/src/flet/controls/base_control.py b/sdk/python/packages/flet/src/flet/controls/base_control.py index d3ad046d0..01360f709 100644 --- a/sdk/python/packages/flet/src/flet/controls/base_control.py +++ b/sdk/python/packages/flet/src/flet/controls/base_control.py @@ -1,12 +1,18 @@ +import asyncio +import inspect import logging import sys from dataclasses import InitVar, dataclass, field from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, Union +from flet.controls.context import _context_page from flet.controls.control_event import ControlEvent from flet.controls.control_id import ControlId from flet.controls.keys import ScrollKey, ValueKey from flet.controls.ref import Ref +from flet.controls.update_behavior import UpdateBehavior +from flet.utils.from_dict import from_dict +from flet.utils.object_model import get_param_count logger = logging.getLogger("flet") controls_log = logging.getLogger("flet_controls") @@ -210,3 +216,73 @@ async def _invoke_method_async( return await self.page.get_session().invoke_method( self._i, method_name, arguments, timeout ) + + async def _trigger_event(self, event_name: str, event_data: Any): + field_name = f"on_{event_name}" + if not hasattr(self, field_name): + # field_name not defined + return + + event_type = ControlEvent.get_event_field_type(self, field_name) + if event_type is None: + return + + if event_type == ControlEvent or not isinstance(event_data, dict): + # simple ControlEvent + e = ControlEvent(control=self, name=event_name, data=event_data) + else: + # custom ControlEvent + args = { + "control": self, + "name": event_name, + **(event_data or {}), + } + e = from_dict(event_type, args) + + handle_event = self.before_event(e) + + if handle_event is None or handle_event: + _context_page.set(self.page) + UpdateBehavior.reset() + + assert self.page, "Control must be added on a page first." + session = self.page.get_session() + + # Handle async and sync event handlers accordingly + event_handler = getattr(self, field_name) + if asyncio.iscoroutinefunction(event_handler): + if get_param_count(event_handler) == 0: + await event_handler() + else: + await event_handler(e) + + elif inspect.isasyncgenfunction(event_handler): + if get_param_count(event_handler) == 0: + async for _ in event_handler(): + if UpdateBehavior.auto_update_enabled(): + await session.auto_update(session.index.get(self._i)) + else: + async for _ in event_handler(e): + if UpdateBehavior.auto_update_enabled(): + await session.auto_update(session.index.get(self._i)) + return + + elif inspect.isgeneratorfunction(event_handler): + if get_param_count(event_handler) == 0: + for _ in event_handler(): + if UpdateBehavior.auto_update_enabled(): + await session.auto_update(session.index.get(self._i)) + else: + for _ in event_handler(e): + if UpdateBehavior.auto_update_enabled(): + await session.auto_update(session.index.get(self._i)) + return + + elif callable(event_handler): + if get_param_count(event_handler) == 0: + event_handler() + else: + event_handler(e) + + if UpdateBehavior.auto_update_enabled(): + await session.auto_update(session.index.get(self._i)) diff --git a/sdk/python/packages/flet/src/flet/controls/context.py b/sdk/python/packages/flet/src/flet/controls/context.py new file mode 100644 index 000000000..2f797669f --- /dev/null +++ b/sdk/python/packages/flet/src/flet/controls/context.py @@ -0,0 +1,15 @@ +from contextvars import ContextVar +from typing import TYPE_CHECKING, Optional + +from flet.utils.classproperty import classproperty + +if TYPE_CHECKING: + from flet.controls.page import Page + +_context_page = ContextVar("flet_session_page", default=None) + + +class context: + @classproperty + def page(cls) -> Optional["Page"]: + return _context_page.get() diff --git a/sdk/python/packages/flet/src/flet/controls/page.py b/sdk/python/packages/flet/src/flet/controls/page.py index 230534785..69254662e 100644 --- a/sdk/python/packages/flet/src/flet/controls/page.py +++ b/sdk/python/packages/flet/src/flet/controls/page.py @@ -3,7 +3,6 @@ import weakref from collections.abc import Awaitable, Coroutine from concurrent.futures import CancelledError, Future, ThreadPoolExecutor -from contextvars import ContextVar from dataclasses import InitVar, dataclass, field from functools import partial from typing import ( @@ -19,6 +18,7 @@ from flet.auth.oauth_provider import OAuthProvider from flet.controls.adaptive_control import AdaptiveControl from flet.controls.base_control import BaseControl, control +from flet.controls.context import _context_page from flet.controls.control import Control from flet.controls.control_event import ( ControlEvent, @@ -46,7 +46,7 @@ PagePlatform, Wrapper, ) -from flet.utils import classproperty, is_pyodide +from flet.utils import is_pyodide from flet.utils.strings import random_string if not is_pyodide(): @@ -72,14 +72,6 @@ except ImportError: from typing_extensions import ParamSpec -_session_page = ContextVar("flet_session_page", default=None) - - -class context: - @classproperty - def page(cls) -> Optional["Page"]: - return _session_page.get() - AT = TypeVar("AT", bound=Authorization) InputT = ParamSpec("InputT") @@ -479,7 +471,7 @@ def run_task( Run `handler` coroutine as a new Task in the event loop associated with the current page. """ - _session_page.set(self) + _context_page.set(self) assert asyncio.iscoroutinefunction(handler) future = asyncio.run_coroutine_threadsafe( @@ -500,7 +492,7 @@ def _on_completion(f): def __context_wrapper(self, handler: Callable[..., Any]) -> Wrapper: def wrapper(*args, **kwargs): - _session_page.set(self) + _context_page.set(self) handler(*args, **kwargs) return wrapper diff --git a/sdk/python/packages/flet/src/flet/messaging/session.py b/sdk/python/packages/flet/src/flet/messaging/session.py index 2a9a602df..fe603de57 100644 --- a/sdk/python/packages/flet/src/flet/messaging/session.py +++ b/sdk/python/packages/flet/src/flet/messaging/session.py @@ -1,5 +1,4 @@ import asyncio -import inspect import logging import traceback import weakref @@ -7,10 +6,9 @@ from typing import Any, Optional from flet.controls.base_control import BaseControl -from flet.controls.control_event import ControlEvent +from flet.controls.context import _context_page from flet.controls.object_patch import ObjectPatch -from flet.controls.page import Page, _session_page -from flet.controls.update_behavior import UpdateBehavior +from flet.controls.page import Page from flet.messaging.connection import Connection from flet.messaging.protocol import ( ClientAction, @@ -20,8 +18,7 @@ SessionCrashedBody, ) from flet.pubsub.pubsub_client import PubSubClient -from flet.utils.from_dict import from_dict -from flet.utils.object_model import get_param_count, patch_dataclass +from flet.utils.object_model import patch_dataclass from flet.utils.strings import random_string logger = logging.getLogger("flet") @@ -75,7 +72,7 @@ def pubsub_client(self) -> PubSubClient: async def connect(self, conn: Connection) -> None: logger.debug(f"Connect session: {self.id}") - _session_page.set(self.__page) + _context_page.set(self.__page) self.__conn = conn self.__expires_at = None for message in self.__send_buffer: @@ -167,73 +164,11 @@ async def dispatch_event( logger.debug(f"Control with ID {control_id} not found.") return - field_name = f"on_{event_name}" - if not hasattr(control, field_name): - # field_name not defined - return try: - event_type = ControlEvent.get_event_field_type(control, field_name) - if event_type is None: - return - - if event_type == ControlEvent or not isinstance(event_data, dict): - # simple ControlEvent - e = ControlEvent(control=control, name=event_name, data=event_data) - else: - # custom ControlEvent - args = { - "control": control, - "name": event_name, - **(event_data or {}), - } - e = from_dict(event_type, args) - - handle_event = control.before_event(e) - - if handle_event is None or handle_event: - _session_page.set(self.__page) - UpdateBehavior.reset() - - # Handle async and sync event handlers accordingly - event_handler = getattr(control, field_name) - if asyncio.iscoroutinefunction(event_handler): - if get_param_count(event_handler) == 0: - await event_handler() - else: - await event_handler(e) - - elif inspect.isasyncgenfunction(event_handler): - if get_param_count(event_handler) == 0: - async for _ in event_handler(): - if UpdateBehavior.auto_update_enabled(): - await self.auto_update(self.index.get(control._i)) - else: - async for _ in event_handler(e): - if UpdateBehavior.auto_update_enabled(): - await self.auto_update(self.index.get(control._i)) - - elif inspect.isgeneratorfunction(event_handler): - if get_param_count(event_handler) == 0: - for _ in event_handler(): - if UpdateBehavior.auto_update_enabled(): - await self.auto_update(self.index.get(control._i)) - else: - for _ in event_handler(e): - if UpdateBehavior.auto_update_enabled(): - await self.auto_update(self.index.get(control._i)) - - elif callable(event_handler): - if get_param_count(event_handler) == 0: - event_handler() - else: - event_handler(e) - - if UpdateBehavior.auto_update_enabled(): - await self.auto_update(self.index.get(control._i)) - + await control._trigger_event(event_name, event_data) except Exception as ex: tb = traceback.format_exc() - self.error(f"Exception in '{field_name}': {ex}\n{tb}") + self.error(f"Exception in 'on_{event_name}': {ex}\n{tb}") async def invoke_method( self, From 236c4fe2be3327ce82a0e6add004632bdf6dd6ea Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Thu, 17 Jul 2025 20:09:52 -0700 Subject: [PATCH 07/37] Scale canvas to account for DPR when taking capture --- packages/flet/lib/src/controls/canvas.dart | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/flet/lib/src/controls/canvas.dart b/packages/flet/lib/src/controls/canvas.dart index 1b19d8ed6..b8ae84ec9 100644 --- a/packages/flet/lib/src/controls/canvas.dart +++ b/packages/flet/lib/src/controls/canvas.dart @@ -35,7 +35,7 @@ class CanvasControl extends StatefulWidget { class _CanvasControlState extends State { int _lastResize = DateTime.now().millisecondsSinceEpoch; - Size? _lastSize; + Size _lastSize = Size.zero; ui.Image? _capturedImage; double _dpr = 1.0; bool _initialized = false; @@ -86,8 +86,7 @@ class _CanvasControlState extends State { switch (name) { case "capture": final shapes = widget.control.children("shapes"); - final logicalSize = _lastSize; - if (logicalSize == null || logicalSize.isEmpty || shapes.isEmpty) { + if (_lastSize.isEmpty || shapes.isEmpty) { return; } @@ -107,15 +106,12 @@ class _CanvasControlState extends State { onPaintCallback: (_) {}, dpr: _dpr); - var captureSize = - Size(logicalSize.width * _dpr, logicalSize.height * _dpr); - - painter.paint(canvas, captureSize); + painter.paint(canvas, _lastSize); final picture = recorder.endRecording(); _capturedImage = await picture.toImage( - captureSize.width.toInt(), - captureSize.height.toInt(), + (_lastSize.width * _dpr).toInt(), + (_lastSize.height * _dpr).toInt(), ); return; @@ -152,7 +148,7 @@ class _CanvasControlState extends State { onPaintCallback: (size) { var now = DateTime.now().millisecondsSinceEpoch; if ((now - _lastResize > resizeInterval && _lastSize != size) || - _lastSize == null) { + _lastSize.isEmpty) { _lastSize = size; _lastResize = now; widget.control @@ -192,6 +188,7 @@ class FletCustomPainter extends CustomPainter { //debugPrint("paint.shapes: $shapes"); canvas.save(); + canvas.scale(dpr); canvas.clipRect(Rect.fromLTWH(0, 0, size.width, size.height)); if (capturedImage != null) { @@ -398,9 +395,8 @@ class FletCustomPainter extends CustomPainter { final srcRect = Rect.fromLTWH(0, 0, img.width.toDouble(), img.height.toDouble()); final dstRect = width != null && height != null - ? Rect.fromLTWH(x * dpr, y * dpr, width * dpr, height * dpr) - : Offset(x * dpr, y * dpr) & - Size(img.width.toDouble() * dpr, img.height.toDouble() * dpr); + ? Rect.fromLTWH(x, y, width, height) + : Offset(x, y) & Size(img.width.toDouble(), img.height.toDouble()); debugPrint("canvas.drawImageRect($srcRect, $dstRect)"); canvas.drawImageRect(img, srcRect, dstRect, paint); } else { From 5d55afb668b1fbca055b11b28aef94269337d4f1 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Sun, 20 Jul 2025 12:20:48 -0700 Subject: [PATCH 08/37] Preserve capture size --- packages/flet/lib/src/controls/canvas.dart | 29 ++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/flet/lib/src/controls/canvas.dart b/packages/flet/lib/src/controls/canvas.dart index b8ae84ec9..aa306f33d 100644 --- a/packages/flet/lib/src/controls/canvas.dart +++ b/packages/flet/lib/src/controls/canvas.dart @@ -37,6 +37,7 @@ class _CanvasControlState extends State { int _lastResize = DateTime.now().millisecondsSinceEpoch; Size _lastSize = Size.zero; ui.Image? _capturedImage; + Size _capturedSize = Size.zero; double _dpr = 1.0; bool _initialized = false; @@ -98,11 +99,15 @@ class _CanvasControlState extends State { final recorder = ui.PictureRecorder(); final canvas = Canvas(recorder); + var capturedSize = + _capturedSize != Size.zero ? _capturedSize : _lastSize; + final painter = FletCustomPainter( context: context, theme: Theme.of(context), shapes: shapes, capturedImage: _capturedImage, + capturedSize: capturedSize, onPaintCallback: (_) {}, dpr: _dpr); @@ -113,6 +118,7 @@ class _CanvasControlState extends State { (_lastSize.width * _dpr).toInt(), (_lastSize.height * _dpr).toInt(), ); + _capturedSize = _lastSize; return; case "get_capture": @@ -144,6 +150,7 @@ class _CanvasControlState extends State { theme: Theme.of(context), shapes: widget.control.children("shapes"), capturedImage: _capturedImage, + capturedSize: _capturedSize, dpr: 1, onPaintCallback: (size) { var now = DateTime.now().millisecondsSinceEpoch; @@ -169,16 +176,17 @@ class FletCustomPainter extends CustomPainter { final List shapes; final CanvasControlOnPaintCallback onPaintCallback; final ui.Image? capturedImage; + final Size? capturedSize; final double dpr; - const FletCustomPainter({ - required this.context, - required this.theme, - required this.shapes, - required this.onPaintCallback, - required this.dpr, - this.capturedImage, - }); + const FletCustomPainter( + {required this.context, + required this.theme, + required this.shapes, + required this.onPaintCallback, + required this.dpr, + this.capturedImage, + this.capturedSize}); @override void paint(Canvas canvas, Size size) { @@ -191,10 +199,11 @@ class FletCustomPainter extends CustomPainter { canvas.scale(dpr); canvas.clipRect(Rect.fromLTWH(0, 0, size.width, size.height)); - if (capturedImage != null) { + if (capturedImage != null && capturedSize != null) { final src = Rect.fromLTWH(0, 0, capturedImage!.width.toDouble(), capturedImage!.height.toDouble()); - final dst = Rect.fromLTWH(0, 0, size.width, size.height); + final dst = + Rect.fromLTWH(0, 0, capturedSize!.width, capturedSize!.height); canvas.drawImageRect(capturedImage!, src, dst, Paint()); } From e4837dd696217e95be696fe99136703000f434e5 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Sun, 20 Jul 2025 13:50:07 -0700 Subject: [PATCH 09/37] Fix: page.page should return Page. --- sdk/python/packages/flet/src/flet/controls/base_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/packages/flet/src/flet/controls/base_control.py b/sdk/python/packages/flet/src/flet/controls/base_control.py index 01360f709..28773caf9 100644 --- a/sdk/python/packages/flet/src/flet/controls/base_control.py +++ b/sdk/python/packages/flet/src/flet/controls/base_control.py @@ -163,7 +163,7 @@ def page(self) -> Optional[Union["Page", "PageView"]]: """The page (of type `Page` or `PageView`) to which this control belongs to.""" from .page import Page, PageView - parent = self.parent + parent = self while parent: if isinstance(parent, (Page, PageView)): return parent From d9e7e8b31a11f815692a250e11c98a15e05cb3cf Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Sun, 20 Jul 2025 17:01:25 -0700 Subject: [PATCH 10/37] KeyboardListener control --- .../lib/src/controls/keyboard_listener.dart | 71 ++++++++++++++++ .../flet/lib/src/flet_core_extension.dart | 3 + sdk/python/packages/flet/src/flet/__init__.py | 12 ++- .../flet/controls/core/keyboard_listener.py | 81 +++++++++++++++++++ 4 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 packages/flet/lib/src/controls/keyboard_listener.dart create mode 100644 sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py diff --git a/packages/flet/lib/src/controls/keyboard_listener.dart b/packages/flet/lib/src/controls/keyboard_listener.dart new file mode 100644 index 000000000..dd0b787f6 --- /dev/null +++ b/packages/flet/lib/src/controls/keyboard_listener.dart @@ -0,0 +1,71 @@ +import 'package:flet/flet.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class KeyboardListenerControl extends StatefulWidget { + final Control control; + + KeyboardListenerControl({Key? key, required this.control}) + : super(key: ValueKey("control_${control.id}")); + + @override + State createState() => + _KeyboardListenerControlState(); +} + +class _KeyboardListenerControlState extends State { + final FocusNode _focusNode = FocusNode(); + + @override + void initState() { + super.initState(); + widget.control.addInvokeMethodListener(_invokeMethod); + } + + @override + void dispose() { + _focusNode.dispose(); + widget.control.removeInvokeMethodListener(_invokeMethod); + super.dispose(); + } + + Future _invokeMethod(String name, dynamic args) async { + debugPrint("KeyboardListener.$name($args)"); + switch (name) { + case "focus": + _focusNode.requestFocus(); + default: + throw Exception("Unknown KeyboardListener method: $name"); + } + } + + @override + Widget build(BuildContext context) { + debugPrint("KeyboardListener build: ${widget.control.id}"); + + var content = widget.control.buildWidget("content"); + + if (content == null) { + return const ErrorControl("KeyboardListener control has no content."); + } + + return KeyboardListener( + focusNode: _focusNode, + autofocus: widget.control.getBool("autofocus", false)!, + includeSemantics: widget.control.getBool("include_semantics", true)!, + onKeyEvent: (keyEvent) { + if (keyEvent is KeyDownEvent) { + widget.control + .triggerEvent("key_down", {"key": keyEvent.logicalKey.keyLabel}); + } else if (keyEvent is KeyUpEvent) { + widget.control + .triggerEvent("key_up", {"key": keyEvent.logicalKey.keyLabel}); + } else if (keyEvent is KeyRepeatEvent) { + widget.control.triggerEvent( + "key_repeat", {"key": keyEvent.logicalKey.keyLabel}); + } + }, + child: content, + ); + } +} diff --git a/packages/flet/lib/src/flet_core_extension.dart b/packages/flet/lib/src/flet_core_extension.dart index 649b33975..33706564b 100644 --- a/packages/flet/lib/src/flet_core_extension.dart +++ b/packages/flet/lib/src/flet_core_extension.dart @@ -61,6 +61,7 @@ import 'controls/icon.dart'; import 'controls/icon_button.dart'; import 'controls/image.dart'; import 'controls/interactive_viewer.dart'; +import 'controls/keyboard_listener.dart'; import 'controls/list_tile.dart'; import 'controls/list_view.dart'; import 'controls/markdown.dart'; @@ -244,6 +245,8 @@ class FletCoreExtension extends FletExtension { return AdaptiveButtonControl(key: key, control: control); case "FletApp": return FletAppControl(key: key, control: control); + case "KeyboardListener": + return KeyboardListenerControl(key: key, control: control); case "SubmenuButton": return SubmenuButtonControl(key: key, control: control); case "FloatingActionButton": diff --git a/sdk/python/packages/flet/src/flet/__init__.py b/sdk/python/packages/flet/src/flet/__init__.py index f1f9d1d6b..aa6f5815b 100644 --- a/sdk/python/packages/flet/src/flet/__init__.py +++ b/sdk/python/packages/flet/src/flet/__init__.py @@ -71,6 +71,7 @@ ) from flet.controls.colors import Colors from flet.controls.constrained_control import ConstrainedControl +from flet.controls.context import context from flet.controls.control import Control, OptionalControl from flet.controls.control_builder import ControlBuilder from flet.controls.control_event import ( @@ -114,6 +115,12 @@ from flet.controls.core.icon import Icon from flet.controls.core.image import Image from flet.controls.core.interactive_viewer import InteractiveViewer +from flet.controls.core.keyboard_listener import ( + KeyboardListener, + KeyDownEvent, + KeyRepeatEvent, + KeyUpEvent, +) from flet.controls.core.list_view import ListView from flet.controls.core.markdown import ( Markdown, @@ -358,7 +365,6 @@ RouteChangeEvent, ViewPopEvent, ) -from flet.controls.context import context from flet.controls.page_view import PageMediaData, PageResizeEvent, PageView from flet.controls.painting import ( Paint, @@ -972,4 +978,8 @@ "EventControlType", "TextSelectionChangeCause", "TextSelectionChangeEvent", + "KeyboardListener", + "KeyDownEvent", + "KeyRepeatEvent", + "KeyUpEvent", ] diff --git a/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py b/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py new file mode 100644 index 000000000..edc0cfc79 --- /dev/null +++ b/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py @@ -0,0 +1,81 @@ +import asyncio +from dataclasses import dataclass + +from flet.controls.base_control import control +from flet.controls.control import Control +from flet.controls.control_event import Event, OptionalEventHandler + +__all__ = [ + "KeyboardListener", +] + + +@dataclass +class KeyDownEvent(Event["KeyboardListener"]): + key: str + + +@dataclass +class KeyUpEvent(Event["KeyboardListener"]): + key: str + + +@dataclass +class KeyRepeatEvent(Event["KeyboardListener"]): + key: str + + +@control("KeyboardListener") +class KeyboardListener(Control): + """ + A control that calls a callback whenever the user presses or releases + a key on a keyboard. + + Online docs: https://flet.dev/docs/controls/keyboardlistener + """ + + content: Control + """ + The content control of the keyboard listener. + """ + + autofocus: bool = False + """ + True if this control will be selected as the initial focus when no other node + in its scope is currently focused. + """ + + include_semantics: bool = True + """ + Include semantics information in this control. + """ + + on_key_down: OptionalEventHandler[KeyDownEvent] = None + """ + Fires when a keyboard key is pressed. + + Event handler argument is of type + [KeyboardEvent](https://flet.dev/docs/reference/types/keydownvent). + """ + + on_key_up: OptionalEventHandler[KeyUpEvent] = None + """ + Fires when a keyboard key is released. + + Event handler argument is of type + [KeyboardEvent](https://flet.dev/docs/reference/types/keyupevent). + """ + + on_key_repeat: OptionalEventHandler[KeyRepeatEvent] = None + """ + Fires when a keyboard key is being hold, causing repeated events. + + Event handler argument is of type + [KeyboardEvent](https://flet.dev/docs/reference/types/keyrepeatevent). + """ + + async def focus_async(self): + await self._invoke_method_async("focus") + + def focus(self): + asyncio.create_task(self.focus_async()) From 1b63fa71190e7bf9112782b180642db41d24d385 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Sun, 20 Jul 2025 18:22:44 -0700 Subject: [PATCH 11/37] Allow FilePicker.save_file on web --- packages/flet/lib/src/services/file_picker.dart | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/flet/lib/src/services/file_picker.dart b/packages/flet/lib/src/services/file_picker.dart index 92d9ed728..a70acefec 100644 --- a/packages/flet/lib/src/services/file_picker.dart +++ b/packages/flet/lib/src/services/file_picker.dart @@ -67,11 +67,14 @@ class FilePickerService extends FletService { }).toList() : []; case "save_file": - if (kIsWeb) { - throw Exception("Save File dialog is not supported on web."); - } else if ((isAndroidMobile() || isIOSMobile()) && srcBytes == null) { + if ((kIsWeb || isAndroidMobile() || isIOSMobile()) && + srcBytes == null) { + throw Exception( + "\"src_bytes\" is required when saving a file on Web, Android and iOS."); + } + if (kIsWeb && args["file_name"] == null) { throw Exception( - "\"src_bytes\" is required when saving a file on Android or iOS."); + "\"file_name\" is required when saving a file on Web."); } return await FilePicker.platform.saveFile( dialogTitle: dialogTitle, From 1041f4811a3f03bc773ef8033e03c97e8983d289 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Tue, 5 Aug 2025 15:52:36 -0700 Subject: [PATCH 12/37] Update right-pan event --- .../flet/lib/src/controls/gesture_detector.dart | 13 +++++-------- .../flet/src/flet/controls/core/canvas/image.py | 12 ++++++------ .../src/flet/controls/core/keyboard_listener.py | 9 +++++---- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/packages/flet/lib/src/controls/gesture_detector.dart b/packages/flet/lib/src/controls/gesture_detector.dart index dada30fa2..4fb3371f8 100644 --- a/packages/flet/lib/src/controls/gesture_detector.dart +++ b/packages/flet/lib/src/controls/gesture_detector.dart @@ -38,8 +38,7 @@ class _GestureDetectorControlState extends State { Timer? _debounce; bool _rightPanActive = false; int _rightPanTimestamp = DateTime.now().millisecondsSinceEpoch; - double _rightPanStartX = 0.0; - double _rightPanStartY = 0.0; + Offset _rightPanStart = Offset.zero; @override void initState() { @@ -386,8 +385,7 @@ class _GestureDetectorControlState extends State { if (event.kind == PointerDeviceKind.mouse && event.buttons == kSecondaryMouseButton) { _rightPanActive = true; - _rightPanStartX = event.localPosition.dx; - _rightPanStartY = event.localPosition.dy; + _rightPanStart = event.localPosition; widget.control.triggerEvent("right_pan_start", event.toMap()); } } @@ -398,10 +396,9 @@ class _GestureDetectorControlState extends State { var now = DateTime.now().millisecondsSinceEpoch; if (now - _rightPanTimestamp > dragInterval) { _rightPanTimestamp = now; - widget.control.triggerEvent("right_pan_update", - event.toMap(_rightPanStartX, _rightPanStartY)); - _rightPanStartX = event.localPosition.dx; - _rightPanStartY = event.localPosition.dy; + widget.control.triggerEvent( + "right_pan_update", event.toMap(_rightPanStart)); + _rightPanStart = event.localPosition; } } } diff --git a/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py b/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py index 2bbe3f105..ee163ee9c 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py +++ b/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py @@ -3,7 +3,7 @@ from flet.controls.base_control import control from flet.controls.core.canvas.shape import Shape from flet.controls.painting import Paint -from flet.controls.types import OptionalNumber, OptionalString +from flet.controls.types import Number @control("Image") @@ -12,7 +12,7 @@ class Image(Shape): Draws an image. """ - src: OptionalString = None + src: Optional[str] = None """ Draws an image from a source. @@ -25,22 +25,22 @@ class Image(Shape): Draws an image from a bytes array. """ - x: OptionalNumber = None + x: Optional[Number] = None """ The x-axis coordinate of the image's top-left corner. """ - y: OptionalNumber = None + y: Optional[Number] = None """ The y-axis coordinate of the image's top-left corner. """ - width: OptionalNumber = None + width: Optional[Number] = None """ The width of the rectangle to draw the image into. Use image width if None. """ - height: OptionalNumber = None + height: Optional[Number] = None """ The height of the rectangle to draw the image into. Use image height if None. """ diff --git a/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py b/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py index edc0cfc79..941744b99 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py +++ b/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py @@ -1,9 +1,10 @@ import asyncio from dataclasses import dataclass +from typing import Optional from flet.controls.base_control import control from flet.controls.control import Control -from flet.controls.control_event import Event, OptionalEventHandler +from flet.controls.control_event import Event, EventHandler __all__ = [ "KeyboardListener", @@ -50,7 +51,7 @@ class KeyboardListener(Control): Include semantics information in this control. """ - on_key_down: OptionalEventHandler[KeyDownEvent] = None + on_key_down: Optional[EventHandler[KeyDownEvent]] = None """ Fires when a keyboard key is pressed. @@ -58,7 +59,7 @@ class KeyboardListener(Control): [KeyboardEvent](https://flet.dev/docs/reference/types/keydownvent). """ - on_key_up: OptionalEventHandler[KeyUpEvent] = None + on_key_up: Optional[EventHandler[KeyUpEvent]] = None """ Fires when a keyboard key is released. @@ -66,7 +67,7 @@ class KeyboardListener(Control): [KeyboardEvent](https://flet.dev/docs/reference/types/keyupevent). """ - on_key_repeat: OptionalEventHandler[KeyRepeatEvent] = None + on_key_repeat: Optional[EventHandler[KeyRepeatEvent]] = None """ Fires when a keyboard key is being hold, causing repeated events. From b18b3d3df798d596fdbdd301b72dbd5b73aff105 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Tue, 5 Aug 2025 16:48:24 -0700 Subject: [PATCH 13/37] All canvas shapes can be dashed Close #1791 --- packages/flet/lib/src/controls/canvas.dart | 104 ++++++++++---- .../examples/controls/canvas/strokes.py | 130 ++++++++++++++++++ .../src/flet/controls/core/canvas/image.py | 3 +- 3 files changed, 208 insertions(+), 29 deletions(-) create mode 100644 sdk/python/examples/controls/canvas/strokes.py diff --git a/packages/flet/lib/src/controls/canvas.dart b/packages/flet/lib/src/controls/canvas.dart index afb274fed..717735f96 100644 --- a/packages/flet/lib/src/controls/canvas.dart +++ b/packages/flet/lib/src/controls/canvas.dart @@ -248,47 +248,84 @@ class FletCustomPainter extends CustomPainter { Paint paint = shape.getPaint("paint", theme, Paint())!; var dashPattern = shape.getPaintStrokeDashPattern("paint"); paint.style = ui.PaintingStyle.stroke; - var path = ui.Path(); - path.moveTo(shape.getDouble("x1")!, shape.getDouble("y1")!); - path.lineTo(shape.getDouble("x2")!, shape.getDouble("y2")!); - if (dashPattern != null) { + var p1 = Offset(shape.getDouble("x1")!, shape.getDouble("y1")!); + var p2 = Offset(shape.getDouble("x2")!, shape.getDouble("y2")!); + + if (dashPattern == null) { + canvas.drawLine(p1, p2, paint); + } else { + var path = ui.Path(); + path.moveTo(p1.dx, p1.dy); + path.lineTo(p2.dx, p2.dy); path = dashPath(path, dashArray: CircularIntervalList(dashPattern)); + canvas.drawPath(path, paint); } - canvas.drawPath(path, paint); } void drawCircle(Canvas canvas, Control shape) { + var x = shape.getDouble("x")!; + var y = shape.getDouble("y")!; var radius = shape.getDouble("radius", 0)!; Paint paint = shape.getPaint("paint", theme, Paint())!; - canvas.drawCircle( - Offset(shape.getDouble("x")!, shape.getDouble("y")!), radius, paint); + + var dashPattern = shape.getPaintStrokeDashPattern("paint"); + + if (dashPattern == null) { + canvas.drawCircle(Offset(x, y), radius, paint); + } else { + var path = ui.Path(); + path.addOval(Rect.fromCircle(center: Offset(x, y), radius: radius)); + path = dashPath(path, dashArray: CircularIntervalList(dashPattern)); + canvas.drawPath(path, paint); + } } void drawOval(Canvas canvas, Control shape) { + var x = shape.getDouble("x")!; + var y = shape.getDouble("y")!; var width = shape.getDouble("width", 0)!; var height = shape.getDouble("height", 0)!; Paint paint = shape.getPaint("paint", theme, Paint())!; - canvas.drawOval( - Rect.fromLTWH( - shape.getDouble("x")!, shape.getDouble("y")!, width, height), - paint); + var dashPattern = shape.getPaintStrokeDashPattern("paint"); + + if (dashPattern == null) { + canvas.drawOval(Rect.fromLTWH(x, y, width, height), paint); + } else { + var path = ui.Path(); + path.addOval(Rect.fromLTWH(x, y, width, height)); + path = dashPath(path, dashArray: CircularIntervalList(dashPattern)); + canvas.drawPath(path, paint); + } } void drawArc(Canvas canvas, Control shape) { + var x = shape.getDouble("x")!; + var y = shape.getDouble("y")!; var width = shape.getDouble("width", 0)!; var height = shape.getDouble("height", 0)!; var startAngle = shape.getDouble("start_angle", 0)!; var sweepAngle = shape.getDouble("sweep_angle", 0)!; var useCenter = shape.getBool("use_center", false)!; Paint paint = shape.getPaint("paint", theme, Paint())!; - canvas.drawArc( - Rect.fromLTWH( - shape.getDouble("x")!, shape.getDouble("y")!, width, height), - startAngle, - sweepAngle, - useCenter, - paint); + + var dashPattern = shape.getPaintStrokeDashPattern("paint"); + if (dashPattern == null) { + canvas.drawArc(Rect.fromLTWH(x, y, width, height), startAngle, sweepAngle, + useCenter, paint); + } else { + var path = ui.Path(); + if (useCenter) { + path.moveTo(x + width / 2, y + height / 2); + path.arcTo( + Rect.fromLTWH(x, y, width, height), startAngle, sweepAngle, false); + path.close(); + } else { + path.addArc(Rect.fromLTWH(x, y, width, height), startAngle, sweepAngle); + } + path = dashPath(path, dashArray: CircularIntervalList(dashPattern)); + canvas.drawPath(path, paint); + } } void drawFill(Canvas canvas, Control shape) { @@ -315,20 +352,33 @@ class FletCustomPainter extends CustomPainter { } void drawRect(Canvas canvas, Control shape) { + var x = shape.getDouble("x")!; + var y = shape.getDouble("y")!; var width = shape.getDouble("width", 0)!; var height = shape.getDouble("height", 0)!; var borderRadius = shape.getBorderRadius("border_radius", BorderRadius.zero)!; Paint paint = shape.getPaint("paint", theme, Paint())!; - canvas.drawRRect( - RRect.fromRectAndCorners( - Rect.fromLTWH( - shape.getDouble("x")!, shape.getDouble("y")!, width, height), - topLeft: borderRadius.topLeft, - topRight: borderRadius.topRight, - bottomLeft: borderRadius.bottomLeft, - bottomRight: borderRadius.bottomRight), - paint); + var dashPattern = shape.getPaintStrokeDashPattern("paint"); + + if (dashPattern == null) { + canvas.drawRRect( + RRect.fromRectAndCorners(Rect.fromLTWH(x, y, width, height), + topLeft: borderRadius.topLeft, + topRight: borderRadius.topRight, + bottomLeft: borderRadius.bottomLeft, + bottomRight: borderRadius.bottomRight), + paint); + } else { + var path = ui.Path(); + path.addRRect(RRect.fromRectAndCorners(Rect.fromLTWH(x, y, width, height), + topLeft: borderRadius.topLeft, + topRight: borderRadius.topRight, + bottomLeft: borderRadius.bottomLeft, + bottomRight: borderRadius.bottomRight)); + path = dashPath(path, dashArray: CircularIntervalList(dashPattern)); + canvas.drawPath(path, paint); + } } void drawText(BuildContext context, Canvas canvas, Control shape) { diff --git a/sdk/python/examples/controls/canvas/strokes.py b/sdk/python/examples/controls/canvas/strokes.py new file mode 100644 index 000000000..a3d5c5fd7 --- /dev/null +++ b/sdk/python/examples/controls/canvas/strokes.py @@ -0,0 +1,130 @@ +import math +from dataclasses import dataclass + +import flet as ft +import flet.canvas as fc + + +@dataclass +class AppState: + strokes: bool + + def toggle_strokes(self): + self.strokes = not self.strokes + + +def main(page: ft.Page): + state = AppState(strokes=False) + + page.add( + ft.ControlBuilder( + state, + lambda state: ft.SafeArea( + ft.Column( + [ + ft.Button("Toggle strokes", on_click=state.toggle_strokes), + fc.Canvas( + [ + fc.Line( + 30, + 30, + 200, + 100, + ft.Paint( + color=ft.Colors.BLACK, + stroke_width=3, + stroke_dash_pattern=[4, 4] + if state.strokes + else None, + style=ft.PaintingStyle.STROKE, + ), + ), + fc.Circle( + 150, + 150, + 130, + ft.Paint( + color=ft.Colors.BLUE, + stroke_width=4, + stroke_dash_pattern=[4, 4] + if state.strokes + else None, + style=ft.PaintingStyle.STROKE, + ), + ), + fc.Oval( + 10, + 10, + 240, + 140, + paint=ft.Paint( + color=ft.Colors.GREEN, + stroke_width=4, + stroke_dash_pattern=[10, 10] + if state.strokes + else None, + style=ft.PaintingStyle.STROKE, + ), + ), + fc.Arc( + 20, + 20, + 220, + 220, + 0, + math.pi, + paint=ft.Paint( + color=ft.Colors.RED, + stroke_width=4, + stroke_dash_pattern=[7, 7] + if state.strokes + else None, + style=ft.PaintingStyle.STROKE, + ), + ), + fc.Rect( + 40, + 60, + 60, + 70, + 0, + paint=ft.Paint( + color=ft.Colors.RED, + stroke_width=4, + stroke_dash_pattern=[7, 7] + if state.strokes + else None, + style=ft.PaintingStyle.STROKE, + ), + ), + fc.Arc( + 50, + 50, + 170, + 140, + math.pi * 0.1, + math.pi * 0.4, + paint=ft.Paint( + color=ft.Colors.YELLOW, + stroke_width=4, + stroke_dash_pattern=[7, 7] + if state.strokes + else None, + style=ft.PaintingStyle.STROKE, + ), + use_center=True, + ), + ], + width=300, + height=300, + ), + ] + ), + expand=True, + ), + expand=True, + ) + ) + + +ft.run(main) diff --git a/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py b/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py index ee163ee9c..dc51c2c65 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py +++ b/sdk/python/packages/flet/src/flet/controls/core/canvas/image.py @@ -47,6 +47,5 @@ class Image(Shape): paint: Optional[Paint] = None """ - A paint to composite the image into canvas. The value of this property - is the instance of [`Paint`](https://flet.dev/docs/reference/types/paint) class. + A paint to composite the image into canvas. """ From 3642e023f519896cf3d049598e1d79f0fe34caf0 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Tue, 5 Aug 2025 20:19:52 -0700 Subject: [PATCH 14/37] Renamed example --- .../examples/controls/canvas/{strokes.py => dash_strokes.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sdk/python/examples/controls/canvas/{strokes.py => dash_strokes.py} (100%) diff --git a/sdk/python/examples/controls/canvas/strokes.py b/sdk/python/examples/controls/canvas/dash_strokes.py similarity index 100% rename from sdk/python/examples/controls/canvas/strokes.py rename to sdk/python/examples/controls/canvas/dash_strokes.py From 8663e3bf6334d069bc0fccb0518534809d8b911b Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Tue, 5 Aug 2025 20:40:34 -0700 Subject: [PATCH 15/37] Add KeyboardListener docs and improve canvas docstrings Added documentation files for KeyboardListener and related key event types. Updated mkdocs navigation to include new docs. Enhanced docstrings for canvas capture methods and removed redundant event handler argument descriptions in GestureDetector and KeyboardListener. --- .../flet/docs/controls/keyboardlistener.md | 1 + .../packages/flet/docs/types/keydownevent.md | 1 + .../flet/docs/types/keyrepeatevent.md | 1 + .../packages/flet/docs/types/keyupevent.md | 1 + sdk/python/packages/flet/mkdocs.yml | 4 +++ .../src/flet/controls/core/canvas/canvas.py | 29 ++++++++++++++++++- .../flet/controls/core/gesture_detector.py | 9 ------ .../flet/controls/core/keyboard_listener.py | 11 ------- 8 files changed, 36 insertions(+), 21 deletions(-) create mode 100644 sdk/python/packages/flet/docs/controls/keyboardlistener.md create mode 100644 sdk/python/packages/flet/docs/types/keydownevent.md create mode 100644 sdk/python/packages/flet/docs/types/keyrepeatevent.md create mode 100644 sdk/python/packages/flet/docs/types/keyupevent.md diff --git a/sdk/python/packages/flet/docs/controls/keyboardlistener.md b/sdk/python/packages/flet/docs/controls/keyboardlistener.md new file mode 100644 index 000000000..d2397144f --- /dev/null +++ b/sdk/python/packages/flet/docs/controls/keyboardlistener.md @@ -0,0 +1 @@ +::: flet.KeyboardListener diff --git a/sdk/python/packages/flet/docs/types/keydownevent.md b/sdk/python/packages/flet/docs/types/keydownevent.md new file mode 100644 index 000000000..0194d469b --- /dev/null +++ b/sdk/python/packages/flet/docs/types/keydownevent.md @@ -0,0 +1 @@ +::: flet.KeyDownEvent diff --git a/sdk/python/packages/flet/docs/types/keyrepeatevent.md b/sdk/python/packages/flet/docs/types/keyrepeatevent.md new file mode 100644 index 000000000..69581cc58 --- /dev/null +++ b/sdk/python/packages/flet/docs/types/keyrepeatevent.md @@ -0,0 +1 @@ +::: flet.KeyRepeatEvent diff --git a/sdk/python/packages/flet/docs/types/keyupevent.md b/sdk/python/packages/flet/docs/types/keyupevent.md new file mode 100644 index 000000000..43e8891db --- /dev/null +++ b/sdk/python/packages/flet/docs/types/keyupevent.md @@ -0,0 +1 @@ +::: flet.KeyUpEvent diff --git a/sdk/python/packages/flet/mkdocs.yml b/sdk/python/packages/flet/mkdocs.yml index 9927fc226..8441b46cb 100644 --- a/sdk/python/packages/flet/mkdocs.yml +++ b/sdk/python/packages/flet/mkdocs.yml @@ -372,6 +372,7 @@ nav: - FletApp: controls/fletapp.md - GestureDetector: controls/gesturedetector.md - InteractiveViewer: controls/interactiveviewer.md + - KeyboardListener: controls/keyboardlistener.md - MergeSemantics: controls/mergesemantics.md - SelectionArea: controls/selectionarea.md - Semantics: controls/semantics.md @@ -604,6 +605,9 @@ nav: - FilePickerUploadEvent: types/filepickeruploadevent.md - HoverEvent: types/hoverevent.md - KeyboardEvent: types/keyboardevent.md + - KeyDownEvent: types/keydownevent.md + - KeyRepeatEvent: types/keyrepeatevent.md + - KeyUpEvent: types/keyupevent.md - LoginEvent: types/loginevent.md - LongPressEndEvent: types/longpressendevent.md - LongPressStartEvent: types/longpressstartevent.md diff --git a/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py b/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py index 03de9551b..2206bf0d2 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py +++ b/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py @@ -63,16 +63,43 @@ def before_update(self): self.height = float("inf") async def capture_async(self): + """ + Captures the current visual state of the canvas asynchronously. + + The captured image is stored internally and will be rendered as a background + beneath all subsequently drawn shapes. + """ await self._invoke_method_async("capture") def capture(self): + """ + Initiates an asynchronous capture of the current canvas state. + + This is a non-blocking version of `capture_async()` and should be used in synchronous contexts. + """ asyncio.create_task(self.capture_async()) - async def get_capture_async(self): + async def get_capture_async(self) -> bytes: + """ + Retrieves the most recent canvas capture as PNG bytes. + + Returns: + bytes: The captured image in PNG format, or an empty result if no capture has been made. + """ return await self._invoke_method_async("get_capture") async def clear_capture_async(self): + """ + Clears the previously captured canvas image asynchronously. + + After clearing, no background will be rendered from a prior capture. + """ await self._invoke_method_async("capture") def clear_capture(self): + """ + Initiates an asynchronous operation to clear the captured canvas image. + + This is a non-blocking version of `clear_capture_async()` and should be used in synchronous contexts. + """ asyncio.create_task(self.clear_capture_async()) diff --git a/sdk/python/packages/flet/src/flet/controls/core/gesture_detector.py b/sdk/python/packages/flet/src/flet/controls/core/gesture_detector.py index fc159226b..0142f5115 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/gesture_detector.py +++ b/sdk/python/packages/flet/src/flet/controls/core/gesture_detector.py @@ -241,27 +241,18 @@ class GestureDetector(ConstrainedControl, AdaptiveControl): """ Pointer has contacted the screen while secondary button pressed and has begun to move. - - Event handler argument is of type - [`PointerEvent`](https://flet.dev/docs/reference/types/PointerEvent). """ on_right_pan_update: Optional[EventHandler[PointerEvent["GestureDetector"]]] = None """ A pointer that is in contact with the screen, secondary button pressed and moving has moved again. - - Event handler argument is of type - [`PointerEvent`](https://flet.dev/docs/reference/types/PointerEvent). """ on_right_pan_end: Optional[EventHandler[PointerEvent["GestureDetector"]]] = None """ A pointer with secondary button pressed is no longer in contact and was moving at a specific velocity. - - Event handler argument is of type - [`PointerEvent`](https://flet.dev/docs/reference/types/PointerEvent). """ on_scale_start: Optional[EventHandler[ScaleStartEvent["GestureDetector"]]] = None diff --git a/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py b/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py index 941744b99..ada50059c 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py +++ b/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py @@ -31,8 +31,6 @@ class KeyboardListener(Control): """ A control that calls a callback whenever the user presses or releases a key on a keyboard. - - Online docs: https://flet.dev/docs/controls/keyboardlistener """ content: Control @@ -54,25 +52,16 @@ class KeyboardListener(Control): on_key_down: Optional[EventHandler[KeyDownEvent]] = None """ Fires when a keyboard key is pressed. - - Event handler argument is of type - [KeyboardEvent](https://flet.dev/docs/reference/types/keydownvent). """ on_key_up: Optional[EventHandler[KeyUpEvent]] = None """ Fires when a keyboard key is released. - - Event handler argument is of type - [KeyboardEvent](https://flet.dev/docs/reference/types/keyupevent). """ on_key_repeat: Optional[EventHandler[KeyRepeatEvent]] = None """ Fires when a keyboard key is being hold, causing repeated events. - - Event handler argument is of type - [KeyboardEvent](https://flet.dev/docs/reference/types/keyrepeatevent). """ async def focus_async(self): From 8220e366cf55f6e5ba2ae5094caaad26477cc427 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Tue, 5 Aug 2025 21:15:04 -0700 Subject: [PATCH 16/37] Add keyboard listener example and improve docs Added a new example 'detect_keys.py' demonstrating keyboard event handling. Updated documentation to include the example and enhanced event class docstrings for clarity in 'keyboard_listener.py'. --- .../controls/keyboard_listener/detect_keys.py | 26 +++++++++++++ .../flet/docs/controls/keyboardlistener.md | 8 ++++ .../flet/controls/core/keyboard_listener.py | 37 +++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 sdk/python/examples/controls/keyboard_listener/detect_keys.py diff --git a/sdk/python/examples/controls/keyboard_listener/detect_keys.py b/sdk/python/examples/controls/keyboard_listener/detect_keys.py new file mode 100644 index 000000000..1a2655b15 --- /dev/null +++ b/sdk/python/examples/controls/keyboard_listener/detect_keys.py @@ -0,0 +1,26 @@ +import flet as ft + + +async def main(page: ft.Page): + pressed_keys = set() + + def key_down(e: ft.KeyDownEvent): + pressed_keys.add(e.key) + keys.controls = [ft.Text(k, size=20) for k in pressed_keys] + + def key_up(e: ft.KeyUpEvent): + pressed_keys.remove(e.key) + keys.controls = [ft.Text(k, size=20) for k in pressed_keys] + + page.add( + ft.Text("Press any keys..."), + ft.KeyboardListener( + content=(keys := ft.Row()), + autofocus=True, + on_key_down=key_down, + on_key_up=key_up, + ), + ) + + +ft.run(main) diff --git a/sdk/python/packages/flet/docs/controls/keyboardlistener.md b/sdk/python/packages/flet/docs/controls/keyboardlistener.md index d2397144f..2b1c7ebbb 100644 --- a/sdk/python/packages/flet/docs/controls/keyboardlistener.md +++ b/sdk/python/packages/flet/docs/controls/keyboardlistener.md @@ -1 +1,9 @@ +## Examples + +### Press any keys + +```python +--8<-- "../../examples/controls/keyboard_listener/detect_keys.py" +``` + ::: flet.KeyboardListener diff --git a/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py b/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py index ada50059c..30908786f 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py +++ b/sdk/python/packages/flet/src/flet/controls/core/keyboard_listener.py @@ -13,17 +13,54 @@ @dataclass class KeyDownEvent(Event["KeyboardListener"]): + """ + Event triggered when a key is pressed down. + + Typically used to detect the initial press of a key before it is released or repeated. + """ + key: str + """ + The key that was pressed down. + + Represents the physical key (e.g., A, Enter, + Shift) that triggered the key down event. + """ @dataclass class KeyUpEvent(Event["KeyboardListener"]): + """ + Event triggered when a key is released. + + Useful for tracking when a key is no longer being pressed after + a key down or repeat event. + """ + key: str + """ + The key that was released. + + Indicates which key was previously pressed and has now been lifted. + """ @dataclass class KeyRepeatEvent(Event["KeyboardListener"]): + """ + Event triggered when a key is held down and repeating. + + This event fires continuously while the key remains pressed, + depending on the system's key repeat rate. + """ + key: str + """ + The key that is being held down and repeating. + + Represents the physical key that is generating repeat events (e.g., + ArrowDown, Backspace). + """ @control("KeyboardListener") From 07dc1fd176e512da1c0cd5663a299d3f60845f67 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 6 Aug 2025 10:39:20 -0700 Subject: [PATCH 17/37] Enhance PageView with detailed docstrings and base class Added comprehensive docstrings to PageView, PageMediaData, and PageResizeEvent for improved clarity and developer guidance. Changed PageView to inherit from ScrollableControl and AdaptiveControl, and updated the import accordingly. Expanded property documentation and clarified usage of key attributes. --- .../flet/src/flet/controls/page_view.py | 117 ++++++++++++++++-- 1 file changed, 105 insertions(+), 12 deletions(-) diff --git a/sdk/python/packages/flet/src/flet/controls/page_view.py b/sdk/python/packages/flet/src/flet/controls/page_view.py index a52030542..74017ac1a 100644 --- a/sdk/python/packages/flet/src/flet/controls/page_view.py +++ b/sdk/python/packages/flet/src/flet/controls/page_view.py @@ -27,7 +27,7 @@ from flet.controls.material.navigation_bar import NavigationBar from flet.controls.material.navigation_drawer import NavigationDrawer from flet.controls.padding import Padding, PaddingValue -from flet.controls.scrollable_control import OnScrollEvent +from flet.controls.scrollable_control import ScrollableControl from flet.controls.theme import Theme from flet.controls.transform import OffsetValue from flet.controls.types import ( @@ -47,46 +47,114 @@ @dataclass class PageMediaData: + """ + Represents the environmental metrics of a page or window. + + This data is updated whenever the platform window or layout changes, + such as when rotating a device, resizing a browser window, or adjusting + system UI elements like the keyboard or safe areas. + """ + padding: Padding + """ + The space surrounding the entire display, accounting for system UI + like notches and status bars. + """ + view_padding: Padding + """ + Similar to `padding`, but includes padding that is always reserved + (even when the system UI is hidden). + """ + view_insets: Padding + """ + Areas obscured by system UI overlays, such as the on-screen keyboard + or system gesture areas. + """ + device_pixel_ratio: float + """ + The number of device pixels for each logical pixel. + """ @dataclass class PageResizeEvent(Event["PageView"]): + """ + Event fired when the size of the containing window or browser is changed. + + Typically used to adapt layout dynamically in response to resizes, + such as switching between compact and expanded views in a responsive design. + """ + width: float + """ + The new width of the page in logical pixels. + """ + height: float + """ + The new height of the page in logical pixels. + """ @control("PageView", isolated=True, kw_only=True) -class PageView(AdaptiveControl): +class PageView(ScrollableControl, AdaptiveControl): """ - TBD + A visual container representing a top-level view in a Flet application. + + `PageView` serves as the base class for [Page][flet.Page] and + [MultiView][flet.MultiView], and provides a unified surface for rendering + application content, app bars, + navigation elements, dialogs, overlays, and more. It manages one + or more [View][flet.View] instances and exposes high-level layout, + scrolling, and theming properties. + + Unlike lower-level layout controls (e.g., [Column][flet.Column], + [Container][flet.Container]), [PageView][flet.PageView] represents + an entire logical view or screen of the app. It provides direct access + to view-level controls such as [AppBar][flet.AppBar], + [NavigationBar][flet.NavigationBar], + [FloatingActionButton][flet.FloatingActionButton], + and supports system-level events like window resizing and media changes. + + This class is not intended to be used directly in most apps; instead, + use [Page][flet.Page] or [MultiView][flet.MultiView], which extend this base + functionality. """ views: list[View] = field(default_factory=lambda: [View()]) - _overlay: "Overlay" = field(default_factory=lambda: Overlay()) - _dialogs: "Dialogs" = field(default_factory=lambda: Dialogs()) + """ + A list of views managed by the page. + + Each [View][flet.View] represents a distinct navigation state or screen + in the application. + + The first view in the list is considered the active one by default. + """ theme_mode: Optional[ThemeMode] = ThemeMode.SYSTEM """ The page's theme mode. - - Defaults to `ThemeMode.SYSTEM`. """ + theme: Optional[Theme] = None """ Customizes the theme of the application when in light theme mode. Currently, a theme can only be automatically generated from a "seed" color. For example, to generate light theme from a green color. """ + dark_theme: Optional[Theme] = None """ Customizes the theme of the application when in dark theme mode. """ locale_configuration: Optional[LocaleConfiguration] = None + """ + Configures supported locales and the current locale. + """ show_semantics_debugger: Optional[bool] = None """ @@ -95,10 +163,28 @@ class PageView(AdaptiveControl): """ width: Optional[Number] = None + """ + Page width in logical pixels (read-only). + + To get or set the full window width including window chrome (e.g., + title bar and borders) when running a Flet app on desktop, + use the `page.window.width` property instead. + """ height: Optional[Number] = None + """ + Page height in logical pixels (read-only). + + To get or set the full window height including window chrome (e.g., + title bar and borders) when running a Flet app on desktop, + use the `page.window.height` property instead. + """ title: Optional[str] = None + """ + Page or window title. + """ + media: PageMediaData = field( default_factory=lambda: PageMediaData( padding=Padding.zero(), @@ -107,7 +193,9 @@ class PageView(AdaptiveControl): device_pixel_ratio=0, ) ) - scroll_event_interval: Optional[Number] = None + """ + Represents the environmental metrics of a page or window. + """ on_resize: Optional[EventHandler["PageResizeEvent"]] = None """ @@ -129,10 +217,8 @@ def page_resize(e): Event type: [`PageMediaData`][flet.PageMediaData] """ - on_scroll: Optional[EventHandler["OnScrollEvent"]] = None - """ - Called when page's scroll position is changed by a user. - """ + _overlay: "Overlay" = field(default_factory=lambda: Overlay()) + _dialogs: "Dialogs" = field(default_factory=lambda: Dialogs()) def __default_view(self) -> View: assert len(self.views) > 0, "views list is empty." @@ -285,6 +371,13 @@ def controls(self, value: list[BaseControl]): # appbar @property def appbar(self) -> Union[AppBar, CupertinoAppBar, None]: + """ + Gets or sets the top application bar ([AppBar][flet.AppBar] or + [CupertinoAppBar][flet.CupertinoAppBar]) for the view. + + The app bar typically displays the page title and optional actions + such as navigation icons, menus, or other interactive elements. + """ return self.__default_view().appbar @appbar.setter From 2f0ed30561ad3e36069a8352989dd3d75beef009 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 6 Aug 2025 10:53:21 -0700 Subject: [PATCH 18/37] Fix tests: Remove ScrollableControl from PageView inheritance PageView no longer inherits from ScrollableControl, and related imports were removed. Page now calls PageView's __post_init__ instead of AdaptiveControl's. This refactoring clarifies class responsibilities and streamlines control hierarchy. --- sdk/python/packages/flet/src/flet/controls/page.py | 5 +++-- sdk/python/packages/flet/src/flet/controls/page_view.py | 3 +-- .../packages/flet/src/flet/controls/scrollable_control.py | 7 +++++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/sdk/python/packages/flet/src/flet/controls/page.py b/sdk/python/packages/flet/src/flet/controls/page.py index 36f4b3fa8..45675af21 100644 --- a/sdk/python/packages/flet/src/flet/controls/page.py +++ b/sdk/python/packages/flet/src/flet/controls/page.py @@ -16,7 +16,6 @@ from flet.auth.authorization import Authorization from flet.auth.oauth_provider import OAuthProvider -from flet.controls.adaptive_control import AdaptiveControl from flet.controls.base_control import BaseControl, control from flet.controls.context import _context_page from flet.controls.control import Control @@ -369,7 +368,7 @@ def __post_init__( ref, sess: "Session", ) -> None: - AdaptiveControl.__post_init__(self, ref) + PageView.__post_init__(self, ref) self._i = 1 self.__session = weakref.ref(sess) @@ -395,11 +394,13 @@ def get_control(self, id: int) -> Optional[BaseControl]: ```python import flet as ft + def main(page: ft.Page): x = ft.IconButton(ft.Icons.ADD) page.add(x) print(type(page.get_control(x.uid))) + ft.run(main) ``` """ diff --git a/sdk/python/packages/flet/src/flet/controls/page_view.py b/sdk/python/packages/flet/src/flet/controls/page_view.py index 74017ac1a..50f30a951 100644 --- a/sdk/python/packages/flet/src/flet/controls/page_view.py +++ b/sdk/python/packages/flet/src/flet/controls/page_view.py @@ -27,7 +27,6 @@ from flet.controls.material.navigation_bar import NavigationBar from flet.controls.material.navigation_drawer import NavigationDrawer from flet.controls.padding import Padding, PaddingValue -from flet.controls.scrollable_control import ScrollableControl from flet.controls.theme import Theme from flet.controls.transform import OffsetValue from flet.controls.types import ( @@ -100,7 +99,7 @@ class PageResizeEvent(Event["PageView"]): @control("PageView", isolated=True, kw_only=True) -class PageView(ScrollableControl, AdaptiveControl): +class PageView(AdaptiveControl): """ A visual container representing a top-level view in a Flet application. diff --git a/sdk/python/packages/flet/src/flet/controls/scrollable_control.py b/sdk/python/packages/flet/src/flet/controls/scrollable_control.py index 888bb5f4f..a6ea46bf9 100644 --- a/sdk/python/packages/flet/src/flet/controls/scrollable_control.py +++ b/sdk/python/packages/flet/src/flet/controls/scrollable_control.py @@ -52,15 +52,18 @@ class ScrollableControl(Control): Defaults to `ScrollMode.None`. """ + auto_scroll: bool = False """ `True` if scrollbar should automatically move its position to the end when children updated. Must be `False` for `scroll_to()` method to work. """ + scroll_interval: Number = 10 """ Throttling in milliseconds for `on_scroll` event. """ + on_scroll: Optional[EventHandler[OnScrollEvent]] = None """ Called when scroll position is changed by a user. @@ -108,6 +111,7 @@ def scroll_to( ```python import flet as ft + def main(page: ft.Page): cl = ft.Column( spacing=10, @@ -126,6 +130,7 @@ def scroll_to_key(e): ft.ElevatedButton("Scroll to key '20'", on_click=scroll_to_key), ) + ft.run(main) ``` @@ -185,6 +190,7 @@ async def scroll_to_async( ```python import flet as ft + def main(page: ft.Page): cl = ft.Column( spacing=10, @@ -203,6 +209,7 @@ def scroll_to_key(e): ft.ElevatedButton("Scroll to key '20'", on_click=scroll_to_key), ) + ft.run(main) ``` From 922012e7774d3e5de4ad5904e2a9d86fd9e15dfb Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 6 Aug 2025 17:20:57 -0700 Subject: [PATCH 19/37] Refactor integration tests and add canvas test coverage Refactored Python integration tests to use a shared flet_app fixture via conftest.py, reducing code duplication. Added comprehensive canvas control tests with golden image comparisons and supporting assets. Updated canvas text rendering to use 'value' instead of 'text'. Improved tester service and Flutter tester API for more flexible duration handling. Enhanced FastAPI web server integration and updated documentation for new environment variables. --- client/integration_test/app_test.dart | 14 +- client/integration_test/flutter_tester.dart | 6 +- packages/flet/lib/src/controls/canvas.dart | 2 +- packages/flet/lib/src/services/tester.dart | 10 +- packages/flet/lib/src/testing/tester.dart | 2 +- sdk/python/examples/controls/canvas/brush.py | 12 +- .../controls/canvas/brush_on_image.py | 14 +- .../src/flet_web/fastapi/flet_fastapi.py | 12 +- .../flet_web/fastapi/serve_fastapi_web_app.py | 17 +- .../packages/flet/integration_tests/README.md | 10 +- .../integration_tests/assets/141-50x50.jpg | Bin 0 -> 1220 bytes .../integration_tests/assets/52-100x100.png | Bin 0 -> 15105 bytes .../flet/integration_tests/conftest.py | 18 + .../controls/golden/macos/canvas/draw_arc.png | Bin 0 -> 1115 bytes .../golden/macos/canvas/draw_asset_image.png | Bin 0 -> 17346 bytes .../golden/macos/canvas/draw_circle.png | Bin 0 -> 3478 bytes .../golden/macos/canvas/draw_dashed_arc.png | Bin 0 -> 1213 bytes .../canvas/draw_dashed_arc_with_center.png | Bin 0 -> 2043 bytes .../macos/canvas/draw_dashed_circle.png | Bin 0 -> 1474 bytes .../golden/macos/canvas/draw_dashed_line.png | Bin 0 -> 1399 bytes .../golden/macos/canvas/draw_dashed_oval.png | Bin 0 -> 1084 bytes .../canvas/draw_dashed_path_with_fill.png | Bin 0 -> 32965 bytes .../golden/macos/canvas/draw_dashed_rect.png | Bin 0 -> 1526 bytes .../draw_filled_circle_default_paint.png | Bin 0 -> 2378 bytes .../golden/macos/canvas/draw_filled_rect.png | Bin 0 -> 1151 bytes .../macos/canvas/draw_flet_logo_with_path.png | Bin 0 -> 11018 bytes .../golden/macos/canvas/draw_gradients.png | Bin 0 -> 55611 bytes .../golden/macos/canvas/draw_line.png | Bin 0 -> 607 bytes .../golden/macos/canvas/draw_oval.png | Bin 0 -> 2273 bytes .../golden/macos/canvas/draw_text.png | Bin 0 -> 160401 bytes .../golden/macos/canvas/draw_url_image.png | Bin 0 -> 25913 bytes .../controls/test_buttons.py | 14 - .../integration_tests/controls/test_canvas.py | 575 ++++++++++++++++++ .../integration_tests/controls/test_text.py | 14 - .../controls/test_textfield.py | 14 - .../integration_tests/test_counter_app.py | 63 +- .../flet/integration_tests/test_finders.py | 102 ++-- .../integration_tests/test_hello_world_app.py | 63 +- sdk/python/packages/flet/src/flet/app.py | 5 +- .../flet/src/flet/controls/base_control.py | 4 +- .../flet/src/flet/controls/core/screenshot.py | 6 +- .../flet/src/flet/testing/flet_test_app.py | 31 +- .../packages/flet/src/flet/testing/tester.py | 13 +- 43 files changed, 801 insertions(+), 220 deletions(-) create mode 100644 sdk/python/packages/flet/integration_tests/assets/141-50x50.jpg create mode 100644 sdk/python/packages/flet/integration_tests/assets/52-100x100.png create mode 100644 sdk/python/packages/flet/integration_tests/conftest.py create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_arc.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_asset_image.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_circle.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_arc.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_arc_with_center.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_circle.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_line.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_oval.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_path_with_fill.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_rect.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_filled_circle_default_paint.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_filled_rect.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_flet_logo_with_path.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_gradients.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_line.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_oval.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_text.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_url_image.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/test_canvas.py diff --git a/client/integration_test/app_test.dart b/client/integration_test/app_test.dart index aa7cd4f36..9659913c5 100644 --- a/client/integration_test/app_test.dart +++ b/client/integration_test/app_test.dart @@ -22,11 +22,23 @@ void main() { if (fletTestAppUrl != "") { args.add(fletTestAppUrl); } + + const fletTestPidFile = String.fromEnvironment("FLET_TEST_PID_FILE_PATH"); + if (fletTestPidFile != "") { + args.add(fletTestPidFile); + } + + const fletTestAssetsDir = String.fromEnvironment("FLET_TEST_ASSETS_DIR"); + if (fletTestAssetsDir != "") { + args.add(fletTestAssetsDir); + } + app.main(args); await Future.delayed(const Duration(milliseconds: 500)); await app.tester?.pump(duration: const Duration(seconds: 1)); - await app.tester?.pumpAndSettle(const Duration(milliseconds: 100)); + await app.tester + ?.pumpAndSettle(duration: const Duration(milliseconds: 100)); await app.tester?.waitForTeardown(); }); }); diff --git a/client/integration_test/flutter_tester.dart b/client/integration_test/flutter_tester.dart index 05792b96a..e5ee7ac36 100644 --- a/client/integration_test/flutter_tester.dart +++ b/client/integration_test/flutter_tester.dart @@ -18,11 +18,11 @@ class FlutterWidgetTester implements Tester { FlutterWidgetTester(this._tester, this._binding); @override - Future pumpAndSettle( - [Duration duration = const Duration(milliseconds: 100)]) async { + Future pumpAndSettle({Duration? duration}) async { await lock.acquire(); try { - await _tester.pumpAndSettle(duration); + await _tester + .pumpAndSettle(duration ?? const Duration(milliseconds: 100)); } finally { lock.release(); } diff --git a/packages/flet/lib/src/controls/canvas.dart b/packages/flet/lib/src/controls/canvas.dart index 717735f96..358aab719 100644 --- a/packages/flet/lib/src/controls/canvas.dart +++ b/packages/flet/lib/src/controls/canvas.dart @@ -390,7 +390,7 @@ class FletCustomPainter extends CustomPainter { style = style.copyWith(color: theme.textTheme.bodyMedium!.color); } TextSpan span = TextSpan( - text: shape.getString("text", "")!, + text: shape.getString("value", "")!, style: style, children: parseTextSpans(shape.children("spans"), theme)); diff --git a/packages/flet/lib/src/services/tester.dart b/packages/flet/lib/src/services/tester.dart index 1bc89b762..1fcc64cb1 100644 --- a/packages/flet/lib/src/services/tester.dart +++ b/packages/flet/lib/src/services/tester.dart @@ -1,8 +1,6 @@ +import 'package:flet/flet.dart'; import 'package:flutter/material.dart'; -import '../flet_service.dart'; -import '../testing/test_finder.dart'; -import '../utils/icons.dart'; import '../utils/keys.dart'; class TesterService extends FletService { @@ -27,10 +25,12 @@ class TesterService extends FletService { debugPrint("Tester.$name($args)"); switch (name) { case "pump": - await control.backend.tester!.pump(duration: args["duration"]); + await control.backend.tester! + .pump(duration: parseDuration(args["duration"])); case "pump_and_settle": - await control.backend.tester!.pumpAndSettle(); + await control.backend.tester! + .pumpAndSettle(duration: parseDuration(args["duration"])); case "find_by_text": var finder = control.backend.tester!.findByText(args["text"]); diff --git a/packages/flet/lib/src/testing/tester.dart b/packages/flet/lib/src/testing/tester.dart index d870f2c6b..91b7bf082 100644 --- a/packages/flet/lib/src/testing/tester.dart +++ b/packages/flet/lib/src/testing/tester.dart @@ -5,7 +5,7 @@ import 'package:flutter/widgets.dart'; import 'test_finder.dart'; abstract class Tester { - Future pumpAndSettle([Duration duration]); + Future pumpAndSettle({Duration? duration}); Future pump({Duration? duration}); TestFinder findByText(String text); TestFinder findByTextContaining(String pattern); diff --git a/sdk/python/examples/controls/canvas/brush.py b/sdk/python/examples/controls/canvas/brush.py index 0b2261364..781e9ffdd 100644 --- a/sdk/python/examples/controls/canvas/brush.py +++ b/sdk/python/examples/controls/canvas/brush.py @@ -14,22 +14,22 @@ def main(page: ft.Page): page.title = "Canvas Example" def handle_pan_start(e: ft.DragStartEvent): - state.x = e.local_x - state.y = e.local_y + state.x = e.local_position.x + state.y = e.local_position.y def handle_pan_update(e: ft.DragUpdateEvent): canvas.shapes.append( cv.Line( x1=state.x, y1=state.y, - x2=e.local_x, - y2=e.local_y, + x2=e.local_position.x, + y2=e.local_position.y, paint=ft.Paint(stroke_width=3), ) ) canvas.update() - state.x = e.local_x - state.y = e.local_y + state.x = e.local_position.x + state.y = e.local_position.y canvas = cv.Canvas( expand=False, diff --git a/sdk/python/examples/controls/canvas/brush_on_image.py b/sdk/python/examples/controls/canvas/brush_on_image.py index 22d53c43f..2b212260c 100644 --- a/sdk/python/examples/controls/canvas/brush_on_image.py +++ b/sdk/python/examples/controls/canvas/brush_on_image.py @@ -14,18 +14,22 @@ def main(page: ft.Page): page.title = "Flet Brush" def handle_pan_start(e: ft.DragStartEvent): - state.x = e.local_x - state.y = e.local_y + state.x = e.local_position.x + state.y = e.local_position.y def handle_pan_update(e: ft.DragUpdateEvent): canvas.shapes.append( cv.Line( - state.x, state.y, e.local_x, e.local_y, paint=ft.Paint(stroke_width=3) + state.x, + state.y, + e.local_position.x, + e.local_position.y, + paint=ft.Paint(stroke_width=3), ) ) canvas.update() - state.x = e.local_x - state.y = e.local_y + state.x = e.local_position.x + state.y = e.local_position.y page.add( ft.Container( diff --git a/sdk/python/packages/flet-web/src/flet_web/fastapi/flet_fastapi.py b/sdk/python/packages/flet-web/src/flet_web/fastapi/flet_fastapi.py index 497a13327..f833e72a2 100644 --- a/sdk/python/packages/flet-web/src/flet_web/fastapi/flet_fastapi.py +++ b/sdk/python/packages/flet-web/src/flet_web/fastapi/flet_fastapi.py @@ -1,20 +1,17 @@ import asyncio -from contextlib import asynccontextmanager +from collections.abc import Awaitable, Coroutine, Sequence +from contextlib import asynccontextmanager, suppress from typing import ( Any, - Awaitable, Callable, - Coroutine, Dict, List, Optional, - Sequence, Type, Union, ) import fastapi -import flet_web.fastapi from fastapi.datastructures import Default from fastapi.params import Depends from fastapi.utils import generate_unique_id @@ -23,6 +20,8 @@ from starlette.responses import JSONResponse, Response from starlette.routing import BaseRoute +import flet_web.fastapi + class FastAPI(fastapi.FastAPI): def __init__( @@ -80,7 +79,8 @@ async def lifespan(app: fastapi.FastAPI): else: h() - yield + with suppress(asyncio.CancelledError): + yield if on_shutdown: for h in on_shutdown: if asyncio.iscoroutinefunction(h): diff --git a/sdk/python/packages/flet-web/src/flet_web/fastapi/serve_fastapi_web_app.py b/sdk/python/packages/flet-web/src/flet_web/fastapi/serve_fastapi_web_app.py index 8220054af..1057373f4 100644 --- a/sdk/python/packages/flet-web/src/flet_web/fastapi/serve_fastapi_web_app.py +++ b/sdk/python/packages/flet-web/src/flet_web/fastapi/serve_fastapi_web_app.py @@ -12,9 +12,12 @@ class WebServerHandle: - def __init__(self, page_url: str, server: uvicorn.Server) -> None: + def __init__( + self, page_url: str, server: uvicorn.Server, serve_task: asyncio.Task + ) -> None: self.page_url = page_url self.server = server + self.serve_task = serve_task async def close(self): logger.info("Closing Flet web server...") @@ -61,10 +64,9 @@ async def serve_fastapi_web_app( web_renderer: WebRenderer = WebRenderer.AUTO, route_url_strategy: RouteUrlStrategy = RouteUrlStrategy.PATH, no_cdn: bool = False, - blocking: bool = False, on_startup: Optional[Any] = None, log_level: Optional[Union[str, int]] = None, -): +) -> WebServerHandle: web_path = f"/{page_name.strip('/')}" page_url = f"http://{url_host}:{port}{web_path if web_path != '/' else ''}" @@ -91,9 +93,6 @@ def startup(): ) server = uvicorn.Server(config) - if blocking: - await server.serve() - else: - asyncio.create_task(server.serve()) - - return WebServerHandle(page_url=page_url, server=server) + return WebServerHandle( + page_url=page_url, server=server, serve_task=asyncio.create_task(server.serve()) + ) diff --git a/sdk/python/packages/flet/integration_tests/README.md b/sdk/python/packages/flet/integration_tests/README.md index c12bb6e3b..374fc3abd 100644 --- a/sdk/python/packages/flet/integration_tests/README.md +++ b/sdk/python/packages/flet/integration_tests/README.md @@ -46,4 +46,12 @@ Environment variables: `FLET_TEST_SCREENSHOTS_PIXEL_RATIO` - device pixel ration to use to take screenshots. Default is 2.0. -`FLET_TEST_SIMILARITY_THRESHOLD` - a minimum value for comparison result of golden and actual screenshot for a test to pass. Default is 99.0. \ No newline at end of file +`FLET_TEST_SIMILARITY_THRESHOLD` - a minimum value for comparison result of golden and actual screenshot for a test to pass. Default is 99.0. + +`FLET_TEST_USE_HTTP` - run Flet app in a web server. By default, the app starts socket +server, but if integration tests use assets they could be inaccessible via TCP from iOS or +Android device or simulator. + +`FLET_TEST_PID_FILE_PATH` - path to a Flutter client PID file. + +`FLET_TEST_ASSETS_DIR` - path to assets directory. \ No newline at end of file diff --git a/sdk/python/packages/flet/integration_tests/assets/141-50x50.jpg b/sdk/python/packages/flet/integration_tests/assets/141-50x50.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2fcb73ebe93fe27ed796248c2d0c45d5bee9e087 GIT binary patch literal 1220 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 Bz9j$v literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/conftest.py b/sdk/python/packages/flet/integration_tests/conftest.py new file mode 100644 index 000000000..c731aa62e --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/conftest.py @@ -0,0 +1,18 @@ +from pathlib import Path + +import flet.testing as ftt +import pytest_asyncio + + +@pytest_asyncio.fixture(scope="module") +async def flet_app(request): + params = getattr(request, "param", {}) + flet_app = ftt.FletTestApp( + flutter_app_dir=(Path(__file__).parent / "../../../../../client").resolve(), + test_path=request.fspath, + flet_app_main=params.get("flet_app_main"), + assets_dir=Path(__file__).resolve().parent / "assets", + ) + await flet_app.start() + yield flet_app + await flet_app.teardown() diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_arc.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_arc.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6f674cb7179d8f9a19db2506c0f6b6252bdfd6 GIT binary patch literal 1115 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKNIvi|3k+<8Q9s*K~#X;^)4C~IxyaaMsik&<| zIDnvrBc%h#W%YD%45^s&_KtVaEe8>Yi_52MKak}UI%le2SlWtB;fIy1nC%o@I5;`C zF0o5bVQ!Wyth_r(324wr165w_U)|rCPPpEGhnwM}W6EJMu?wMxZ@S-_vu*2~evtz#Ok2us z?Yd?2D`xAjZ+C+jggGvF-L7y6xovpOxvox?VeOK`)m48q(-l+=8yWaZcZ8IGf3(y< zk%`IV)uz(Wwfk6>C~Vu%u-od`;cKCZEG#Ro+R3fkr8QMo=Yf6fqlc?j7yZ1-@Mm$h zO-}4oZ-)l%j|;dN8I}6JSJs%>FMBepLO~&5&*j5{=5HSh?#}x9_w~`!No*`ET-W}j z+>Ls4uyyr@1p&)H^L>1fsV1OtMmRc5QSORiql4qRWqo`fS8RLaC@ah%^5Epk!&k#h zgajgXk6zvDsVFo!=OgXY*5J^4X5tQ2DW6FV8zRgF zcZ7ZZr7BQgTe~DWM4fwJ$P- literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_asset_image.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_asset_image.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7afc40212acc2a2e851f4482b7c29a3e44ca34 GIT binary patch literal 17346 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 aF;U!{h) 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 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_circle.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..05e8034b6509d8a42810d1d7f7b6452517e49150 GIT binary patch literal 3478 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 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_arc_with_center.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_arc_with_center.png new file mode 100644 index 0000000000000000000000000000000000000000..3b983c0eb6b6591ff39c40d6322ae296af162992 GIT binary patch literal 2043 zcmds2`8OMg6Hihl?zp=jpk+r3cQj`>_yCrP})h6nUV(S({HL13-MTJ(2XjRin zXi8bV=*FEovW~EhW|J+7byX;dWAlCAf8zVT^WMC9Ge69H-ppraZk_f)DJvXQ0002W z?x$S*003ZtR1siVX=L%YX|~h=6Z}v}KwZD?oYav?K)R#BQpo^cz6k)xRlB=5qf^Tk zr>2r0pVE}&!U?=Vx`(I-SK&2B_b?lOph%6>q^di|FEcQ6?MKG@Q04w7pwdMDZ}P%e zB@@W4Mk9F8r{4;2YDh5lyQW{(8}-C*F5Q*^SCv>(!ZwQ>g%jW4x}YDQLIj=~>8{+?J3PG^*v;k;OK`%`|ZbYcFscu_w6}Zd1bb3nuu>9?m3Ps&%o!5w~iB0hl`#;Q~Xg1jf8A z)alFFE%d_&_$?S>h`(i=k_BJ7Cmm?>t8Uk4@hDh*^lj zw<3*5HA=;joYIL`D}Gc~>V2NS@A9#G*JG0!LRq0X^#0@}``(U4-a@OyKh-|>t(zH& z)FqOK=-0fv6|AV{TQl%uT}u=8yYsdEXK!JH>TGN?c7_=QIgieZ_ZT( zmiB%bxq$*hd+(BIW#%Bk<8u=%f}LLDx!lYxrY%l}U0Uz{NvM>Mq4>+D!ADHictt<# zO%gny{x}(=(ZU!ev*3?t1m?o$h8ZdVN-ArkA>&Ve4^vf0>?mxaj+Z}tqW`Airy83-Cjw4D&%-bCCfN_@ViPu!tr6)D(y1DWY z?olAfFyR+yrK8rqBZ~OPoPF1b$(&jha6Mtkq`D86c8t3q{B(BX84loPppp2dDAtxS zlOYJOB@g92oDHW3SCj%u?^75(p<~wkY*NqBo(TrW3@Gx=_HxTG$F2ytR#2@ zXo!vu!PlbDKV`<(asniOLBt~OY_DKOL!YVGz?S3C&bDY5g%F{LkA>JJyp`^Xk!30f z^x5^*!Q#u-IN#WG^B6|pu2~E{v5Fx+nahei2uoZI(bv$mR|9^{k&?k?YO|j9AnyA` zT{%x}-{xS#!2ERnOpQee_b+$b!HxZTd~Sc7ST&aYl%)jSnIuIB46ht0_i}ijG!w9~ z%qg8tHi?)v(GlicryDtiOgefIn;d$|ftnjOA9Ykc7TH_#VjW^ynh+=1>$)&@0~2`y zCb;u_B zi^$nUlx#cd$+?QJ{ zm)uqoqncwNYKZqDJWP`IvuA16o%c5 zOO6HT5(LRFi58O@D`|cp9jCzwrL~hNB|7n-XMPf+M^T9PY4%gZsY3bAjc_d~q5<|a zsAYZUh@naf>;Z9Efzs%i<=LC{;n8f97s$sQ@g73HEODwwSI-!bGgYIK(EETepeZdi zebGt%h@ga~VfFl|!^a%B)R3_oN}0h-KSKv@Q9*aqtQL4x)V~MAscot6&Gt&<$sso< zCXD(gHtTbq=Z& z+Y15yc_ZpuOY-XAUPDBjR^pa53PW{{C01m;{ov-Eg2=9=x~)YRWSM&S%bi zf&Sd`cQt-OdLNihACK5*U+=m50V19(>R$x^t0=v(+(cKiX+TZYINCbJlIih$dBvTh z>uMTeeTJ&lIk|7VB*CP-k(S)hOJBJR7KWqXExMB88 zN3wl`tcsGgv4Wl?$?VdOEIx>iqRfm~xcZEamY;LmhSis4#KvX1FmnH}+F+c-nL1fB zkz8s@$Gey$QoRXAT0!a7IrBUXFc1GVF+!A_&$qg3@#bR|DcwjP^hHsD0yhCRoOf8s zU6=|{P-KYwl5kf_U}f;=iF#kGgj1^}Y;#Dq0tBafG^`5Wl{-vy3ni}NwLfU_#6m^5 z4USO;1$(XogoQ;!MS*a+^bX2gDlFTROT^#y>u&-ZT3dT}RgW>;*p4@(*lm}4^pZyj z2xA=dOS3KKaC6O6&DwOdK-thoUdr-f|Fh9QWJt>{85t+-kR9^KO{I0E5>>j#?(BXD z`5rI0QUMAdhos&3B|m z-YBMxu$qEB8F_N*;DPJA6>`M}%8-5q|25Lf#I>pPvX=~cb;fYqJSE(O1?=Z%m)1E2 zphEo4w4qpQx8O4lC9zox&-UHVA7%pZz}Vn?r3+`w${cw;cwX7o6-OP literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_line.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_line.png new file mode 100644 index 0000000000000000000000000000000000000000..42f6a9aa3ec65fc1fc19c3665816494b1a238d21 GIT binary patch literal 1399 zcmV--1&I2IP)Px#1am@3R0s$N2z&@+hyVZuAxT6*RCt{2-N91gOc({w4%-Q*W z;8NAlzi?g8mrWCXhY&(lg~uOHe*}eW4H}T`aD0A%kdU##0@4+Z&kqq2GBq3HLz*W1 z_D({Mu0CRY`7kF5nYrpqdgliU2^krD#QO2{XIWL@ap>O*F${i!v~0APf~y52xD$cn z+^Pcr0I7Pb?-t%yNXb>VSf_Za?-o__@e*vjNJtU^*$zibNJv5SfOLhUB_zZ)N}Koa z1AHv{ex?OXY|&4Upx{Wtk_bo;5)u`C#A+RD0XI$aYuqP-gierF_es*Mem?)bkM&HH zE4hG#y^sh8>{-|I<@>{J=lT}_03bFu?p#AM_aK*ef4F^7OW_)lT=Sk{v+1fn`&@3^ z8B*2(*$qcaNEk}CBi37ex9AE-&;n*a*#_k1>2-CuyCo!CF6$91XaRF&*`6S+<1OI+ z@W3(I2P7N`NmI=f9XVU}Bi6RvajU6j_cu?ktGG`E3E8xO=gnrz1?&+H0D!2BV;nMx zHSf9B^?X@1A1`j)=`*P{?M26PuHpi6=*zN$kg%h;cMvULPEp(m z($WIvJBkfR_(n){xhQVL+IFY~Tvg#wI4JrAX<7Ng5p4_D3p(^rI{^TQ$~abrqSw6V z(gH4rHSdY6gv%lzC(r^ekAQrW7I2xogM5<~aG9JSC(;5gi-4R#3%DEta;E-}G^?M_ ze|;bDL{2!e|fVmzgNJhF&5~s&? z2}owPLn0i|VO`IcHdp`vK#IJtT*ek_!fd=QCm<8$&SV$@GC_x`DME4@Rg=PK0iVVR zGEoYS!w`@O6Ozjru_jCl_;OB=0@!GsPe2OcP6Uo{s}2AFr0T7{TX30*rM7^bAbg?V_?3XLM@arLVzK8~ z3%F^TU*kSeJWddLb)O{7>gV&{`&iF3HUZ(FuOTTb9PlmcdcNHJJ2(IUfb>l1#@#&# zgL;3seVI}%#hRDFY&KohXP;{dH|_$$Aa=vi$~`1TEH3s|-z~br5hl;xgYlv}_8LK2RJBvzNph(!_(wScQCJjNw3P_+X4Up00000000000002a_dl_z9Kxun2*dyY002ovPDHLk FV1ge5Yd-)0 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_oval.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_oval.png new file mode 100644 index 0000000000000000000000000000000000000000..58f962a068513e4024b9842bf9077881776f737f GIT binary patch literal 1084 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VJUX<4B-HR z8jh3>1_tJ5o-U3d6?5L+wVia^OoSo9;$x)I&ekV!tyh+Q_1t0Qr?oO*{}o-El{Lc4 z4K^Gsa_xNlfn8w#`pBD`laoE{_O{2j0S!e0Hv9d(%^Uvbm*4t-;@^#Le{Ov(ve4$f&KeEt?=}F@Z-7dZ8PiLm4n!7Dfkyvnx}%yHtlF5nb>*>sX) zTc&lS%H0RqzhW-?#(SJPa`xR8e#MsLAC-5z1 zU3}dT&kIzN>8Ru|!}ZJ|MQN%33yvgydL(t^^JzCW^T_+_cD!M9y)pNje%o^Q2TDfU zwc09^6HE+cwYg`W&G$BcF!9FDYTvD^bPmnwI;&9L#y;EHdskw}QC5%TbDCU5L(d-% z-Ta;DaFlvlXbjuS#GW~>Q^XXGzgu+R^us@?2fuA7+OL1N;f{TM{qKLrg9RVKQzYLHp~*w^H|?2{WfNewDqPwKgT6*KX`e4xTNsv~|43HXA*uaOte9j`k?fQuzt8l|b=>uL!oBh&=Y{ud zH!o&8v3BpCZAL-e(dS=@)J}N!VI9LlE?~^=l{q(mQ~D2!lRj0mTECn!+2I(;ij;)b zoOrk8{<+F)2XC++KdTkDLhUWX=U?}pi+mS1oqKoX<~y%foqu+=Oz&AA(^JbYEN(`p zYuA}MYmp$|8XWE%{HiMAo%S9{xS1k;o%3_4)v@Xw9sxFcO+;4gSv7rfA;XH< zd~aNmDzCTw_uHo*wS0-^{M%Bu?3TW=e#x4B>BOyfTh9Ntvn{y3;ew5?*$hE8o|Wrn zG0Z&B%=c{D=i<)Bma_+(k8aQApOijNV@dpXTfN$_|5CP+DOSfBQ++b;pL>65Khte< w>$zWMrarx1cG9mP>-a6}he+W;G4t|o@dzKupF literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_path_with_fill.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_path_with_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..87a4262198bca95e1aebdacbda9727bbdd2f3ae1 GIT binary patch literal 32965 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≫g{;O8F>5ekd(*gxnr4t)GIQ5?yb} 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 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_rect.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_dashed_rect.png new file mode 100644 index 0000000000000000000000000000000000000000..879b063bffce6d247e726bd5b69df0609e13c538 GIT binary patch literal 1526 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 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_filled_rect.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_filled_rect.png new file mode 100644 index 0000000000000000000000000000000000000000..cf5075b4c771419197e84f8b3add732b60fd8337 GIT binary patch literal 1151 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKNIvi|3k+<8Q9s*K~#X;^)4C~IxyaaMsik&<| zIDnvrBc%h#)%0|645^s&_V&g==|qv%i{EE6R3)&PJN9TTU_Y^t?U?C;J6{}F1unOk zI`eBJOk=p&`1ZxSMfK^Weyrw|pUh(7hqq{cj(=UHDz$o4 z%^^B-j2675_2&c7zS1X6U~pk!Y3OKR5D*-dq*frDsCd7Z z{eTZB#3y`=tLAT*StQM^uJCy87dZywr)FY)4#%?IZv4(NLv{PcinZSxR3+y1)rVe< zd@pODJbT-%y7#tC>z{I_aIL-jbsod!M{0ac4L%EE_t=J9-SwSsM(5XeY7rLeH>jD| z$ledX>ib^y!o^){w{73+zCnJTgW8p_+qbjc?pkHGcl&{PxvREjf3(n<=dka@hnk|$ z!v&F{&qGV2Lf!Y8A8ff-e!p@LFsa5xG7eZiB53i2+w7m%B9#@wY@9)AJzf1=);T3K F0RXL+8iD`- literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_flet_logo_with_path.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_flet_logo_with_path.png new file mode 100644 index 0000000000000000000000000000000000000000..534e795065363f511fc735a6bbcc52513e4b5e0d GIT binary patch literal 11018 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 D4%oZL literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_gradients.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_gradients.png new file mode 100644 index 0000000000000000000000000000000000000000..fc963ad5dbb8da9b638871f1b1aa1ff3724543b5 GIT binary patch literal 55611 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 YqdZQ&dFt@Fh>6kkbd0qtHPNB}0fUxQS^xk5 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_line.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_line.png new file mode 100644 index 0000000000000000000000000000000000000000..82191fb3d3b7f7676ed487787946e70d000a188f GIT binary patch literal 607 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VJUX<4B-HR z8jh3>1_mZhPZ!6KiaBqu8gdx;*fTAws|OnM|UBP*feY-$=% zGZLuVdge^kH;x^PQq$t*D+}GYaZFL@#t*S}j|a(jIbBo~gff&G6@)lOi2(|Of(VuE z^|mbRyUw3Ue*UlWf!K~U`SvG^zG>{36e_bJU$zh_E`dz@YUb(kI?2zt&Tj%qc)I$z JtaD0e0su#5j3od7 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_oval.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_oval.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e633bd02c951fcbeab3c18b520d428416a31a6 GIT binary patch literal 2273 zcmb_eX*ipS7PiNTq^$;(2wId-OKXs3B8<|AC8MZ)>!=!ppwtpYv}moR)(RPWW8X<_ zpDrlH=+wU622=Y|MTr`H?!ABJ{=Mfp%X7|;^XonDdmft-@el#H00##LgkYd&c2ax3 z2S49QuCT7mJt>@b&G5P$l>_2SCk@YCU4jMwiG}jte#F7SA4kyp*&>LxHa%N*(-jVE zkL{Q#^v=NBGJo~n{`DO{ zGLNsse^F-t!FAaeL$&z>Q`kwH@{tJ&{rA7gIM+r0SR53`A zA^g(|hXV1-99=!3&O+8)#(H*{!MWtGvkOk#Q}5~#%+aH7>xj84K8jnr?lRy)OdRzl z@LvAm+o{io=Af}x4f3gdK+)9as)#ZMw{a&|RvSb9VcOQ1`(6>W{LW~B>A)M85|a{W zIZ?zQP>~t{NDqy0fz3d}s@fcG5q|=VAZ!Nad8xJ3aTEX8xu`!-vHHTw$D{A67rMmv z5Z+x^`gWZ{)&~8<8dcSJ*bY$}UncE4X^-d)18C8n9N;Wa{9Dq1Z?LA?wL~_${m*Bl z+S{`XwL;n_7qRJ3zEDB&q;4mL*cMBcrPNBkJSOTgIl|SxFQN0NHC@P-##?UY{YoNY zzAuJ;CCU$rbBDW&3*6SK78~O#&s>-d%MiQhFOmI?ph|kmytRaxTeneWVSNPA0=EQb^K7WOJby$jtd@ebA(z3*4x^ydxv?ud@jbF8r}uHDzBZpDKd zkX2A)Hz#)3g+O8*)$|{((ZNF{bzkL5XeBIdqBerD*g08dPweQXL{(9 z=a*Yz)rkEUNe~Jc4Lk0{Mh{`Z`D7^G>C5t9Rl!C^5w!KOCCA~x*rQo)5Ve9k%)IEw zMSVIl9=AF?c*wW^(N#u^r**QM?+_Mro+xP1(x23h9mjWUfGkU(=qPo7ii0+MF`N^jkorZy22@pcG1X}I%3#XOgOb>{4(2%20gYkPV-&Co$u5N3S=9I*(ZzkM$ zo!H>vzkP=QgeQOl3Kf(RrWAUaO=h5sJx9XtRYg!^>5YbzDT;Q0GcraXvPA%!g;7mN zkdyvvJ2(g(;M^?`c@Sbx1e+F=qppJ4)};|M^8AZ*VB3PzeN_q6F5lCq8IA1u%=>fb z@-W3CLN+<>D?2pIniK0-y&cZI2UX-?#89N=J_jG{t6DnNe}ufUuK5v+F#MK0x;z}2 zhO^o;EaKF%dQw$2(on0-p}lCi8{(k&RAD)7N;O_|bSn25f3NDWj6GRZY0*q_ z&-BQWS-S2GI?BaZUVwCJ1*{etNtg6;F;giyl70j)-=6}@EkUV-NRjNxT(ZkVO)gsHspA0tISC<>0eR#jSO`+t!W1@tCgj7N7W*Y zvZF{;>%66sda9B4Rx!kbkvCn>Nj@w{7hCoU$F%y=CZygbur@~uJg9|D5^u7t$~seK zTVE9XcJM%j_D$ypr6d%3JNW9((kTp02X8Xe{DVIRD$26}Bf*PnQDe{(W?>yg&fW15 z`enF^Bs92Z21?(vB>Ya~uE6+b^Bwem=u8_o7ux)i$#y7xInu+(w?9Ezvtw?o9k(#= zF=sUHZ`5kcg=SzU z(l7usglGSG9|HSdjCa-}#&^$e`YcP8)vK+q*zHDZgK|xfg(;I_Ow)8ZQL396$R^_} zFr!Qk<3od61&s@#meMtW9OP80wcQ3KxGrbwyJ|Z&rNSgejw9 zj!?Biz?=)|=1ynwr>9{D>(4bW(6Slm*pR$I2#(vhyS;z6QR0@@W7(R7y>5+-rf_9F zIwCe@u$^m48wm@SWR(#OD!} zo`4naf7rTa;|Y21RCPH$B8kcxA`YJ>%XU@h)ULmS^|)6gmeLdzbN`G?w=Y#hiJ0 zzc;8=CBRv|C3o^KOoo_Q;-&90Szwwj63>zYO=TgAJ!KDx8TqFxi=nE#;M+lq_&j!4 z;vwX07IM-1P-S}8t+wNk40~DedJ_LnasFSq{y$IL^^Q(S@NgE73XLwGyeS+6eWG5a Hu5;wyzSur7 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_text.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_text.png new file mode 100644 index 0000000000000000000000000000000000000000..ed9318b37c4b43b02cb371718a40ad0abdd806ff GIT binary patch literal 160401 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

6P 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 diff --git a/sdk/python/packages/flet/docs/controls/canvas/index.md b/sdk/python/packages/flet/docs/controls/canvas/index.md index 5ae415d21..1e806bbd6 100644 --- a/sdk/python/packages/flet/docs/controls/canvas/index.md +++ b/sdk/python/packages/flet/docs/controls/canvas/index.md @@ -58,10 +58,6 @@ --8<-- "../../examples/controls/canvas/brush.py" ``` -![brush](../../examples/controls/canvas/media/brush.gif){width="80%"} -/// caption -/// - ### Gradients ```python diff --git a/sdk/python/packages/flet/src/flet/controls/services/file_picker.py b/sdk/python/packages/flet/src/flet/controls/services/file_picker.py index 889f98981..4073ef5d9 100644 --- a/sdk/python/packages/flet/src/flet/controls/services/file_picker.py +++ b/sdk/python/packages/flet/src/flet/controls/services/file_picker.py @@ -5,8 +5,8 @@ from flet.controls.base_control import control from flet.controls.control_event import Event, EventHandler +from flet.controls.exceptions import FletUnsupportedPlatformException from flet.controls.services.service import Service -from flet.controls.types import PagePlatform __all__ = [ "FilePicker", @@ -178,8 +178,8 @@ async def get_directory_path_async( NotImplementedError: if called in web app. """ if self.page.web: - raise NotImplementedError( - "Get Directory Path dialog is not supported on web." + raise FletUnsupportedPlatformException( + "get_directory_path is not supported on web" ) return await self._invoke_method_async( @@ -225,10 +225,7 @@ async def save_file_async( ValueError: if `file_name` is not provided in web mode. """ - if ( - self.page.web - or self.page.platform in [PagePlatform.ANDROID, PagePlatform.IOS] - ) and not src_bytes: + if (self.page.web or self.page.platform.is_mobile()) and not src_bytes: raise ValueError( '"src_bytes" is required when saving a file on Web, Android and iOS.' )

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%0DNSz;e}Eu39oD((C?Ad6>Lx$HOjHHJi&a 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 V20}u1QWpV#?#V05<=rv#|36FaUXlO+ literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_url_image.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/draw_url_image.png new file mode 100644 index 0000000000000000000000000000000000000000..149568923d9cd50a280e66b847231f7a3795a813 GIT binary patch literal 25913 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 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/test_buttons.py b/sdk/python/packages/flet/integration_tests/controls/test_buttons.py index 00687d872..def46fa16 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_buttons.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_buttons.py @@ -1,20 +1,6 @@ -from pathlib import Path - import flet as ft import flet.testing as ftt import pytest -import pytest_asyncio - - -@pytest_asyncio.fixture(scope="module") -async def flet_app(request): - flet_app = ftt.FletTestApp( - flutter_app_dir=(Path(__file__).parent / "../../../../../../client").resolve(), - test_path=request.fspath, - ) - await flet_app.start() - yield flet_app - await flet_app.teardown() @pytest.mark.asyncio(loop_scope="module") diff --git a/sdk/python/packages/flet/integration_tests/controls/test_canvas.py b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py new file mode 100644 index 000000000..6406c34c4 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py @@ -0,0 +1,575 @@ +import math + +import flet as ft +import flet.canvas as fc +import flet.testing as ftt +import pytest + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_line(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [fc.Line(10, 10, 90, 90, ft.Paint(stroke_width=3))], + width=100, + height=100, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_dashed_line(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Line( + 10, + 10, + 90, + 90, + ft.Paint( + stroke_width=3, stroke_dash_pattern=[5, 5], color=ft.Colors.RED + ), + ) + ], + width=100, + height=100, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_circle(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Circle( + x=50, + y=50, + radius=40, + paint=ft.Paint(stroke_width=3, style=ft.PaintingStyle.STROKE), + ) + ], + width=100, + height=100, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_dashed_circle(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Circle( + x=50, + y=50, + radius=40, + paint=ft.Paint( + stroke_width=3, + stroke_dash_pattern=[5, 15], + color=ft.Colors.GREEN, + style=ft.PaintingStyle.STROKE, + ), + ) + ], + width=100, + height=100, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_filled_circle_default_paint(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [fc.Circle(x=50, y=50, radius=40, paint=ft.Paint())], + width=100, + height=100, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_oval(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Oval( + x=10, + y=10, + width=90, + height=40, + paint=ft.Paint(stroke_width=2, style=ft.PaintingStyle.STROKE), + ) + ], + width=100, + height=100, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_dashed_oval(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Oval( + x=10, + y=10, + width=90, + height=40, + paint=ft.Paint( + stroke_width=2, + stroke_dash_pattern=[5, 15], + color=ft.Colors.GREEN, + style=ft.PaintingStyle.STROKE, + ), + ) + ], + width=100, + height=100, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_arc(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Arc( + 40, + 40, + 100, + 60, + math.pi * 0.1, + math.pi * 0.4, + paint=ft.Paint( + color=ft.Colors.YELLOW, + stroke_width=4, + style=ft.PaintingStyle.STROKE, + ), + ) + ], + width=200, + height=150, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_dashed_arc(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Arc( + 40, + 40, + 100, + 60, + math.pi * 0.1, + math.pi * 0.4, + paint=ft.Paint( + color=ft.Colors.AMBER, + stroke_width=4, + stroke_dash_pattern=[7, 7], + style=ft.PaintingStyle.STROKE, + ), + use_center=False, + ) + ], + width=200, + height=150, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_dashed_arc_with_center(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Arc( + x=40, + y=40, + width=100, + height=60, + start_angle=math.pi * 0.1, + sweep_angle=math.pi * 0.6, + paint=ft.Paint( + color=ft.Colors.AMBER, + stroke_width=4, + stroke_dash_pattern=[7, 7], + style=ft.PaintingStyle.STROKE, + ), + use_center=True, + ) + ], + width=200, + height=150, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_filled_rect(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Rect( + x=40, + y=40, + width=100, + height=60, + border_radius=5, + paint=ft.Paint( + color=ft.Colors.AMBER, + stroke_width=4, + ), + ) + ], + width=200, + height=150, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_dashed_rect(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Rect( + x=40, + y=40, + width=100, + height=60, + border_radius=5, + paint=ft.Paint( + color=ft.Colors.BLUE, + stroke_width=4, + stroke_dash_pattern=[3, 3], + style=ft.PaintingStyle.STROKE, + ), + ) + ], + width=200, + height=150, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_flet_logo_with_path(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Path( + elements=[ + fc.Path.MoveTo(25, 125), + fc.Path.QuadraticTo(50, 25, 135, 35, 0.35), + fc.Path.QuadraticTo(75, 115, 135, 215, 0.6), + fc.Path.QuadraticTo(50, 225, 25, 125, 0.35), + ], + paint=ft.Paint( + stroke_width=2, + style=ft.PaintingStyle.FILL, + color=ft.Colors.PINK_400, + ), + ), + fc.Path( + elements=[ + fc.Path.MoveTo(85, 125), + fc.Path.QuadraticTo(120, 85, 165, 75, 0.5), + fc.Path.QuadraticTo(120, 115, 165, 175, 0.3), + fc.Path.QuadraticTo(120, 165, 85, 125, 0.5), + ], + paint=ft.Paint( + stroke_width=2, + style=ft.PaintingStyle.FILL, + color=ft.Colors.with_opacity(0.5, ft.Colors.BLUE_400), + ), + ), + ], + width=300, + height=300, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_dashed_path_with_fill(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Fill( + paint=ft.Paint( + style=ft.PaintingStyle.FILL, + gradient=ft.PaintLinearGradient( + begin=(0, 10), + end=(100, 50), + colors=[ft.Colors.BLUE, ft.Colors.YELLOW], + ), + ) + ), + fc.Path( + paint=ft.Paint( + stroke_width=3, + stroke_dash_pattern=[3, 3], + style=ft.PaintingStyle.STROKE, + ), + elements=[ + fc.Path.MoveTo(75, 25), + fc.Path.QuadraticTo(25, 25, 25, 62.5), + fc.Path.QuadraticTo(25, 100, 50, 100), + fc.Path.QuadraticTo(50, 120, 30, 125), + fc.Path.QuadraticTo(60, 120, 65, 100), + fc.Path.QuadraticTo(125, 100, 125, 62.5), + fc.Path.QuadraticTo(125, 25, 75, 25), + ], + ), + ], + width=150, + height=150, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_text(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Fill( + paint=ft.Paint( + style=ft.PaintingStyle.FILL, + color=ft.Colors.WHITE, + ) + ), + fc.Text( + x=0, + y=0, + value="Just a text", + ), + fc.Circle( + x=200, + y=100, + radius=2, + paint=ft.Paint(color=ft.Colors.RED), + ), + fc.Text( + x=200, + y=100, + style=ft.TextStyle(weight=ft.FontWeight.BOLD, size=30), + alignment=ft.Alignment.TOP_CENTER, + rotate=math.pi * 0.15, + value="Rotated", + spans=[ + ft.TextSpan( + text="around top_center", + style=ft.TextStyle( + italic=True, color=ft.Colors.GREEN, size=20 + ), + ) + ], + ), + fc.Circle( + x=400, + y=100, + radius=2, + paint=ft.Paint(color=ft.Colors.RED), + ), + fc.Text( + x=400, + y=100, + value="Rotated around top_left", + style=ft.TextStyle(size=20), + alignment=ft.Alignment.TOP_LEFT, + rotate=math.pi * -0.15, + ), + fc.Circle( + x=600, + y=200, + radius=2, + paint=ft.Paint(color=ft.Colors.RED), + ), + fc.Text( + x=600, + y=200, + value="Rotated around center", + style=ft.TextStyle(size=20), + alignment=ft.Alignment.CENTER, + rotate=math.pi / 2, + ), + fc.Text( + x=300, + y=400, + value="Limited to max_width and right-aligned.\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + text_align=ft.TextAlign.RIGHT, + max_width=400, + ), + fc.Text( + x=200, + y=200, + value="WOW!", + style=ft.TextStyle( + weight=ft.FontWeight.BOLD, + size=100, + foreground=ft.Paint( + color=ft.Colors.PINK, + stroke_width=6, + style=ft.PaintingStyle.STROKE, + stroke_join=ft.StrokeJoin.ROUND, + stroke_cap=ft.StrokeCap.ROUND, + ), + ), + ), + fc.Text( + x=200, + y=200, + value="WOW!", + style=ft.TextStyle( + weight=ft.FontWeight.BOLD, + size=100, + foreground=ft.Paint( + gradient=ft.PaintLinearGradient( + begin=(200, 200), + end=(300, 300), + colors=[ft.Colors.YELLOW, ft.Colors.RED], + ), + stroke_join=ft.StrokeJoin.ROUND, + stroke_cap=ft.StrokeCap.ROUND, + ), + ), + ), + ], + width=800, + height=500, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_gradients(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [ + fc.Rect( + x=10, + y=10, + width=100, + height=100, + border_radius=5, + paint=ft.Paint( + style=ft.PaintingStyle.FILL, + gradient=ft.PaintLinearGradient( + begin=(0, 10), + end=(100, 50), + colors=[ft.Colors.BLUE, ft.Colors.YELLOW], + ), + ), + ), + fc.Circle( + x=60, + y=170, + radius=50, + paint=ft.Paint( + style=ft.PaintingStyle.FILL, + gradient=ft.PaintRadialGradient( + radius=50, + center=(60, 170), + colors=[ft.Colors.YELLOW, ft.Colors.BLUE], + ), + ), + ), + fc.Path( + elements=[ + fc.Path.Arc( + x=10, + y=230, + width=100, + height=100, + start_angle=3 * math.pi / 4, + sweep_angle=3 * math.pi / 2, + ), + ], + paint=ft.Paint( + stroke_width=15, + stroke_join=ft.StrokeJoin.ROUND, + style=ft.PaintingStyle.STROKE, + gradient=ft.PaintSweepGradient( + start_angle=0, + end_angle=math.pi * 2, + rotation=3 * math.pi / 4, + center=(60, 280), + colors=[ft.Colors.YELLOW, ft.Colors.PURPLE], + color_stops=[0.0, 1.0], + ), + ), + ), + ], + width=150, + height=350, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_asset_image(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [fc.Image(src="52-100x100.png", x=10, y=10)], + width=120, + height=120, + ), + delay=1000, + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_draw_url_image(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + await flet_app.assert_control_screenshot( + request.node.name, + fc.Canvas( + [fc.Image(src="https://picsum.photos/id/237/100/100", x=10, y=10)], + width=120, + height=120, + ), + delay=3000, + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_text.py b/sdk/python/packages/flet/integration_tests/controls/test_text.py index 4e6b8f7cc..46a49db68 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_text.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_text.py @@ -1,20 +1,6 @@ -from pathlib import Path - import flet as ft import flet.testing as ftt import pytest -import pytest_asyncio - - -@pytest_asyncio.fixture(scope="module") -async def flet_app(request): - flet_app = ftt.FletTestApp( - flutter_app_dir=(Path(__file__).parent / "../../../../../../client").resolve(), - test_path=request.fspath, - ) - await flet_app.start() - yield flet_app - await flet_app.teardown() @pytest.mark.asyncio(loop_scope="module") diff --git a/sdk/python/packages/flet/integration_tests/controls/test_textfield.py b/sdk/python/packages/flet/integration_tests/controls/test_textfield.py index 94f92e71f..0e94d3416 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_textfield.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_textfield.py @@ -1,20 +1,6 @@ -from pathlib import Path - import flet as ft import flet.testing as ftt import pytest -import pytest_asyncio - - -@pytest_asyncio.fixture(scope="module") -async def flet_app(request): - flet_app = ftt.FletTestApp( - flutter_app_dir=(Path(__file__).parent / "../../../../../../client").resolve(), - test_path=request.fspath, - ) - await flet_app.start() - yield flet_app - await flet_app.teardown() @pytest.mark.asyncio(loop_scope="module") diff --git a/sdk/python/packages/flet/integration_tests/test_counter_app.py b/sdk/python/packages/flet/integration_tests/test_counter_app.py index 2e56ba1c4..0f4aaa4ff 100644 --- a/sdk/python/packages/flet/integration_tests/test_counter_app.py +++ b/sdk/python/packages/flet/integration_tests/test_counter_app.py @@ -1,42 +1,37 @@ -from pathlib import Path - import apps.counter as app import flet as ft import flet.testing as ftt import pytest -import pytest_asyncio - - -@pytest_asyncio.fixture(scope="module") -async def flet_app(request): - flet_app = ftt.FletTestApp( - flutter_app_dir=(Path(__file__).parent / "../../../../../client").resolve(), - flet_app_main=app.main, - test_path=request.fspath, - ) - await flet_app.start() - yield flet_app - await flet_app.teardown() -@pytest.mark.asyncio(loop_scope="module") -async def test_app(flet_app: ftt.FletTestApp): - tester = flet_app.tester - await tester.pump_and_settle() - zero_text = await tester.find_by_text("0") - assert zero_text.count == 1 +@pytest.mark.parametrize( + "flet_app", + [ + { + "flet_app_main": app.main, + } + ], + indirect=True, +) +class TestApp: + @pytest.mark.asyncio(loop_scope="module") + async def test_app(self, flet_app: ftt.FletTestApp): + tester = flet_app.tester + await tester.pump_and_settle() + zero_text = await tester.find_by_text("0") + assert zero_text.count == 1 - # tap increment button - increment_btn = await tester.find_by_icon(ft.Icons.ADD) - assert increment_btn.count == 1 - await tester.tap(increment_btn) - await tester.pump_and_settle() - assert (await tester.find_by_text("1")).count == 1 + # tap increment button + increment_btn = await tester.find_by_icon(ft.Icons.ADD) + assert increment_btn.count == 1 + await tester.tap(increment_btn) + await tester.pump_and_settle() + assert (await tester.find_by_text("1")).count == 1 - # tap decrement button - decrement_button = await tester.find_by_key("decrement") - assert decrement_button.count == 1 - await tester.tap(decrement_button) - await tester.tap(decrement_button) - await tester.pump_and_settle() - assert (await tester.find_by_text("-1")).count == 1 + # tap decrement button + decrement_button = await tester.find_by_key("decrement") + assert decrement_button.count == 1 + await tester.tap(decrement_button) + await tester.tap(decrement_button) + await tester.pump_and_settle() + assert (await tester.find_by_text("-1")).count == 1 diff --git a/sdk/python/packages/flet/integration_tests/test_finders.py b/sdk/python/packages/flet/integration_tests/test_finders.py index d4777d8d5..92ea17a8f 100644 --- a/sdk/python/packages/flet/integration_tests/test_finders.py +++ b/sdk/python/packages/flet/integration_tests/test_finders.py @@ -1,62 +1,52 @@ -from pathlib import Path - import apps.finders as app import flet as ft import flet.testing as ftt import pytest -import pytest_asyncio - - -@pytest_asyncio.fixture(scope="module") -async def flet_app(request): - flet_app = ftt.FletTestApp( - flutter_app_dir=(Path(__file__).parent / "../../../../../client").resolve(), - flet_app_main=app.main, - test_path=request.fspath, - ) - await flet_app.start() - await flet_app.tester.pump_and_settle() - yield flet_app - await flet_app.teardown() - - -@pytest.mark.asyncio(loop_scope="module") -async def test_find_by_text(flet_app: ftt.FletTestApp): - finder = await flet_app.tester.find_by_text("Hello, world!") - assert finder.count == 2 - - -@pytest.mark.asyncio(loop_scope="module") -async def test_find_by_text_containing(flet_app: ftt.FletTestApp): - finder = await flet_app.tester.find_by_text_containing("Hello, world!") - assert finder.count == 3 - - finder = await flet_app.tester.find_by_text_containing("Hello") - assert finder.count == 4 - - finder = await flet_app.tester.find_by_text_containing("(\\s+)world") - assert finder.count == 3 - - finder = await flet_app.tester.find_by_text_containing("world!$") - assert finder.count == 3 - - -@pytest.mark.asyncio(loop_scope="module") -async def test_find_by_icon(flet_app: ftt.FletTestApp): - finder = await flet_app.tester.find_by_icon(ft.Icons.ADD_A_PHOTO) - assert finder.count == 1 - - -@pytest.mark.asyncio(loop_scope="module") -async def test_find_by_tooltip(flet_app: ftt.FletTestApp): - finder = await flet_app.tester.find_by_tooltip("Tooltip1") - assert finder.count == 1 - -@pytest.mark.asyncio(loop_scope="module") -async def test_find_by_key(flet_app: ftt.FletTestApp): - finder = await flet_app.tester.find_by_key("value_key_1") - assert finder.count == 1 - finder = await flet_app.tester.find_by_key(ft.ScrollKey("scroll_key_1")) - assert finder.count == 1 +@pytest.mark.parametrize( + "flet_app", + [ + { + "flet_app_main": app.main, + } + ], + indirect=True, +) +class TestFinders: + @pytest.mark.asyncio(loop_scope="module") + async def test_find_by_text(self, flet_app: ftt.FletTestApp): + finder = await flet_app.tester.find_by_text("Hello, world!") + assert finder.count == 2 + + @pytest.mark.asyncio(loop_scope="module") + async def test_find_by_text_containing(self, flet_app: ftt.FletTestApp): + finder = await flet_app.tester.find_by_text_containing("Hello, world!") + assert finder.count == 3 + + finder = await flet_app.tester.find_by_text_containing("Hello") + assert finder.count == 4 + + finder = await flet_app.tester.find_by_text_containing("(\\s+)world") + assert finder.count == 3 + + finder = await flet_app.tester.find_by_text_containing("world!$") + assert finder.count == 3 + + @pytest.mark.asyncio(loop_scope="module") + async def test_find_by_icon(self, flet_app: ftt.FletTestApp): + finder = await flet_app.tester.find_by_icon(ft.Icons.ADD_A_PHOTO) + assert finder.count == 1 + + @pytest.mark.asyncio(loop_scope="module") + async def test_find_by_tooltip(self, flet_app: ftt.FletTestApp): + finder = await flet_app.tester.find_by_tooltip("Tooltip1") + assert finder.count == 1 + + @pytest.mark.asyncio(loop_scope="module") + async def test_find_by_key(self, flet_app: ftt.FletTestApp): + finder = await flet_app.tester.find_by_key("value_key_1") + assert finder.count == 1 + + finder = await flet_app.tester.find_by_key(ft.ScrollKey("scroll_key_1")) + assert finder.count == 1 diff --git a/sdk/python/packages/flet/integration_tests/test_hello_world_app.py b/sdk/python/packages/flet/integration_tests/test_hello_world_app.py index a3e1932c9..60649bd9e 100644 --- a/sdk/python/packages/flet/integration_tests/test_hello_world_app.py +++ b/sdk/python/packages/flet/integration_tests/test_hello_world_app.py @@ -1,40 +1,33 @@ -from pathlib import Path - import apps.hello_world as app import flet.testing as ftt import pytest -import pytest_asyncio - - -@pytest_asyncio.fixture(scope="module") -async def flet_app(request): - flet_app = ftt.FletTestApp( - flutter_app_dir=(Path(__file__).parent / "../../../../../client").resolve(), - flet_app_main=app.main, - test_path=request.fspath, - ) - await flet_app.start() - yield flet_app - await flet_app.teardown() - - -@pytest.mark.asyncio(loop_scope="module") -async def test_app(flet_app: ftt.FletTestApp): - await flet_app.tester.pump_and_settle() - finder = await flet_app.tester.find_by_text("Hello, world!") - assert finder.count == 1 - # bytes = await flet_app.tester.take_screenshot("scr1") - # p = Path(get_current_script_dir(), "scr_1.png") - # print(p) - # with open(p, "wb") as f: - # f.write(bytes) - - -@pytest.mark.asyncio(loop_scope="module") -async def test_1(flet_app: ftt.FletTestApp): - print("Test 1") -@pytest.mark.asyncio(loop_scope="module") -async def test_2(flet_app: ftt.FletTestApp): - print("Test 2") +@pytest.mark.parametrize( + "flet_app", + [ + { + "flet_app_main": app.main, + } + ], + indirect=True, +) +class TestHelloWorld: + @pytest.mark.asyncio(loop_scope="module") + async def test_app(self, flet_app: ftt.FletTestApp): + await flet_app.tester.pump_and_settle() + finder = await flet_app.tester.find_by_text("Hello, world!") + assert finder.count == 1 + # bytes = await flet_app.tester.take_screenshot("scr1") + # p = Path(get_current_script_dir(), "scr_1.png") + # print(p) + # with open(p, "wb") as f: + # f.write(bytes) + + @pytest.mark.asyncio(loop_scope="module") + async def test_1(self, flet_app: ftt.FletTestApp): + print("Test 1") + + @pytest.mark.asyncio(loop_scope="module") + async def test_2(self, flet_app: ftt.FletTestApp): + print("Test 2") diff --git a/sdk/python/packages/flet/src/flet/app.py b/sdk/python/packages/flet/src/flet/app.py index 3f336f21e..12b4fbf11 100644 --- a/sdk/python/packages/flet/src/flet/app.py +++ b/sdk/python/packages/flet/src/flet/app.py @@ -206,7 +206,6 @@ def exit_gracefully(signum, frame): web_renderer=web_renderer, route_url_strategy=route_url_strategy, no_cdn=no_cdn, - blocking=(view == AppView.WEB_BROWSER or view is None or force_web_server), on_startup=on_app_startup, ) ) @@ -241,7 +240,7 @@ def exit_gracefully(signum, frame): with contextlib.suppress(KeyboardInterrupt): await terminate.wait() - elif view is None: + elif view == AppView.WEB_BROWSER or view is None or force_web_server: with contextlib.suppress(KeyboardInterrupt): await terminate.wait() @@ -316,7 +315,6 @@ async def __run_web_server( web_renderer: Optional[WebRenderer], route_url_strategy, no_cdn, - blocking, on_startup, ): ensure_flet_web_package_installed() @@ -345,7 +343,6 @@ async def __run_web_server( web_renderer=web_renderer, route_url_strategy=route_url_strategy, no_cdn=no_cdn, - blocking=blocking, on_startup=on_startup, log_level=logging.getLevelName(log_level).lower(), ) diff --git a/sdk/python/packages/flet/src/flet/controls/base_control.py b/sdk/python/packages/flet/src/flet/controls/base_control.py index a538fc097..b63cbf185 100644 --- a/sdk/python/packages/flet/src/flet/controls/base_control.py +++ b/sdk/python/packages/flet/src/flet/controls/base_control.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, Union from flet.controls.context import _context_page -from flet.controls.control_event import ControlEvent +from flet.controls.control_event import ControlEvent, get_event_field_type from flet.controls.control_id import ControlId from flet.controls.keys import KeyValue from flet.controls.ref import Ref @@ -226,7 +226,7 @@ async def _trigger_event(self, event_name: str, event_data: Any): # field_name not defined return - event_type = ControlEvent.get_event_field_type(self, field_name) + event_type = get_event_field_type(self, field_name) if event_type is None: return diff --git a/sdk/python/packages/flet/src/flet/controls/core/screenshot.py b/sdk/python/packages/flet/src/flet/controls/core/screenshot.py index 52bfae427..2a1659d44 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/screenshot.py +++ b/sdk/python/packages/flet/src/flet/controls/core/screenshot.py @@ -2,7 +2,7 @@ from flet.controls.base_control import control from flet.controls.control import Control -from flet.controls.duration import Duration +from flet.controls.duration import DurationValue from flet.controls.types import Number __all__ = ["Screenshot"] @@ -20,7 +20,9 @@ class Screenshot(Control): """ async def capture_async( - self, pixel_ratio: Optional[Number] = None, delay: Optional[Duration] = None + self, + pixel_ratio: Optional[Number] = None, + delay: Optional[DurationValue] = None, ) -> bytes: """ Captures a screenshot of the enclosed content control. diff --git a/sdk/python/packages/flet/src/flet/testing/flet_test_app.py b/sdk/python/packages/flet/src/flet/testing/flet_test_app.py index e36f276b1..290c76dfd 100644 --- a/sdk/python/packages/flet/src/flet/testing/flet_test_app.py +++ b/sdk/python/packages/flet/src/flet/testing/flet_test_app.py @@ -2,6 +2,7 @@ import logging import os import platform +import tempfile from io import BytesIO from pathlib import Path from typing import Any, Optional @@ -25,6 +26,7 @@ def __init__( self, flutter_app_dir: os.PathLike, flet_app_main: Any = None, + assets_dir: Optional[os.PathLike] = None, test_path: Optional[str] = None, tcp_port: Optional[int] = None, ): @@ -35,6 +37,7 @@ def __init__( self.__test_path = test_path self.__flet_app_main = flet_app_main self.__flutter_app_dir = flutter_app_dir + self.__assets_dir = assets_dir or "assets" self.__tcp_port = tcp_port self.__flutter_process: Optional[asyncio.subprocess.Process] = None self.__page = None @@ -79,7 +82,16 @@ async def main(page: ft.Page): if not self.__tcp_port: self.__tcp_port = get_free_tcp_port() - asyncio.create_task(ft.run_async(main, port=self.__tcp_port, view=None)) + use_http = get_bool_env_var("FLET_TEST_USE_HTTP") + + if use_http: + os.environ["FLET_FORCE_WEB_SERVER"] = "true" + + asyncio.create_task( + ft.run_async( + main, port=self.__tcp_port, assets_dir=str(self.__assets_dir), view=None + ) + ) print("Started Flet app") stdout = asyncio.subprocess.DEVNULL @@ -101,13 +113,22 @@ async def main(page: ft.Page): self.test_device = os.getenv("FLET_TEST_DEVICE", self.test_platform) tcp_addr = "10.0.2.2" if self.test_platform == "android" else "127.0.0.1" + protocol = "http" if use_http else "tcp" if self.test_device: flutter_args += ["-d", self.test_device] - app_url = f"tcp://{tcp_addr}:{self.__tcp_port}" + app_url = f"{protocol}://{tcp_addr}:{self.__tcp_port}" flutter_args += [f"--dart-define=FLET_TEST_APP_URL={app_url}"] + if not use_http: + temp_path = Path(tempfile.gettempdir()) / "flet_app_pid.txt" + flutter_args += [f"--dart-define=FLET_TEST_PID_FILE_PATH={temp_path}"] + if self.__assets_dir: + flutter_args += [ + f"--dart-define=FLET_TEST_ASSETS_DIR={self.__assets_dir}" + ] + self.__flutter_process = await asyncio.create_subprocess_exec( *flutter_args, cwd=str(self.__flutter_app_dir), @@ -147,7 +168,9 @@ async def teardown(self): print("Force killing Flutter test process...") self.__flutter_process.kill() - async def assert_control_screenshot(self, name: str, control: Control): + async def assert_control_screenshot( + self, name: str, control: Control, delay: Optional[ft.DurationValue] = None + ): """ Adds control to a clean page, takes a screenshot and compares it with a golden copy or takes golden screenshot if `FLET_TEST_GOLDEN=1` @@ -159,11 +182,13 @@ async def assert_control_screenshot(self, name: str, control: Control): """ # clean page self.page.clean() + await self.tester.pump_and_settle() # add control and take screenshot screenshot = ft.Screenshot(control) self.page.add(screenshot) await self.tester.pump_and_settle() + await self.tester.pump(duration=delay) self.assert_screenshot( name, await screenshot.capture_async(pixel_ratio=pixel_ratio), diff --git a/sdk/python/packages/flet/src/flet/testing/tester.py b/sdk/python/packages/flet/src/flet/testing/tester.py index 8cfb19fac..654aa9568 100644 --- a/sdk/python/packages/flet/src/flet/testing/tester.py +++ b/sdk/python/packages/flet/src/flet/testing/tester.py @@ -1,7 +1,7 @@ from typing import Optional from flet.controls.base_control import control -from flet.controls.duration import Duration +from flet.controls.duration import DurationValue from flet.controls.keys import KeyValue from flet.controls.services.service import Service from flet.controls.types import IconValue @@ -16,7 +16,7 @@ class Tester(Service): Class that programmatically interacts with page controls and the test environment. """ - async def pump(self, duration: Optional[Duration] = None): + async def pump(self, duration: Optional[DurationValue] = None): """ Triggers a frame after duration amount of time. @@ -25,7 +25,7 @@ async def pump(self, duration: Optional[Duration] = None): """ return await self._invoke_method_async("pump", {"duration": duration}) - async def pump_and_settle(self): + async def pump_and_settle(self, duration: Optional[DurationValue] = None): """ Repeatedly calls pump until there are no longer any frames scheduled. This will call `pump` at least once, even if no frames are scheduled when @@ -33,8 +33,13 @@ async def pump_and_settle(self): themselves schedule a frame. This essentially waits for all animations to have completed. + + Args: + duration: A duration after which to trigger a frame. """ - return await self._invoke_method_async("pump_and_settle") + return await self._invoke_method_async( + "pump_and_settle", {"duration": duration} + ) async def find_by_text(self, text: str) -> Finder: """ From f4b990845fd06871734e4919c04c891bd9714e10 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 6 Aug 2025 20:35:44 -0700 Subject: [PATCH 20/37] Lower pytest log level to INFO in AppVeyor config Changed the pytest log_cli_level from DEBUG to INFO in the AppVeyor configuration to reduce log verbosity during integration tests. --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 03bc2b047..783bc925e 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -173,7 +173,7 @@ for: test_script: - cd sdk/python - - uv run pytest -s -o log_cli=true -o log_cli_level=DEBUG packages/flet/integration_tests/ + - uv run pytest -s -o log_cli=true -o log_cli_level=INFO packages/flet/integration_tests/ on_failure: - find packages/flet/integration_tests -type f -name '*_actual.png' -exec appveyor PushArtifact {} \; From d018c39d7aa269021153d0dddccd439147022cf5 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Wed, 6 Aug 2025 21:34:35 -0700 Subject: [PATCH 21/37] Update CI config and test finders only Commented out most build and test jobs in .appveyor.yml, limiting test execution to test_finders.py. Increased the test app window width from 400 to 800 in finders.py. Added a pump delay in test_find_by_text to improve test reliability. --- .appveyor.yml | 150 +++++++++--------- .../flet/integration_tests/apps/finders.py | 2 +- .../flet/integration_tests/test_finders.py | 1 + 3 files changed, 77 insertions(+), 76 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 783bc925e..fea21b59c 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -22,9 +22,9 @@ environment: secure: trYGM65OQ1+HYnOYOe/NOHrofLpP3bz64nHwVWPJhiUIYll3MrrQd7ilFNp+zSkI matrix: - - job_name: Build Flet package for Flutter - job_group: build_flet_package - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2204 + # - job_name: Build Flet package for Flutter + # job_group: build_flet_package + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2204 - job_name: Integration tests on macOS job_group: integration_tests @@ -33,77 +33,77 @@ environment: FLET_TEST_SCREENSHOTS_PIXEL_RATIO: 2.0 FLET_TEST_SIMILARITY_THRESHOLD: 99.0 - - job_name: Build Flet for Windows - job_group: build_flet - job_depends_on: build_flet_package - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 - - - job_name: Build Flet for macOS - job_group: build_flet - job_depends_on: build_flet_package - APPVEYOR_BUILD_WORKER_IMAGE: macos-sonoma - - - job_name: Build Flet for Linux - job_group: build_flet_linux - job_depends_on: build_flet_package - ARCH: amd64 - PACKAGE_NAME: flet-desktop - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - - job_name: Build Flet Light for Linux - job_group: build_flet_linux - job_depends_on: build_flet_package - ARCH: amd64 - PACKAGE_NAME: flet-desktop-light - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - - job_name: Build Flet for Linux ARM64 - job_group: build_flet_linux - job_depends_on: build_flet_package - ARCH: arm64 - PACKAGE_NAME: flet-desktop - PYTHON_VERSION: 3.10 - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004-arm - - - job_name: Build Flet Light for Linux ARM64 - job_group: build_flet_linux - job_depends_on: build_flet_package - ARCH: arm64 - PACKAGE_NAME: flet-desktop-light - PYTHON_VERSION: 3.10 - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004-arm - - - job_name: Build Flet for web - job_group: build_flet - job_depends_on: build_flet_package - PYODIDE_URL: https://github.com/pyodide/pyodide/releases/download/0.27.7/pyodide-core-0.27.7.tar.bz2 - PYODIDE_CDN_URL: https://cdn.jsdelivr.net/pyodide/v0.27.7/full - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - - job_name: Test Python 3.10 - job_group: python_tests - PYTHON_VERSION: 3.10 - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - - job_name: Test Python 3.11 - job_group: python_tests - PYTHON_VERSION: 3.11 - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - - job_name: Test Python 3.12 - job_group: python_tests - PYTHON_VERSION: 3.12 - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - - job_name: Test Python 3.13 - job_group: python_tests - PYTHON_VERSION: 3.13 - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - - job_name: Build Python wheels - job_group: python_build - job_depends_on: python_tests, build_flet, build_flet_linux - APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + # - job_name: Build Flet for Windows + # job_group: build_flet + # job_depends_on: build_flet_package + # APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 + + # - job_name: Build Flet for macOS + # job_group: build_flet + # job_depends_on: build_flet_package + # APPVEYOR_BUILD_WORKER_IMAGE: macos-sonoma + + # - job_name: Build Flet for Linux + # job_group: build_flet_linux + # job_depends_on: build_flet_package + # ARCH: amd64 + # PACKAGE_NAME: flet-desktop + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + # - job_name: Build Flet Light for Linux + # job_group: build_flet_linux + # job_depends_on: build_flet_package + # ARCH: amd64 + # PACKAGE_NAME: flet-desktop-light + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + # - job_name: Build Flet for Linux ARM64 + # job_group: build_flet_linux + # job_depends_on: build_flet_package + # ARCH: arm64 + # PACKAGE_NAME: flet-desktop + # PYTHON_VERSION: 3.10 + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004-arm + + # - job_name: Build Flet Light for Linux ARM64 + # job_group: build_flet_linux + # job_depends_on: build_flet_package + # ARCH: arm64 + # PACKAGE_NAME: flet-desktop-light + # PYTHON_VERSION: 3.10 + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004-arm + + # - job_name: Build Flet for web + # job_group: build_flet + # job_depends_on: build_flet_package + # PYODIDE_URL: https://github.com/pyodide/pyodide/releases/download/0.27.7/pyodide-core-0.27.7.tar.bz2 + # PYODIDE_CDN_URL: https://cdn.jsdelivr.net/pyodide/v0.27.7/full + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + # - job_name: Test Python 3.10 + # job_group: python_tests + # PYTHON_VERSION: 3.10 + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + # - job_name: Test Python 3.11 + # job_group: python_tests + # PYTHON_VERSION: 3.11 + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + # - job_name: Test Python 3.12 + # job_group: python_tests + # PYTHON_VERSION: 3.12 + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + # - job_name: Test Python 3.13 + # job_group: python_tests + # PYTHON_VERSION: 3.13 + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + # - job_name: Build Python wheels + # job_group: python_build + # job_depends_on: python_tests, build_flet, build_flet_linux + # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 matrix: fast_finish: true @@ -173,7 +173,7 @@ for: test_script: - cd sdk/python - - uv run pytest -s -o log_cli=true -o log_cli_level=INFO packages/flet/integration_tests/ + - uv run pytest -s -o log_cli=true -o log_cli_level=INFO packages/flet/integration_tests/test_finders.py on_failure: - find packages/flet/integration_tests -type f -name '*_actual.png' -exec appveyor PushArtifact {} \; diff --git a/sdk/python/packages/flet/integration_tests/apps/finders.py b/sdk/python/packages/flet/integration_tests/apps/finders.py index 5b0f00514..edcd78efd 100644 --- a/sdk/python/packages/flet/integration_tests/apps/finders.py +++ b/sdk/python/packages/flet/integration_tests/apps/finders.py @@ -3,7 +3,7 @@ async def main(page: ft.Page): print("Test mode:", page.test) - page.window.width = 400 + page.window.width = 800 page.add(ft.Text("Hello, world!")) page.add(ft.Button("Button_1")) page.add(ft.Button("Button_2")) diff --git a/sdk/python/packages/flet/integration_tests/test_finders.py b/sdk/python/packages/flet/integration_tests/test_finders.py index 92ea17a8f..c6e26b7e6 100644 --- a/sdk/python/packages/flet/integration_tests/test_finders.py +++ b/sdk/python/packages/flet/integration_tests/test_finders.py @@ -16,6 +16,7 @@ class TestFinders: @pytest.mark.asyncio(loop_scope="module") async def test_find_by_text(self, flet_app: ftt.FletTestApp): + await flet_app.tester.pump(1000) finder = await flet_app.tester.find_by_text("Hello, world!") assert finder.count == 2 From 78e5372f2c04f78f1d98c65dee266c922d0cab91 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Thu, 7 Aug 2025 07:39:45 -0700 Subject: [PATCH 22/37] Run all integration tests --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index fea21b59c..1206dce14 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -173,7 +173,7 @@ for: test_script: - cd sdk/python - - uv run pytest -s -o log_cli=true -o log_cli_level=INFO packages/flet/integration_tests/test_finders.py + - uv run pytest -s -o log_cli=true -o log_cli_level=INFO packages/flet/integration_tests on_failure: - find packages/flet/integration_tests -type f -name '*_actual.png' -exec appveyor PushArtifact {} \; From e2e0655d8c9641c44838b2df33f616b0d2541a1a Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Thu, 7 Aug 2025 08:11:46 -0700 Subject: [PATCH 23/37] Update test runner and increase test delay in test_canvas.py The AppVeyor configuration now runs only the test_canvas.py integration test instead of the entire directory. Additionally, the delay in the test_draw_url_image test was increased from 3000ms to 5000ms, likely to improve test reliability. --- .appveyor.yml | 2 +- .../packages/flet/integration_tests/controls/test_canvas.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 1206dce14..e850efbe2 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -173,7 +173,7 @@ for: test_script: - cd sdk/python - - uv run pytest -s -o log_cli=true -o log_cli_level=INFO packages/flet/integration_tests + - uv run pytest -s -o log_cli=true -o log_cli_level=INFO packages/flet/integration_tests/controls/test_canvas.py on_failure: - find packages/flet/integration_tests -type f -name '*_actual.png' -exec appveyor PushArtifact {} \; diff --git a/sdk/python/packages/flet/integration_tests/controls/test_canvas.py b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py index 6406c34c4..b4cc3747b 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_canvas.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py @@ -571,5 +571,5 @@ async def test_draw_url_image(flet_app: ftt.FletTestApp, request): width=120, height=120, ), - delay=3000, + delay=5000, ) From 3778399dcc3d7f7dabc97c051292d97c735d73c6 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Thu, 7 Aug 2025 08:35:36 -0700 Subject: [PATCH 24/37] Run all tests, again --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index e850efbe2..1206dce14 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -173,7 +173,7 @@ for: test_script: - cd sdk/python - - uv run pytest -s -o log_cli=true -o log_cli_level=INFO packages/flet/integration_tests/controls/test_canvas.py + - uv run pytest -s -o log_cli=true -o log_cli_level=INFO packages/flet/integration_tests on_failure: - find packages/flet/integration_tests -type f -name '*_actual.png' -exec appveyor PushArtifact {} \; From c0775e635dd79adf71eea0510338f6ee084a80be Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Thu, 7 Aug 2025 15:11:35 -0700 Subject: [PATCH 25/37] Refactor screenshot test timing in canvas tests Replaces the 'delay' parameter with 'pump_times' and 'pump_duration' in canvas integration tests and the FletTestApp helper. This allows for more precise control over test timing and screenshot capture during automated UI tests. --- .../flet/integration_tests/controls/test_canvas.py | 6 ++++-- .../packages/flet/src/flet/testing/flet_test_app.py | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_canvas.py b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py index b4cc3747b..8674c452a 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_canvas.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py @@ -557,7 +557,8 @@ async def test_draw_asset_image(flet_app: ftt.FletTestApp, request): width=120, height=120, ), - delay=1000, + pump_times=1, + pump_duration=1000, ) @@ -571,5 +572,6 @@ async def test_draw_url_image(flet_app: ftt.FletTestApp, request): width=120, height=120, ), - delay=5000, + pump_times=7, + pump_duration=1000, ) diff --git a/sdk/python/packages/flet/src/flet/testing/flet_test_app.py b/sdk/python/packages/flet/src/flet/testing/flet_test_app.py index 290c76dfd..22d0c9b08 100644 --- a/sdk/python/packages/flet/src/flet/testing/flet_test_app.py +++ b/sdk/python/packages/flet/src/flet/testing/flet_test_app.py @@ -169,7 +169,11 @@ async def teardown(self): self.__flutter_process.kill() async def assert_control_screenshot( - self, name: str, control: Control, delay: Optional[ft.DurationValue] = None + self, + name: str, + control: Control, + pump_times: int = 0, + pump_duration: Optional[ft.DurationValue] = None, ): """ Adds control to a clean page, takes a screenshot and compares it with @@ -188,7 +192,8 @@ async def assert_control_screenshot( screenshot = ft.Screenshot(control) self.page.add(screenshot) await self.tester.pump_and_settle() - await self.tester.pump(duration=delay) + for _ in range(0, pump_times): + await self.tester.pump(duration=pump_duration) self.assert_screenshot( name, await screenshot.capture_async(pixel_ratio=pixel_ratio), From a4838fb4f7a695eed8dbf98e08d0f49989cc9e2b Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 8 Aug 2025 11:20:18 -0700 Subject: [PATCH 26/37] Add canvas capture tests and enable full CI matrix Introduces integration tests for the Canvas control's capture functionality, including new golden images for macOS. Fixes a bug in Canvas.clear_capture_async() to call the correct method, and moves screenshot pixel ratio and similarity threshold to FletTestApp instance variables. Also enables all previously commented-out jobs in the AppVeyor CI matrix. --- .appveyor.yml | 148 +++++++++--------- .../golden/macos/canvas/capture_1.png | Bin 0 -> 6030 bytes .../golden/macos/canvas/capture_2.png | Bin 0 -> 6618 bytes .../golden/macos/canvas/capture_3.png | Bin 0 -> 607 bytes .../integration_tests/controls/test_canvas.py | 63 ++++++++ .../src/flet/controls/core/canvas/canvas.py | 14 +- .../flet/src/flet/testing/flet_test_app.py | 18 ++- 7 files changed, 159 insertions(+), 84 deletions(-) create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/capture_1.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/capture_2.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/capture_3.png diff --git a/.appveyor.yml b/.appveyor.yml index 1206dce14..3124a4c84 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -22,9 +22,9 @@ environment: secure: trYGM65OQ1+HYnOYOe/NOHrofLpP3bz64nHwVWPJhiUIYll3MrrQd7ilFNp+zSkI matrix: - # - job_name: Build Flet package for Flutter - # job_group: build_flet_package - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2204 + - job_name: Build Flet package for Flutter + job_group: build_flet_package + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2204 - job_name: Integration tests on macOS job_group: integration_tests @@ -33,77 +33,77 @@ environment: FLET_TEST_SCREENSHOTS_PIXEL_RATIO: 2.0 FLET_TEST_SIMILARITY_THRESHOLD: 99.0 - # - job_name: Build Flet for Windows - # job_group: build_flet - # job_depends_on: build_flet_package - # APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 - - # - job_name: Build Flet for macOS - # job_group: build_flet - # job_depends_on: build_flet_package - # APPVEYOR_BUILD_WORKER_IMAGE: macos-sonoma - - # - job_name: Build Flet for Linux - # job_group: build_flet_linux - # job_depends_on: build_flet_package - # ARCH: amd64 - # PACKAGE_NAME: flet-desktop - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - # - job_name: Build Flet Light for Linux - # job_group: build_flet_linux - # job_depends_on: build_flet_package - # ARCH: amd64 - # PACKAGE_NAME: flet-desktop-light - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - # - job_name: Build Flet for Linux ARM64 - # job_group: build_flet_linux - # job_depends_on: build_flet_package - # ARCH: arm64 - # PACKAGE_NAME: flet-desktop - # PYTHON_VERSION: 3.10 - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004-arm - - # - job_name: Build Flet Light for Linux ARM64 - # job_group: build_flet_linux - # job_depends_on: build_flet_package - # ARCH: arm64 - # PACKAGE_NAME: flet-desktop-light - # PYTHON_VERSION: 3.10 - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004-arm - - # - job_name: Build Flet for web - # job_group: build_flet - # job_depends_on: build_flet_package - # PYODIDE_URL: https://github.com/pyodide/pyodide/releases/download/0.27.7/pyodide-core-0.27.7.tar.bz2 - # PYODIDE_CDN_URL: https://cdn.jsdelivr.net/pyodide/v0.27.7/full - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - # - job_name: Test Python 3.10 - # job_group: python_tests - # PYTHON_VERSION: 3.10 - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - # - job_name: Test Python 3.11 - # job_group: python_tests - # PYTHON_VERSION: 3.11 - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - # - job_name: Test Python 3.12 - # job_group: python_tests - # PYTHON_VERSION: 3.12 - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - # - job_name: Test Python 3.13 - # job_group: python_tests - # PYTHON_VERSION: 3.13 - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 - - # - job_name: Build Python wheels - # job_group: python_build - # job_depends_on: python_tests, build_flet, build_flet_linux - # APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + - job_name: Build Flet for Windows + job_group: build_flet + job_depends_on: build_flet_package + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 + + - job_name: Build Flet for macOS + job_group: build_flet + job_depends_on: build_flet_package + APPVEYOR_BUILD_WORKER_IMAGE: macos-sonoma + + - job_name: Build Flet for Linux + job_group: build_flet_linux + job_depends_on: build_flet_package + ARCH: amd64 + PACKAGE_NAME: flet-desktop + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + - job_name: Build Flet Light for Linux + job_group: build_flet_linux + job_depends_on: build_flet_package + ARCH: amd64 + PACKAGE_NAME: flet-desktop-light + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + - job_name: Build Flet for Linux ARM64 + job_group: build_flet_linux + job_depends_on: build_flet_package + ARCH: arm64 + PACKAGE_NAME: flet-desktop + PYTHON_VERSION: 3.10 + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004-arm + + - job_name: Build Flet Light for Linux ARM64 + job_group: build_flet_linux + job_depends_on: build_flet_package + ARCH: arm64 + PACKAGE_NAME: flet-desktop-light + PYTHON_VERSION: 3.10 + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004-arm + + - job_name: Build Flet for web + job_group: build_flet + job_depends_on: build_flet_package + PYODIDE_URL: https://github.com/pyodide/pyodide/releases/download/0.27.7/pyodide-core-0.27.7.tar.bz2 + PYODIDE_CDN_URL: https://cdn.jsdelivr.net/pyodide/v0.27.7/full + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + - job_name: Test Python 3.10 + job_group: python_tests + PYTHON_VERSION: 3.10 + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + - job_name: Test Python 3.11 + job_group: python_tests + PYTHON_VERSION: 3.11 + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + - job_name: Test Python 3.12 + job_group: python_tests + PYTHON_VERSION: 3.12 + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + - job_name: Test Python 3.13 + job_group: python_tests + PYTHON_VERSION: 3.13 + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 + + - job_name: Build Python wheels + job_group: python_build + job_depends_on: python_tests, build_flet, build_flet_linux + APPVEYOR_BUILD_WORKER_IMAGE: ubuntu2004 matrix: fast_finish: true diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/capture_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/capture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d5cddf7961e97e20c65a7049f8bf27c0d264230a GIT binary patch literal 6030 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 JqGa{vzW|~F9E{% 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 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/capture_3.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/canvas/capture_3.png new file mode 100644 index 0000000000000000000000000000000000000000..82191fb3d3b7f7676ed487787946e70d000a188f GIT binary patch literal 607 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VJUX<4B-HR z8jh3>1_mZhPZ!6KiaBqu8gdx;*fTAws|OnM|UBP*feY-$=% zGZLuVdge^kH;x^PQq$t*D+}GYaZFL@#t*S}j|a(jIbBo~gff&G6@)lOi2(|Of(VuE z^|mbRyUw3Ue*UlWf!K~U`SvG^zG>{36e_bJU$zh_E`dz@YUb(kI?2zt&Tj%qc)I$z JtaD0e0su#5j3od7 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/test_canvas.py b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py index 8674c452a..7ab971e0c 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_canvas.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py @@ -575,3 +575,66 @@ async def test_draw_url_image(flet_app: ftt.FletTestApp, request): pump_times=7, pump_duration=1000, ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_capture(flet_app: ftt.FletTestApp, request): + flet_app.page.theme_mode = ft.ThemeMode.LIGHT + canvas = fc.Canvas( + [ + fc.Circle( + x=50, + y=50, + radius=40, + paint=ft.Paint( + stroke_width=3, + color=ft.Colors.GREEN, + style=ft.PaintingStyle.STROKE, + ), + ) + ], + width=100, + height=100, + ) + screenshot = ft.Screenshot(canvas) + + # clean page + flet_app.page.clean() + await flet_app.tester.pump_and_settle() + + # add canvas to a page, pump and settle + flet_app.page.add(screenshot) + await flet_app.tester.pump_and_settle() + + # ensure there is no initial capture + capture_0 = await canvas.get_capture_async() + assert capture_0 is None + + # take capture and assert + await canvas.capture_async() + capture_1 = await canvas.get_capture_async() + assert capture_1 is not None + flet_app.assert_screenshot("capture_1", capture_1) + + # clean canvas and draw a line + canvas.shapes = [fc.Line(10, 10, 90, 90, ft.Paint(stroke_width=3))] + canvas.update() + await flet_app.tester.pump_and_settle() + + # take screenshot + # it must be a circle striked out with a line (capture + shapes) + capture_2 = await screenshot.capture_async(pixel_ratio=flet_app.pixel_ratio) + flet_app.assert_screenshot("capture_2", capture_2) + + # clean current capture + await canvas.clear_capture_async() + await flet_app.tester.pump_and_settle() + + # take screenshot + # it must be just a single line + capture_3 = await screenshot.capture_async(pixel_ratio=flet_app.pixel_ratio) + flet_app.assert_screenshot("capture_3", capture_3) + + # back to empty capture + capture_4 = await canvas.get_capture_async() + assert capture_4 is None diff --git a/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py b/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py index 2206bf0d2..f166b2ae1 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py +++ b/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py @@ -46,7 +46,8 @@ class Canvas(ConstrainedControl): """ Sampling interval in milliseconds for `on_resize` event. - Setting to `0` calls [`on_resize`][flet.canvas.Canvas.on_resize] immediately on every change. + Setting to `0` calls [`on_resize`][flet.canvas.Canvas.on_resize] immediately + on every change. """ on_resize: Optional[EventHandler[CanvasResizeEvent]] = None @@ -75,7 +76,8 @@ def capture(self): """ Initiates an asynchronous capture of the current canvas state. - This is a non-blocking version of `capture_async()` and should be used in synchronous contexts. + This is a non-blocking version of `capture_async()` and should be used + in synchronous contexts. """ asyncio.create_task(self.capture_async()) @@ -84,7 +86,8 @@ async def get_capture_async(self) -> bytes: Retrieves the most recent canvas capture as PNG bytes. Returns: - bytes: The captured image in PNG format, or an empty result if no capture has been made. + bytes: The captured image in PNG format, or an empty result + if no capture has been made. """ return await self._invoke_method_async("get_capture") @@ -94,12 +97,13 @@ async def clear_capture_async(self): After clearing, no background will be rendered from a prior capture. """ - await self._invoke_method_async("capture") + await self._invoke_method_async("clear_capture") def clear_capture(self): """ Initiates an asynchronous operation to clear the captured canvas image. - This is a non-blocking version of `clear_capture_async()` and should be used in synchronous contexts. + This is a non-blocking version of `clear_capture_async()` and should + be used in synchronous contexts. """ asyncio.create_task(self.clear_capture_async()) diff --git a/sdk/python/packages/flet/src/flet/testing/flet_test_app.py b/sdk/python/packages/flet/src/flet/testing/flet_test_app.py index 22d0c9b08..e962bd46a 100644 --- a/sdk/python/packages/flet/src/flet/testing/flet_test_app.py +++ b/sdk/python/packages/flet/src/flet/testing/flet_test_app.py @@ -17,8 +17,8 @@ from flet.utils.network import get_free_tcp_port from flet.utils.platform_utils import get_bool_env_var -pixel_ratio = float(os.getenv("FLET_TEST_SCREENSHOTS_PIXEL_RATIO", "2.0")) -similarity_threshold = float(os.getenv("FLET_TEST_SIMILARITY_THRESHOLD", "99.0")) +DEFAULT_SCREENSHOTS_PIXEL_RATIO = "2.0" +DEFAULT_SIMILARITY_THRESHOLD = "99.0" class FletTestApp: @@ -34,6 +34,14 @@ def __init__( Flet app test controller is a bridge that connects together a Flet app in Python and a running integration test in Flutter. """ + self.pixel_ratio = float( + os.getenv( + "FLET_TEST_SCREENSHOTS_PIXEL_RATIO", DEFAULT_SCREENSHOTS_PIXEL_RATIO + ) + ) + self.similarity_threshold = float( + os.getenv("FLET_TEST_SIMILARITY_THRESHOLD", DEFAULT_SIMILARITY_THRESHOLD) + ) self.__test_path = test_path self.__flet_app_main = flet_app_main self.__flutter_app_dir = flutter_app_dir @@ -196,7 +204,7 @@ async def assert_control_screenshot( await self.tester.pump(duration=pump_duration) self.assert_screenshot( name, - await screenshot.capture_async(pixel_ratio=pixel_ratio), + await screenshot.capture_async(pixel_ratio=self.pixel_ratio), ) def assert_screenshot(self, name: str, screenshot: bytes): @@ -235,14 +243,14 @@ def assert_screenshot(self, name: str, screenshot: bytes): img = self._load_image_from_bytes(screenshot) similarity = self._compare_images_rgb(golden_img, img) print(f"Similarity for {name}: {similarity}%") - if similarity <= similarity_threshold: + if similarity <= self.similarity_threshold: actual_image_path = ( golden_image_path.parent / f"{golden_image_path.parent.stem}_{golden_image_path.stem}_actual.png" ) with open(actual_image_path, "bw") as f: f.write(screenshot) - assert similarity > similarity_threshold, ( + assert similarity > self.similarity_threshold, ( f"{name} screenshots are not identical" ) From d761dce55edf1032255bb38f2654d75185652dca Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 8 Aug 2025 14:06:35 -0700 Subject: [PATCH 27/37] Refactor control initialization and property handling Introduces a new build() method for control child initialization, refactors property handling using _internals for host_expanded, host_positioned, and skip_properties, and updates Dart logic to use these internals for sizing and positioning. Updates tests and removes obsolete _skip_inherited_notifier logic. This change improves extensibility and consistency in control property management. --- .../flet/lib/src/controls/base_controls.dart | 48 ++++++++++--------- .../flet/src/flet/controls/base_control.py | 9 ++++ .../flet/src/flet/controls/core/column.py | 4 ++ .../flet/src/flet/controls/core/image.py | 4 ++ .../flet/src/flet/controls/core/row.py | 4 ++ .../flet/src/flet/controls/core/stack.py | 4 ++ .../flet/src/flet/controls/core/view.py | 4 ++ .../src/flet/controls/material/container.py | 4 ++ .../src/flet/controls/material/datatable.py | 5 +- .../flet/src/flet/controls/object_patch.py | 4 +- .../flet/src/flet/controls/page_view.py | 4 ++ sdk/python/packages/flet/tests/common.py | 7 +-- .../flet/tests/test_object_diff_frozen.py | 8 +--- .../flet/tests/test_object_diff_in_place.py | 4 ++ 14 files changed, 75 insertions(+), 38 deletions(-) diff --git a/packages/flet/lib/src/controls/base_controls.dart b/packages/flet/lib/src/controls/base_controls.dart index ab04bdcd1..f6019af25 100644 --- a/packages/flet/lib/src/controls/base_controls.dart +++ b/packages/flet/lib/src/controls/base_controls.dart @@ -81,21 +81,15 @@ Widget _directionality(Widget widget, Control control) { } Widget _expandable(Widget widget, Control control) { - var parent = control.parent; - if (parent != null && ["View", "Column", "Row"].contains(parent.type)) { - int? expand = control.properties.containsKey("expand") - ? control.get("expand") == true - ? 1 - : control.get("expand") == false - ? 0 - : control.getInt("expand") - : null; - var expandLoose = control.getBool("expand_loose", false)!; - return expand != null - ? (expandLoose == true) - ? Flexible(flex: expand, child: widget) - : Expanded(flex: expand, child: widget) - : widget; + int? expand = control.get("expand") == true + ? 1 + : control.get("expand") == false + ? 0 + : control.getInt("expand"); + if (expand != null && control.parent?.internals?["host_expanded"] == true) { + return (control.getBool("expand_loose") == true) + ? Flexible(flex: expand, child: widget) + : Expanded(flex: expand, child: widget); } return widget; } @@ -206,8 +200,15 @@ Widget _positionedControl( var right = control.getDouble("right", null); var bottom = control.getDouble("bottom", null); + var errorControl = ErrorControl("Error displaying ${control.type}", + description: + "Control can be positioned absolutely with \"left\", \"top\", \"right\" and \"bottom\" properties inside Stack control only and page.overlay."); + var animation = control.getAnimation("animate_position"); if (animation != null) { + if (control.parent?.internals?["host_positioned"] != true) { + return errorControl; + } if (left == null && top == null && right == null && bottom == null) { left = 0; top = 0; @@ -228,11 +229,8 @@ Widget _positionedControl( child: widget, ); } else if (left != null || top != null || right != null || bottom != null) { - var parent = control.parent; - if (!["Stack", "Page", "Overlay"].contains(parent?.type)) { - return ErrorControl("Error displaying ${control.type}", - description: - "Control can be positioned absolutely with \"left\", \"top\", \"right\" and \"bottom\" properties inside Stack control only."); + if (control.parent?.internals?["host_positioned"] != true) { + return errorControl; } return Positioned( left: left, @@ -246,10 +244,16 @@ Widget _positionedControl( } Widget _sizedControl(Widget widget, Control control) { + final skipProps = control.internals?["skip_properties"] as List?; + if (skipProps?.contains("width") == true || + skipProps?.contains("height") == true) { + return widget; + } + var width = control.getDouble("width"); var height = control.getDouble("height"); - if ((width != null || height != null) && - !["Container", "Image"].contains(control.type)) { + + if ((width != null || height != null)) { widget = ConstrainedBox( constraints: BoxConstraints.tightFor(width: width, height: height), child: widget, diff --git a/sdk/python/packages/flet/src/flet/controls/base_control.py b/sdk/python/packages/flet/src/flet/controls/base_control.py index b63cbf185..1b838026c 100644 --- a/sdk/python/packages/flet/src/flet/controls/base_control.py +++ b/sdk/python/packages/flet/src/flet/controls/base_control.py @@ -133,6 +133,8 @@ def __post_init__(self, ref: Optional[Ref[Any]]): if ref is not None: ref.current = self + self.init() + # control_id = self._i # object_id = id(self) # ctrl_type = self._c @@ -176,6 +178,13 @@ def is_isolated(self): def init(self): pass + def build(self): + """ + Called once during control initialization to define its child controls. + self.page is available in this method. + """ + pass + def before_update(self): """ This method is called every time when this control is being updated. diff --git a/sdk/python/packages/flet/src/flet/controls/core/column.py b/sdk/python/packages/flet/src/flet/controls/core/column.py index be43dc396..ab906b1bb 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/column.py +++ b/sdk/python/packages/flet/src/flet/controls/core/column.py @@ -63,3 +63,7 @@ class Column(ConstrainedControl, ScrollableControl, AdaptiveControl): """ How the runs should be placed in the cross-axis when [`wrap`][flet.Column.wrap] is `True`. """ + + def init(self): + super().init() + self._internals["host_expanded"] = True diff --git a/sdk/python/packages/flet/src/flet/controls/core/image.py b/sdk/python/packages/flet/src/flet/controls/core/image.py index 26d15908e..0a5484965 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/image.py +++ b/sdk/python/packages/flet/src/flet/controls/core/image.py @@ -145,3 +145,7 @@ class Image(ConstrainedControl): Anti-aliasing alleviates the sawtooth artifact when the image is rotated. """ + + def init(self): + super().init() + self._internals["skip_properties"] = ["width", "height"] diff --git a/sdk/python/packages/flet/src/flet/controls/core/row.py b/sdk/python/packages/flet/src/flet/controls/core/row.py index 682360c2e..c12cfdd0b 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/row.py +++ b/sdk/python/packages/flet/src/flet/controls/core/row.py @@ -67,3 +67,7 @@ class Row(ConstrainedControl, ScrollableControl, AdaptiveControl): """ How the runs should be placed in the cross-axis when `wrap=True`. """ + + def init(self): + super().init() + self._internals["host_expanded"] = True diff --git a/sdk/python/packages/flet/src/flet/controls/core/stack.py b/sdk/python/packages/flet/src/flet/controls/core/stack.py index 9842cff07..70023dd65 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/stack.py +++ b/sdk/python/packages/flet/src/flet/controls/core/stack.py @@ -57,3 +57,7 @@ class Stack(ConstrainedControl, AdaptiveControl): """ How to size the non-positioned [`controls`][flet.Stack.controls]. """ + + def init(self): + super().init() + self._internals["host_positioned"] = True diff --git a/sdk/python/packages/flet/src/flet/controls/core/view.py b/sdk/python/packages/flet/src/flet/controls/core/view.py index 771703b8f..eb019156a 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/view.py +++ b/sdk/python/packages/flet/src/flet/controls/core/view.py @@ -165,6 +165,10 @@ def confirm_pop(self, should_pop: bool) -> None: async def confirm_pop_async(self, should_pop: bool) -> None: await self._invoke_method_async("confirm_pop", {"should_pop": should_pop}) + def init(self): + super().init() + self._internals["host_expanded"] = True + # Magic methods def __contains__(self, item: Control) -> bool: return item in self.controls diff --git a/sdk/python/packages/flet/src/flet/controls/material/container.py b/sdk/python/packages/flet/src/flet/controls/material/container.py index 7be6d4a33..ba4414503 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/container.py +++ b/sdk/python/packages/flet/src/flet/controls/material/container.py @@ -352,3 +352,7 @@ def on_hover(e): ft.run(main) ``` """ + + def init(self): + super().init() + self._internals["skip_properties"] = ["width", "height"] diff --git a/sdk/python/packages/flet/src/flet/controls/material/datatable.py b/sdk/python/packages/flet/src/flet/controls/material/datatable.py index 20657d1c6..ee2455b34 100644 --- a/sdk/python/packages/flet/src/flet/controls/material/datatable.py +++ b/sdk/python/packages/flet/src/flet/controls/material/datatable.py @@ -75,12 +75,15 @@ class DataColumn(Control): If not set, the column will not be considered sortable. """ + def init(self): + super().init() + self._internals["skip_properties"] = ["tooltip"] + def before_update(self): super().before_update() assert isinstance(self.label, str) or ( isinstance(self.label, Control) and self.label.visible ), "label must a string or a visible control" - self._internals["skip_properties"] = ["tooltip"] @control("DataCell") diff --git a/sdk/python/packages/flet/src/flet/controls/object_patch.py b/sdk/python/packages/flet/src/flet/controls/object_patch.py index f78dfbe7f..cf8484aa5 100644 --- a/sdk/python/packages/flet/src/flet/controls/object_patch.py +++ b/sdk/python/packages/flet/src/flet/controls/object_patch.py @@ -651,7 +651,7 @@ def _compare_dataclasses(self, parent, path, src, dst, frozen): orig_frozen = getattr(dst, "_frozen", None) if orig_frozen is not None: del dst._frozen - dst.init() + dst.build() dst.before_update() if orig_frozen is not None: object.__setattr__(dst, "_frozen", orig_frozen) @@ -872,7 +872,7 @@ def control_setattr(obj, name, value): if self.control_cls and isinstance(item, self.control_cls): if not configure_setattr_only: - item.init() + item.build() item.before_update() object.__setattr__(item, "_initialized", True) yield item diff --git a/sdk/python/packages/flet/src/flet/controls/page_view.py b/sdk/python/packages/flet/src/flet/controls/page_view.py index 50f30a951..20f7479dd 100644 --- a/sdk/python/packages/flet/src/flet/controls/page_view.py +++ b/sdk/python/packages/flet/src/flet/controls/page_view.py @@ -534,6 +534,10 @@ def __contains__(self, item: Control) -> bool: class Overlay(BaseControl): controls: list[BaseControl] = field(default_factory=list) + def init(self): + super().init() + self._internals["host_positioned"] = True + @control("Dialogs") class Dialogs(BaseControl): diff --git a/sdk/python/packages/flet/tests/common.py b/sdk/python/packages/flet/tests/common.py index b8f90ef0c..98f6a14d9 100644 --- a/sdk/python/packages/flet/tests/common.py +++ b/sdk/python/packages/flet/tests/common.py @@ -35,15 +35,10 @@ class LineChart(ft.ConstrainedControl): ) ) interactive: bool = True - _skip_inherited_notifier: Optional[bool] = None - - def __post_init__(self, ref: Optional[ft.Ref[Any]]): - super().__post_init__(ref) - self._internals["skip_properties"] = ["tooltip"] def init(self): super().init() - self._skip_inherited_notifier = True + self._internals["skip_properties"] = ["tooltip"] def b_pack(data): diff --git a/sdk/python/packages/flet/tests/test_object_diff_frozen.py b/sdk/python/packages/flet/tests/test_object_diff_frozen.py index 73ae92769..44273e0b9 100644 --- a/sdk/python/packages/flet/tests/test_object_diff_frozen.py +++ b/sdk/python/packages/flet/tests/test_object_diff_frozen.py @@ -1,11 +1,10 @@ from dataclasses import dataclass from typing import Optional +import flet as ft import pytest from flet.controls.base_control import BaseControl, control -import flet as ft - from .common import ( LineChart, LineChartData, @@ -333,7 +332,6 @@ def test_lists_with_key_diff(): "path": ["data_series", 0, "points", 2], "value_type": LineChartDataPoint, }, - {"op": "replace", "path": ["_skip_inherited_notifier"], "value": True}, ], ) assert patch[2]["value"].x == 3 @@ -395,7 +393,6 @@ def test_lists_with_no_key_diff(): "path": ["data_series", 0, "points", 2, "y"], "value": 5, }, - {"op": "replace", "path": ["_skip_inherited_notifier"], "value": True}, ], ) @@ -410,7 +407,6 @@ def test_simple_lists_diff_1(): [ {"op": "remove", "path": ["data_series", 0, "points", 0], "value": 1}, {"op": "add", "path": ["data_series", 0, "points", 2], "value": 4}, - {"op": "replace", "path": ["_skip_inherited_notifier"], "value": True}, ], ) @@ -424,7 +420,6 @@ def test_simple_lists_diff_2(): patch, [ {"op": "remove", "path": ["data_series", 0, "points", 1], "value": 2}, - {"op": "replace", "path": ["_skip_inherited_notifier"], "value": True}, ], ) @@ -447,7 +442,6 @@ def test_similar_lists_diff(): "path": ["data_series", 0, "points", 1, "scale"], "value": 2, }, - {"op": "replace", "path": ["_skip_inherited_notifier"], "value": True}, ], ) diff --git a/sdk/python/packages/flet/tests/test_object_diff_in_place.py b/sdk/python/packages/flet/tests/test_object_diff_in_place.py index 3317db3b8..f1d9ca388 100644 --- a/sdk/python/packages/flet/tests/test_object_diff_in_place.py +++ b/sdk/python/packages/flet/tests/test_object_diff_in_place.py @@ -40,6 +40,10 @@ class SuperElevatedButton(ElevatedButton): def init(self): print("SuperElevatedButton.init()") + assert not self.page + + def build(self): + print("SuperElevatedButton.build()") assert self.page From 06ad8ffbf7868729675e79b552746e4dc4645be9 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 8 Aug 2025 14:38:16 -0700 Subject: [PATCH 28/37] Add pixel_ratio support to Canvas capture methods Introduces an optional pixel_ratio argument to Canvas.capture and Canvas.capture_async, allowing control over the resolution of captured images. Updates the Dart backend to use the provided pixel ratio and adjusts integration tests and Python examples to use the new build method instead of init. --- packages/flet/lib/src/controls/canvas.dart | 8 ++++--- sdk/python/examples/apps/todo/todo.py | 4 ++-- .../cookbook/user-control-with-auto-update.py | 2 +- .../examples/tutorials/todo/todo/todo.py | 4 ++-- .../integration_tests/controls/test_canvas.py | 2 +- .../src/flet/controls/core/canvas/canvas.py | 24 +++++++++++++++---- 6 files changed, 31 insertions(+), 13 deletions(-) diff --git a/packages/flet/lib/src/controls/canvas.dart b/packages/flet/lib/src/controls/canvas.dart index 358aab719..d4470f0d2 100644 --- a/packages/flet/lib/src/controls/canvas.dart +++ b/packages/flet/lib/src/controls/canvas.dart @@ -91,6 +91,8 @@ class _CanvasControlState extends State { return; } + var dpr = parseDouble(args["pixel_ratio"]) ?? _dpr; + // Wait for all images to load await _awaitImageLoads(shapes); @@ -109,14 +111,14 @@ class _CanvasControlState extends State { capturedImage: _capturedImage, capturedSize: capturedSize, onPaintCallback: (_) {}, - dpr: _dpr); + dpr: dpr); painter.paint(canvas, _lastSize); final picture = recorder.endRecording(); _capturedImage = await picture.toImage( - (_lastSize.width * _dpr).toInt(), - (_lastSize.height * _dpr).toInt(), + (_lastSize.width * dpr).toInt(), + (_lastSize.height * dpr).toInt(), ); _capturedSize = _lastSize; return; diff --git a/sdk/python/examples/apps/todo/todo.py b/sdk/python/examples/apps/todo/todo.py index a545c1019..edae3ed20 100644 --- a/sdk/python/examples/apps/todo/todo.py +++ b/sdk/python/examples/apps/todo/todo.py @@ -8,7 +8,7 @@ def __init__(self, task_name, task_delete): self.task_name = task_name self.task_delete = task_delete - def init(self): + def build(self): self.display_task = ft.Checkbox( value=False, label=self.task_name, on_change=self.status_changed ) @@ -72,7 +72,7 @@ def delete_clicked(self, e): class TodoApp(ft.Column): # application's root control is a Column containing all other controls - def init(self): + def build(self): self.new_task = ft.TextField( hint_text="What needs to be done?", on_submit=self.add_clicked, expand=True ) diff --git a/sdk/python/examples/cookbook/user-control-with-auto-update.py b/sdk/python/examples/cookbook/user-control-with-auto-update.py index 2319081b0..1cea40f98 100644 --- a/sdk/python/examples/cookbook/user-control-with-auto-update.py +++ b/sdk/python/examples/cookbook/user-control-with-auto-update.py @@ -8,7 +8,7 @@ class MyPanel(ft.Container): greeting: str = "Hi" # called only once - def init(self): + def build(self): print(self.page.platform) self.content = ft.Column( [ diff --git a/sdk/python/examples/tutorials/todo/todo/todo.py b/sdk/python/examples/tutorials/todo/todo/todo.py index a545c1019..edae3ed20 100644 --- a/sdk/python/examples/tutorials/todo/todo/todo.py +++ b/sdk/python/examples/tutorials/todo/todo/todo.py @@ -8,7 +8,7 @@ def __init__(self, task_name, task_delete): self.task_name = task_name self.task_delete = task_delete - def init(self): + def build(self): self.display_task = ft.Checkbox( value=False, label=self.task_name, on_change=self.status_changed ) @@ -72,7 +72,7 @@ def delete_clicked(self, e): class TodoApp(ft.Column): # application's root control is a Column containing all other controls - def init(self): + def build(self): self.new_task = ft.TextField( hint_text="What needs to be done?", on_submit=self.add_clicked, expand=True ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_canvas.py b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py index 7ab971e0c..7f8a03338 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_canvas.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_canvas.py @@ -611,7 +611,7 @@ async def test_capture(flet_app: ftt.FletTestApp, request): assert capture_0 is None # take capture and assert - await canvas.capture_async() + await canvas.capture_async(pixel_ratio=flet_app.pixel_ratio) capture_1 = await canvas.get_capture_async() assert capture_1 is not None flet_app.assert_screenshot("capture_1", capture_1) diff --git a/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py b/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py index f166b2ae1..3209a93d9 100644 --- a/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py +++ b/sdk/python/packages/flet/src/flet/controls/core/canvas/canvas.py @@ -63,23 +63,39 @@ def before_update(self): if self.height is None: self.height = float("inf") - async def capture_async(self): + async def capture_async(self, pixel_ratio: Optional[Number] = None): """ Captures the current visual state of the canvas asynchronously. The captured image is stored internally and will be rendered as a background beneath all subsequently drawn shapes. + + Args: + pixel_ratio: + The pixel density multiplier to use when rendering the capture. + `1.0` means 1 device pixel per logical pixel (no scaling). + Values greater than `1.0` produce higher-resolution captures. + If `None`, the device's default pixel ratio is used. """ - await self._invoke_method_async("capture") + await self._invoke_method_async( + "capture", arguments={"pixel_ratio": pixel_ratio} + ) - def capture(self): + def capture(self, pixel_ratio: Optional[Number] = None): """ Initiates an asynchronous capture of the current canvas state. This is a non-blocking version of `capture_async()` and should be used in synchronous contexts. + + Args: + pixel_ratio: + The pixel density multiplier to use when rendering the capture. + `1.0` means 1 device pixel per logical pixel (no scaling). + Values greater than `1.0` produce higher-resolution captures. + If `None`, the device's default pixel ratio is used. """ - asyncio.create_task(self.capture_async()) + asyncio.create_task(self.capture_async(pixel_ratio=pixel_ratio)) async def get_capture_async(self) -> bytes: """ From 40a15e61ea8597722989ad0025a21b21a2bdee27 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 8 Aug 2025 16:31:11 -0700 Subject: [PATCH 29/37] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- sdk/python/packages/flet/src/flet/controls/base_control.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/python/packages/flet/src/flet/controls/base_control.py b/sdk/python/packages/flet/src/flet/controls/base_control.py index 1b838026c..8736367c0 100644 --- a/sdk/python/packages/flet/src/flet/controls/base_control.py +++ b/sdk/python/packages/flet/src/flet/controls/base_control.py @@ -257,7 +257,10 @@ async def _trigger_event(self, event_name: str, event_data: Any): _context_page.set(self.page) UpdateBehavior.reset() - assert self.page, "Control must be added on a page first." + assert self.page, ( + "Control must be added to a page before triggering events. " + "Use page.add(control) or add it to a parent control that's on a page." + ) session = self.page.get_session() # Handle async and sync event handlers accordingly From dfa72997dd30b9814378a338192acba3863f45e0 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 8 Aug 2025 17:10:08 -0700 Subject: [PATCH 30/37] Update __init__.py --- sdk/python/packages/flet/src/flet/__init__.py | 584 +++++++++--------- 1 file changed, 292 insertions(+), 292 deletions(-) diff --git a/sdk/python/packages/flet/src/flet/__init__.py b/sdk/python/packages/flet/src/flet/__init__.py index 3f865d9ea..ae8f1c657 100644 --- a/sdk/python/packages/flet/src/flet/__init__.py +++ b/sdk/python/packages/flet/src/flet/__init__.py @@ -492,121 +492,89 @@ from flet.pubsub.pubsub_hub import PubSubHub __all__ = [ - "app", - "app_async", - "run", - "run_async", - "alignment", - "border", - "border_radius", - "margin", - "padding", "AdaptiveControl", + "AlertDialog", "Alignment", - "Axis", + "AnimatedSwitcher", + "AnimatedSwitcherTransition", "Animation", "AnimationCurve", "AnimationStyle", "AnimationValue", + "AppBar", + "AppBarTheme", + "AppLifecycleState", + "AppLifecycleStateChangeEvent", + "AppView", + "Assertiveness", + "AutoComplete", + "AutoCompleteSelectEvent", + "AutoCompleteSuggestion", + "AutofillGroup", + "AutofillGroupDisposeAction", + "AutofillHint", + "AutomaticNotchShape", + "Axis", + "Badge", + "BadgeTheme", + "BadgeValue", + "Banner", + "BannerTheme", "BaseControl", - "control", + "BeveledRectangleBorder", + "BlendMode", "Blur", + "BlurStyle", "BlurTileMode", "BlurValue", "Border", + "BorderRadius", + "BorderRadiusValue", "BorderSide", "BorderSideStrokeAlign", "BorderSideStrokeAlignValue", "BorderStyle", - "BorderRadius", - "BorderRadiusValue", - "BlurStyle", + "BottomAppBar", + "BottomAppBarTheme", + "BottomSheet", + "BottomSheetTheme", "BoxConstraints", "BoxDecoration", "BoxFit", "BoxShadow", "BoxShadowValue", "BoxShape", - "ColorFilter", - "DecorationImage", - "FilterQuality", - "BeveledRectangleBorder", + "Brightness", + "BrowserContextMenu", + "Button", "ButtonStyle", + "Card", + "CardTheme", + "CardVariant", + "Checkbox", + "CheckboxTheme", + "Chip", + "ChipTheme", + "CircleAvatar", "CircleBorder", - "ContinuousRectangleBorder", - "OutlinedBorder", - "RoundedRectangleBorder", - "ShapeBorder", - "StadiumBorder", + "CircularRectangleNotchShape", + "ClipBehavior", + "Clipboard", + "ColorFilter", + "ColorScheme", + "ColorValue", "Colors", + "Column", "ConstrainedControl", - "context", + "Container", + "ContinuousRectangleBorder", "Control", "ControlBuilder", "ControlEvent", "ControlEventHandler", - "Event", - "EventControlType", - "EventHandler", "ControlState", "ControlStateValue", - "AnimatedSwitcher", - "AnimatedSwitcherTransition", - "AutofillGroup", - "AutofillGroupDisposeAction", - "AutofillHint", - "Column", - "Dismissible", - "DismissibleDismissEvent", - "DismissibleUpdateEvent", - "DragTarget", - "DragTargetEvent", - "DragTargetLeaveEvent", - "DragWillAcceptEvent", - "Draggable", - "FletApp", - "GestureDetector", - "GridView", - "Icon", - "Image", - "InteractiveViewer", - "KeyDownEvent", - "KeyRepeatEvent", - "KeyUpEvent", - "KeyboardListener", - "ListView", - "Markdown", - "MarkdownCodeTheme", - "MarkdownCustomCodeTheme", - "MarkdownExtensionSet", - "MarkdownStyleSheet", - "MergeSemantics", - "Pagelet", - "Placeholder", - "ReorderableDraggable", - "ResponsiveRow", - "Row", - "SafeArea", - "Screenshot", - "Semantics", - "ShaderMask", - "Stack", - "StackFit", - "Text", - "TextAffinity", - "TextSelection", - "TextSelectionChangeCause", - "TextSelectionChangeEvent", - "TextSpan", - "TransparentPointer", - "View", - "Window", - "WindowEvent", - "WindowEventType", - "WindowResizeEdge", - "WindowDragArea", - "cupertino_colors", - "cupertino_icons", + "CrossAxisAlignment", "CupertinoActionSheet", "CupertinoActionSheetAction", "CupertinoActivityIndicator", @@ -634,288 +602,320 @@ "CupertinoSlidingSegmentedButton", "CupertinoSwitch", "CupertinoTextField", - "OverlayVisibilityMode", "CupertinoTimerPicker", "CupertinoTimerPickerMode", "CupertinoTintedButton", - "data_view", - "DialogControl", - "DateTimeValue", - "Duration", - "DurationValue", - "DragEndEvent", - "DragStartEvent", - "DragUpdateEvent", - "HoverEvent", - "LongPressEndEvent", - "LongPressStartEvent", - "MultiTapEvent", - "PointerEvent", - "ScaleEndEvent", - "ScaleStartEvent", - "ScaleUpdateEvent", - "ScrollEvent", - "TapEvent", - "FletException", - "FletPageDisconnectedException", - "FletUnimplementedPlatformException", - "FletUnsupportedPlatformException", - "Rect", - "Size", - "Gradient", - "GradientTileMode", - "LinearGradient", - "RadialGradient", - "SweepGradient", - "Key", - "KeyValue", - "ScrollKey", - "ValueKey", - "Margin", - "MarginValue", - "dropdown", - "dropdownm2", - "icons", - "AlertDialog", - "AppBar", - "AutoComplete", - "AutoCompleteSelectEvent", - "AutoCompleteSuggestion", - "Badge", - "BadgeValue", - "Banner", - "BottomAppBar", - "BottomSheet", - "Button", - "Card", - "CardVariant", - "Checkbox", - "Chip", - "CircleAvatar", - "Container", "DataCell", "DataColumn", "DataColumnSortEvent", "DataRow", "DataTable", + "DataTableTheme", "DatePicker", "DatePickerEntryMode", "DatePickerEntryModeChangeEvent", "DatePickerMode", + "DatePickerTheme", + "DateTimeValue", + "DecorationImage", + "DialogControl", + "DialogTheme", + "DismissDirection", + "Dismissible", + "DismissibleDismissEvent", + "DismissibleUpdateEvent", "Divider", + "DividerTheme", + "DragEndEvent", + "DragStartEvent", + "DragTarget", + "DragTargetEvent", + "DragTargetLeaveEvent", + "DragUpdateEvent", + "DragWillAcceptEvent", + "Draggable", "Dropdown", - "DropdownOption", "DropdownM2", + "DropdownOption", + "DropdownTheme", + "Duration", + "DurationValue", "ElevatedButton", + "ElevatedButtonTheme", + "Event", + "EventControlType", + "EventHandler", "ExpansionPanel", "ExpansionPanelList", "ExpansionTile", - "TileAffinity", + "ExpansionTileTheme", + "FilePicker", + "FilePickerFile", + "FilePickerFileType", + "FilePickerUploadEvent", + "FilePickerUploadFile", "FilledButton", + "FilledButtonTheme", "FilledTonalButton", + "FilterQuality", + "FletApp", + "FletException", + "FletPageDisconnectedException", + "FletUnimplementedPlatformException", + "FletUnsupportedPlatformException", "FloatingActionButton", - "InputBorder", + "FloatingActionButtonLocation", + "FloatingActionButtonTheme", + "FontWeight", + "GestureDetector", + "Gradient", + "GradientTileMode", + "GridView", + "HapticFeedback", + "HoverEvent", + "Icon", "IconButton", + "IconButtonTheme", + "IconTheme", + "IconValue", + "IconValueOrControl", "Icons", - "ListTile", - "ListTileStyle", - "ListTileTitleAlignment", - "MenuBar", - "MenuStyle", - "MenuItemButton", - "NavigationBar", + "Image", + "ImageRepeat", + "InputBorder", + "InputFilter", + "InteractiveViewer", + "Key", + "KeyDownEvent", + "KeyRepeatEvent", + "KeyUpEvent", + "KeyValue", + "KeyboardEvent", + "KeyboardListener", + "KeyboardType", + "LabelPosition", + "LinearGradient", + "ListTile", + "ListTileStyle", + "ListTileTheme", + "ListTileTitleAlignment", + "ListView", + "Locale", + "LocaleConfiguration", + "LoginEvent", + "LongPressEndEvent", + "LongPressStartEvent", + "MainAxisAlignment", + "Margin", + "MarginValue", + "Markdown", + "MarkdownCodeTheme", + "MarkdownCustomCodeTheme", + "MarkdownExtensionSet", + "MarkdownStyleSheet", + "MenuBar", + "MenuItemButton", + "MenuStyle", + "MergeSemantics", + "MouseCursor", + "MultiTapEvent", + "MultiView", + "MultiViewAddEvent", + "MultiViewRemoveEvent", + "NavigationBar", "NavigationBarDestination", "NavigationBarLabelBehavior", + "NavigationBarTheme", "NavigationDrawer", "NavigationDrawerDestination", "NavigationDrawerPosition", + "NavigationDrawerTheme", "NavigationRail", "NavigationRailDestination", "NavigationRailLabelType", + "NavigationRailTheme", + "NotchShape", + "Number", + "NumbersOnlyInputFilter", + "Offset", + "OffsetValue", + "OnReorderEvent", + "OnScrollEvent", + "Orientation", + "OutlinedBorder", "OutlinedButton", + "OutlinedButtonTheme", + "OverlayVisibilityMode", + "Padding", + "PaddingValue", + "Page", + "PageMediaData", + "PagePlatform", + "PageResizeEvent", + "PageTransitionTheme", + "PageTransitionsTheme", + "PageView", + "Pagelet", + "Paint", + "PaintGradient", + "PaintLinearGradient", + "PaintRadialGradient", + "PaintSweepGradient", + "PaintingStyle", + "Placeholder", + "PointerDeviceType", + "PointerEvent", "PopupMenuButton", "PopupMenuItem", "PopupMenuPosition", + "PopupMenuTheme", "ProgressBar", + "ProgressIndicatorTheme", "ProgressRing", + "PubSubClient", + "PubSubHub", + "QueryString", + "RadialGradient", "Radio", "RadioGroup", + "RadioTheme", "RangeSlider", - "OnReorderEvent", + "Rect", + "Ref", + "ReorderableDraggable", "ReorderableListView", + "ResponsiveNumber", + "ResponsiveRow", + "ResponsiveRowBreakpoint", + "Rotate", + "RotateValue", + "RoundedRectangleBorder", + "RouteChangeEvent", + "RouteUrlStrategy", + "Row", + "SafeArea", + "Scale", + "ScaleEndEvent", + "ScaleStartEvent", + "ScaleUpdateEvent", + "ScaleValue", + "Screenshot", + "ScrollDirection", + "ScrollEvent", + "ScrollKey", + "ScrollMode", + "ScrollType", + "ScrollableControl", + "ScrollbarTheme", "SearchBar", + "SearchBarTheme", + "SearchViewTheme", "Segment", "SegmentedButton", + "SegmentedButtonTheme", "SelectionArea", + "Semantics", + "SemanticsService", + "Service", + "ShaderMask", + "ShakeDetector", + "ShapeBorder", + "SharedPreferences", + "Size", "Slider", "SliderInteraction", - "DismissDirection", + "SliderTheme", "SnackBar", "SnackBarAction", "SnackBarBehavior", + "SnackBarTheme", + "Stack", + "StackFit", + "StadiumBorder", + "StoragePaths", + "StrOrControl", + "StrokeCap", + "StrokeJoin", + "StrutStyle", "SubmenuButton", + "SupportsStr", + "SweepGradient", "Switch", + "SwitchTheme", + "SystemOverlayStyle", "Tab", "TabAlignment", "TabBar", "TabBarHoverEvent", "TabBarIndicatorSize", + "TabBarTheme", "TabBarView", "TabIndicatorAnimation", "Tabs", - "UnderlineTabIndicator", + "TapEvent", + "TemplateRoute", + "Text", + "TextAffinity", + "TextAlign", + "TextBaseline", "TextButton", - "InputFilter", - "KeyboardType", - "NumbersOnlyInputFilter", + "TextButtonTheme", "TextCapitalization", + "TextDecoration", + "TextDecorationStyle", "TextField", "TextOnlyInputFilter", + "TextOverflow", + "TextSelection", + "TextSelectionChangeCause", + "TextSelectionChangeEvent", + "TextSpan", + "TextStyle", + "TextTheme", + "TextThemeStyle", + "Theme", + "ThemeMode", + "TileAffinity", "TimePicker", "TimePickerEntryMode", "TimePickerEntryModeChangeEvent", + "TimePickerTheme", "Tooltip", + "TooltipTheme", "TooltipTriggerMode", "TooltipValue", - "VerticalDivider", - "MultiView", - "Padding", - "PaddingValue", - "AppLifecycleStateChangeEvent", - "KeyboardEvent", - "LoginEvent", - "MultiViewAddEvent", - "MultiViewRemoveEvent", - "Page", - "RouteChangeEvent", - "ViewPopEvent", - "PageMediaData", - "PageResizeEvent", - "PageView", - "Paint", - "PaintGradient", - "PaintLinearGradient", - "PaintRadialGradient", - "PaintSweepGradient", - "PaintingStyle", - "QueryString", - "Ref", - "OnScrollEvent", - "ScrollDirection", - "ScrollType", - "ScrollableControl", - "BrowserContextMenu", - "Clipboard", - "FilePicker", - "FilePickerFile", - "FilePickerFileType", - "FilePickerUploadEvent", - "FilePickerUploadFile", - "HapticFeedback", - "Assertiveness", - "SemanticsService", - "Service", - "ShakeDetector", - "SharedPreferences", - "StoragePaths", + "TransparentPointer", + "UnderlineTabIndicator", + "UpdateBehavior", "UrlLauncher", - "TemplateRoute", - "StrutStyle", - "TextBaseline", - "TextDecoration", - "TextDecorationStyle", - "TextOverflow", - "TextStyle", - "TextThemeStyle", - "AppBarTheme", - "BadgeTheme", - "BannerTheme", - "BottomAppBarTheme", - "BottomSheetTheme", - "CardTheme", - "CheckboxTheme", - "ChipTheme", - "ColorScheme", - "DataTableTheme", - "DatePickerTheme", - "DialogTheme", - "DividerTheme", - "DropdownTheme", - "ElevatedButtonTheme", - "ExpansionTileTheme", - "FilledButtonTheme", - "FloatingActionButtonTheme", - "IconButtonTheme", - "IconTheme", - "ListTileTheme", - "NavigationBarTheme", - "NavigationDrawerTheme", - "NavigationRailTheme", - "OutlinedButtonTheme", - "PageTransitionTheme", - "PageTransitionsTheme", - "PopupMenuTheme", - "ProgressIndicatorTheme", - "RadioTheme", - "ScrollbarTheme", - "SearchBarTheme", - "SearchViewTheme", - "SegmentedButtonTheme", - "SliderTheme", - "SnackBarTheme", - "SwitchTheme", - "SystemOverlayStyle", - "TabBarTheme", - "TextButtonTheme", - "TextTheme", - "Theme", - "TimePickerTheme", - "TooltipTheme", - "Offset", - "OffsetValue", - "Rotate", - "RotateValue", - "Scale", - "ScaleValue", - "AppLifecycleState", - "AppView", - "AutomaticNotchShape", - "BlendMode", - "Brightness", - "CircularRectangleNotchShape", - "ClipBehavior", - "ColorValue", - "CrossAxisAlignment", - "FloatingActionButtonLocation", - "FontWeight", - "IconValue", - "IconValueOrControl", - "ImageRepeat", - "LabelPosition", - "Locale", - "LocaleConfiguration", - "MainAxisAlignment", - "MouseCursor", - "NotchShape", - "Number", - "Orientation", - "PagePlatform", - "PointerDeviceType", - "ResponsiveNumber", - "ResponsiveRowBreakpoint", - "RouteUrlStrategy", - "ScrollMode", - "StrOrControl", - "StrokeCap", - "StrokeJoin", - "SupportsStr", - "TextAlign", - "ThemeMode", "UrlTarget", + "ValueKey", "VerticalAlignment", + "VerticalDivider", + "View", + "ViewPopEvent", "VisualDensity", "WebRenderer", - "UpdateBehavior", - "PubSubClient", - "PubSubHub", + "Window", + "WindowDragArea", + "WindowEvent", + "WindowEventType", + "WindowResizeEdge", + "alignment", + "app", + "app_async", + "border", + "border_radius", + "context", + "control", + "cupertino_colors", + "cupertino_icons", + "data_view", + "dropdown", + "dropdownm2", + "icons", + "margin", + "padding", + "run", + "run_async", ] From c36c5f4f8bc53173f06c8ab90f4c1b4c02bf7fd5 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Sat, 9 Aug 2025 02:26:33 +0200 Subject: [PATCH 31/37] improve some docstrings --- .../flet/src/flet/controls/page_view.py | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/sdk/python/packages/flet/src/flet/controls/page_view.py b/sdk/python/packages/flet/src/flet/controls/page_view.py index 20f7479dd..700481017 100644 --- a/sdk/python/packages/flet/src/flet/controls/page_view.py +++ b/sdk/python/packages/flet/src/flet/controls/page_view.py @@ -11,7 +11,6 @@ from flet.controls.box import BoxDecoration from flet.controls.control import Control from flet.controls.control_event import ( - ControlEventHandler, Event, EventHandler, ) @@ -129,7 +128,7 @@ class PageView(AdaptiveControl): Each [View][flet.View] represents a distinct navigation state or screen in the application. - + The first view in the list is considered the active one by default. """ @@ -157,26 +156,32 @@ class PageView(AdaptiveControl): show_semantics_debugger: Optional[bool] = None """ - `True` turns on an overlay that shows the accessibility information reported by the - framework. + Whether to turn on an overlay that shows the accessibility information + reported by the framework. """ width: Optional[Number] = None """ - Page width in logical pixels (read-only). + Page width in logical pixels. - To get or set the full window width including window chrome (e.g., - title bar and borders) when running a Flet app on desktop, - use the `page.window.width` property instead. + Note: + - This property is read-only. + - To get or set the full window height including window chrome (e.g., + title bar and borders) when running a Flet app on desktop, + use the [`width`][flet.Window.width] property of + [`Page.window`][flet.Page.window] instead. """ height: Optional[Number] = None """ - Page height in logical pixels (read-only). + Page height in logical pixels. - To get or set the full window height including window chrome (e.g., - title bar and borders) when running a Flet app on desktop, - use the `page.window.height` property instead. + Note: + - This property is read-only. + - To get or set the full window height including window chrome (e.g., + title bar and borders) when running a Flet app on desktop, + use the [`height`][flet.Window.height] property of + [`Page.window`][flet.Page.window] instead. """ title: Optional[str] = None @@ -209,11 +214,9 @@ def page_resize(e): ``` """ - on_media_change: Optional[ControlEventHandler["PageView"]] = None + on_media_change: Optional[EventHandler[PageMediaData]] = None """ - Called when `page.media` has changed. - - Event type: [`PageMediaData`][flet.PageMediaData] + Called when `media` has changed. """ _overlay: "Overlay" = field(default_factory=lambda: Overlay()) From 035ad3d2e85d481e8d4bb4a5872f504826dba506 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Sat, 9 Aug 2025 02:27:48 +0200 Subject: [PATCH 32/37] `on_media_change` event receives new media data --- packages/flet/lib/src/flet_backend.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flet/lib/src/flet_backend.dart b/packages/flet/lib/src/flet_backend.dart index 7b9f76800..84274135e 100644 --- a/packages/flet/lib/src/flet_backend.dart +++ b/packages/flet/lib/src/flet_backend.dart @@ -345,7 +345,7 @@ class FletBackend extends ChangeNotifier { debugPrint("Page media updated: $newMedia"); media = newMedia; updateControl(page.id, {"media": newMedia.toMap()}); - triggerControlEvent(page, "media_change"); + triggerControlEvent(page, "media_change", newMedia.toMap()); notifyListeners(); } From 03fb5cbd4e89490d900a0d1fcdf9d8400383f607 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 8 Aug 2025 17:43:37 -0700 Subject: [PATCH 33/37] Canvas example: Add image saving and optimize canvas capture Introduced a 'Save image' button that allows users to save the canvas as a PNG file. Optimized the brush drawing by batching shape captures every 30 shapes, clearing the canvas after each capture, and improved state management using a dataclass. Also updated the canvas background to white and added a border for better visibility. --- sdk/python/examples/controls/canvas/brush.py | 54 +++++++++++++++----- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/sdk/python/examples/controls/canvas/brush.py b/sdk/python/examples/controls/canvas/brush.py index 781e9ffdd..f3780ac29 100644 --- a/sdk/python/examples/controls/canvas/brush.py +++ b/sdk/python/examples/controls/canvas/brush.py @@ -1,10 +1,16 @@ +from dataclasses import dataclass + import flet as ft import flet.canvas as cv +MAX_SHAPES_PER_CAPTURE = 30 + +@dataclass class State: - x: float - y: float + x: float = 0 + y: float = 0 + shapes_count: int = 1 state = State() @@ -13,11 +19,15 @@ class State: def main(page: ft.Page): page.title = "Canvas Example" + file_picker = ft.FilePicker() + page.services.append(file_picker) + def handle_pan_start(e: ft.DragStartEvent): state.x = e.local_position.x state.y = e.local_position.y - def handle_pan_update(e: ft.DragUpdateEvent): + async def handle_pan_update(e: ft.DragUpdateEvent): + ft.UpdateBehavior.disable_auto_update() canvas.shapes.append( cv.Line( x1=state.x, @@ -28,21 +38,21 @@ def handle_pan_update(e: ft.DragUpdateEvent): ) ) canvas.update() + state.shapes_count += 1 + + if state.shapes_count == MAX_SHAPES_PER_CAPTURE: + await canvas.capture_async() + canvas.shapes.clear() + canvas.update() + state.shapes_count = 0 + state.x = e.local_position.x state.y = e.local_position.y canvas = cv.Canvas( expand=False, shapes=[ - cv.Fill( - ft.Paint( - gradient=ft.PaintLinearGradient( - begin=(0, 0), - end=(600, 600), - colors=[ft.Colors.CYAN_50, ft.Colors.GREY], - ) - ) - ), + cv.Fill(ft.Paint(color=ft.Colors.WHITE)), ], content=ft.GestureDetector( on_pan_start=handle_pan_start, @@ -51,13 +61,31 @@ def handle_pan_update(e: ft.DragUpdateEvent): ), ) + async def save_image(): + await canvas.capture_async() + capture = await canvas.get_capture_async() + if capture: + file_path = await file_picker.save_file_async( + file_name="flet_picture.png", src_bytes=capture + ) + if file_path and page.platform in [ + ft.PagePlatform.MACOS, + ft.PagePlatform.WINDOWS, + ft.PagePlatform.LINUX, + ]: + with open(file_path, "wb") as f: + f.write(capture) + page.add( + ft.Button("Save image", on_click=save_image), ft.Container( content=canvas, border_radius=5, + border=ft.Border.all(2), + bgcolor=ft.Colors.WHITE, width=float("inf"), expand=True, - ) + ), ) From 083ce4ee61718e4b448c85b82d9fc19b265ab3c0 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 8 Aug 2025 18:01:23 -0700 Subject: [PATCH 34/37] Refactor canvas shape constructors to use keyword args Updated all canvas shape and path constructors in example files to use explicit keyword arguments for clarity and consistency. Added documentation for the Image control and updated the canvas documentation index to include gradients and the new Image page. --- .../examples/controls/canvas/bezier_curves.py | 40 ++++++++----- .../controls/canvas/brush_on_image.py | 8 +-- .../examples/controls/canvas/dash_strokes.py | 60 +++++++++---------- .../examples/controls/canvas/flet_logo.py | 16 ++--- .../examples/controls/canvas/smiling_face.py | 20 +++++-- .../examples/controls/canvas/triangles.py | 12 ++-- .../flet/docs/controls/canvas/image.md | 5 ++ .../flet/docs/controls/canvas/index.md | 8 ++- sdk/python/packages/flet/mkdocs.yml | 1 + 9 files changed, 101 insertions(+), 69 deletions(-) create mode 100644 sdk/python/packages/flet/docs/controls/canvas/image.md diff --git a/sdk/python/examples/controls/canvas/bezier_curves.py b/sdk/python/examples/controls/canvas/bezier_curves.py index 896ff10b3..020c43fc9 100644 --- a/sdk/python/examples/controls/canvas/bezier_curves.py +++ b/sdk/python/examples/controls/canvas/bezier_curves.py @@ -10,13 +10,13 @@ def main(page: ft.Page): cv.Path( paint=ft.Paint(stroke_width=2, style=ft.PaintingStyle.STROKE), elements=[ - cv.Path.MoveTo(75, 25), - cv.Path.QuadraticTo(25, 25, 25, 62.5), - cv.Path.QuadraticTo(25, 100, 50, 100), - cv.Path.QuadraticTo(50, 120, 30, 125), - cv.Path.QuadraticTo(60, 120, 65, 100), - cv.Path.QuadraticTo(125, 100, 125, 62.5), - cv.Path.QuadraticTo(125, 25, 75, 25), + cv.Path.MoveTo(x=75, y=25), + cv.Path.QuadraticTo(cp1x=25, cp1y=25, x=25, y=62.5), + cv.Path.QuadraticTo(cp1x=25, cp1y=100, x=50, y=100), + cv.Path.QuadraticTo(cp1x=50, cp1y=120, x=30, y=125), + cv.Path.QuadraticTo(cp1x=60, cp1y=120, x=65, y=100), + cv.Path.QuadraticTo(cp1x=125, cp1y=100, x=125, y=62.5), + cv.Path.QuadraticTo(cp1x=125, cp1y=25, x=75, y=25), ], ), cv.Path( @@ -25,13 +25,25 @@ def main(page: ft.Page): x=100, y=100, elements=[ - cv.Path.MoveTo(75, 40), - cv.Path.CubicTo(75, 37, 70, 25, 50, 25), - cv.Path.CubicTo(20, 25, 20, 62.5, 20, 62.5), - cv.Path.CubicTo(20, 80, 40, 102, 75, 120), - cv.Path.CubicTo(110, 102, 130, 80, 130, 62.5), - cv.Path.CubicTo(130, 62.5, 130, 25, 100, 25), - cv.Path.CubicTo(85, 25, 75, 37, 75, 40), + cv.Path.MoveTo(x=75, y=40), + cv.Path.CubicTo( + cp1x=75, cp1y=37, cp2x=70, cp2y=25, x=50, y=25 + ), + cv.Path.CubicTo( + cp1x=20, cp1y=25, cp2x=20, cp2y=62.5, x=20, y=62.5 + ), + cv.Path.CubicTo( + cp1x=20, cp1y=80, cp2x=40, cp2y=102, x=75, y=120 + ), + cv.Path.CubicTo( + cp1x=110, cp1y=102, cp2x=130, cp2y=80, x=130, y=62.5 + ), + cv.Path.CubicTo( + cp1x=130, cp1y=62.5, cp2x=130, cp2y=25, x=100, y=25 + ), + cv.Path.CubicTo( + cp1x=85, cp1y=25, cp2x=75, cp2y=37, x=75, y=40 + ), ], ) ], diff --git a/sdk/python/examples/controls/canvas/brush_on_image.py b/sdk/python/examples/controls/canvas/brush_on_image.py index 2b212260c..235b04c79 100644 --- a/sdk/python/examples/controls/canvas/brush_on_image.py +++ b/sdk/python/examples/controls/canvas/brush_on_image.py @@ -20,10 +20,10 @@ def handle_pan_start(e: ft.DragStartEvent): def handle_pan_update(e: ft.DragUpdateEvent): canvas.shapes.append( cv.Line( - state.x, - state.y, - e.local_position.x, - e.local_position.y, + x1=state.x, + y1=state.y, + x2=e.local_position.x, + y2=e.local_position.y, paint=ft.Paint(stroke_width=3), ) ) diff --git a/sdk/python/examples/controls/canvas/dash_strokes.py b/sdk/python/examples/controls/canvas/dash_strokes.py index a3d5c5fd7..ebb47cd44 100644 --- a/sdk/python/examples/controls/canvas/dash_strokes.py +++ b/sdk/python/examples/controls/canvas/dash_strokes.py @@ -26,11 +26,11 @@ def main(page: ft.Page): fc.Canvas( [ fc.Line( - 30, - 30, - 200, - 100, - ft.Paint( + x1=30, + y1=30, + x2=200, + y2=100, + paint=ft.Paint( color=ft.Colors.BLACK, stroke_width=3, stroke_dash_pattern=[4, 4] @@ -40,10 +40,10 @@ def main(page: ft.Page): ), ), fc.Circle( - 150, - 150, - 130, - ft.Paint( + x=150, + y=150, + radius=130, + paint=ft.Paint( color=ft.Colors.BLUE, stroke_width=4, stroke_dash_pattern=[4, 4] @@ -53,10 +53,10 @@ def main(page: ft.Page): ), ), fc.Oval( - 10, - 10, - 240, - 140, + x=10, + y=10, + width=240, + height=140, paint=ft.Paint( color=ft.Colors.GREEN, stroke_width=4, @@ -67,12 +67,12 @@ def main(page: ft.Page): ), ), fc.Arc( - 20, - 20, - 220, - 220, - 0, - math.pi, + x=20, + y=20, + width=220, + height=220, + start_angle=0, + sweep_angle=math.pi, paint=ft.Paint( color=ft.Colors.RED, stroke_width=4, @@ -83,11 +83,11 @@ def main(page: ft.Page): ), ), fc.Rect( - 40, - 60, - 60, - 70, - 0, + x=40, + y=60, + width=60, + height=70, + border_radius=0, paint=ft.Paint( color=ft.Colors.RED, stroke_width=4, @@ -98,12 +98,12 @@ def main(page: ft.Page): ), ), fc.Arc( - 50, - 50, - 170, - 140, - math.pi * 0.1, - math.pi * 0.4, + x=50, + y=50, + width=170, + height=140, + start_angle=math.pi * 0.1, + sweep_angle=math.pi * 0.4, paint=ft.Paint( color=ft.Colors.YELLOW, stroke_width=4, diff --git a/sdk/python/examples/controls/canvas/flet_logo.py b/sdk/python/examples/controls/canvas/flet_logo.py index 98099ab8b..6d96d2202 100644 --- a/sdk/python/examples/controls/canvas/flet_logo.py +++ b/sdk/python/examples/controls/canvas/flet_logo.py @@ -12,10 +12,10 @@ def main(page: ft.Page): shapes=[ cv.Path( elements=[ - cv.Path.MoveTo(25, 125), - cv.Path.QuadraticTo(50, 25, 135, 35, 0.35), - cv.Path.QuadraticTo(75, 115, 135, 215, 0.6), - cv.Path.QuadraticTo(50, 225, 25, 125, 0.35), + cv.Path.MoveTo(x=25, y=125), + cv.Path.QuadraticTo(cp1x=50, cp1y=25, x=135, y=35, w=0.35), + cv.Path.QuadraticTo(cp1x=75, cp1y=115, x=135, y=215, w=0.6), + cv.Path.QuadraticTo(cp1x=50, cp1y=225, x=25, y=125, w=0.35), ], paint=ft.Paint( stroke_width=2, @@ -25,10 +25,10 @@ def main(page: ft.Page): ), cv.Path( elements=[ - cv.Path.MoveTo(85, 125), - cv.Path.QuadraticTo(120, 85, 165, 75, 0.5), - cv.Path.QuadraticTo(120, 115, 165, 175, 0.3), - cv.Path.QuadraticTo(120, 165, 85, 125, 0.5), + cv.Path.MoveTo(x=85, y=125), + cv.Path.QuadraticTo(cp1x=120, cp1y=85, x=165, y=75, w=0.5), + cv.Path.QuadraticTo(cp1x=120, cp1y=115, x=165, y=175, w=0.3), + cv.Path.QuadraticTo(cp1x=120, cp1y=165, x=85, y=125, w=0.5), ], paint=ft.Paint( stroke_width=2, diff --git a/sdk/python/examples/controls/canvas/smiling_face.py b/sdk/python/examples/controls/canvas/smiling_face.py index a1f550171..68361350c 100644 --- a/sdk/python/examples/controls/canvas/smiling_face.py +++ b/sdk/python/examples/controls/canvas/smiling_face.py @@ -13,12 +13,20 @@ def main(page: ft.Page): width=float("inf"), expand=True, shapes=[ - cv.Circle(100, 100, 50, stroke_paint), - cv.Circle(80, 90, 10, stroke_paint), - cv.Circle(84, 87, 5, fill_paint), - cv.Circle(120, 90, 10, stroke_paint), - cv.Circle(124, 87, 5, fill_paint), - cv.Arc(70, 95, 60, 40, 0, math.pi, paint=stroke_paint), + cv.Circle(x=100, y=100, radius=50, paint=stroke_paint), + cv.Circle(x=80, y=90, radius=10, paint=stroke_paint), + cv.Circle(x=84, y=87, radius=5, paint=fill_paint), + cv.Circle(x=120, y=90, radius=10, paint=stroke_paint), + cv.Circle(x=124, y=87, radius=5, paint=fill_paint), + cv.Arc( + x=70, + y=95, + width=60, + height=40, + start_angle=0, + sweep_angle=math.pi, + paint=stroke_paint, + ), ], ) ) diff --git a/sdk/python/examples/controls/canvas/triangles.py b/sdk/python/examples/controls/canvas/triangles.py index f5c5c5ad3..bb3c0d109 100644 --- a/sdk/python/examples/controls/canvas/triangles.py +++ b/sdk/python/examples/controls/canvas/triangles.py @@ -11,17 +11,17 @@ def main(page: ft.Page): cv.Path( paint=ft.Paint(style=ft.PaintingStyle.FILL), elements=[ - cv.Path.MoveTo(25, 25), - cv.Path.LineTo(105, 25), - cv.Path.LineTo(25, 105), + cv.Path.MoveTo(x=25, y=25), + cv.Path.LineTo(x=105, y=25), + cv.Path.LineTo(x=25, y=105), ], ), cv.Path( paint=ft.Paint(stroke_width=2, style=ft.PaintingStyle.STROKE), elements=[ - cv.Path.MoveTo(125, 125), - cv.Path.LineTo(125, 45), - cv.Path.LineTo(45, 125), + cv.Path.MoveTo(x=125, y=125), + cv.Path.LineTo(x=125, y=45), + cv.Path.LineTo(x=45, y=125), cv.Path.Close(), ], ), diff --git a/sdk/python/packages/flet/docs/controls/canvas/image.md b/sdk/python/packages/flet/docs/controls/canvas/image.md new file mode 100644 index 000000000..7585cfcb3 --- /dev/null +++ b/sdk/python/packages/flet/docs/controls/canvas/image.md @@ -0,0 +1,5 @@ +### Examples + +See [these](index.md#examples). + +::: flet.canvas.Image diff --git a/sdk/python/packages/flet/docs/controls/canvas/index.md b/sdk/python/packages/flet/docs/controls/canvas/index.md index cc5d67cef..5ae415d21 100644 --- a/sdk/python/packages/flet/docs/controls/canvas/index.md +++ b/sdk/python/packages/flet/docs/controls/canvas/index.md @@ -52,7 +52,7 @@ /// caption /// -### Free-hand drawing with brush +### Free-hand drawing with image capture ```python --8<-- "../../examples/controls/canvas/brush.py" @@ -62,4 +62,10 @@ /// caption /// +### Gradients + +```python +--8<-- "../../examples/controls/canvas/gradients.py" +``` + ::: flet.canvas.Canvas diff --git a/sdk/python/packages/flet/mkdocs.yml b/sdk/python/packages/flet/mkdocs.yml index 73487f0ae..f73b21ee3 100644 --- a/sdk/python/packages/flet/mkdocs.yml +++ b/sdk/python/packages/flet/mkdocs.yml @@ -277,6 +277,7 @@ nav: - Circle: controls/canvas/circle.md - Color: controls/canvas/color.md - Fill: controls/canvas/fill.md + - Image: controls/canvas/image.md - Line: controls/canvas/line.md - Oval: controls/canvas/oval.md - Path: controls/canvas/path.md From 7eb6bb4cedaad5c8427d4ef7ef8f2198a23821b8 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 8 Aug 2025 18:35:34 -0700 Subject: [PATCH 35/37] Add platform checks and validation to FilePicker methods Introduced platform-specific validation in FilePicker: 'get_directory_path' now raises NotImplementedError on web, and 'save_file' raises ValueError if required arguments are missing on web, iOS, or Android. Updated docstrings to clarify argument requirements and platform behavior. --- .../src/flet/controls/services/file_picker.py | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/sdk/python/packages/flet/src/flet/controls/services/file_picker.py b/sdk/python/packages/flet/src/flet/controls/services/file_picker.py index 2213c2ac1..889f98981 100644 --- a/sdk/python/packages/flet/src/flet/controls/services/file_picker.py +++ b/sdk/python/packages/flet/src/flet/controls/services/file_picker.py @@ -6,19 +6,21 @@ from flet.controls.base_control import control from flet.controls.control_event import Event, EventHandler from flet.controls.services.service import Service +from flet.controls.types import PagePlatform __all__ = [ "FilePicker", - "FilePickerUploadEvent", + "FilePickerFile", "FilePickerFileType", + "FilePickerUploadEvent", "FilePickerUploadFile", - "FilePickerFile", ] class FilePickerFileType(Enum): """ - Defines the file types that can be selected using the [`FilePicker`][flet.FilePicker]. + Defines the file types that can be selected using the + [`FilePicker`][flet.FilePicker]. """ ANY = "any" @@ -28,7 +30,8 @@ class FilePickerFileType(Enum): MEDIA = "media" """ - A combination of [`VIDEO`][flet.FilePickerFileType.VIDEO] and [`IMAGE`][flet.FilePickerFileType.IMAGE]. + A combination of [`VIDEO`][flet.FilePickerFileType.VIDEO] and + [`IMAGE`][flet.FilePickerFileType.IMAGE]. """ IMAGE = "image" @@ -130,12 +133,14 @@ async def upload_async(self, files: list[FilePickerUploadFile]): """ Uploads selected files to specified upload URLs. - Before calling this method, [`pick_files_async()`][flet.FilePicker.pick_files_async] + Before calling this method, + [`pick_files_async()`][flet.FilePicker.pick_files_async] must be called, so that the internal file picker selection is not empty. Args: files: A list of [`FilePickerUploadFile`][flet.FilePickerUploadFile], where - each item specifies which file to upload, and where (with PUT or POST). + each item specifies which file to upload, and where + (with PUT or POST). """ await self._invoke_method_async( "upload", @@ -146,12 +151,14 @@ def upload(self, files: list[FilePickerUploadFile]): """ Uploads selected files to specified upload URLs. - Before calling this method, [`pick_files_async()`][flet.FilePicker.pick_files_async] + Before calling this method, + [`pick_files_async()`][flet.FilePicker.pick_files_async] must be called, so that the internal file picker selection is not empty. Args: files: A list of [`FilePickerUploadFile`][flet.FilePickerUploadFile], where - each item specifies which file to upload, and where (with PUT or POST). + each item specifies which file to upload, and where + (with PUT or POST). """ asyncio.create_task(self.upload_async(files)) @@ -166,7 +173,15 @@ async def get_directory_path_async( Args: dialog_title: The title of the dialog window. Defaults to [`FilePicker. initial_directory: The initial directory where the dialog should open. + + Raises: + NotImplementedError: if called in web app. """ + if self.page.web: + raise NotImplementedError( + "Get Directory Path dialog is not supported on web." + ) + return await self._invoke_method_async( "get_directory_path", { @@ -194,48 +209,32 @@ async def save_file_async( file_name: The default file name. initial_directory: The initial directory where the dialog should open. file_type: The file types allowed to be selected. - src_bytes: TBA + src_bytes: The contents of a file. Must be provided in web, + iOS or Android modes. allowed_extensions: The allowed file extensions. Has effect only if - `file_type` is [`FilePickerFileType.CUSTOM`][flet.FilePickerFileType.CUSTOM]. + `file_type` is + [`FilePickerFileType.CUSTOM`][flet.FilePickerFileType.CUSTOM]. Note: - - This method only opens a dialog for the user to select a location and file name, - and returns the chosen path. The file itself is not created or saved. - - This method is only available on desktop platforms (Linux, macOS & Windows). - - Info: Saving a file on web - To save a file from the web, you actually don't need to use a `FilePicker`. + - On desktop this method only opens a dialog for the user to select + a location and file name, and returns the chosen path. The file + itself is not created or saved. - You can instead provide an API endpoint `/download/:filename` that returns the - file content, and then use - [`page.launch_url`][flet.Page.launch_url] to open the url, which - will trigger the browser's save file dialog. - - Take [FastAPI](https://flet.dev/docs/publish/web/dynamic-website#advanced-fastapi-scenarios) - as an example, you can use the following code to implement the endpoint: - - ```python - from fastapi import FastAPI, Response - from fastapi.responses import FileResponse - - app = flet_fastapi.app(main) - - @app.get("/download/{filename}") - def download(filename: str): - path = prepare_file(filename) - return FileResponse(path) - ``` - - and then use `page.launch_url("/download/myfile.txt")` to open the url, for - instance, when a button is clicked. + Raises: + ValueError: if `src_bytes` is not provided in web, iOS or Android modes. + ValueError: if `file_name` is not provided in web mode. + """ - ```python - ft.ElevatedButton( - "Download myfile", - on_click=lambda _: page.launch_url("/download/myfile.txt"), + if ( + self.page.web + or self.page.platform in [PagePlatform.ANDROID, PagePlatform.IOS] + ) and not src_bytes: + raise ValueError( + '"src_bytes" is required when saving a file on Web, Android and iOS.' ) - ``` - """ + if self.page.web and not file_name: + raise ValueError('"file_name" is required when saving a file on Web.') + return await self._invoke_method_async( "save_file", { @@ -266,7 +265,8 @@ async def pick_files_async( file_type: The file types allowed to be selected. allow_multiple: Allow the selection of multiple files at once. allowed_extensions: The allowed file extensions. Has effect only if - `file_type` is [`FilePickerFileType.CUSTOM`][flet.FilePickerFileType.CUSTOM]. + `file_type` is + [`FilePickerFileType.CUSTOM`][flet.FilePickerFileType.CUSTOM]. """ files = await self._invoke_method_async( "pick_files", From 36d9da49824c8980a86a43c48079bc12da5e7c71 Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Fri, 8 Aug 2025 18:35:45 -0700 Subject: [PATCH 36/37] Remove base64 decoding fallback in loadCanvasImage Eliminated the code path that attempted to decode the image source as base64 when 'src' is provided. Now, an exception is thrown if neither 'src' nor 'src_bytes' is present, clarifying the expected input and simplifying image loading logic. --- packages/flet/lib/src/controls/canvas.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/flet/lib/src/controls/canvas.dart b/packages/flet/lib/src/controls/canvas.dart index d4470f0d2..23b6bd269 100644 --- a/packages/flet/lib/src/controls/canvas.dart +++ b/packages/flet/lib/src/controls/canvas.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'dart:ui' as ui; @@ -562,8 +561,6 @@ Future loadCanvasImage(Control shape) async { } bytes = resp.bodyBytes; } - } else if (src != null) { - bytes = base64Decode(src); } else { throw Exception("Missing image source: 'src' or 'src_bytes'"); } From e67d21bf8afcd6c1c3a6560dc0eb8cc5a03dbbee Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Sat, 9 Aug 2025 04:27:20 +0200 Subject: [PATCH 37/37] use FletExceptions and remove outdated brush.gif --- .../examples/controls/canvas/brush_on_image.py | 6 +++--- .../examples/controls/canvas/dash_strokes.py | 12 ++++++------ .../examples/controls/canvas/media/brush.gif | Bin 308623 -> 0 bytes .../flet/docs/controls/canvas/index.md | 4 ---- .../src/flet/controls/services/file_picker.py | 11 ++++------- 5 files changed, 13 insertions(+), 20 deletions(-) delete mode 100644 sdk/python/examples/controls/canvas/media/brush.gif diff --git a/sdk/python/examples/controls/canvas/brush_on_image.py b/sdk/python/examples/controls/canvas/brush_on_image.py index 235b04c79..0ffc3f80f 100644 --- a/sdk/python/examples/controls/canvas/brush_on_image.py +++ b/sdk/python/examples/controls/canvas/brush_on_image.py @@ -33,6 +33,9 @@ def handle_pan_update(e: ft.DragUpdateEvent): page.add( ft.Container( + border_radius=5, + width=float("inf"), + expand=True, content=ft.Stack( controls=[ ft.Image( @@ -50,9 +53,6 @@ def handle_pan_update(e: ft.DragUpdateEvent): ), ] ), - border_radius=5, - width=float("inf"), - expand=True, ) ) diff --git a/sdk/python/examples/controls/canvas/dash_strokes.py b/sdk/python/examples/controls/canvas/dash_strokes.py index ebb47cd44..478d5a304 100644 --- a/sdk/python/examples/controls/canvas/dash_strokes.py +++ b/sdk/python/examples/controls/canvas/dash_strokes.py @@ -20,11 +20,14 @@ def main(page: ft.Page): ft.ControlBuilder( state, lambda state: ft.SafeArea( - ft.Column( - [ + expand=True, + content=ft.Column( + controls=[ ft.Button("Toggle strokes", on_click=state.toggle_strokes), fc.Canvas( - [ + width=300, + height=300, + shapes=[ fc.Line( x1=30, y1=30, @@ -115,12 +118,9 @@ def main(page: ft.Page): use_center=True, ), ], - width=300, - height=300, ), ] ), - expand=True, ), expand=True, ) diff --git a/sdk/python/examples/controls/canvas/media/brush.gif b/sdk/python/examples/controls/canvas/media/brush.gif deleted file mode 100644 index 7c3af11aec2b15973b8a9e93e9e693b97dad1f3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 308623 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≤_@fb; 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 z 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