diff --git a/lib/cards/alarm_panel_card.dart b/lib/cards/alarm_panel_card.dart index 7024f58..81b9c25 100644 --- a/lib/cards/alarm_panel_card.dart +++ b/lib/cards/alarm_panel_card.dart @@ -1,36 +1,43 @@ part of '../main.dart'; class AlarmPanelCard extends StatelessWidget { - final HACard card; + final AlarmPanelCardData card; const AlarmPanelCard({Key key, this.card}) : super(key: key); @override Widget build(BuildContext context) { + if (card.entity.entity.statelessType == StatelessEntityType.missed) { + return EntityModel( + entityWrapper: card.entity, + child: MissedEntityWidget(), + handleTap: false, + ); + } List body = []; body.add(CardHeader( name: card.name ?? "", - subtitle: Text("${card.linkedEntityWrapper.entity.displayState}", - ), - trailing: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.end, - children: [ - EntityIcon( - 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(entity: card.linkedEntityWrapper.entity)) - ) + subtitle: Text("${card.entity.entity.displayState}", + ), + trailing: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + EntityIcon( + 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(entity: card.entity.entity)) ) - ] - ), + ) + ] + ), )); body.add( AlarmControlPanelControlsWidget( @@ -40,7 +47,7 @@ class AlarmPanelCard extends StatelessWidget { ); return CardWrapper( child: EntityModel( - entityWrapper: card.linkedEntityWrapper, + entityWrapper: card.entity, handleTap: null, child: Column( crossAxisAlignment: CrossAxisAlignment.center, diff --git a/lib/cards/card.class.dart b/lib/cards/card.class.dart index c18bc0a..05d9020 100644 --- a/lib/cards/card.class.dart +++ b/lib/cards/card.class.dart @@ -1,135 +1,17 @@ part of '../main.dart'; -class HACard { - List entities = []; - List childCards = []; - EntityWrapper linkedEntityWrapper; - String name; - String id; - String type; - String icon; - bool showName; - bool showState; - bool showEmpty; - bool showHeaderToggle; - int columnsCount; - List stateFilter; - List states; - List conditions; - String content; - String unit; - int min; - int max; - int depth; - Map severity; - EntityUIAction action; - - HACard({ - this.name, - this.id, - this.linkedEntityWrapper, - this.columnsCount: 4, - this.showName: true, - this.showHeaderToggle: true, - this.showState: true, - this.stateFilter: const [], - this.showEmpty: true, - this.content, - this.states, - this.conditions: const [], - this.unit, - this.min, - this.max, - this.depth: 1, - this.severity, - this.icon, - @required this.type - }) { - if (this.columnsCount <= 0) { - this.columnsCount = 4; - } - } - - List getEntitiesToShow() { - return entities.where((entityWrapper) { - if (HomeAssistant().autoUi && entityWrapper.entity.isHidden) { - return false; - } - List currentStateFilter; - if (entityWrapper.stateFilter != null && entityWrapper.stateFilter.isNotEmpty) { - currentStateFilter = entityWrapper.stateFilter; - } else { - currentStateFilter = stateFilter; - } - bool showByFilter = currentStateFilter.isEmpty; - for (var allowedState in currentStateFilter) { - if (allowedState is String && allowedState == entityWrapper.entity.state) { - showByFilter = true; - break; - } else if (allowedState is Map) { - try { - var tmpVal = allowedState['attribute'] != null ? entityWrapper.entity.getAttribute(allowedState['attribute']) : entityWrapper.entity.state; - var valToCompareWith = allowedState['value']; - var valToCompare; - if (valToCompareWith is! String && tmpVal is String) { - valToCompare = double.tryParse(tmpVal); - } else { - valToCompare = tmpVal; - } - if (valToCompare != null) { - bool result; - switch (allowedState['operator']) { - case '<=': { result = valToCompare <= valToCompareWith;} - break; - - case '<': { result = valToCompare < valToCompareWith;} - break; - - case '>=': { result = valToCompare >= valToCompareWith;} - break; - - case '>': { result = valToCompare > valToCompareWith;} - break; - - case '!=': { result = valToCompare != valToCompareWith;} - break; - - case 'regex': { - RegExp regExp = RegExp(valToCompareWith.toString()); - result = regExp.hasMatch(valToCompare.toString()); - } - break; - - default: { - result = valToCompare == valToCompareWith; - } - } - if (result) { - showByFilter = true; - break; - } - } - } catch (e) { - Logger.e('Error filtering ${entityWrapper.entity.entityId} by $allowedState'); - Logger.e('$e'); - } - } - } - return showByFilter; - }).toList(); - } -} - class CardData { String type; final int depth; List entities = []; List conditions; - bool showEmapty; + bool showEmpty; List stateFilter; - factory CardData.parse(Map rawData, {depth}) { + EntityWrapper get entity => entities.isNotEmpty ? entities[0] : null; + + factory CardData.parse(Map rawData, {depth: 1}) { switch (rawData['type']) { case CardType.ENTITIES: return EntitiesCardData(rawData, depth: depth); @@ -167,19 +49,34 @@ class CardData { case CardType.VERTICAL_STACK: return VerticalStackCardData(rawData, depth: depth); break; + case CardType.MARKDOWN: + return MarkdownCardData(rawData, depth: depth); + break; + case CardType.MEDIA_CONTROL: + return MediaControlCardData(rawData, depth: depth); + break; default: - //TODO check for 'entity' and 'entities' - return EntitiesCardData(rawData, depth: depth); + if (rawData.containsKey('entities')) { + return EntitiesCardData(rawData, depth: depth); + } else if (rawData.containsKey('entity')) { + rawData['entities'] = [rawData['entity']]; + return EntitiesCardData(rawData, depth: depth); + } + return CardData(rawData, depth: depth); } } CardData(Map rawData, {this.depth: 1}) { type = rawData['type'] ?? CardType.ENTITIES; - conditions = rawData['conditions']; - showEmapty = rawData['show_empty'] ?? true; + conditions = rawData['conditions'] ?? []; + showEmpty = rawData['show_empty'] ?? true; stateFilter = rawData['state_filter'] ?? []; } + Widget buildCardWidget() { + return UnsupportedCard(card: this); + } + List getEntitiesToShow() { return entities.where((entityWrapper) { if (HomeAssistant().autoUi && entityWrapper.entity.isHidden) { @@ -257,6 +154,11 @@ class EntitiesCardData extends CardData { String icon; bool showHeaderToggle; bool stateColor; + + @override + Widget buildCardWidget() { + return EntitiesCard(card: this); + } EntitiesCardData(Map rawData, {int depth: 1}) : super(rawData, depth: depth) { //Parsing card data @@ -338,7 +240,12 @@ class EntitiesCardData extends CardData { class AlarmPanelCardData extends CardData { String name; - List states; + List states; + + @override + Widget buildCardWidget() { + return AlarmPanelCard(card: this); + } AlarmPanelCardData(Map rawData, {int depth: 1}) : super(rawData, depth: depth) { //Parsing card data @@ -368,12 +275,17 @@ class ButtonCardData extends CardData { bool showName; bool showIcon; + @override + Widget buildCardWidget() { + return EntityButtonCard(card: this); + } + ButtonCardData(Map rawData, {int depth: 1}) : super(rawData, depth: depth) { //Parsing card data name = rawData['name']; icon = rawData['icon']; - showName = rawData['show_name']; - showIcon = rawData['show_icon']; + showName = rawData['show_name'] ?? true; + showIcon = rawData['show_icon'] ?? true; //Parsing entity var entitiId = rawData["entity"]; if (entitiId != null && entitiId is String) { @@ -412,6 +324,11 @@ class GaugeCardData extends CardData { int min; int max; Map severity; + + @override + Widget buildCardWidget() { + return GaugeCard(card: this); + } GaugeCardData(Map rawData, {int depth: 1}) : super(rawData, depth: depth) { //Parsing card data @@ -431,6 +348,8 @@ class GaugeCardData extends CardData { } else { entities.add(EntityWrapper(entity: Entity.missed(entitiId))); } + } else { + entities.add(EntityWrapper(entity: Entity.missed(entitiId))); } } @@ -445,6 +364,11 @@ class GlanceCardData extends CardData { bool showState; bool stateColor; int columnsCount; + + @override + Widget buildCardWidget() { + return GlanceCard(card: this); + } GlanceCardData(Map rawData, {int depth: 1}) : super(rawData, depth: depth) { //Parsing card data @@ -487,10 +411,15 @@ class GlanceCardData extends CardData { class HorizontalStackCardData extends CardData { List childCards; + + @override + Widget buildCardWidget() { + return HorizontalStackCard(card: this); + } HorizontalStackCardData(Map rawData, {int depth: 1}) : super(rawData, depth: depth) { if (rawData.containsKey('cards')) { - childCards = rawData['cards'].map((childCard) { + childCards = rawData['cards'].map((childCard) { return CardData.parse(childCard, depth: this.depth + 1); }).toList(); } else { @@ -503,10 +432,15 @@ class HorizontalStackCardData extends CardData { class VerticalStackCardData extends CardData { List childCards; + + @override + Widget buildCardWidget() { + return VerticalStackCard(card: this); + } VerticalStackCardData(Map rawData, {int depth: 1}) : super(rawData, depth: depth) { if (rawData.containsKey('cards')) { - childCards = rawData['cards'].map((childCard) { + childCards = rawData['cards'].map((childCard) { return CardData.parse(childCard); }).toList(); } else { @@ -514,4 +448,44 @@ class VerticalStackCardData extends CardData { } } +} + +class MarkdownCardData extends CardData { + + String title; + String content; + + @override + Widget buildCardWidget() { + return MarkdownCard(card: this); + } + + MarkdownCardData(Map rawData, {int depth: 1}) : super(rawData, depth: depth) { + //Parsing card data + title = rawData['title']; + content = rawData['content']; + } + +} + +class MediaControlCardData extends CardData { + + @override + Widget buildCardWidget() { + return MediaControlsCard(card: this); + } + + MediaControlCardData(Map rawData, {int depth: 1}) : super(rawData, depth: depth) { + var entitiId = rawData["entity"]; + if (entitiId != null && entitiId is String) { + if (HomeAssistant().entities.isExist(entitiId)) { + entities.add(EntityWrapper( + entity: HomeAssistant().entities.get(entitiId), + )); + } else { + entities.add(EntityWrapper(entity: Entity.missed(entitiId))); + } + } + } + } \ No newline at end of file diff --git a/lib/cards/card_widget.dart b/lib/cards/card_widget.dart deleted file mode 100644 index 4690756..0000000 --- a/lib/cards/card_widget.dart +++ /dev/null @@ -1,97 +0,0 @@ -part of '../main.dart'; - -class LovelaceCard extends StatelessWidget { - - final HACard card; - - const LovelaceCard({ - Key key, - this.card - }) : super(key: key); - - @override - Widget build(BuildContext context) { - if (card.linkedEntityWrapper!= null) { - if (card.linkedEntityWrapper.entity.isHidden) { - return Container(width: 0.0, height: 0.0,); - } - if (card.linkedEntityWrapper.entity.statelessType == StatelessEntityType.missed) { - return EntityModel( - entityWrapper: card.linkedEntityWrapper, - child: MissedEntityWidget(), - handleTap: false, - ); - } - } - - if (card.conditions.isNotEmpty) { - bool showCardByConditions = true; - for (var condition in card.conditions) { - Entity conditionEntity = HomeAssistant().entities.get(condition['entity']); - if (conditionEntity != null && - ((condition['state'] != null && conditionEntity.state != condition['state']) || - (condition['state_not'] != null && conditionEntity.state == condition['state_not'])) - ) { - showCardByConditions = false; - break; - } - } - if (!showCardByConditions) { - return Container(width: 0.0, height: 0.0,); - } - } - - switch (card.type) { - - case CardType.ENTITIES: { - return EntitiesCard(card: card); - } - - case CardType.GLANCE: { - return GlanceCard(card: card); - } - - case CardType.MEDIA_CONTROL: { - return MediaControlsCard(card: card); - } - - case CardType.ENTITY_BUTTON: { - return EntityButtonCard(card: card); - } - - case CardType.BUTTON: { - return EntityButtonCard(card: card); - } - - case CardType.GAUGE: { - return GaugeCard(card: card); - } - - case CardType.MARKDOWN: { - return MarkdownCard(card: card); - } - - case CardType.ALARM_PANEL: { - return AlarmPanelCard(card: card); - } - - case CardType.HORIZONTAL_STACK: { - return HorizontalStackCard(card: card); - } - - case CardType.VERTICAL_STACK: { - return VerticalStackCard(card: card); - } - - default: { - if ((card.linkedEntityWrapper == null) && (card.entities.isNotEmpty)) { - return EntitiesCard(card: card); - } else { - return UnsupportedCard(card: card); - } - } - - } - } - -} diff --git a/lib/cards/entities_card.dart b/lib/cards/entities_card.dart index 0b9380c..fdd51d2 100644 --- a/lib/cards/entities_card.dart +++ b/lib/cards/entities_card.dart @@ -1,7 +1,7 @@ part of '../main.dart'; class EntitiesCard extends StatelessWidget { - final HACard card; + final EntitiesCardData card; const EntitiesCard({Key key, this.card}) : super(key: key); @@ -35,7 +35,7 @@ class EntitiesCard extends StatelessWidget { } body.add( CardHeader( - name: card.name, + name: card.title, trailing: headerSwitch, emptyPadding: Sizes.rowPadding, leading: card.icon != null ? Icon( @@ -64,10 +64,12 @@ class EntitiesCard extends StatelessWidget { left: Sizes.leftWidgetPadding, bottom: Sizes.rowPadding, ), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - children: body + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: body + ) ), ) ); diff --git a/lib/cards/entity_button_card.dart b/lib/cards/entity_button_card.dart index c30857f..2f5a4bd 100644 --- a/lib/cards/entity_button_card.dart +++ b/lib/cards/entity_button_card.dart @@ -2,7 +2,7 @@ part of '../main.dart'; class EntityButtonCard extends StatelessWidget { - final HACard card; + final ButtonCardData card; EntityButtonCard({ Key key, this.card @@ -10,18 +10,20 @@ class EntityButtonCard extends StatelessWidget { @override Widget build(BuildContext context) { - //card.linkedEntityWrapper.overrideName = card.name?.toUpperCase() ?? - // card.linkedEntityWrapper.displayName.toUpperCase(); - EntityWrapper entityWrapper = card.linkedEntityWrapper; + EntityWrapper entityWrapper = card.entity; if (entityWrapper.entity.statelessType == StatelessEntityType.missed) { - return MissedEntityWidget(); + return EntityModel( + entityWrapper: card.entity, + child: MissedEntityWidget(), + handleTap: false, + ); } else if (entityWrapper.entity.statelessType != StatelessEntityType.ghost && entityWrapper.entity.statelessType != StatelessEntityType.none) { return Container(width: 0.0, height: 0.0,); } double widthBase = math.min(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height) / 6; Widget buttonIcon; - if (entityWrapper.icon == null || entityWrapper.icon.isEmpty) { + if (!card.showIcon) { buttonIcon = Container(height: Sizes.rowPadding, width: 10); } else { buttonIcon = EntityIcon( @@ -32,12 +34,12 @@ class EntityButtonCard extends StatelessWidget { return CardWrapper( child: EntityModel( - entityWrapper: card.linkedEntityWrapper, + entityWrapper: card.entity, child: InkWell( onTap: () => entityWrapper.handleTap(), onLongPress: () => entityWrapper.handleHold(), onDoubleTap: () => entityWrapper.handleDoubleTap(), - child: Container( + child: Center( child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, diff --git a/lib/cards/gauge_card.dart b/lib/cards/gauge_card.dart index 2665388..10e9c12 100644 --- a/lib/cards/gauge_card.dart +++ b/lib/cards/gauge_card.dart @@ -2,18 +2,24 @@ part of '../main.dart'; class GaugeCard extends StatelessWidget { - final HACard card; + final GaugeCardData card; GaugeCard({Key key, this.card}) : super(key: key); @override Widget build(BuildContext context) { - EntityWrapper entityWrapper = card.linkedEntityWrapper; + EntityWrapper entityWrapper = card.entity; + if (entityWrapper.entity.statelessType == StatelessEntityType.missed) { + return EntityModel( + entityWrapper: card.entity, + child: MissedEntityWidget(), + handleTap: false, + ); + } entityWrapper.overrideName = card.name ?? entityWrapper.displayName; entityWrapper.unitOfMeasurementOverride = card.unit ?? entityWrapper.unitOfMeasurement; - double fixedValue; double value = entityWrapper.entity.doubleState; if (value > card.max) { diff --git a/lib/cards/glance_card.dart b/lib/cards/glance_card.dart index 7404b56..cc8afe1 100644 --- a/lib/cards/glance_card.dart +++ b/lib/cards/glance_card.dart @@ -1,7 +1,7 @@ part of '../main.dart'; class GlanceCard extends StatelessWidget { - final HACard card; + final GlanceCardData card; const GlanceCard({Key key, this.card}) : super(key: key); @@ -12,8 +12,15 @@ class GlanceCard extends StatelessWidget { return Container(height: 0.0, width: 0.0,); } int length = entitiesToShow.length; - int columnsCount = length >= card.columnsCount ? card.columnsCount : entitiesToShow.length; - int rowsCount = (length / columnsCount).round(); + int rowsCount; + int columnsCount; + if (length == 0) { + columnsCount = 0; + rowsCount = 0; + } else { + columnsCount = length >= card.columnsCount ? card.columnsCount : entitiesToShow.length; + rowsCount = (length / columnsCount).round(); + } List rows = []; for (int i = 0; i < rowsCount; i++) { int start = i*columnsCount; @@ -46,7 +53,7 @@ class GlanceCard extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - CardHeader(name: card.name), + CardHeader(name: card.title), Padding( padding: EdgeInsets.symmetric(vertical: Sizes.rowPadding), child: Table( diff --git a/lib/cards/horizontal_srack_card.dart b/lib/cards/horizontal_srack_card.dart index 05157fe..b1ef5e5 100644 --- a/lib/cards/horizontal_srack_card.dart +++ b/lib/cards/horizontal_srack_card.dart @@ -1,7 +1,7 @@ part of '../main.dart'; class HorizontalStackCard extends StatelessWidget { - final HACard card; + final HorizontalStackCardData card; const HorizontalStackCard({Key key, this.card}) : super(key: key); @@ -11,7 +11,7 @@ class HorizontalStackCard extends StatelessWidget { List children = []; children = card.childCards.map((childCard) => Flexible( fit: FlexFit.tight, - child: LovelaceCard(card: childCard) + child: childCard.buildCardWidget() ) ).toList(); return IntrinsicHeight( diff --git a/lib/cards/markdown_card.dart b/lib/cards/markdown_card.dart index dacd95c..349287c 100644 --- a/lib/cards/markdown_card.dart +++ b/lib/cards/markdown_card.dart @@ -1,7 +1,7 @@ part of '../main.dart'; class MarkdownCard extends StatelessWidget { - final HACard card; + final MarkdownCardData card; const MarkdownCard({Key key, this.card}) : super(key: key); @@ -19,7 +19,7 @@ class MarkdownCard extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - CardHeader(name: card.name), + CardHeader(name: card.title), MarkdownBody( data: card.content, ) diff --git a/lib/cards/media_control_card.dart b/lib/cards/media_control_card.dart index aaf225b..fddf57d 100644 --- a/lib/cards/media_control_card.dart +++ b/lib/cards/media_control_card.dart @@ -1,15 +1,22 @@ part of '../main.dart'; class MediaControlsCard extends StatelessWidget { - final HACard card; + final MediaControlCardData card; const MediaControlsCard({Key key, this.card}) : super(key: key); @override Widget build(BuildContext context) { + if (card.entity.entity.statelessType == StatelessEntityType.missed) { + return EntityModel( + entityWrapper: card.entity, + child: MissedEntityWidget(), + handleTap: false, + ); + } return CardWrapper( child: EntityModel( - entityWrapper: card.linkedEntityWrapper, + entityWrapper: card.entity, handleTap: null, child: MediaPlayerWidget() ) diff --git a/lib/cards/unsupported_card.dart b/lib/cards/unsupported_card.dart index af60056..251e9c4 100644 --- a/lib/cards/unsupported_card.dart +++ b/lib/cards/unsupported_card.dart @@ -1,47 +1,17 @@ part of '../main.dart'; class UnsupportedCard extends StatelessWidget { - final HACard card; + final CardData card; const UnsupportedCard({Key key, this.card}) : super(key: key); @override Widget build(BuildContext context) { - List body = []; - body.add( - CardHeader( - name: card.name ?? "" + return CardWrapper( + child: Padding( + padding: EdgeInsets.fromLTRB(Sizes.leftWidgetPadding, Sizes.rowPadding, Sizes.rightWidgetPadding, Sizes.rowPadding), + child: Text("'${card.type}' card is not supported yet"), ) ); - List result = []; - if (card.linkedEntityWrapper != null) { - result.addAll([ - Padding( - padding: EdgeInsets.fromLTRB(0.0, Sizes.rowPadding, 0.0, Sizes.rowPadding), - child: EntityModel( - entityWrapper: card.linkedEntityWrapper, - handleTap: true, - child: card.linkedEntityWrapper.entity.buildDefaultWidget(context) - ), - ) - ]); - } else { - result.addAll([ - Padding( - padding: EdgeInsets.fromLTRB(Sizes.leftWidgetPadding, Sizes.rowPadding, Sizes.rightWidgetPadding, Sizes.rowPadding), - child: Text("'${card.type}' card is not supported yet"), - ), - ]); - } - body.addAll(result); - return CardWrapper( - child: new Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: body - ) - ); - } - - + } } \ No newline at end of file diff --git a/lib/cards/vertical_stack_card.dart b/lib/cards/vertical_stack_card.dart index d47dafa..b308a7f 100644 --- a/lib/cards/vertical_stack_card.dart +++ b/lib/cards/vertical_stack_card.dart @@ -1,7 +1,7 @@ part of '../main.dart'; class VerticalStackCard extends StatelessWidget { - final HACard card; + final VerticalStackCardData card; const VerticalStackCard({Key key, this.card}) : super(key: key); @@ -11,8 +11,8 @@ class VerticalStackCard extends StatelessWidget { return Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, - children: card.childCards.map( - (childCard) => LovelaceCard(card: childCard) + children: card.childCards.map( + (childCard) => childCard.buildCardWidget() ).toList(), ); } diff --git a/lib/main.dart b/lib/main.dart index da469fb..d17b2e0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -129,7 +129,6 @@ part 'view.class.dart'; part 'cards/card.class.dart'; part 'panels/panel_class.dart'; part 'viewWidget.widget.dart'; -part 'cards/card_widget.dart'; part 'cards/widgets/card_header.widget.dart'; part 'panels/config_panel_widget.dart'; part 'panels/widgets/link_to_web_config.dart'; diff --git a/lib/view.class.dart b/lib/view.class.dart index 9fbbbab..65abde2 100644 --- a/lib/view.class.dart +++ b/lib/view.class.dart @@ -1,7 +1,7 @@ part of 'main.dart'; class HAView { - List cards = []; + List cards = []; List badges = []; Entity linkedEntity; String name; @@ -33,150 +33,11 @@ class HAView { }); } - cards.addAll(_createLovelaceCards(rawData["cards"] ?? [], 1)); - } + (rawData["cards"] ?? []).forEach((rawCardData) { + cards.add(CardData.parse(rawCardData)); + }); - List _createLovelaceCards(List rawCards, int depth) { - List result = []; - rawCards.forEach((rawCard){ - try { - //bool isThereCardOptionsInside = rawCard["card"] != null; - var rawCardInfo = rawCard["card"] ?? rawCard; - HACard card = HACard( - id: "card", - name: rawCardInfo["title"] ?? rawCardInfo["name"], - type: rawCardInfo['type'] ?? CardType.ENTITIES, - icon: rawCardInfo['icon'], - columnsCount: rawCardInfo['columns'] ?? 4, - showName: (rawCardInfo['show_name'] ?? rawCard['show_name']) ?? true, - showHeaderToggle: (rawCardInfo['show_header_toggle'] ?? rawCard['show_header_toggle']) ?? false, - showState: (rawCardInfo['show_state'] ?? rawCard['show_state']) ?? true, - showEmpty: (rawCardInfo['show_empty'] ?? rawCard['show_empty']) ?? true, - stateFilter: (rawCard['state_filter'] ?? rawCardInfo['state_filter']) ?? [], - states: rawCardInfo['states'], - conditions: rawCard['conditions'] ?? [], - content: rawCardInfo['content'], - min: rawCardInfo['min'] ?? 0, - max: rawCardInfo['max'] ?? 100, - unit: rawCardInfo['unit'], - depth: depth, - severity: rawCardInfo['severity'] - ); - if (rawCardInfo["cards"] != null) { - card.childCards = _createLovelaceCards(rawCardInfo["cards"], depth + 1); - } - var rawEntities = rawCard["entities"] ?? rawCardInfo["entities"]; - var rawSingleEntity = rawCard["entity"] ?? rawCardInfo["entity"]; - if (rawEntities != null) { - rawEntities.forEach((rawEntity) { - if (rawEntity is String) { - if (HomeAssistant().entities.isExist(rawEntity)) { - card.entities.add(EntityWrapper(entity: HomeAssistant().entities.get(rawEntity))); - } else { - card.entities.add(EntityWrapper(entity: Entity.missed(rawEntity))); - } - } else { - if (rawEntity["type"] == "divider") { - card.entities.add(EntityWrapper(entity: Entity.divider())); - } else if (rawEntity["type"] == "section") { - card.entities.add(EntityWrapper(entity: Entity.section(rawEntity["label"] ?? ""))); - } else if (rawEntity["type"] == "call-service") { - Map uiActionData = { - "tap_action": { - "action": EntityUIAction.callService, - "service": rawEntity["service"], - "service_data": rawEntity["service_data"] - }, - "hold_action": EntityUIAction.none - }; - card.entities.add(EntityWrapper( - entity: Entity.callService( - icon: rawEntity["icon"], - name: rawEntity["name"], - service: rawEntity["service"], - actionName: rawEntity["action_name"] - ), - uiAction: EntityUIAction(rawEntityData: uiActionData) - ) - ); - } else if (rawEntity["type"] == "weblink") { - Map uiActionData = { - "tap_action": { - "action": EntityUIAction.navigate, - "service": rawEntity["url"] - }, - "hold_action": EntityUIAction.none - }; - card.entities.add(EntityWrapper( - entity: Entity.weblink( - icon: rawEntity["icon"], - name: rawEntity["name"], - url: rawEntity["url"] - ), - uiAction: EntityUIAction(rawEntityData: uiActionData) - ) - ); - } else if (HomeAssistant().entities.isExist(rawEntity["entity"])) { - Entity e = HomeAssistant().entities.get(rawEntity["entity"]); - card.entities.add( - EntityWrapper( - entity: e, - overrideName: rawEntity["name"], - overrideIcon: rawEntity["icon"], - stateFilter: rawEntity['state_filter'] ?? [], - uiAction: EntityUIAction(rawEntityData: rawEntity) - ) - ); - } else { - card.entities.add(EntityWrapper(entity: Entity.missed(rawEntity["entity"]))); - } - } - }); - } else if (rawSingleEntity != null) { - var en = rawSingleEntity; - if (en is String) { - if (HomeAssistant().entities.isExist(en)) { - Entity e = HomeAssistant().entities.get(en); - card.linkedEntityWrapper = EntityWrapper( - entity: e, - overrideIcon: rawCardInfo["icon"], - overrideName: rawCardInfo["name"], - uiAction: EntityUIAction(rawEntityData: rawCard) - ); - } else { - card.linkedEntityWrapper = EntityWrapper(entity: Entity.missed(en)); - } - } else { - if (HomeAssistant().entities.isExist(en["entity"])) { - Entity e = HomeAssistant().entities.get(en["entity"]); - card.linkedEntityWrapper = EntityWrapper( - entity: e, - overrideIcon: en["icon"], - overrideName: en["name"], - stateFilter: en['state_filter'] ?? [], - uiAction: EntityUIAction(rawEntityData: rawCard) - ); - } else { - card.linkedEntityWrapper = EntityWrapper(entity: Entity.missed(en["entity"])); - } - } - } else { - card.linkedEntityWrapper = EntityWrapper( - entity: Entity.ghost( - card.name, - card.icon, - ), - uiAction: EntityUIAction( - rawEntityData: rawCardInfo - ) - ); - } - result.add(card); - } catch (e) { - Logger.e("There was an error parsing card: ${e.toString()}"); - } - }); - return result; + //cards.addAll(_createLovelaceCards(rawData["cards"] ?? [], 1)); } Widget buildTab() { diff --git a/lib/viewWidget.widget.dart b/lib/viewWidget.widget.dart index d1f6f7a..d09a3ff 100644 --- a/lib/viewWidget.widget.dart +++ b/lib/viewWidget.widget.dart @@ -21,7 +21,25 @@ class ViewWidget extends StatelessWidget { if (this.view.cards.isNotEmpty) { cardsContainer = DynamicMultiColumnLayout( minColumnWidth: Sizes.minViewColumnWidth, - children: this.view.cards.map((card) => LovelaceCard(card: card)).toList(), + children: this.view.cards.map((card) { + if (card.conditions.isNotEmpty) { + bool showCardByConditions = true; + for (var condition in card.conditions) { + Entity conditionEntity = HomeAssistant().entities.get(condition['entity']); + if (conditionEntity != null && + ((condition['state'] != null && conditionEntity.state != condition['state']) || + (condition['state_not'] != null && conditionEntity.state == condition['state_not'])) + ) { + showCardByConditions = false; + break; + } + } + if (!showCardByConditions) { + return Container(width: 0.0, height: 0.0,); + } + } + return card.buildCardWidget(); + }).toList(), ); } else { cardsContainer = Container(); @@ -39,7 +57,7 @@ class ViewWidget extends StatelessWidget { Widget _buildPanelChild(BuildContext context) { if (this.view.cards != null && this.view.cards.isNotEmpty) { - return LovelaceCard(card: this.view.cards[0]); + return this.view.cards[0].buildCardWidget(); } else { return Container(width: 0, height: 0); }