[#12] Parse default_view to build main screen

This commit is contained in:
estevez
2018-09-15 12:56:42 +03:00
parent cd17eabb63
commit b9e07abba9
2 changed files with 131 additions and 50 deletions

View File

@ -1,5 +1,6 @@
import 'dart:convert';
import 'dart:async';
import 'package:flutter/rendering.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
@ -43,6 +44,7 @@ class _MainPageState extends State<MainPage> {
HassioDataModel _dataModel;
Map _entitiesData;
Map _uiStructure;
String _dataModelErrorMessage = "";
bool loading = true;
@ -68,7 +70,8 @@ class _MainPageState extends State<MainPage> {
if (_dataModel != null) {
await _dataModel.fetch().then((result) {
setState(() {
_entitiesData = _dataModel._uiStructure;
_entitiesData = _dataModel.entities;
_uiStructure = _dataModel.uiStructure;
loading = false;
});
}).catchError((e) {
@ -80,60 +83,127 @@ class _MainPageState extends State<MainPage> {
}
}
Widget buildEntityButtons(String entityId) {
if (_entitiesData[entityId]["services"] == null || _entitiesData[entityId]["services"].length == 0) {
return new Container(width: 0.0, height: 0.0);
Widget _buildEntityAction(String entityId) {
var entity = _entitiesData[entityId];
if (entity["actionType"] == "switch") {
return Switch(
value: (entity["state"] == "on"),
onChanged: ((state) {
_dataModel.callService(entity["domain"], state ? "turn_on" : "turn_off", entityId);
setState(() {
_entitiesData[entityId]["state"] = state ? "on" : "off";
});
}),
);
} else {
return Text(
"${entity["state"]}"
);
}
List<Widget> buttons = [];
_entitiesData[entityId]["services"].forEach((key, value) {
buttons.add(new FlatButton(
child: Text('$key'),
onPressed: () {
_dataModel.callService(_entitiesData[entityId]["domain"], key, _entitiesData[entityId]["entity_id"]);
},
));
});
return ButtonBar(
children: buttons
);
}
Widget buildEntityCard(data) {
return Card(
child: new Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
/* Widget buildEntityCard(String entityId) {
var data = _entitiesData[entityId];
if (data != null) {
return Card(
child: new Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
new ListTile(
leading: const Icon(Icons.device_hub),
subtitle: Text("${data['entity_id']}"),
trailing: Text("${data["state"]}"),
title: Text("${data["display_name"]}"),
),
new ButtonTheme
.bar( // make buttons use the appropriate styles for cards
child: buildEntityButtons(data['entity_id']),
),
],
),
);
} else {
return Card(
child: new Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
new Text("Unknown entity: $entityId")
],
),
);
}
}*/
Card _buildEntityGroup(List<String> ids, String name) {
List<Widget> body = [];
body.add(_buildEntityGroupHeader(name));
body.addAll(_buildEntityGroupBody(ids));
Card result = Card(
child: new Column(
mainAxisSize: MainAxisSize.min,
children: body
)
);
return result;
}
Widget _buildEntityGroupHeader(String name) {
var result;
if (name.length > 0) {
result = new ListTile(
//leading: const Icon(Icons.device_hub),
//subtitle: Text(".."),
//trailing: Text("${data["state"]}"),
title: Text(
"$name",
textAlign: TextAlign.left,
overflow: TextOverflow.ellipsis,
style: new TextStyle(fontWeight: FontWeight.bold, fontSize: 25.0)
),
);
} else {
result = new Container(width: 0.0, height: 0.0);
}
return result;
}
List<Widget> _buildEntityGroupBody(List<String> ids) {
List<Widget> entities = [];
ids.forEach((id){
var data = _entitiesData[id];
entities.add(
new ListTile(
leading: const Icon(Icons.device_hub),
subtitle: Text("${data['entity_id']}"),
trailing: Text("${data["state"]}"),
title: Text("${data["display_name"]}"),
),
new ButtonTheme.bar( // make buttons use the appropriate styles for cards
child: buildEntityButtons(data['entity_id']),
),
],
),
);
//subtitle: Text("${data['entity_id']}"),
trailing: _buildEntityAction(id),
title: Text(
"${data["display_name"]}",
overflow: TextOverflow.ellipsis,
),
)
);
});
return entities;
}
List<Widget> buildEntitiesView() {
if (_entitiesData != null) {
if ((_entitiesData != null)&&(_uiStructure != null)) {
List<Widget> result = [];
if (_dataModelErrorMessage.length == 0) {
_entitiesData.forEach((key, data) {
if (data != null) {
result.add(buildEntityCard(data));
} else {
debugPrint("Unknown entity: $key");
}
_uiStructure["standalone"].forEach((entityId) {
result.add(_buildEntityGroup([entityId], ""));
});
_uiStructure["groups"].forEach((group) {
result.add(_buildEntityGroup(group["children"], group["friendly_name"].toString()));
});
} else {
result.add(Text(_dataModelErrorMessage));
//TODO
//result.add(Text(_dataModelErrorMessage));
}
return result;
} else {
return [Container(width: 0.0, height: 0.0)];
//TODO
return [];
}
}
@ -196,7 +266,7 @@ class _MainPageState extends State<MainPage> {
),
),
body: ListView(
children: buildEntitiesView(),
children: buildEntitiesView()
),
floatingActionButton: new FloatingActionButton(
onPressed: _refreshData,