WIP #183
This commit is contained in:
parent
874410964d
commit
25bf10a64e
@ -88,6 +88,14 @@ class Entity {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget buildGlanceWidget(BuildContext context) {
|
||||||
|
return EntityModel(
|
||||||
|
entity: this,
|
||||||
|
child: GlanceEntityContainer(),
|
||||||
|
handleTap: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildStatePart(BuildContext context) {
|
Widget _buildStatePart(BuildContext context) {
|
||||||
return SimpleEntityState();
|
return SimpleEntityState();
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,22 @@
|
|||||||
part of '../main.dart';
|
part of '../main.dart';
|
||||||
|
|
||||||
class EntityIcon extends StatelessWidget {
|
class EntityIcon extends StatelessWidget {
|
||||||
|
|
||||||
|
final EdgeInsetsGeometry padding;
|
||||||
|
final double iconSize;
|
||||||
|
|
||||||
|
const EntityIcon({Key key, this.iconSize: Sizes.iconSize, this.padding: const EdgeInsets.fromLTRB(
|
||||||
|
Sizes.leftWidgetPadding, 0.0, 12.0, 0.0)}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final entityModel = EntityModel.of(context);
|
final entityModel = EntityModel.of(context);
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.fromLTRB(
|
padding: padding,
|
||||||
Sizes.leftWidgetPadding, 0.0, 12.0, 0.0),
|
|
||||||
child: MaterialDesignIcons.createIconWidgetFromEntityData(
|
child: MaterialDesignIcons.createIconWidgetFromEntityData(
|
||||||
entityModel.entity,
|
entityModel.entity,
|
||||||
Sizes.iconSize,
|
iconSize,
|
||||||
EntityColor.stateColor(entityModel.entity.state)
|
EntityColor.stateColor(entityModel.entity.state)
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -1,16 +1,21 @@
|
|||||||
part of '../main.dart';
|
part of '../main.dart';
|
||||||
|
|
||||||
class EntityName extends StatelessWidget {
|
class EntityName extends StatelessWidget {
|
||||||
|
|
||||||
|
final EdgeInsetsGeometry padding;
|
||||||
|
|
||||||
|
const EntityName({Key key, this.padding: const EdgeInsets.only(right: 10.0)}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final entityModel = EntityModel.of(context);
|
final entityModel = EntityModel.of(context);
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.only(right: 10.0),
|
padding: padding,
|
||||||
child: Text(
|
child: Text(
|
||||||
"${entityModel.entity.displayName}",
|
"${entityModel.entity.displayName}",
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
softWrap: false,
|
softWrap: true,
|
||||||
style: TextStyle(fontSize: Sizes.nameFontSize),
|
style: TextStyle(fontSize: Sizes.nameFontSize),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
30
lib/entity_widgets/glance_entity_container.dart
Normal file
30
lib/entity_widgets/glance_entity_container.dart
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
part of '../main.dart';
|
||||||
|
|
||||||
|
class GlanceEntityContainer extends StatelessWidget {
|
||||||
|
GlanceEntityContainer({
|
||||||
|
Key key,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
EntityName(
|
||||||
|
padding: EdgeInsets.all(0.0),
|
||||||
|
),
|
||||||
|
EntityIcon(
|
||||||
|
padding: EdgeInsets.all(0.0),
|
||||||
|
iconSize: Sizes.largeIconSize,
|
||||||
|
),
|
||||||
|
SimpleEntityState(
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
expanded: false,
|
||||||
|
padding: EdgeInsets.all(0.0),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -3,18 +3,20 @@ part of '../../main.dart';
|
|||||||
class SimpleEntityState extends StatelessWidget {
|
class SimpleEntityState extends StatelessWidget {
|
||||||
|
|
||||||
final bool expanded;
|
final bool expanded;
|
||||||
|
final TextAlign textAlign;
|
||||||
|
final EdgeInsetsGeometry padding;
|
||||||
|
|
||||||
const SimpleEntityState({Key key, this.expanded: true}) : super(key: key);
|
const SimpleEntityState({Key key, this.expanded: true, this.textAlign: TextAlign.right, this.padding: const EdgeInsets.fromLTRB(0.0, 0.0, Sizes.rightWidgetPadding, 0.0)}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final entityModel = EntityModel.of(context);
|
final entityModel = EntityModel.of(context);
|
||||||
Widget result = Padding(
|
Widget result = Padding(
|
||||||
padding: EdgeInsets.fromLTRB(0.0, 0.0, Sizes.rightWidgetPadding, 0.0),
|
padding: padding,
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
child: Text(
|
child: Text(
|
||||||
"${entityModel.entity.state}${entityModel.entity.unitOfMeasurement}",
|
"${entityModel.entity.state}${entityModel.entity.unitOfMeasurement}",
|
||||||
textAlign: TextAlign.right,
|
textAlign: textAlign,
|
||||||
maxLines: 4,
|
maxLines: 4,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
softWrap: true,
|
softWrap: true,
|
||||||
|
@ -411,7 +411,8 @@ class HomeAssistant {
|
|||||||
HACard card = HACard(
|
HACard card = HACard(
|
||||||
id: "card",
|
id: "card",
|
||||||
name: rawCard["title"],
|
name: rawCard["title"],
|
||||||
type: rawCard['type']
|
type: rawCard['type'],
|
||||||
|
columnsCount: rawCard['columns'] ?? 4,
|
||||||
);
|
);
|
||||||
rawCard["entities"]?.forEach((rawEntity) {
|
rawCard["entities"]?.forEach((rawEntity) {
|
||||||
if (rawEntity is String) {
|
if (rawEntity is String) {
|
||||||
|
@ -31,6 +31,7 @@ part 'entity_class/media_player_entity.class.dart';
|
|||||||
part 'entity_widgets/badge.dart';
|
part 'entity_widgets/badge.dart';
|
||||||
part 'entity_widgets/model_widgets.dart';
|
part 'entity_widgets/model_widgets.dart';
|
||||||
part 'entity_widgets/default_entity_container.dart';
|
part 'entity_widgets/default_entity_container.dart';
|
||||||
|
part 'entity_widgets/glance_entity_container.dart';
|
||||||
part 'entity_widgets/entity_attributes_list.dart';
|
part 'entity_widgets/entity_attributes_list.dart';
|
||||||
part 'entity_widgets/entity_icon.dart';
|
part 'entity_widgets/entity_icon.dart';
|
||||||
part 'entity_widgets/entity_name.dart';
|
part 'entity_widgets/entity_name.dart';
|
||||||
@ -71,6 +72,7 @@ part 'ui_class/card.class.dart';
|
|||||||
part 'ui_class/sizes_class.dart';
|
part 'ui_class/sizes_class.dart';
|
||||||
part 'ui_widgets/view.dart';
|
part 'ui_widgets/view.dart';
|
||||||
part 'ui_widgets/entities_card.dart';
|
part 'ui_widgets/entities_card.dart';
|
||||||
|
part 'ui_widgets/glance_card.dart';
|
||||||
part 'ui_widgets/unsupported_card.dart';
|
part 'ui_widgets/unsupported_card.dart';
|
||||||
part 'ui_widgets/media_control_card.dart';
|
part 'ui_widgets/media_control_card.dart';
|
||||||
part 'ui_widgets/card_header_widget.dart';
|
part 'ui_widgets/card_header_widget.dart';
|
||||||
|
@ -6,11 +6,13 @@ class HACard {
|
|||||||
String name;
|
String name;
|
||||||
String id;
|
String id;
|
||||||
String type;
|
String type;
|
||||||
|
int columnsCount;
|
||||||
|
|
||||||
HACard({
|
HACard({
|
||||||
this.name,
|
this.name,
|
||||||
this.id,
|
this.id,
|
||||||
this.linkedEntity,
|
this.linkedEntity,
|
||||||
|
this.columnsCount: 4,
|
||||||
@required this.type
|
@required this.type
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -23,6 +25,12 @@ class HACard {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case "glance": {
|
||||||
|
return GlanceCardWidget(
|
||||||
|
card: this,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
case "media-control": {
|
case "media-control": {
|
||||||
return MediaControlCardWidget(
|
return MediaControlCardWidget(
|
||||||
card: this,
|
card: this,
|
||||||
|
@ -5,6 +5,7 @@ class Sizes {
|
|||||||
static const leftWidgetPadding = 8.0;
|
static const leftWidgetPadding = 8.0;
|
||||||
static const extendedWidgetHeight = 50.0;
|
static const extendedWidgetHeight = 50.0;
|
||||||
static const iconSize = 28.0;
|
static const iconSize = 28.0;
|
||||||
|
static const largeIconSize = 34.0;
|
||||||
static const stateFontSize = 16.0;
|
static const stateFontSize = 16.0;
|
||||||
static const nameFontSize = 16.0;
|
static const nameFontSize = 16.0;
|
||||||
static const smallFontSize = 14.0;
|
static const smallFontSize = 14.0;
|
||||||
|
@ -28,7 +28,7 @@ class EntitiesCardWidget extends StatelessWidget {
|
|||||||
if (!entity.isHidden) {
|
if (!entity.isHidden) {
|
||||||
result.add(
|
result.add(
|
||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0),
|
padding: EdgeInsets.fromLTRB(0.0, Sizes.rowPadding, 0.0, Sizes.rowPadding),
|
||||||
child: entity.buildDefaultWidget(context),
|
child: entity.buildDefaultWidget(context),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
50
lib/ui_widgets/glance_card.dart
Normal file
50
lib/ui_widgets/glance_card.dart
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
part of '../main.dart';
|
||||||
|
|
||||||
|
class GlanceCardWidget extends StatelessWidget {
|
||||||
|
|
||||||
|
final HACard card;
|
||||||
|
|
||||||
|
const GlanceCardWidget({
|
||||||
|
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<Widget> rows = [];
|
||||||
|
rows.add(CardHeaderWidget(name: card.name));
|
||||||
|
rows.add(_buildRows(context));
|
||||||
|
return Card(
|
||||||
|
child: new Column(mainAxisSize: MainAxisSize.min, children: rows)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildRows(BuildContext context) {
|
||||||
|
List<Widget> result = [];
|
||||||
|
double width = MediaQuery.of(context).size.width - Sizes.leftWidgetPadding - (2*Sizes.rightWidgetPadding);
|
||||||
|
List<Entity> toShow = card.entities.where((entity) {return !entity.isHidden;}).toList();
|
||||||
|
int columnsCount = toShow.length >= card.columnsCount ? card.columnsCount : toShow.length;
|
||||||
|
card.entities.forEach((Entity entity) {
|
||||||
|
if (!entity.isHidden) {
|
||||||
|
result.add(
|
||||||
|
SizedBox(
|
||||||
|
width: width / columnsCount,
|
||||||
|
child: entity.buildGlanceWidget(context),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.fromLTRB(0.0, Sizes.rowPadding, 0.0, 2*Sizes.rowPadding),
|
||||||
|
child: Wrap(
|
||||||
|
alignment: WrapAlignment.spaceAround,
|
||||||
|
runSpacing: Sizes.rowPadding*2,
|
||||||
|
children: result,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user