From eb7d17d147f6b3264714dd07462a7f7f93a453d8 Mon Sep 17 00:00:00 2001 From: estevez-dev Date: Thu, 21 Feb 2019 16:32:55 +0200 Subject: [PATCH] WIP #308 Move entity icon generation into EntityIcon widget --- .../button_entity_container.dart | 2 +- lib/entity_widgets/common/badge.dart | 14 +++-- lib/entity_widgets/entity_icon.dart | 54 +++++++++++++++++-- .../glance_entity_container.dart | 2 +- lib/mdi.class.dart | 16 +++--- lib/ui_widgets/card_widget.dart | 2 +- 6 files changed, 70 insertions(+), 20 deletions(-) diff --git a/lib/entity_widgets/button_entity_container.dart b/lib/entity_widgets/button_entity_container.dart index 373f8d8..8f8dd55 100644 --- a/lib/entity_widgets/button_entity_container.dart +++ b/lib/entity_widgets/button_entity_container.dart @@ -22,7 +22,7 @@ class ButtonEntityContainer extends StatelessWidget { fit: BoxFit.fitHeight, child: EntityIcon( padding: EdgeInsets.fromLTRB(2.0, 6.0, 2.0, 2.0), - iconSize: Sizes.iconSize, + size: Sizes.iconSize, ) ), ), diff --git a/lib/entity_widgets/common/badge.dart b/lib/entity_widgets/common/badge.dart index 76a5670..38567ec 100644 --- a/lib/entity_widgets/common/badge.dart +++ b/lib/entity_widgets/common/badge.dart @@ -27,14 +27,20 @@ class BadgeWidget extends StatelessWidget { case "media_player": case "binary_sensor": { - badgeIcon = MaterialDesignIcons.createIconWidgetFromEntityData( - entityModel.entityWrapper, iconSize, Colors.black); + badgeIcon = EntityIcon( + padding: EdgeInsets.all(0.0), + size: iconSize, + color: Colors.black + ); break; } case "device_tracker": { - badgeIcon = MaterialDesignIcons.createIconWidgetFromEntityData( - entityModel.entityWrapper, iconSize, Colors.black); + badgeIcon = EntityIcon( + padding: EdgeInsets.all(0.0), + size: iconSize, + color: Colors.black + ); onBadgeTextValue = entityModel.entityWrapper.entity.state; break; } diff --git a/lib/entity_widgets/entity_icon.dart b/lib/entity_widgets/entity_icon.dart index 76e69e7..f7f7242 100644 --- a/lib/entity_widgets/entity_icon.dart +++ b/lib/entity_widgets/entity_icon.dart @@ -3,20 +3,64 @@ part of '../main.dart'; class EntityIcon extends StatelessWidget { final EdgeInsetsGeometry padding; - final double iconSize; + final double size; + final Color color; - const EntityIcon({Key key, this.iconSize: Sizes.iconSize, this.padding: const EdgeInsets.fromLTRB( + const EntityIcon({Key key, this.color, this.size: Sizes.iconSize, this.padding: const EdgeInsets.fromLTRB( Sizes.leftWidgetPadding, 0.0, 12.0, 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, Color color) { + if (data == null) { + return null; + } + if (data.entity.entityPicture != null) { + return CircleAvatar( + radius: size/2, + backgroundColor: Colors.white, + backgroundImage: CachedNetworkImageProvider( + "$homeAssistantWebHost${data.entity.entityPicture}", + ), + ); + } else { + 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); // + } + return Icon( + IconData(iconCode, fontFamily: 'Material Design Icons'), + size: size, + color: color, + ); + } + } + @override Widget build(BuildContext context) { final EntityWrapper entityWrapper = EntityModel.of(context).entityWrapper; return Padding( padding: padding, - child: MaterialDesignIcons.createIconWidgetFromEntityData( + child: buildIcon( entityWrapper, - iconSize, - EntityColor.stateColor(entityWrapper.entity.state) + color ?? EntityColor.stateColor(entityWrapper.entity.state) ), ); } diff --git a/lib/entity_widgets/glance_entity_container.dart b/lib/entity_widgets/glance_entity_container.dart index 6a1837d..812722b 100644 --- a/lib/entity_widgets/glance_entity_container.dart +++ b/lib/entity_widgets/glance_entity_container.dart @@ -35,7 +35,7 @@ class GlanceEntityContainer extends StatelessWidget { result.add( EntityIcon( padding: EdgeInsets.all(0.0), - iconSize: iconSize, + size: iconSize, ) ); if (!nameInTheBottom) { diff --git a/lib/mdi.class.dart b/lib/mdi.class.dart index 0fdaf3e..dabb10d 100644 --- a/lib/mdi.class.dart +++ b/lib/mdi.class.dart @@ -1,7 +1,7 @@ part of 'main.dart'; class MaterialDesignIcons { - static Map _defaultIconsByDomains = { + static final Map defaultIconsByDomains = { "light": "mdi:lightbulb", "switch": "mdi:flash", "binary_sensor": "mdi:checkbox-blank-circle-outline", @@ -34,7 +34,7 @@ class MaterialDesignIcons { "alarm_control_panel" : "mdi:bell" }; - static Map _defaultIconsByDeviceClass = { + static final Map defaultIconsByDeviceClass = { //"binary_sensor.battery": "mdi:", //TODO "binary_sensor.cold.on": "mdi:snowflake", "binary_sensor.cold.off": "mdi:thermometer", @@ -92,7 +92,7 @@ class MaterialDesignIcons { "cover.window.closing": "mdi:window-open", "cover.window.opening": "mdi:window-open", }; - static Map _iconsDataMap = { + static final Map iconsDataMap = { "mdi:access-point": 0xf002, "mdi:access-point-network": 0xf003, "mdi:account": 0xf004, @@ -2890,7 +2890,7 @@ class MaterialDesignIcons { "mdi:blank": 0xf68c }; - static Widget createIconWidgetFromEntityData(EntityWrapper data, double size, Color color) { + /*static Widget createIconWidgetFromEntityData(EntityWrapper data, double size, Color color) { if (data == null) { return null; } @@ -2921,7 +2921,7 @@ class MaterialDesignIcons { color: color, ); } - } + }*/ static IconData createIconDataFromIconCode(int code) { return IconData(code, fontFamily: 'Material Design Icons'); @@ -2932,10 +2932,10 @@ class MaterialDesignIcons { } static int getIconCodeByIconName(String name) { - return _iconsDataMap[name] ?? 0; + return iconsDataMap[name] ?? 0; } - static int getDefaultIconByEntityId(String entityId, String deviceClass, String state) { + /*static int getDefaultIconByEntityId(String entityId, String deviceClass, String state) { String domain = entityId.split(".")[0]; String iconNameByDomain = _defaultIconsByDomains["$domain.$state"] ?? _defaultIconsByDomains["$domain"]; String iconNameByDeviceClass; @@ -2948,6 +2948,6 @@ class MaterialDesignIcons { } else { return 0; } - } + }*/ } \ No newline at end of file diff --git a/lib/ui_widgets/card_widget.dart b/lib/ui_widgets/card_widget.dart index 82697b7..238322f 100644 --- a/lib/ui_widgets/card_widget.dart +++ b/lib/ui_widgets/card_widget.dart @@ -149,7 +149,7 @@ class CardWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.end, children: [ EntityIcon( - iconSize: 50.0, + size: 50.0, ), Container( width: 26.0,