diff --git a/lib/cards/card.class.dart b/lib/cards/card.class.dart index 9c03a34..13c1c18 100644 --- a/lib/cards/card.class.dart +++ b/lib/cards/card.class.dart @@ -10,6 +10,7 @@ class HACard { bool showName; bool showState; bool showEmpty; + bool showHeaderToggle; int columnsCount; List stateFilter; List states; @@ -26,6 +27,7 @@ class HACard { this.linkedEntityWrapper, this.columnsCount: 4, this.showName: true, + this.showHeaderToggle: true, this.showState: true, this.stateFilter: const [], this.showEmpty: true, diff --git a/lib/cards/card_widget.dart b/lib/cards/card_widget.dart index 8e02e79..b13f325 100644 --- a/lib/cards/card_widget.dart +++ b/lib/cards/card_widget.dart @@ -132,7 +132,33 @@ class CardWidget extends StatelessWidget { return Container(height: 0.0, width: 0.0,); } List body = []; - body.add(CardHeader(name: card.name)); + Widget headerSwitch; + if (card.showHeaderToggle) { + bool headerToggleVal = entitiesToShow.any((EntityWrapper en){ return en.entity.state == EntityState.on; }); + List entitiesToToggle = entitiesToShow.where((EntityWrapper enw) { + return ["switch", "light", "automation", "input_boolean"].contains(enw.entity.domain); + }).map((EntityWrapper en) { + return en.entity.entityId; + }).toList(); + headerSwitch = Switch( + value: headerToggleVal, + onChanged: (val) { + if (entitiesToToggle.isNotEmpty) { + ConnectionManager().callService( + domain: "homeassistant", + service: val ? "turn_on" : "turn_off", + entityId: entitiesToToggle + ); + } + }, + ); + } + body.add( + CardHeader( + name: card.name, + trailing: headerSwitch + ) + ); entitiesToShow.forEach((EntityWrapper entity) { body.add( Padding( @@ -329,7 +355,11 @@ class CardWidget extends StatelessWidget { Widget _buildUnsupportedCard(BuildContext context) { List body = []; - body.add(CardHeader(name: card.name ?? "")); + body.add( + CardHeader( + name: card.name ?? "" + ) + ); List result = []; if (card.linkedEntityWrapper != null) { result.addAll([ diff --git a/lib/home_assistant.class.dart b/lib/home_assistant.class.dart index 63caddd..357856b 100644 --- a/lib/home_assistant.class.dart +++ b/lib/home_assistant.class.dart @@ -221,6 +221,7 @@ class HomeAssistant { type: rawCardInfo['type'] ?? CardType.ENTITIES, columnsCount: rawCardInfo['columns'] ?? 4, showName: (rawCardInfo['show_name'] ?? rawCard['show_name']) ?? true, + showHeaderToggle: (rawCardInfo['show_header_toggle'] ?? rawCard['show_header_toggle']) ?? true, showState: (rawCardInfo['show_state'] ?? rawCard['show_state']) ?? true, showEmpty: (rawCardInfo['show_empty'] ?? rawCard['show_empty']) ?? true, stateFilter: (rawCard['state_filter'] ?? rawCardInfo['state_filter']) ?? [], diff --git a/lib/managers/connection_manager.class.dart b/lib/managers/connection_manager.class.dart index 2dbe80c..35b8b9f 100644 --- a/lib/managers/connection_manager.class.dart +++ b/lib/managers/connection_manager.class.dart @@ -352,7 +352,7 @@ class ConnectionManager { _currentMessageId += 1; } - Future callService({@required String domain, @required String service, String entityId, Map data}) { + Future callService({@required String domain, @required String service, entityId, Map data}) { eventBus.fire(NotifyServiceCallEvent(domain, service, entityId)); Logger.d("Service call: $domain.$service, $entityId, $data"); Completer completer = Completer(); diff --git a/lib/pages/main/main.page.dart b/lib/pages/main/main.page.dart index 32c016a..9072c51 100644 --- a/lib/pages/main/main.page.dart +++ b/lib/pages/main/main.page.dart @@ -278,7 +278,7 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker ); } - void _notifyServiceCalled(String domain, String service, String entityId) { + void _notifyServiceCalled(String domain, String service, entityId) { _showInfoBottomBar( message: "Calling $domain.$service", duration: Duration(seconds: 4) diff --git a/lib/types/event_bus_events.dart b/lib/types/event_bus_events.dart index 1181967..cbaf68e 100644 --- a/lib/types/event_bus_events.dart +++ b/lib/types/event_bus_events.dart @@ -36,7 +36,7 @@ class StartAuthEvent { class NotifyServiceCallEvent { String domain; String service; - String entityId; + var entityId; NotifyServiceCallEvent(this.domain, this.service, this.entityId); }