Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 20 additions & 17 deletions packages/flet/lib/src/controls/canvas.dart
Original file line number Diff line number Diff line change
Expand Up @@ -193,9 +193,6 @@ class FletCustomPainter extends CustomPainter {
void paint(Canvas canvas, Size size) {
onPaintCallback(size);

debugPrint("paint.size: $size");
//debugPrint("paint.shapes: $shapes");

canvas.save();
canvas.scale(dpr);
canvas.clipRect(Rect.fromLTWH(0, 0, size.width, size.height));
Expand Down Expand Up @@ -541,16 +538,19 @@ Future<void> loadCanvasImage(Control shape) async {
final completer = Completer();
shape.properties["_loading"] = completer;

final src = shape.getString("src");
final srcBytes = shape.get("src_bytes") as Uint8List?;
final src = shape.getSrc("src");

try {
Uint8List bytes;

if (srcBytes != null) {
bytes = srcBytes;
} else if (src != null) {
var assetSrc = shape.backend.getAssetSource(src);
if (src.error != null) {
throw Exception("Error decoding src: ${src.error}");
}

if (src.hasBytes) {
bytes = src.bytes!;
} else if (src.hasUri) {
var assetSrc = shape.backend.getAssetSource(src.uri!);
if (assetSrc.isFile) {
final file = File(assetSrc.path);
bytes = await file.readAsBytes();
Expand All @@ -562,7 +562,7 @@ Future<void> loadCanvasImage(Control shape) async {
bytes = resp.bodyBytes;
}
} else {
throw Exception("Missing image source: 'src' or 'src_bytes'");
throw Exception("Missing image source: 'src'");
}

final codec = await ui.instantiateImageCodec(bytes, allowUpscaling: false);
Expand All @@ -579,12 +579,15 @@ Future<void> loadCanvasImage(Control shape) async {
}
}

/// Produces a fast hash for the `src` so Canvas can tell when it needs to
/// refetch the image. Inline strings and bytes use FNV to avoid massive hashes.
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;
final src = shape.getSrc("src");
if (src.hasUri) {
return src.uri!.hashCode;
}
if (src.hasBytes) {
return fnv1aHash(src.bytes!);
}
return 0;
}
46 changes: 6 additions & 40 deletions packages/flet/lib/src/controls/circle_avatar.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
import 'package:flet/flet.dart';
import 'package:flutter/material.dart';

import '../extensions/control.dart';
import '../models/control.dart';
import '../utils/colors.dart';
import '../utils/numbers.dart';
import 'base_controls.dart';

class CircleAvatarControl extends StatelessWidget {
final Control control;

Expand All @@ -18,39 +13,10 @@ class CircleAvatarControl extends StatelessWidget {
Widget build(BuildContext context) {
debugPrint("CircleAvatar build: ${control.id}");

var foregroundImageSrc = control.getString("foreground_image_src");
var backgroundImageSrc = control.getString("background_image_src");
var content = control.buildTextOrWidget("content");

ImageProvider<Object>? backgroundImage;
ImageProvider<Object>? foregroundImage;

if (foregroundImageSrc != null || backgroundImageSrc != null) {
var assetSrc = control.backend
.getAssetSource((foregroundImageSrc ?? backgroundImageSrc)!);

// foregroundImage
if (foregroundImageSrc != null) {
if (assetSrc.isFile) {
// from File
foregroundImage = AssetImage(assetSrc.path);
} else {
// URL
foregroundImage = NetworkImage(assetSrc.path);
}
}

// backgroundImage
if (backgroundImageSrc != null) {
if (assetSrc.isFile) {
// from File
backgroundImage = AssetImage(assetSrc.path);
} else {
// URL
backgroundImage = NetworkImage(assetSrc.path);
}
}
}
var foregroundImage =
control.getImageProvider("foreground_image_src", context);
var backgroundImage =
control.getImageProvider("background_image_src", context);

var avatar = CircleAvatar(
foregroundImage: foregroundImage,
Expand All @@ -70,7 +36,7 @@ class CircleAvatarControl extends StatelessWidget {
control.triggerEvent("image_error", "foreground");
}
: null,
child: content);
child: control.buildTextOrWidget("content"));

return LayoutControl(control: control, child: avatar);
}
Expand Down
17 changes: 7 additions & 10 deletions packages/flet/lib/src/controls/cupertino_switch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

import '../models/control.dart';
import '../utils/box.dart';
import '../utils/colors.dart';
import '../utils/icons.dart';
import '../utils/images.dart';
import '../utils/misc.dart';
import '../utils/numbers.dart';
import 'base_controls.dart';
Expand Down Expand Up @@ -85,18 +85,17 @@ class _CupertinoSwitchControlState extends State<CupertinoSwitchControl> {

var materialThumbColor =
widget.control.getWidgetStateColor("thumb_color", theme);
// var materialTrackColor =
// widget.control.getWidgetStateColor("track_color", theme);
var activeThumbImage = widget.control.getString("active_thumb_image");
var inactiveThumbImage = widget.control.getString("inactive_thumb_image");
var activeThumbImage =
widget.control.getImageProvider("active_thumb_image_src", context);
var inactiveThumbImage =
widget.control.getImageProvider("inactive_thumb_image_src", context);

var swtch = CupertinoSwitch(
autofocus: autofocus,
focusNode: _focusNode,
activeTrackColor:
widget.control.getColor("active_track_color", context),
thumbColor: materialThumbColor?.resolve({}),
//inactiveTrackColor: materialTrackColor?.resolve({}),
focusColor: widget.control.getColor("focusColor", context),
inactiveTrackColor:
widget.control.getColor("inactive_track_color", context),
Expand All @@ -107,10 +106,8 @@ class _CupertinoSwitchControlState extends State<CupertinoSwitchControl> {
trackOutlineWidth:
widget.control.getWidgetStateDouble("track_outline_width"),
thumbIcon: widget.control.getWidgetStateIcon("thumb_icon", theme),
inactiveThumbImage:
getImageProvider(context, inactiveThumbImage, null, null),
activeThumbImage:
getImageProvider(context, activeThumbImage, null, null),
inactiveThumbImage: inactiveThumbImage,
activeThumbImage: activeThumbImage,
onActiveThumbImageError: activeThumbImage == null
? null
: (Object exception, StackTrace? stackTrace) {
Expand Down
18 changes: 5 additions & 13 deletions packages/flet/lib/src/controls/image.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import 'dart:typed_data';

import 'package:flutter/material.dart';

import '../extensions/control.dart';
Expand All @@ -26,20 +24,14 @@ class ImageControl extends StatelessWidget {
Widget build(BuildContext context) {
debugPrint("Image build: ${control.id}");

var src = control.getString("src", "")!;
var srcBase64 = control.getString("src_base64", "")!;
var srcBytes = (control.get("src_bytes") as Uint8List?) ?? Uint8List(0);
if (src == "" && srcBase64 == "" && srcBytes.isEmpty) {
return const ErrorControl(
"Image must have either \"src\" or \"src_base64\" or \"src_bytes\" specified.");
var rawSrc = control.get("src");
if (rawSrc == null) {
return const ErrorControl("Image must have \"src\" specified.");
}
var errorContent = control.buildWidget("error_content");

Widget? image = buildImage(
context: context,
src: src,
srcBase64: srcBase64,
srcBytes: srcBytes,
src: rawSrc,
width: control.getDouble("width"),
height: control.getDouble("height"),
cacheWidth: control.getInt("cache_width"),
Expand All @@ -55,7 +47,7 @@ class ImageControl extends StatelessWidget {
filterQuality:
control.getFilterQuality("filter_quality", FilterQuality.medium)!,
disabled: control.disabled,
errorCtrl: errorContent,
errorCtrl: control.buildWidget("error_content"),
);
return LayoutControl(
control: control,
Expand Down
12 changes: 1 addition & 11 deletions packages/flet/lib/src/controls/markdown.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@ import 'package:markdown/markdown.dart' as md;

import '../extensions/control.dart';
import '../models/control.dart';
import '../utils/box.dart';
import '../utils/images.dart';
import '../utils/launch_url.dart';
import '../utils/markdown.dart';
import '../utils/numbers.dart';
import '../utils/uri.dart';
import '../widgets/error.dart';
import 'base_controls.dart';
import 'highlight_view.dart';

Expand Down Expand Up @@ -51,17 +49,9 @@ class MarkdownControl extends StatelessWidget {
},
styleSheet: mdStyleSheet,
imageBuilder: (Uri uri, String? title, String? alt) {
String s = uri.toString();
var srcBase64 = isBase64ImageString(s) ? s : null;
var src = isUrlOrPath(s) ? s : null;
if (src == null && srcBase64 == null) {
return ErrorControl("Invalid image URI: $s");
}

return buildImage(
context: context,
src: src,
srcBase64: srcBase64,
src: uri.toString(),
semanticsLabel: alt,
disabled: control.disabled,
errorCtrl: control.buildWidget("image_error_content"));
Expand Down
2 changes: 1 addition & 1 deletion packages/flet/lib/src/controls/slider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class _SliderControlState extends State<SliderControl> {
_value = value;
var props = {"value": value};
widget.control.updateProperties(props, notify: true);
widget.control.triggerEvent("change");
widget.control.triggerEvent("change", value);
}

@override
Expand Down
Loading
Loading