From 1ba9106d0be0022473aaf0d904fac4a932995770 Mon Sep 17 00:00:00 2001 From: Yegor Vialov Date: Sat, 14 Mar 2020 17:56:07 +0000 Subject: [PATCH] Show entity picture while camera stream loading --- .../camera/widgets/camera_stream_view.dart | 20 +++--- lib/entities/entity_picture.widget.dart | 68 +++++++++++++++++++ lib/main.dart | 1 + 3 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 lib/entities/entity_picture.widget.dart diff --git a/lib/entities/camera/widgets/camera_stream_view.dart b/lib/entities/camera/widgets/camera_stream_view.dart index c4cf062..4a29714 100644 --- a/lib/entities/camera/widgets/camera_stream_view.dart +++ b/lib/entities/camera/widgets/camera_stream_view.dart @@ -3,9 +3,8 @@ part of '../../../main.dart'; class CameraStreamView extends StatefulWidget { final bool withControls; - final CameraEntity entity; - CameraStreamView({Key key, this.withControls: true, this.entity}) : super(key: key); + CameraStreamView({Key key, this.withControls: true}) : super(key: key); @override _CameraStreamViewState createState() => _CameraStreamViewState(); @@ -35,7 +34,7 @@ class _CameraStreamViewState extends State { } Logger.d("[Camera Player] Loading resources"); _loading = Completer(); - _entity = widget.entity ?? EntityModel + _entity = EntityModel .of(context) .entityWrapper .entity; @@ -106,14 +105,14 @@ class _CameraStreamViewState extends State { Widget screenWidget; if (!_isLoaded) { screenWidget = Center( - child: CircularProgressIndicator() + child: EntityPicture() ); } else if (_entity.supportStream) { if (_videoPlayerController.value.initialized) { screenWidget = VideoPlayer(_videoPlayerController); } else { screenWidget = Center( - child: CircularProgressIndicator() + child: EntityPicture() ); } } else { @@ -192,9 +191,14 @@ class _CameraStreamViewState extends State { Navigator.of(context).push( MaterialPageRoute( builder: (conext) => FullScreenPage( - child: CameraStreamView( - withControls: false, - entity: _entity, + child: EntityModel( + child: CameraStreamView( + withControls: false + ), + handleTap: false, + entityWrapper: EntityWrapper( + entity: _entity + ), ), ), fullscreenDialog: true diff --git a/lib/entities/entity_picture.widget.dart b/lib/entities/entity_picture.widget.dart new file mode 100644 index 0000000..a85cc60 --- /dev/null +++ b/lib/entities/entity_picture.widget.dart @@ -0,0 +1,68 @@ +part of '../main.dart'; + +class EntityPicture extends StatelessWidget { + + final EdgeInsetsGeometry padding; + + const EntityPicture({Key key, this.padding: const EdgeInsets.all(0.0)}) : super(key: key); + + int getDefaultIconByEntityId(String entityId, String deviceClass, String state) { + String domain = entityId.split(".")[0]; + String iconNameByDomain = MaterialDesignIcons.defaultIconsByDomains["$domain.$state"] ?? MaterialDesignIcons.defaultIconsByDomains["$domain"]; + String iconNameByDeviceClass; + if (deviceClass != null) { + iconNameByDeviceClass = MaterialDesignIcons.defaultIconsByDeviceClass["$domain.$deviceClass.$state"] ?? MaterialDesignIcons.defaultIconsByDeviceClass["$domain.$deviceClass"]; + } + String iconName = iconNameByDeviceClass ?? iconNameByDomain; + if (iconName != null) { + return MaterialDesignIcons.iconsDataMap[iconName] ?? 0; + } else { + return 0; + } + } + + Widget buildIcon(EntityWrapper data) { + if (data == null) { + return null; + } + String iconName = data.icon; + int iconCode = 0; + if (iconName.length > 0) { + iconCode = MaterialDesignIcons.getIconCodeByIconName(iconName); + } else { + iconCode = getDefaultIconByEntityId(data.entity.entityId, + data.entity.deviceClass, data.entity.state); // + } + Widget iconPicture = Container( + child: Center( + child: Icon( + IconData(iconCode, fontFamily: 'Material Design Icons'), + size: Sizes.largeIconSize, + color: EntityColor.defaultStateColor, + ) + ) + ); + + + if (data.entityPicture != null) { + return CachedNetworkImage( + imageUrl: data.entityPicture, + errorWidget: (context, _, __) => iconPicture, + placeholder: (context, _) => iconPicture, + ); + } + + return iconPicture; + } + + @override + Widget build(BuildContext context) { + final EntityWrapper entityWrapper = EntityModel.of(context).entityWrapper; + return Padding( + padding: padding, + child: buildIcon( + entityWrapper + ), + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index d60b2e1..1f46ec1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -88,6 +88,7 @@ part 'entities/slider/widgets/slider_controls.dart'; part 'entities/text/widgets/text_input_state.dart'; part 'entities/select/widgets/select_state.dart'; part 'entities/simple_state.widget.dart'; +part 'entities/entity_picture.widget.dart'; part 'entities/timer/widgets/timer_state.dart'; part 'entities/climate/widgets/climate_state.widget.dart'; part 'entities/cover/widgets/cover_state.dart';