From 809c7d63550a91eea6bcff31b0d8e69b9e4ab4cb Mon Sep 17 00:00:00 2001 From: Yegor Vialov Date: Sat, 27 Oct 2018 17:28:47 +0300 Subject: [PATCH] Card separation by type --- lib/home_assistant.class.dart | 6 +- lib/main.dart | 10 ++- lib/ui_class/card.class.dart | 47 +++++++++++++ lib/{ui => ui_class}/ui.dart | 0 lib/ui_class/view.class.dart | 66 ++++++++++++++++++ .../entities_card.dart} | 24 +------ lib/ui_widgets/media_control_card.dart | 27 ++++++++ lib/ui_widgets/unsupported_card.dart | 57 +++++++++++++++ .../view.class.dart => ui_widgets/view.dart} | 69 ++----------------- 9 files changed, 215 insertions(+), 91 deletions(-) create mode 100644 lib/ui_class/card.class.dart rename lib/{ui => ui_class}/ui.dart (100%) create mode 100644 lib/ui_class/view.class.dart rename lib/{ui/card.class.dart => ui_widgets/entities_card.dart} (79%) create mode 100644 lib/ui_widgets/media_control_card.dart create mode 100644 lib/ui_widgets/unsupported_card.dart rename lib/{ui/view.class.dart => ui_widgets/view.dart} (52%) diff --git a/lib/home_assistant.class.dart b/lib/home_assistant.class.dart index 82d94c9..c5c0865 100644 --- a/lib/home_assistant.class.dart +++ b/lib/home_assistant.class.dart @@ -401,7 +401,8 @@ class HomeAssistant { TheLogger.debug("------card: ${rawCard['type']}"); HACard card = HACard( id: "card", - name: rawCard["title"] + name: rawCard["title"], + type: rawCard['type'] ); rawCard["entities"]?.forEach((rawEntity) { if (rawEntity is String) { @@ -414,6 +415,9 @@ class HomeAssistant { } } }); + if (rawCard["entity"] != null) { + card.linkedEntity = entities.get(rawCard["entity"]); + } result.add(card); } }); diff --git a/lib/main.dart b/lib/main.dart index 3b51a78..c8dfdbf 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -53,9 +53,13 @@ part 'entity.page.dart'; part 'utils.class.dart'; part 'mdi.class.dart'; part 'entity_collection.class.dart'; -part 'ui/ui.dart'; -part 'ui/view.class.dart'; -part 'ui/card.class.dart'; +part 'ui_class/ui.dart'; +part 'ui_class/view.class.dart'; +part 'ui_class/card.class.dart'; +part 'ui_widgets/view.dart'; +part 'ui_widgets/entities_card.dart'; +part 'ui_widgets/unsupported_card.dart'; +part 'ui_widgets/media_control_card.dart'; EventBus eventBus = new EventBus(); const String appName = "HA Client"; diff --git a/lib/ui_class/card.class.dart b/lib/ui_class/card.class.dart new file mode 100644 index 0000000..90b4d6d --- /dev/null +++ b/lib/ui_class/card.class.dart @@ -0,0 +1,47 @@ +part of '../main.dart'; + +class HACard { + List entities = []; + Entity linkedEntity; + String name; + String id; + String type; + + HACard({ + this.name, + this.id, + this.linkedEntity, + @required this.type + }); + + Widget build(BuildContext context) { + switch (type) { + + case "entities": { + return EntitiesCardWidget( + card: this, + ); + } + + case "media-control": { + return UnsupportedCardWidget( + card: this, + ); + } + + default: { + if ((linkedEntity == null) && (entities.isNotEmpty)) { + return EntitiesCardWidget( + card: this, + ); + } else { + return UnsupportedCardWidget( + card: this, + ); + } + } + + } + } + +} \ No newline at end of file diff --git a/lib/ui/ui.dart b/lib/ui_class/ui.dart similarity index 100% rename from lib/ui/ui.dart rename to lib/ui_class/ui.dart diff --git a/lib/ui_class/view.class.dart b/lib/ui_class/view.class.dart new file mode 100644 index 0000000..872a4d8 --- /dev/null +++ b/lib/ui_class/view.class.dart @@ -0,0 +1,66 @@ +part of '../main.dart'; + +class HAView { + List cards = []; + List badges = []; + Entity linkedEntity; + String name; + String id; + String iconName; + int count; + + HAView({ + this.name, + this.id, + this.count, + this.iconName, + List childEntities + }) { + if (childEntities != null) { + _fillView(childEntities); + } + } + + void _fillView(List childEntities) { + List autoGeneratedCards = []; + childEntities.forEach((entity) { + if (entity.isBadge) { + badges.add(entity); + TheLogger.debug("----Badge: ${entity.entityId}"); + } else { + if (!entity.isGroup) { + String groupIdToAdd = "${entity.domain}.${entity.domain}$count"; + if (autoGeneratedCards.every((HACard card) => card.id != groupIdToAdd )) { + HACard card = HACard( + id: groupIdToAdd, + name: entity.domain, + type: "entities" + ); + TheLogger.debug("----Creating card: $groupIdToAdd"); + card.entities.add(entity); + autoGeneratedCards.add(card); + } else { + autoGeneratedCards.firstWhere((card) => card.id == groupIdToAdd).entities.add(entity); + } + } else { + TheLogger.debug("----Card: ${entity.entityId}"); + HACard card = HACard( + name: entity.displayName, + id: entity.entityId, + linkedEntity: entity, + type: "entities" + ); + card.entities.addAll(entity.childEntities); + cards.add(card); + } + } + }); + cards.addAll(autoGeneratedCards); + } + + Widget build(BuildContext context) { + return ViewWidget( + view: this, + ); + } +} \ No newline at end of file diff --git a/lib/ui/card.class.dart b/lib/ui_widgets/entities_card.dart similarity index 79% rename from lib/ui/card.class.dart rename to lib/ui_widgets/entities_card.dart index 2b012f9..61750cd 100644 --- a/lib/ui/card.class.dart +++ b/lib/ui_widgets/entities_card.dart @@ -1,30 +1,10 @@ part of '../main.dart'; -class HACard { - List entities = []; - Entity linkedEntity; - String name; - String id; - - HACard({ - this.name, - this.id, - this.linkedEntity - }); - - Widget build(BuildContext context) { - return HACardWidget( - card: this, - ); - } - -} - -class HACardWidget extends StatelessWidget { +class EntitiesCardWidget extends StatelessWidget { final HACard card; - const HACardWidget({ + const EntitiesCardWidget({ Key key, this.card }) : super(key: key); diff --git a/lib/ui_widgets/media_control_card.dart b/lib/ui_widgets/media_control_card.dart new file mode 100644 index 0000000..2b69fb6 --- /dev/null +++ b/lib/ui_widgets/media_control_card.dart @@ -0,0 +1,27 @@ +part of '../main.dart'; + +class MediaControlCardWidget extends StatelessWidget { + + final HACard card; + + const MediaControlCardWidget({ + Key key, + this.card + }) : super(key: key); + + @override + Widget build(BuildContext context) { + if ((card.linkedEntity!= null) && (card.linkedEntity.isHidden)) { + return Container(width: 0.0, height: 0.0,); + } + List body = []; + return Card( + child: new Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: body + ) + ); + } + +} \ No newline at end of file diff --git a/lib/ui_widgets/unsupported_card.dart b/lib/ui_widgets/unsupported_card.dart new file mode 100644 index 0000000..c5d38f5 --- /dev/null +++ b/lib/ui_widgets/unsupported_card.dart @@ -0,0 +1,57 @@ +part of '../main.dart'; + +class UnsupportedCardWidget extends StatelessWidget { + + final HACard card; + + const UnsupportedCardWidget({ + Key key, + this.card + }) : super(key: key); + + @override + Widget build(BuildContext context) { + if ((card.linkedEntity!= null) && (card.linkedEntity.isHidden)) { + return Container(width: 0.0, height: 0.0,); + } + List body = []; + body.add(_buildCardHeader()); + body.addAll(_buildCardBody(context)); + return Card( + child: new Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: body + ) + ); + } + + Widget _buildCardHeader() { + return ListTile( + title: Text("${card.name ?? card.type}", + textAlign: TextAlign.left, + overflow: TextOverflow.ellipsis, + style: new TextStyle(fontWeight: FontWeight.bold, fontSize: 25.0)), + ); + } + + List _buildCardBody(BuildContext context) { + List result = []; + result.addAll([ + Padding( + padding: EdgeInsets.fromLTRB(Entity.leftWidgetPadding, 0.0, Entity.rightWidgetPadding, 0.0), + child: Text("Card type '${card.type}' is not supported yet"), + ), + Padding( + padding: EdgeInsets.fromLTRB(Entity.leftWidgetPadding, Entity.rowPadding, Entity.rightWidgetPadding, 0.0), + child: Text("Linked entity: ${card.linkedEntity?.entityId}"), + ), + Padding( + padding: EdgeInsets.fromLTRB(Entity.leftWidgetPadding, Entity.rowPadding, Entity.rightWidgetPadding, Entity.rowPadding), + child: Text("Child entities: ${card.entities}"), + ), + ]); + return result; + } + +} \ No newline at end of file diff --git a/lib/ui/view.class.dart b/lib/ui_widgets/view.dart similarity index 52% rename from lib/ui/view.class.dart rename to lib/ui_widgets/view.dart index 4a31a8b..8e9ddb1 100644 --- a/lib/ui/view.class.dart +++ b/lib/ui_widgets/view.dart @@ -1,82 +1,21 @@ part of '../main.dart'; -class HAView { - List cards = []; - List badges = []; - Entity linkedEntity; - String name; - String id; - String iconName; - int count; - - HAView({ - this.name, - this.id, - this.count, - this.iconName, - List childEntities - }) { - _fillView(childEntities ?? []); - } - - void _fillView(List childEntities) { - List autoGeneratedCards = []; - childEntities.forEach((entity) { - if (entity.isBadge) { - badges.add(entity); - TheLogger.debug("----Badge: ${entity.entityId}"); - } else { - if (!entity.isGroup) { - String groupIdToAdd = "${entity.domain}.${entity.domain}$count"; - if (autoGeneratedCards.every((HACard card) => card.id != groupIdToAdd )) { - HACard card = HACard( - id: groupIdToAdd, - name: entity.domain - ); - TheLogger.debug("----Creating card: $groupIdToAdd"); - card.entities.add(entity); - autoGeneratedCards.add(card); - } else { - autoGeneratedCards.firstWhere((card) => card.id == groupIdToAdd).entities.add(entity); - } - } else { - TheLogger.debug("----Card: ${entity.entityId}"); - HACard card = HACard( - name: entity.displayName, - id: entity.entityId, - linkedEntity: entity - ); - card.entities.addAll(entity.childEntities); - cards.add(card); - } - } - }); - cards.addAll(autoGeneratedCards); - } - - Widget build(BuildContext context) { - return HAViewWidget( - view: this, - ); - } -} - -class HAViewWidget extends StatefulWidget { +class ViewWidget extends StatefulWidget { final HAView view; - const HAViewWidget({ + const ViewWidget({ Key key, this.view }) : super(key: key); @override State createState() { - return HAViewWidgetState(); + return ViewWidgetState(); } } -class HAViewWidgetState extends State { +class ViewWidgetState extends State { StreamSubscription _refreshDataSubscription; Completer _refreshCompleter;