Resolves #539 Fix button card without entity

This commit is contained in:
Yegor Vialov 2020-04-25 20:53:08 +00:00
parent 05c1427aa8
commit 2c3335ebf3
11 changed files with 115 additions and 104 deletions

View File

@ -22,6 +22,7 @@ class HACard {
int max; int max;
int depth; int depth;
Map severity; Map severity;
EntityUIAction action;
HACard({ HACard({
this.name, this.name,
@ -117,5 +118,4 @@ class HACard {
return showByFilter; return showByFilter;
}).toList(); }).toList();
} }
} }

View File

@ -15,7 +15,7 @@ class LovelaceCard extends StatelessWidget {
if (card.linkedEntityWrapper.entity.isHidden) { if (card.linkedEntityWrapper.entity.isHidden) {
return Container(width: 0.0, height: 0.0,); return Container(width: 0.0, height: 0.0,);
} }
if (card.linkedEntityWrapper.entity.statelessType == StatelessEntityType.MISSED) { if (card.linkedEntityWrapper.entity.statelessType == StatelessEntityType.missed) {
return EntityModel( return EntityModel(
entityWrapper: card.linkedEntityWrapper, entityWrapper: card.linkedEntityWrapper,
child: MissedEntityWidget(), child: MissedEntityWidget(),

View File

@ -10,39 +10,45 @@ class EntityButtonCard extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
card.linkedEntityWrapper.overrideName = card.name?.toUpperCase() ?? //card.linkedEntityWrapper.overrideName = card.name?.toUpperCase() ??
card.linkedEntityWrapper.displayName.toUpperCase(); // card.linkedEntityWrapper.displayName.toUpperCase();
EntityWrapper entityWrapper = card.linkedEntityWrapper; EntityWrapper entityWrapper = card.linkedEntityWrapper;
if (entityWrapper.entity.statelessType == StatelessEntityType.MISSED) { if (entityWrapper.entity.statelessType == StatelessEntityType.missed) {
return MissedEntityWidget(); return MissedEntityWidget();
} } else if (entityWrapper.entity.statelessType != StatelessEntityType.ghost && entityWrapper.entity.statelessType != StatelessEntityType.none) {
if (entityWrapper.entity.statelessType > StatelessEntityType.MISSED) {
return Container(width: 0.0, height: 0.0,); return Container(width: 0.0, height: 0.0,);
} }
double widthBase = math.min(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height) / 6; double widthBase = math.min(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height) / 6;
Widget buttonIcon;
if (entityWrapper.icon == null || entityWrapper.icon.isEmpty) {
buttonIcon = Container(height: Sizes.rowPadding, width: 10);
} else {
buttonIcon = EntityIcon(
padding: EdgeInsets.fromLTRB(2.0, 6.0, 2.0, 2.0),
size: widthBase / (card.depth * 0.5),
);
}
return CardWrapper( return CardWrapper(
child: Center(
child: EntityModel( child: EntityModel(
entityWrapper: card.linkedEntityWrapper, entityWrapper: card.linkedEntityWrapper,
child: InkWell( child: InkWell(
onTap: () => entityWrapper.handleTap(), onTap: () => entityWrapper.handleTap(),
onLongPress: () => entityWrapper.handleHold(), onLongPress: () => entityWrapper.handleHold(),
onDoubleTap: () => entityWrapper.handleDoubleTap(), onDoubleTap: () => entityWrapper.handleDoubleTap(),
child: Container(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[ children: <Widget>[
EntityIcon( buttonIcon,
padding: EdgeInsets.fromLTRB(2.0, 6.0, 2.0, 2.0),
size: widthBase / (card.depth * 0.5),
),
_buildName() _buildName()
], ],
)
), ),
), ),
handleTap: true handleTap: true
),
) )
); );
} }

View File

@ -59,10 +59,9 @@ class GlanceCard extends StatelessWidget {
} }
Widget _buildEntityContainer(BuildContext context, EntityWrapper entityWrapper) { Widget _buildEntityContainer(BuildContext context, EntityWrapper entityWrapper) {
if (entityWrapper.entity.statelessType == StatelessEntityType.MISSED) { if (entityWrapper.entity.statelessType == StatelessEntityType.missed) {
return MissedEntityWidget(); return MissedEntityWidget();
} } else if (entityWrapper.entity.statelessType != StatelessEntityType.none) {
if (entityWrapper.entity.statelessType > StatelessEntityType.MISSED) {
return Container(width: 0.0, height: 0.0,); return Container(width: 0.0, height: 0.0,);
} }
List<Widget> result = []; List<Widget> result = [];

View File

@ -11,13 +11,13 @@ class DefaultEntityContainer extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final EntityModel entityModel = EntityModel.of(context); final EntityModel entityModel = EntityModel.of(context);
if (entityModel.entityWrapper.entity.statelessType == StatelessEntityType.MISSED) { if (entityModel.entityWrapper.entity.statelessType == StatelessEntityType.missed) {
return MissedEntityWidget(); return MissedEntityWidget();
} }
if (entityModel.entityWrapper.entity.statelessType == StatelessEntityType.DIVIDER) { if (entityModel.entityWrapper.entity.statelessType == StatelessEntityType.divider) {
return Divider(); return Divider();
} }
if (entityModel.entityWrapper.entity.statelessType == StatelessEntityType.SECTION) { if (entityModel.entityWrapper.entity.statelessType == StatelessEntityType.section) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,

View File

@ -1,13 +1,6 @@
part of '../main.dart'; part of '../main.dart';
class StatelessEntityType { enum StatelessEntityType {none, missed, ghost, divider, section, callService, webLink}
static const NONE = 0;
static const MISSED = 1;
static const DIVIDER = 2;
static const SECTION = 3;
static const CALL_SERVICE = 4;
static const WEBLINK = 5;
}
class Entity { class Entity {
@ -77,7 +70,7 @@ class Entity {
String state; String state;
String displayState; String displayState;
DateTime lastUpdatedTimestamp; DateTime lastUpdatedTimestamp;
int statelessType = 0; StatelessEntityType statelessType = StatelessEntityType.none;
List<Entity> childEntities = []; List<Entity> childEntities = [];
String deviceClass; String deviceClass;
@ -120,30 +113,35 @@ class Entity {
} }
Entity.missed(String entityId) { Entity.missed(String entityId) {
statelessType = StatelessEntityType.MISSED; statelessType = StatelessEntityType.missed;
attributes = {"hidden": false}; attributes = {"hidden": false};
this.entityId = entityId; this.entityId = entityId;
} }
Entity.divider() { Entity.divider() {
statelessType = StatelessEntityType.DIVIDER; statelessType = StatelessEntityType.divider;
attributes = {"hidden": false}; attributes = {"hidden": false};
} }
Entity.section(String label) { Entity.section(String label) {
statelessType = StatelessEntityType.SECTION; statelessType = StatelessEntityType.section;
attributes = {"hidden": false, "friendly_name": "$label"}; attributes = {"hidden": false, "friendly_name": "$label"};
} }
Entity.ghost(String name, String icon) {
statelessType = StatelessEntityType.ghost;
attributes = {"icon": icon, "hidden": false, "friendly_name": name};
}
Entity.callService({String icon, String name, String service, String actionName}) { Entity.callService({String icon, String name, String service, String actionName}) {
statelessType = StatelessEntityType.CALL_SERVICE; statelessType = StatelessEntityType.callService;
entityId = service; entityId = service;
displayState = actionName?.toUpperCase() ?? "RUN"; displayState = actionName?.toUpperCase() ?? "RUN";
attributes = {"hidden": false, "friendly_name": "$name", "icon": "$icon"}; attributes = {"hidden": false, "friendly_name": "$name", "icon": "$icon"};
} }
Entity.weblink({String url, String name, String icon}) { Entity.weblink({String url, String name, String icon}) {
statelessType = StatelessEntityType.WEBLINK; statelessType = StatelessEntityType.webLink;
entityId = "custom.custom"; entityId = "custom.custom";
attributes = {"hidden": false, "friendly_name": "${name ?? url}", "icon": "${icon ?? 'mdi:link'}"}; attributes = {"hidden": false, "friendly_name": "${name ?? url}", "icon": "${icon ?? 'mdi:link'}"};
} }

View File

@ -16,7 +16,7 @@ class EntityName extends StatelessWidget {
final EntityWrapper entityWrapper = EntityModel.of(context).entityWrapper; final EntityWrapper entityWrapper = EntityModel.of(context).entityWrapper;
TextStyle tStyle; TextStyle tStyle;
if (textStyle == null) { if (textStyle == null) {
if (entityWrapper.entity.statelessType == StatelessEntityType.WEBLINK) { if (entityWrapper.entity.statelessType == StatelessEntityType.webLink) {
tStyle = HAClientTheme().getLinkTextStyle(context); tStyle = HAClientTheme().getLinkTextStyle(context);
} else { } else {
tStyle = Theme.of(context).textTheme.body1; tStyle = Theme.of(context).textTheme.body1;

View File

@ -21,7 +21,7 @@ class EntityWrapper {
this.uiAction, this.uiAction,
this.stateFilter this.stateFilter
}) { }) {
if (entity.statelessType == StatelessEntityType.NONE || entity.statelessType == StatelessEntityType.CALL_SERVICE || entity.statelessType == StatelessEntityType.WEBLINK) { if (entity.statelessType == StatelessEntityType.ghost || entity.statelessType == StatelessEntityType.none || entity.statelessType == StatelessEntityType.callService || entity.statelessType == StatelessEntityType.webLink) {
if (uiAction == null) { if (uiAction == null) {
uiAction = EntityUIAction(); uiAction = EntityUIAction();
} }

View File

@ -25,7 +25,7 @@ class SimpleEntityState extends StatelessWidget {
TextStyle tStyle; TextStyle tStyle;
if (textStyle != null) { if (textStyle != null) {
tStyle = textStyle; tStyle = textStyle;
} else if (entityModel.entityWrapper.entity.statelessType == StatelessEntityType.CALL_SERVICE) { } else if (entityModel.entityWrapper.entity.statelessType == StatelessEntityType.callService) {
tStyle = Theme.of(context).textTheme.subhead.copyWith( tStyle = Theme.of(context).textTheme.subhead.copyWith(
color: Colors.blue color: Colors.blue
); );

View File

@ -14,7 +14,6 @@ class BottomInfoBarController {
List<HAErrorAction> actions = []; List<HAErrorAction> actions = [];
void hideBottomBar() { void hideBottomBar() {
//_scaffoldKey?.currentState?.hideCurrentSnackBar();
_bottomBarTimer?.cancel(); _bottomBarTimer?.cancel();
if (hide == null) { if (hide == null) {
initialState = false; initialState = false;
@ -32,7 +31,6 @@ class BottomInfoBarController {
if (show == null) { if (show == null) {
initialState = true; initialState = true;
} else { } else {
Logger.d("Calling show() - ${bottomBarProgress}");
show(); show();
} }
if (duration != null) { if (duration != null) {
@ -78,7 +76,6 @@ class _BottomInfoBarState extends State<BottomInfoBar> {
void initState() { void initState() {
_show = widget.controller.initialState; _show = widget.controller.initialState;
widget.controller.show = () { widget.controller.show = () {
Logger.d('Set state in show() - ${widget.controller.bottomBarProgress}');
setState(() { setState(() {
_show = true; _show = true;
}); });

View File

@ -66,7 +66,9 @@ class HAView {
card.childCards = _createLovelaceCards(rawCardInfo["cards"], depth + 1); card.childCards = _createLovelaceCards(rawCardInfo["cards"], depth + 1);
} }
var rawEntities = rawCard["entities"] ?? rawCardInfo["entities"]; var rawEntities = rawCard["entities"] ?? rawCardInfo["entities"];
rawEntities?.forEach((rawEntity) { var rawSingleEntity = rawCard["entity"] ?? rawCardInfo["entity"];
if (rawEntities != null) {
rawEntities.forEach((rawEntity) {
if (rawEntity is String) { if (rawEntity is String) {
if (HomeAssistant().entities.isExist(rawEntity)) { if (HomeAssistant().entities.isExist(rawEntity)) {
card.entities.add(EntityWrapper(entity: HomeAssistant().entities.get(rawEntity))); card.entities.add(EntityWrapper(entity: HomeAssistant().entities.get(rawEntity)));
@ -130,8 +132,7 @@ class HAView {
} }
} }
}); });
var rawSingleEntity = rawCard["entity"] ?? rawCardInfo["entity"]; } else if (rawSingleEntity != null) {
if (rawSingleEntity != null) {
var en = rawSingleEntity; var en = rawSingleEntity;
if (en is String) { if (en is String) {
if (HomeAssistant().entities.isExist(en)) { if (HomeAssistant().entities.isExist(en)) {
@ -159,6 +160,16 @@ class HAView {
card.linkedEntityWrapper = EntityWrapper(entity: Entity.missed(en["entity"])); 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); result.add(card);
} catch (e) { } catch (e) {