From a08a056cffb33c57bf430af36e91d3b55cca34b9 Mon Sep 17 00:00:00 2001 From: estevez-dev Date: Tue, 12 Mar 2019 23:35:33 +0200 Subject: [PATCH] Resolves #254 Missed entities --- lib/entity_class/entity.class.dart | 7 ++ lib/entity_class/entity_wrapper.class.dart | 10 +- .../button_entity_container.dart | 43 +++---- .../default_entity_container.dart | 54 +++++---- .../glance_entity_container.dart | 3 + lib/entity_widgets/missed_entity.dart | 19 +++ lib/home_assistant.class.dart | 8 ++ lib/main.dart | 1 + lib/ui_widgets/card_widget.dart | 113 +++++++++--------- 9 files changed, 151 insertions(+), 107 deletions(-) create mode 100644 lib/entity_widgets/missed_entity.dart diff --git a/lib/entity_class/entity.class.dart b/lib/entity_class/entity.class.dart index eb89590..9d5798a 100644 --- a/lib/entity_class/entity.class.dart +++ b/lib/entity_class/entity.class.dart @@ -67,6 +67,7 @@ class Entity { String state; String displayState; DateTime _lastUpdated; + bool missed = false; List childEntities = []; List attributesToShow = ["all"]; @@ -97,6 +98,12 @@ class Entity { update(rawData); } + Entity.missed(String entityId) { + missed = true; + attributes = {"hidden": false}; + this.entityId = entityId; + } + void update(Map rawData) { attributes = rawData["attributes"] ?? {}; domain = rawData["entity_id"].split(".")[0]; diff --git a/lib/entity_class/entity_wrapper.class.dart b/lib/entity_class/entity_wrapper.class.dart index 983dc4b..f574c55 100644 --- a/lib/entity_class/entity_wrapper.class.dart +++ b/lib/entity_class/entity_wrapper.class.dart @@ -14,10 +14,12 @@ class EntityWrapper { String displayName, this.uiAction }) { - this.icon = icon ?? entity.icon; - this.displayName = displayName ?? entity.displayName; - if (this.uiAction == null) { - this.uiAction = EntityUIAction(); + if (!entity.missed) { + this.icon = icon ?? entity.icon; + this.displayName = displayName ?? entity.displayName; + if (uiAction == null) { + uiAction = EntityUIAction(); + } } } diff --git a/lib/entity_widgets/button_entity_container.dart b/lib/entity_widgets/button_entity_container.dart index 8f8dd55..28b0554 100644 --- a/lib/entity_widgets/button_entity_container.dart +++ b/lib/entity_widgets/button_entity_container.dart @@ -9,27 +9,30 @@ class ButtonEntityContainer extends StatelessWidget { @override Widget build(BuildContext context) { final EntityWrapper entityWrapper = EntityModel.of(context).entityWrapper; - - return InkWell( - onTap: () => entityWrapper.handleTap(), - onLongPress: () => entityWrapper.handleHold(), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - FractionallySizedBox( - widthFactor: 0.4, - child: FittedBox( - fit: BoxFit.fitHeight, - child: EntityIcon( - padding: EdgeInsets.fromLTRB(2.0, 6.0, 2.0, 2.0), - size: Sizes.iconSize, - ) + if (entityWrapper.entity.missed) { + return MissedEntityWidget(); + } else { + return InkWell( + onTap: () => entityWrapper.handleTap(), + onLongPress: () => entityWrapper.handleHold(), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + FractionallySizedBox( + widthFactor: 0.4, + child: FittedBox( + fit: BoxFit.fitHeight, + child: EntityIcon( + padding: EdgeInsets.fromLTRB(2.0, 6.0, 2.0, 2.0), + size: Sizes.iconSize, + ) + ), ), - ), - _buildName() - ], - ), - ); + _buildName() + ], + ), + ); + } } Widget _buildName() { diff --git a/lib/entity_widgets/default_entity_container.dart b/lib/entity_widgets/default_entity_container.dart index 4a1216c..b2ce082 100644 --- a/lib/entity_widgets/default_entity_container.dart +++ b/lib/entity_widgets/default_entity_container.dart @@ -11,32 +11,36 @@ class DefaultEntityContainer extends StatelessWidget { @override Widget build(BuildContext context) { final EntityModel entityModel = EntityModel.of(context); - return InkWell( - onLongPress: () { - if (entityModel.handleTap) { - entityModel.entityWrapper.handleHold(); - } - }, - onTap: () { - if (entityModel.handleTap) { - entityModel.entityWrapper.handleTap(); - } - }, - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - EntityIcon(), + if (entityModel.entityWrapper.entity.missed) { + return MissedEntityWidget(); + } else { + return InkWell( + onLongPress: () { + if (entityModel.handleTap) { + entityModel.entityWrapper.handleHold(); + } + }, + onTap: () { + if (entityModel.handleTap) { + entityModel.entityWrapper.handleTap(); + } + }, + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + EntityIcon(), - Flexible( - fit: FlexFit.tight, - flex: 3, - child: EntityName( - padding: EdgeInsets.fromLTRB(10.0, 2.0, 10.0, 2.0), + Flexible( + fit: FlexFit.tight, + flex: 3, + child: EntityName( + padding: EdgeInsets.fromLTRB(10.0, 2.0, 10.0, 2.0), + ), ), - ), - state - ], - ), - ); + state + ], + ), + ); + } } } \ No newline at end of file diff --git a/lib/entity_widgets/glance_entity_container.dart b/lib/entity_widgets/glance_entity_container.dart index 812722b..5c9e07d 100644 --- a/lib/entity_widgets/glance_entity_container.dart +++ b/lib/entity_widgets/glance_entity_container.dart @@ -22,6 +22,9 @@ class GlanceEntityContainer extends StatelessWidget { @override Widget build(BuildContext context) { final EntityWrapper entityWrapper = EntityModel.of(context).entityWrapper; + if (entityWrapper.entity.missed) { + return MissedEntityWidget(); + } List result = []; if (!nameInTheBottom) { if (showName) { diff --git a/lib/entity_widgets/missed_entity.dart b/lib/entity_widgets/missed_entity.dart new file mode 100644 index 0000000..26219b9 --- /dev/null +++ b/lib/entity_widgets/missed_entity.dart @@ -0,0 +1,19 @@ +part of '../main.dart'; + +class MissedEntityWidget extends StatelessWidget { + MissedEntityWidget({ + Key key + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final EntityModel entityModel = EntityModel.of(context); + return Container( + child: Padding( + padding: EdgeInsets.all(5.0), + child: Text("Entity not available: ${entityModel.entityWrapper.entity.entityId}"), + ), + color: Colors.amber[100], + ); + } +} \ No newline at end of file diff --git a/lib/home_assistant.class.dart b/lib/home_assistant.class.dart index c2f8bec..73e4698 100644 --- a/lib/home_assistant.class.dart +++ b/lib/home_assistant.class.dart @@ -401,6 +401,8 @@ class HomeAssistant { if (rawEntity is String) { if (entities.isExist(rawEntity)) { card.entities.add(EntityWrapper(entity: entities.get(rawEntity))); + } else { + card.entities.add(EntityWrapper(entity: Entity.missed(rawEntity))); } } else { if (entities.isExist(rawEntity["entity"])) { @@ -413,6 +415,8 @@ class HomeAssistant { uiAction: EntityUIAction(rawEntityData: rawEntity) ) ); + } else { + card.entities.add(EntityWrapper(entity: Entity.missed(rawEntity["entity"]))); } } }); @@ -427,6 +431,8 @@ class HomeAssistant { displayName: rawCard["name"], uiAction: EntityUIAction(rawEntityData: rawCard) ); + } else { + card.linkedEntityWrapper = EntityWrapper(entity: Entity.missed(en)); } } else { if (entities.isExist(en["entity"])) { @@ -437,6 +443,8 @@ class HomeAssistant { displayName: en["name"], uiAction: EntityUIAction(rawEntityData: rawCard) ); + } else { + card.linkedEntityWrapper = EntityWrapper(entity: Entity.missed(en["entity"])); } } } diff --git a/lib/main.dart b/lib/main.dart index 8cfc5f9..6ecd4bc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -40,6 +40,7 @@ part 'entity_class/alarm_control_panel.class.dart'; part 'entity_widgets/common/badge.dart'; part 'entity_widgets/model_widgets.dart'; part 'entity_widgets/default_entity_container.dart'; +part 'entity_widgets/missed_entity.dart'; part 'entity_widgets/glance_entity_container.dart'; part 'entity_widgets/button_entity_container.dart'; part 'entity_widgets/common/entity_attributes_list.dart'; diff --git a/lib/ui_widgets/card_widget.dart b/lib/ui_widgets/card_widget.dart index 3f1c132..3cb91a4 100644 --- a/lib/ui_widgets/card_widget.dart +++ b/lib/ui_widgets/card_widget.dart @@ -11,8 +11,17 @@ class CardWidget extends StatelessWidget { @override Widget build(BuildContext context) { - if ((card.linkedEntityWrapper!= null) && (card.linkedEntityWrapper.entity.isHidden)) { - return Container(width: 0.0, height: 0.0,); + if (card.linkedEntityWrapper!= null) { + if (card.linkedEntityWrapper.entity.isHidden) { + return Container(width: 0.0, height: 0.0,); + } + if (card.linkedEntityWrapper.entity.missed) { + return EntityModel( + entityWrapper: card.linkedEntityWrapper, + child: MissedEntityWidget(), + handleTap: false, + ); + } } switch (card.type) { @@ -133,18 +142,15 @@ class CardWidget extends StatelessWidget { } Widget _buildAlarmPanelCard(BuildContext context) { - if (card.linkedEntityWrapper == null || card.linkedEntityWrapper.entity == null) { - return Container(width: 0, height: 0,); - } else { - List body = []; - body.add(CardHeaderWidget( - name: card.name ?? "", - subtitle: Text("${card.linkedEntityWrapper.entity.displayState}", - style: TextStyle( + List body = []; + body.add(CardHeaderWidget( + name: card.name ?? "", + subtitle: Text("${card.linkedEntityWrapper.entity.displayState}", + style: TextStyle( color: Colors.grey - ), ), - trailing: Row( + ), + trailing: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.end, children: [ @@ -152,36 +158,35 @@ class CardWidget extends StatelessWidget { size: 50.0, ), Container( - width: 26.0, - child: IconButton( - padding: EdgeInsets.all(0.0), - alignment: Alignment.centerRight, - icon: Icon(MaterialDesignIcons.getIconDataFromIconName( - "mdi:dots-vertical")), - onPressed: () => eventBus.fire(new ShowEntityPageEvent(card.linkedEntityWrapper.entity)) - ) + width: 26.0, + child: IconButton( + padding: EdgeInsets.all(0.0), + alignment: Alignment.centerRight, + icon: Icon(MaterialDesignIcons.getIconDataFromIconName( + "mdi:dots-vertical")), + onPressed: () => eventBus.fire(new ShowEntityPageEvent(card.linkedEntityWrapper.entity)) + ) ) ] - ), - )); - body.add( + ), + )); + body.add( AlarmControlPanelControlsWidget( extended: true, states: card.states, ) - ); - return Card( + ); + return Card( child: EntityModel( - entityWrapper: card.linkedEntityWrapper, - handleTap: null, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: body - ) + entityWrapper: card.linkedEntityWrapper, + handleTap: null, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: body + ) ) - ); - } + ); } Widget _buildGlanceCard(BuildContext context) { @@ -227,33 +232,25 @@ class CardWidget extends StatelessWidget { } Widget _buildMediaControlsCard(BuildContext context) { - if (card.linkedEntityWrapper == null || card.linkedEntityWrapper.entity == null) { - return Container(width: 0, height: 0,); - } else { - return Card( - child: EntityModel( - entityWrapper: card.linkedEntityWrapper, - handleTap: null, - child: MediaPlayerWidget() - ) - ); - } + return Card( + child: EntityModel( + entityWrapper: card.linkedEntityWrapper, + handleTap: null, + child: MediaPlayerWidget() + ) + ); } Widget _buildEntityButtonCard(BuildContext context) { - if (card.linkedEntityWrapper == null || card.linkedEntityWrapper.entity == null) { - return Container(width: 0, height: 0,); - } else { - card.linkedEntityWrapper.displayName = card.name?.toUpperCase() ?? - card.linkedEntityWrapper.displayName.toUpperCase(); - return Card( - child: EntityModel( - entityWrapper: card.linkedEntityWrapper, - child: ButtonEntityContainer(), - handleTap: true - ) - ); - } + card.linkedEntityWrapper.displayName = card.name?.toUpperCase() ?? + card.linkedEntityWrapper.displayName.toUpperCase(); + return Card( + child: EntityModel( + entityWrapper: card.linkedEntityWrapper, + child: ButtonEntityContainer(), + handleTap: true + ) + ); } Widget _buildUnsupportedCard(BuildContext context) {