From d2d037e468cb7ad6508179be985a63d3c9cf1b23 Mon Sep 17 00:00:00 2001 From: estevez-dev Date: Mon, 20 Jul 2020 13:53:18 +0300 Subject: [PATCH] Map card WIP --- lib/cards/card.class.dart | 25 ++++++++-- lib/cards/map_card.dart | 74 ++++++++++++++++++++++++----- lib/main.dart | 3 ++ lib/pages/main/main.page.dart | 2 +- lib/utils/RandomColorGenerator.dart | 28 +++++++++++ lib/view.class.dart | 2 +- pubspec.yaml | 1 + 7 files changed, 118 insertions(+), 17 deletions(-) create mode 100644 lib/utils/RandomColorGenerator.dart diff --git a/lib/cards/card.class.dart b/lib/cards/card.class.dart index b134673..98bc6ef 100644 --- a/lib/cards/card.class.dart +++ b/lib/cards/card.class.dart @@ -21,7 +21,6 @@ class CardData { switch (rawData['type']) { case CardType.ENTITIES: case CardType.HISTORY_GRAPH: - case CardType.MAP: case CardType.PICTURE_GLANCE: case CardType.SENSOR: case CardType.ENTITY: @@ -47,6 +46,9 @@ class CardData { return CardData(null); } break; + case CardType.MAP: + return MapCardData(rawData); + break; case CardType.ENTITY_BUTTON: case CardType.BUTTON: case CardType.PICTURE_ENTITY: @@ -656,7 +658,7 @@ class MapCardData extends CardData { MapCardData(rawData) : super(rawData) { //Parsing card data title = rawData['title']; - List geoLocationSources = rawData['geo_location_sources'] ?? []; + List geoLocationSources = rawData['geo_location_sources'] ?? []; if (geoLocationSources.isNotEmpty) { //TODO add entities by source } @@ -664,8 +666,25 @@ class MapCardData extends CardData { rawEntities.forEach((rawEntity) { if (rawEntity is String) { if (HomeAssistant().entities.isExist(rawEntity)) { + entities.add(EntityWrapper(entity: HomeAssistant().entities.get(rawEntity))); + } else { + entities.add(EntityWrapper(entity: Entity.missed(rawEntity))); + } + } else { + if (HomeAssistant().entities.isExist(rawEntity["entity"])) { + Entity e = HomeAssistant().entities.get(rawEntity["entity"]); entities.add( - EntityWrapper(entity: HomeAssistant().entities.get(rawEntity))); + EntityWrapper( + entity: e, + stateColor: stateColor, + overrideName: rawEntity["name"]?.toString(), + overrideIcon: rawEntity["icon"], + stateFilter: rawEntity['state_filter'] ?? [], + uiAction: EntityUIAction(rawEntityData: rawEntity) + ) + ); + } else { + entities.add(EntityWrapper(entity: Entity.missed(rawEntity["entity"]))); } } }); diff --git a/lib/cards/map_card.dart b/lib/cards/map_card.dart index d376133..e38318a 100644 --- a/lib/cards/map_card.dart +++ b/lib/cards/map_card.dart @@ -1,25 +1,75 @@ part of '../main.dart'; -class MapCard extends StatelessWidget { +class MapCard extends StatefulWidget { final MapCardData card; const MapCard({Key key, this.card}) : super(key: key); + @override + _MapCardState createState() => _MapCardState(); +} + +class _MapCardState extends State { + + GlobalKey _mapKey = new GlobalKey(); + MapController mapController = MapController(); + @override Widget build(BuildContext context) { + List markers = []; + List points = []; + widget.card.entities.forEach((entityWrapper) { + double lat = entityWrapper.entity._getDoubleAttributeValue("latitude"); + double long = entityWrapper.entity._getDoubleAttributeValue("longitude"); + if (lat != null && long != null) { + points.add(LatLng(lat, long)); + markers.add( + Marker( + width: 36, + height: 36, + point: LatLng(lat, long), + builder: (ctx) => EntityModel( + handleTap: true, + entityWrapper: entityWrapper, + child: EntityIcon( + size: 36, + ), + ) + ) + ); + } + }); return CardWrapper( - child: Padding( - padding: EdgeInsets.fromLTRB(Sizes.leftWidgetPadding, Sizes.rowPadding, Sizes.rightWidgetPadding, Sizes.rowPadding), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - CardHeader(name: card.title) - ], - ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + CardHeader(name: widget.card.title), + AspectRatio( + aspectRatio: 1, + child: GestureDetector( + child: FlutterMap( + key: _mapKey, + mapController: mapController, + options: new MapOptions( + interactive: true, + bounds: LatLngBounds.fromPoints(points), + boundsOptions: FitBoundsOptions(padding: EdgeInsets.all(30)), + ), + layers: [ + new TileLayerOptions( + urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + subdomains: ['a', 'b', 'c'] + ), + new MarkerLayerOptions( + markers: markers, + ), + ], + ) + ), + ) + ], ) ); } - - } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index feae6c2..790e76b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -27,12 +27,15 @@ import 'package:flutter_webview_plugin/flutter_webview_plugin.dart' as standalon import 'package:webview_flutter/webview_flutter.dart'; import 'package:syncfusion_flutter_core/core.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong/latlong.dart'; import 'utils/logger.dart'; import '.secrets.dart'; part 'const.dart'; part 'utils/launcher.dart'; +part 'utils/RandomColorGenerator.dart'; part 'entities/entity.class.dart'; part 'entities/entity_wrapper.class.dart'; part 'entities/timer/timer_entity.class.dart'; diff --git a/lib/pages/main/main.page.dart b/lib/pages/main/main.page.dart index 03de9c3..a726915 100644 --- a/lib/pages/main/main.page.dart +++ b/lib/pages/main/main.page.dart @@ -408,7 +408,7 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker int currentViewCount = HomeAssistant().ui?.views?.length ?? 0; if (_previousViewCount != currentViewCount) { - Logger.d("Views count changed ($_previousViewCount->$currentViewCount). Creating new tabs controller."); + //Logger.d("Views count changed ($_previousViewCount->$currentViewCount). Creating new tabs controller."); _viewsTabController = TabController(vsync: this, length: currentViewCount); _previousViewCount = currentViewCount; } diff --git a/lib/utils/RandomColorGenerator.dart b/lib/utils/RandomColorGenerator.dart new file mode 100644 index 0000000..01dcfec --- /dev/null +++ b/lib/utils/RandomColorGenerator.dart @@ -0,0 +1,28 @@ +part of '../main.dart'; + +class RandomColorGenerator { + static const colorsList = [ + Colors.green, + Colors.purple, + Colors.indigo, + Colors.red, + Colors.orange, + Colors.cyan + ]; + + int _index = 0; + + Color getCurrent() { + return colorsList[_index]; + } + + Color getNext() { + if (_index < colorsList.length - 1) { + _index += 1; + } else { + _index = 1; + } + return getCurrent(); + } + +} \ No newline at end of file diff --git a/lib/view.class.dart b/lib/view.class.dart index 599fc2c..78f4fcc 100644 --- a/lib/view.class.dart +++ b/lib/view.class.dart @@ -74,7 +74,7 @@ class HAView { Widget build(BuildContext context) { return ViewWidget( - view: this, + view: this ); } } diff --git a/pubspec.yaml b/pubspec.yaml index 90adf4a..903da5c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,6 +29,7 @@ dependencies: firebase_crashlytics: ^0.1.3+3 syncfusion_flutter_core: ^18.2.44 syncfusion_flutter_gauges: ^18.2.44 + flutter_map: ^0.10.1 dev_dependencies: