mirror of
https://bitbucket.org/FransoletThomas/tablet-app.git
synced 2025-12-06 08:31:19 +00:00
WIP geopoints filter on map
This commit is contained in:
parent
fbf051b23f
commit
d9efad47f8
@ -14,7 +14,8 @@ List<Translation> translations = [
|
|||||||
"sunday": "Dimanche",
|
"sunday": "Dimanche",
|
||||||
"menu": "Menu",
|
"menu": "Menu",
|
||||||
"quiz.seeResponses": "Voir les réponses",
|
"quiz.seeResponses": "Voir les réponses",
|
||||||
"quiz.restart": "Recommencer"
|
"quiz.restart": "Recommencer",
|
||||||
|
"map.search": "Rechercher"
|
||||||
}),
|
}),
|
||||||
Translation(language: "EN", data: {
|
Translation(language: "EN", data: {
|
||||||
"weather.hourly": "Hourly",
|
"weather.hourly": "Hourly",
|
||||||
@ -29,7 +30,8 @@ List<Translation> translations = [
|
|||||||
"sunday": "Sunday",
|
"sunday": "Sunday",
|
||||||
"menu": "Menu",
|
"menu": "Menu",
|
||||||
"quiz.seeResponses": "See the answers",
|
"quiz.seeResponses": "See the answers",
|
||||||
"quiz.restart": "Restart"
|
"quiz.restart": "Restart",
|
||||||
|
"map.search": "Search"
|
||||||
}),
|
}),
|
||||||
Translation(language: "DE", data: {
|
Translation(language: "DE", data: {
|
||||||
"weather.hourly": "Nächste Stunden",
|
"weather.hourly": "Nächste Stunden",
|
||||||
@ -44,7 +46,8 @@ List<Translation> translations = [
|
|||||||
"sunday": "Sonntag",
|
"sunday": "Sonntag",
|
||||||
"menu": "Speisekarte",
|
"menu": "Speisekarte",
|
||||||
"quiz.seeResponses": "Sehen Sie sich die Antworten an",
|
"quiz.seeResponses": "Sehen Sie sich die Antworten an",
|
||||||
"quiz.restart": "Neu starten"
|
"quiz.restart": "Neu starten",
|
||||||
|
"map.search": "Suchen"
|
||||||
}),
|
}),
|
||||||
Translation(language: "NL", data: {
|
Translation(language: "NL", data: {
|
||||||
"weather.hourly": "Volgende uren",
|
"weather.hourly": "Volgende uren",
|
||||||
@ -59,7 +62,8 @@ List<Translation> translations = [
|
|||||||
"sunday": "Zondag",
|
"sunday": "Zondag",
|
||||||
"menu": "Menu",
|
"menu": "Menu",
|
||||||
"quiz.seeResponses": "Zie de antwoorden",
|
"quiz.seeResponses": "Zie de antwoorden",
|
||||||
"quiz.restart": "Herstarten"
|
"quiz.restart": "Herstarten",
|
||||||
|
"map.search": "Zoeken"
|
||||||
}),
|
}),
|
||||||
Translation(language: "IT", data: {
|
Translation(language: "IT", data: {
|
||||||
"weather.hourly": "Le prossime ore",
|
"weather.hourly": "Le prossime ore",
|
||||||
@ -74,7 +78,8 @@ List<Translation> translations = [
|
|||||||
"sunday": "Domenica",
|
"sunday": "Domenica",
|
||||||
"menu": "Menù",
|
"menu": "Menù",
|
||||||
"quiz.seeResponses": "Vedi le risposte",
|
"quiz.seeResponses": "Vedi le risposte",
|
||||||
"quiz.restart": "Ricomincia"
|
"quiz.restart": "Ricomincia",
|
||||||
|
"map.search": "Cerca"
|
||||||
}),
|
}),
|
||||||
Translation(language: "ES", data: {
|
Translation(language: "ES", data: {
|
||||||
"weather.hourly": "Próximas horas",
|
"weather.hourly": "Próximas horas",
|
||||||
@ -89,7 +94,8 @@ List<Translation> translations = [
|
|||||||
"sunday": "Domingo",
|
"sunday": "Domingo",
|
||||||
"menu": "Menú",
|
"menu": "Menú",
|
||||||
"quiz.seeResponses": "Ver las respuestas",
|
"quiz.seeResponses": "Ver las respuestas",
|
||||||
"quiz.restart": "Reanudar"
|
"quiz.restart": "Reanudar",
|
||||||
|
"map.search": "Buscar"
|
||||||
}),
|
}),
|
||||||
Translation(language: "PL", data: {
|
Translation(language: "PL", data: {
|
||||||
"weather.hourly": "Następne godziny",
|
"weather.hourly": "Następne godziny",
|
||||||
@ -104,7 +110,8 @@ List<Translation> translations = [
|
|||||||
"sunday": "Niedziela",
|
"sunday": "Niedziela",
|
||||||
"menu": "Menu",
|
"menu": "Menu",
|
||||||
"quiz.seeResponses": "Zobacz odpowiedzi",
|
"quiz.seeResponses": "Zobacz odpowiedzi",
|
||||||
"quiz.restart": "Uruchom ponownie"
|
"quiz.restart": "Uruchom ponownie",
|
||||||
|
"map.search": "Szukaj"
|
||||||
}),
|
}),
|
||||||
Translation(language: "CN", data: {
|
Translation(language: "CN", data: {
|
||||||
"weather.hourly": "接下来的几个小时",
|
"weather.hourly": "接下来的几个小时",
|
||||||
@ -119,7 +126,8 @@ List<Translation> translations = [
|
|||||||
"sunday": "星期日",
|
"sunday": "星期日",
|
||||||
"menu": "菜单",
|
"menu": "菜单",
|
||||||
"quiz.seeResponses": "查看答案",
|
"quiz.seeResponses": "查看答案",
|
||||||
"quiz.restart": "重新开始"
|
"quiz.restart": "重新开始",
|
||||||
|
"map.search": "搜索"
|
||||||
}),
|
}),
|
||||||
Translation(language: "UK", data: {
|
Translation(language: "UK", data: {
|
||||||
"weather.hourly": "Наступні години",
|
"weather.hourly": "Наступні години",
|
||||||
@ -134,7 +142,8 @@ List<Translation> translations = [
|
|||||||
"sunday": "Неділя",
|
"sunday": "Неділя",
|
||||||
"menu": "Меню",
|
"menu": "Меню",
|
||||||
"quiz.seeResponses": "Подивіться відповіді",
|
"quiz.seeResponses": "Подивіться відповіді",
|
||||||
"quiz.restart": "Перезапустіть"
|
"quiz.restart": "Перезапустіть",
|
||||||
|
"map.search": "Шукати"
|
||||||
}),
|
}),
|
||||||
Translation(language: "AR", data: {
|
Translation(language: "AR", data: {
|
||||||
"weather.hourly": "الساعات القادمة",
|
"weather.hourly": "الساعات القادمة",
|
||||||
@ -149,6 +158,7 @@ List<Translation> translations = [
|
|||||||
"sunday": "الأحد",
|
"sunday": "الأحد",
|
||||||
"menu": "القائمة",
|
"menu": "القائمة",
|
||||||
"quiz.seeResponses": "انظر الإجابات",
|
"quiz.seeResponses": "انظر الإجابات",
|
||||||
"quiz.restart": "إعادة تشغيل"
|
"quiz.restart": "إعادة تشغيل",
|
||||||
|
"map.search": "بحث"
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
@ -154,6 +154,7 @@ class _MainViewWidget extends State<MainViewWidget> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
resizeToAvoidBottomInset: false,
|
||||||
body: SingleChildScrollView(
|
body: SingleChildScrollView(
|
||||||
child: Container(
|
child: Container(
|
||||||
height: size.height,
|
height: size.height,
|
||||||
@ -328,6 +329,7 @@ class _MainViewWidget extends State<MainViewWidget> {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
resizeToAvoidBottomInset: false,
|
||||||
body: Container(
|
body: Container(
|
||||||
height: size.height,
|
height: size.height,
|
||||||
width: size.width,
|
width: size.width,
|
||||||
|
|||||||
@ -1,12 +1,14 @@
|
|||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
//import 'package:animated_tree_view/animated_tree_view.dart';
|
//import 'package:animated_tree_view/animated_tree_view.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
|
import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
|
||||||
import 'package:generate_tree/generate_tree.dart';
|
import 'package:generate_tree/generate_tree.dart';
|
||||||
import 'package:generate_tree/treeNode.dart';
|
import 'package:generate_tree/treeNode.dart';
|
||||||
import 'package:manager_api/api.dart';
|
import 'package:manager_api/api.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:tablet_app/Helpers/translationHelper.dart';
|
||||||
import 'package:tablet_app/Models/tabletContext.dart';
|
import 'package:tablet_app/Models/tabletContext.dart';
|
||||||
import 'package:tablet_app/app_context.dart';
|
import 'package:tablet_app/app_context.dart';
|
||||||
import 'package:tablet_app/constants.dart';
|
import 'package:tablet_app/constants.dart';
|
||||||
@ -29,19 +31,28 @@ class _GeoPointFilterState extends State<GeoPointFilter> {
|
|||||||
//late List<TreeNode> treeNodes;
|
//late List<TreeNode> treeNodes;
|
||||||
late List<TreeNode> _filteredNodes;
|
late List<TreeNode> _filteredNodes;
|
||||||
late ValueNotifier<String> _searchTextNotifier;
|
late ValueNotifier<String> _searchTextNotifier;
|
||||||
|
final TextEditingController _searchController = TextEditingController();
|
||||||
|
FocusNode focusNode = new FocusNode();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_searchTextNotifier = ValueNotifier<String>('');
|
_searchTextNotifier = ValueNotifier<String>('');
|
||||||
|
|
||||||
//_searchTextNotifier.addListener(_onSearchTextChanged); // Cause the setState ?
|
//_searchTextNotifier.addListener(_onSearchTextChanged); // Cause the setState ?
|
||||||
// Construire les nœuds de l'arborescence en utilisant les catégories et les géopoints
|
// Construire les nœuds de l'arborescence en utilisant les catégories et les géopoints
|
||||||
//treeNodes = buildTreeNodes(widget.categories, widget.geoPoints);
|
//treeNodes = buildTreeNodes(widget.categories, widget.geoPoints);
|
||||||
_filteredNodes = buildTreeNodes(widget.categories, widget.geoPoints);
|
_filteredNodes = buildTreeNodes(widget.categories, widget.geoPoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_searchController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
void _onSearchTextChanged() {
|
void _onSearchTextChanged() {
|
||||||
filterNodes(_searchTextNotifier.value);
|
//filterNodes(_searchTextNotifier.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<TreeNode> buildTreeNodes(List<CategorieDTO> categories, List<GeoPointDTO> geoPoints) {
|
List<TreeNode> buildTreeNodes(List<CategorieDTO> categories, List<GeoPointDTO> geoPoints) {
|
||||||
@ -53,7 +64,7 @@ class _GeoPointFilterState extends State<GeoPointFilter> {
|
|||||||
id: category.id ?? 0,
|
id: category.id ?? 0,
|
||||||
title: parse(category.label!.firstWhere((l) => l.language == widget.language).value!).documentElement!.text,
|
title: parse(category.label!.firstWhere((l) => l.language == widget.language).value!).documentElement!.text,
|
||||||
children: [],
|
children: [],
|
||||||
checked: false,
|
checked: true, // default true
|
||||||
show: false,
|
show: false,
|
||||||
pid: 0,
|
pid: 0,
|
||||||
commonID: 0,
|
commonID: 0,
|
||||||
@ -63,9 +74,9 @@ class _GeoPointFilterState extends State<GeoPointFilter> {
|
|||||||
for (var geoPoint in geoPoints) {
|
for (var geoPoint in geoPoints) {
|
||||||
if (geoPoint.categorieId == category.id) {
|
if (geoPoint.categorieId == category.id) {
|
||||||
TreeNode geoPointNode = TreeNode(
|
TreeNode geoPointNode = TreeNode(
|
||||||
id: geoPoint.id ?? 0,
|
id: int.parse(geoPoint.latitude!.substring(0,10).replaceAll(".", "")+geoPoint.longitude!.substring(0,10).replaceAll(".", "")),
|
||||||
title: parse(geoPoint.title!.firstWhere((l) => l.language == widget.language).value!).documentElement!.text,
|
title: parse(geoPoint.title!.firstWhere((l) => l.language == widget.language).value!).documentElement!.text,
|
||||||
checked: false,
|
checked: true, // default true
|
||||||
show: false,
|
show: false,
|
||||||
children: [],
|
children: [],
|
||||||
pid: 0,
|
pid: 0,
|
||||||
@ -81,28 +92,60 @@ class _GeoPointFilterState extends State<GeoPointFilter> {
|
|||||||
return nodes;
|
return nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void filterNodes(String searchText) {
|
void filterNodes() {
|
||||||
//setState(() {
|
String searchText = _searchController.text;
|
||||||
_searchTextNotifier.value = searchText;
|
setState(() {
|
||||||
//_searchText = searchText;
|
_filteredNodes = searchText.isEmpty
|
||||||
// Filtrer les nœuds en fonction du texte de recherche
|
|
||||||
_filteredNodes = _searchTextNotifier.value.isEmpty
|
|
||||||
? buildTreeNodes(widget.categories, widget.geoPoints)
|
? buildTreeNodes(widget.categories, widget.geoPoints)
|
||||||
: _filterNodesBySearchText(_searchTextNotifier.value);
|
: _filterNodesBySearchText(searchText);
|
||||||
//});
|
|
||||||
|
// if unfocus, then
|
||||||
|
if(searchText.isEmpty && !focusNode.hasFocus) {
|
||||||
|
// widget.filteredPoints = //todo
|
||||||
|
sendFilteredGeoPoint();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
sendFilteredGeoPoint() {
|
||||||
|
List<GeoPointDTO> checkedGeoPoints = [];
|
||||||
|
// Parcourez les nœuds filtrés pour récupérer les GeoPointDTO correspondants qui sont cochés
|
||||||
|
for (var node in _filteredNodes) {
|
||||||
|
if (node.children.isNotEmpty) {
|
||||||
|
for (var childNode in node.children) {
|
||||||
|
if (childNode.checked) {
|
||||||
|
checkedGeoPoints.add(widget.geoPoints.firstWhere((point) => int.parse(point.latitude!.substring(0,10).replaceAll(".", "")+point.longitude!.substring(0,10).replaceAll(".", "")) == childNode.id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Passez la liste des GeoPointDTO cochés à la fonction filteredPoints
|
||||||
|
widget.filteredPoints(checkedGeoPoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<TreeNode> _filterNodesBySearchText(String searchText) {
|
List<TreeNode> _filterNodesBySearchText(String searchText) {
|
||||||
List<TreeNode> filteredNodes = [];
|
List<TreeNode> filteredNodes = [];
|
||||||
for (var node in buildTreeNodes(widget.categories, widget.geoPoints)) {
|
for (var node in buildTreeNodes(widget.categories, widget.geoPoints)) {
|
||||||
if (node.title.toLowerCase().contains(searchText.toLowerCase())) {
|
if (_nodeOrChildrenContainsText(node, searchText)) {
|
||||||
// Si le titre du nœud contient le texte de recherche, ajoutez-le aux nœuds filtrés
|
|
||||||
filteredNodes.add(node);
|
filteredNodes.add(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return filteredNodes;
|
return filteredNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool _nodeOrChildrenContainsText(TreeNode node, String searchText) {
|
||||||
|
if (node.title.toLowerCase().contains(searchText)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (var childNode in node.children) {
|
||||||
|
if (_nodeOrChildrenContainsText(childNode, searchText)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Size size = MediaQuery.of(context).size;
|
Size size = MediaQuery.of(context).size;
|
||||||
@ -112,7 +155,11 @@ class _GeoPointFilterState extends State<GeoPointFilter> {
|
|||||||
|
|
||||||
var primaryColor = tabletAppContext.configuration != null ? tabletAppContext.configuration!.primaryColor != null ? new Color(int.parse(tabletAppContext.configuration!.primaryColor!.split('(0x')[1].split(')')[0], radix: 16)) : kTestSecondColor : kTestSecondColor;
|
var primaryColor = tabletAppContext.configuration != null ? tabletAppContext.configuration!.primaryColor != null ? new Color(int.parse(tabletAppContext.configuration!.primaryColor!.split('(0x')[1].split(')')[0], radix: 16)) : kTestSecondColor : kTestSecondColor;
|
||||||
|
|
||||||
return Container(
|
return Positioned(
|
||||||
|
left: 5,
|
||||||
|
top: 35,
|
||||||
|
child: Container(
|
||||||
|
width: size.width * 0.3,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: kBackgroundColor.withOpacity(0.78),
|
color: kBackgroundColor.withOpacity(0.78),
|
||||||
borderRadius: BorderRadius.all(Radius.circular(tabletAppContext.configuration!.roundedValue?.toDouble() ?? 20.0)),
|
borderRadius: BorderRadius.all(Radius.circular(tabletAppContext.configuration!.roundedValue?.toDouble() ?? 20.0)),
|
||||||
@ -121,22 +168,47 @@ class _GeoPointFilterState extends State<GeoPointFilter> {
|
|||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.all(8.0),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
TextFormField(
|
Padding(
|
||||||
//initialValue: 'Input text',
|
padding: const EdgeInsets.only(bottom: 8.0, top: 4.0),
|
||||||
|
child: TextField(
|
||||||
|
focusNode: focusNode,
|
||||||
|
controller: _searchController,
|
||||||
|
onChanged: (value) {
|
||||||
|
filterNodes();
|
||||||
|
},
|
||||||
|
cursorColor: Colors.black,
|
||||||
|
style: TextStyle(color: Colors.black),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: 'Recherche',
|
labelText: TranslationHelper.getFromLocale("map.search", appContext.getContext()),
|
||||||
suffixIcon: Icon(
|
labelStyle: TextStyle(
|
||||||
Icons.search,
|
color: focusNode.hasFocus ? primaryColor : Colors.black
|
||||||
|
),
|
||||||
|
focusColor: primaryColor,
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(tabletAppContext.configuration!.roundedValue?.toDouble() ?? 20.0)),
|
||||||
|
borderSide: BorderSide(color: primaryColor)),
|
||||||
|
//labelStyle: TextStyle(color: primaryColor),
|
||||||
|
suffixIcon: IconButton(
|
||||||
|
icon: _searchController.text.isNotEmpty ? Icon(Icons.close) : Icon(Icons.search),
|
||||||
|
onPressed: () {
|
||||||
|
if(_searchController.text.isNotEmpty) {
|
||||||
|
_searchController.text = "";
|
||||||
|
}
|
||||||
|
filterNodes();
|
||||||
|
if(_searchController.text.isNotEmpty) {
|
||||||
|
focusNode.unfocus();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onChanged: filterNodes,
|
|
||||||
),
|
),
|
||||||
ValueListenableBuilder<String>(
|
ValueListenableBuilder<String>(
|
||||||
valueListenable: _searchTextNotifier,
|
valueListenable: _searchTextNotifier,
|
||||||
builder: (context, value, _) {
|
builder: (context, value, _) {
|
||||||
return Container(
|
return Container(
|
||||||
color: Colors.greenAccent,
|
//color: Colors.greenAccent,
|
||||||
height: size.height * 0.7,
|
height: size.height * 0.65,
|
||||||
width: size.width * 0.3,
|
width: size.width * 0.3,
|
||||||
child: GenerateTree(
|
child: GenerateTree(
|
||||||
data: _filteredNodes,
|
data: _filteredNodes,
|
||||||
@ -152,6 +224,7 @@ class _GeoPointFilterState extends State<GeoPointFilter> {
|
|||||||
print('common Node ID : ${commonID}');
|
print('common Node ID : ${commonID}');
|
||||||
print('children node data : ${node.children.map((e) => '${e.title}')}');
|
print('children node data : ${node.children.map((e) => '${e.title}')}');
|
||||||
// Todo update selection
|
// Todo update selection
|
||||||
|
sendFilteredGeoPoint();
|
||||||
},
|
},
|
||||||
checkBoxColor: primaryColor,
|
checkBoxColor: primaryColor,
|
||||||
childrenPadding: EdgeInsets.only(left: 20, top: 10, right: 0, bottom: 10),
|
childrenPadding: EdgeInsets.only(left: 20, top: 10, right: 0, bottom: 10),
|
||||||
@ -162,6 +235,7 @@ class _GeoPointFilterState extends State<GeoPointFilter> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,8 +8,11 @@ import 'package:manager_api/api.dart';
|
|||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:tablet_app/Components/multi_select_container.dart';
|
import 'package:tablet_app/Components/multi_select_container.dart';
|
||||||
import 'package:tablet_app/Models/map-marker.dart';
|
import 'package:tablet_app/Models/map-marker.dart';
|
||||||
|
import 'package:tablet_app/Models/tabletContext.dart';
|
||||||
|
import 'package:tablet_app/Screens/Map/geo_point_filter.dart';
|
||||||
import 'package:tablet_app/Screens/Map/map_context.dart';
|
import 'package:tablet_app/Screens/Map/map_context.dart';
|
||||||
import 'package:html/parser.dart' show parse;
|
import 'package:html/parser.dart' show parse;
|
||||||
|
import 'package:tablet_app/app_context.dart';
|
||||||
import 'package:tablet_app/constants.dart';
|
import 'package:tablet_app/constants.dart';
|
||||||
|
|
||||||
class GoogleMapView extends StatefulWidget {
|
class GoogleMapView extends StatefulWidget {
|
||||||
@ -95,6 +98,8 @@ class _GoogleMapViewState extends State<GoogleMapView> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final mapContext = Provider.of<MapContext>(context);
|
final mapContext = Provider.of<MapContext>(context);
|
||||||
|
final appContext = Provider.of<AppContext>(context);
|
||||||
|
TabletAppContext tabletAppContext = appContext.getContext() as TabletAppContext;
|
||||||
Size size = MediaQuery.of(context).size;
|
Size size = MediaQuery.of(context).size;
|
||||||
|
|
||||||
if(!init) {
|
if(!init) {
|
||||||
@ -168,6 +173,22 @@ class _GoogleMapViewState extends State<GoogleMapView> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Positioned(
|
||||||
|
left: 5,
|
||||||
|
top: 35,
|
||||||
|
child: SizedBox(
|
||||||
|
width: size.width * 0.3,
|
||||||
|
height: size.height * 0.76,
|
||||||
|
child: GeoPointFilter(
|
||||||
|
language: tabletAppContext.language!,
|
||||||
|
geoPoints: widget.mapDTO!.points!,
|
||||||
|
categories: widget.mapDTO!.categories!,
|
||||||
|
filteredPoints: (filteredPoints) {
|
||||||
|
print("COUCOU FILTERED POINTS");
|
||||||
|
print(filteredPoints);
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
),
|
||||||
Positioned(
|
Positioned(
|
||||||
bottom: 35,
|
bottom: 35,
|
||||||
left: 10,
|
left: 10,
|
||||||
|
|||||||
@ -19,11 +19,13 @@ import 'package:tablet_app/constants.dart';
|
|||||||
|
|
||||||
class MapBoxView extends StatefulWidget {
|
class MapBoxView extends StatefulWidget {
|
||||||
final MapDTO? mapDTO;
|
final MapDTO? mapDTO;
|
||||||
|
final List<GeoPointDTO> geoPoints;
|
||||||
final Uint8List? selectedMarkerIcon;
|
final Uint8List? selectedMarkerIcon;
|
||||||
final String? language;
|
final String? language;
|
||||||
const MapBoxView({
|
const MapBoxView({
|
||||||
Key? key,
|
Key? key,
|
||||||
this.mapDTO,
|
this.mapDTO,
|
||||||
|
required this.geoPoints,
|
||||||
this.selectedMarkerIcon,
|
this.selectedMarkerIcon,
|
||||||
this.language,
|
this.language,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
@ -55,7 +57,7 @@ class AnnotationClickListener extends mapBox.OnPointAnnotationClickListener {
|
|||||||
|
|
||||||
class _MapBoxViewState extends State<MapBoxView> {
|
class _MapBoxViewState extends State<MapBoxView> {
|
||||||
late mapBox.MapboxMap? mapboxMap;
|
late mapBox.MapboxMap? mapboxMap;
|
||||||
late mapBox.PointAnnotationManager? pointAnnotationManager;
|
mapBox.PointAnnotationManager? pointAnnotationManager;
|
||||||
bool filterZoneSelected = false;
|
bool filterZoneSelected = false;
|
||||||
|
|
||||||
createPoints() {
|
createPoints() {
|
||||||
@ -116,20 +118,28 @@ class _MapBoxViewState extends State<MapBoxView> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
pointsToShow = widget.mapDTO!.points;
|
pointsToShow = widget.geoPoints;//widget.mapDTO!.points;
|
||||||
selectedCategories = widget.mapDTO!.categories!.map((categorie) => categorie.label!.firstWhere((element) => element.language == widget.language).value!).toList();
|
selectedCategories = widget.mapDTO!.categories!.map((categorie) => categorie.label!.firstWhere((element) => element.language == widget.language).value!).toList();
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
// TODO: implement dispose
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final mapContext = Provider.of<MapContext>(context);
|
final mapContext = Provider.of<MapContext>(context);
|
||||||
|
|
||||||
|
pointsToShow = widget.geoPoints;//widget.mapDTO!.points;
|
||||||
|
|
||||||
|
if(pointAnnotationManager != null) {
|
||||||
|
pointAnnotationManager!.deleteAll();
|
||||||
|
pointAnnotationManager!.createMulti(createPoints());
|
||||||
|
//mapContext.notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
final appContext = Provider.of<AppContext>(context);
|
final appContext = Provider.of<AppContext>(context);
|
||||||
TabletAppContext tabletAppContext = appContext.getContext() as TabletAppContext;
|
TabletAppContext tabletAppContext = appContext.getContext() as TabletAppContext;
|
||||||
Size size = MediaQuery.of(context).size;
|
Size size = MediaQuery.of(context).size;
|
||||||
@ -178,7 +188,7 @@ class _MapBoxViewState extends State<MapBoxView> {
|
|||||||
zoom: widget.mapDTO!.zoom != null ? widget.mapDTO!.zoom!.toDouble() : 12),
|
zoom: widget.mapDTO!.zoom != null ? widget.mapDTO!.zoom!.toDouble() : 12),
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
Positioned(
|
/*Positioned(
|
||||||
left: 5,
|
left: 5,
|
||||||
top: 35,
|
top: 35,
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
@ -193,7 +203,7 @@ class _MapBoxViewState extends State<MapBoxView> {
|
|||||||
print(filteredPoints);
|
print(filteredPoints);
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
),
|
),*/
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,8 @@ import 'package:tablet_app/Components/loading_common.dart';
|
|||||||
import 'package:tablet_app/Models/map-marker.dart';
|
import 'package:tablet_app/Models/map-marker.dart';
|
||||||
import 'dart:ui' as ui;
|
import 'dart:ui' as ui;
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:tablet_app/Models/tabletContext.dart';
|
||||||
|
import 'package:tablet_app/Screens/Map/geo_point_filter.dart';
|
||||||
import 'package:tablet_app/Screens/Map/map_box_view.dart';
|
import 'package:tablet_app/Screens/Map/map_box_view.dart';
|
||||||
import 'package:tablet_app/Screens/Map/marker_view.dart';
|
import 'package:tablet_app/Screens/Map/marker_view.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
@ -35,6 +37,7 @@ class _MapViewWidget extends State<MapViewWidget> {
|
|||||||
MapDTO? mapDTO;
|
MapDTO? mapDTO;
|
||||||
//Completer<GoogleMapController> _controller = Completer();
|
//Completer<GoogleMapController> _controller = Completer();
|
||||||
Uint8List? selectedMarkerIcon;
|
Uint8List? selectedMarkerIcon;
|
||||||
|
late ValueNotifier<List<GeoPointDTO>> _geoPoints = ValueNotifier<List<GeoPointDTO>>([]);
|
||||||
|
|
||||||
Future<Uint8List> getBytesFromAsset(ByteData data, int width) async {
|
Future<Uint8List> getBytesFromAsset(ByteData data, int width) async {
|
||||||
//ByteData data = await rootBundle.load(path);
|
//ByteData data = await rootBundle.load(path);
|
||||||
@ -49,6 +52,7 @@ class _MapViewWidget extends State<MapViewWidget> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
mapDTO = MapDTO.fromJson(jsonDecode(widget.section!.data!));
|
mapDTO = MapDTO.fromJson(jsonDecode(widget.section!.data!));
|
||||||
|
_geoPoints.value = mapDTO!.points!;
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,26 +72,42 @@ class _MapViewWidget extends State<MapViewWidget> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
//final mapContext = Provider.of<MapContext>(context);
|
//final mapContext = Provider.of<MapContext>(context);
|
||||||
final appContext = Provider.of<AppContext>(context);
|
final appContext = Provider.of<AppContext>(context);
|
||||||
return Stack(
|
TabletAppContext tabletAppContext = appContext.getContext() as TabletAppContext;
|
||||||
children: <Widget>[
|
return FutureBuilder(
|
||||||
FutureBuilder(
|
|
||||||
future: getByteIcon(mapDTO!.iconSource),
|
future: getByteIcon(mapDTO!.iconSource),
|
||||||
builder: (context, AsyncSnapshot<dynamic> snapshot) {
|
builder: (context, AsyncSnapshot<dynamic> snapshot) {
|
||||||
if (snapshot.connectionState == ConnectionState.done) {
|
if (snapshot.connectionState == ConnectionState.done) {
|
||||||
print("snapshot");
|
return Stack(
|
||||||
print(snapshot.data);
|
children: <Widget>[
|
||||||
print(selectedMarkerIcon);
|
ValueListenableBuilder<List<GeoPointDTO>>(
|
||||||
|
valueListenable: _geoPoints,
|
||||||
|
builder: (context, value, _) {
|
||||||
switch(mapDTO!.mapProvider) {
|
switch(mapDTO!.mapProvider) {
|
||||||
case MapProvider.Google:
|
case MapProvider.Google:
|
||||||
return GoogleMapView(language: appContext.getContext().language, mapDTO: mapDTO, selectedMarkerIcon: selectedMarkerIcon);
|
return GoogleMapView(language: appContext.getContext().language, mapDTO: mapDTO, selectedMarkerIcon: selectedMarkerIcon);
|
||||||
case MapProvider.MapBox:
|
case MapProvider.MapBox:
|
||||||
return MapBoxView(language: appContext.getContext().language, mapDTO: mapDTO, selectedMarkerIcon: selectedMarkerIcon);
|
return MapBoxView(language: appContext.getContext().language, geoPoints: value, mapDTO: mapDTO, selectedMarkerIcon: selectedMarkerIcon);
|
||||||
default:
|
default:
|
||||||
// By default google
|
// By default google
|
||||||
return GoogleMapView(language: appContext.getContext().language, mapDTO: mapDTO, selectedMarkerIcon: selectedMarkerIcon);
|
return GoogleMapView(language: appContext.getContext().language, mapDTO: mapDTO, selectedMarkerIcon: selectedMarkerIcon);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
),
|
||||||
|
GeoPointFilter(
|
||||||
|
language: tabletAppContext.language!,
|
||||||
|
geoPoints: mapDTO!.points!,
|
||||||
|
categories: mapDTO!.categories!,
|
||||||
|
filteredPoints: (value) {
|
||||||
|
_geoPoints.value = value!;
|
||||||
|
}),
|
||||||
|
MarkerViewWidget(),
|
||||||
|
]
|
||||||
|
/*floatingActionButton: FloatingActionButton.extended(
|
||||||
|
onPressed: _goToTheLake,
|
||||||
|
label: Text('To the lake!'),
|
||||||
|
icon: Icon(Icons.directions_boat),
|
||||||
|
),*/
|
||||||
|
);
|
||||||
} else if (snapshot.connectionState == ConnectionState.none) {
|
} else if (snapshot.connectionState == ConnectionState.none) {
|
||||||
return Text("No data");
|
return Text("No data");
|
||||||
} else {
|
} else {
|
||||||
@ -98,14 +118,6 @@ class _MapViewWidget extends State<MapViewWidget> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
),
|
|
||||||
MarkerViewWidget()
|
|
||||||
]
|
|
||||||
/*floatingActionButton: FloatingActionButton.extended(
|
|
||||||
onPressed: _goToTheLake,
|
|
||||||
label: Text('To the lake!'),
|
|
||||||
icon: Icon(Icons.directions_boat),
|
|
||||||
),*/
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,7 +24,6 @@ class MarkerViewWidget extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _MarkerInfoWidget extends State<MarkerViewWidget> {
|
class _MarkerInfoWidget extends State<MarkerViewWidget> {
|
||||||
Size sizeScreen = new Size(1080.0, 1920.0); // Tablet resolution
|
|
||||||
CarouselController? sliderController;
|
CarouselController? sliderController;
|
||||||
ValueNotifier<int> currentIndex = ValueNotifier<int>(1);
|
ValueNotifier<int> currentIndex = ValueNotifier<int>(1);
|
||||||
|
|
||||||
@ -51,7 +50,7 @@ class _MarkerInfoWidget extends State<MarkerViewWidget> {
|
|||||||
return new AnimatedPositioned(
|
return new AnimatedPositioned(
|
||||||
duration: const Duration(milliseconds: 1500),
|
duration: const Duration(milliseconds: 1500),
|
||||||
curve: Curves.easeInOutSine,
|
curve: Curves.easeInOutSine,
|
||||||
right: 25, // 140
|
left: 25, // 140
|
||||||
top: 10, // 150
|
top: 10, // 150
|
||||||
child: Visibility(
|
child: Visibility(
|
||||||
visible: (mapContext.getSelectedMarker() as MapMarker).longitude != null,
|
visible: (mapContext.getSelectedMarker() as MapMarker).longitude != null,
|
||||||
|
|||||||
@ -118,11 +118,16 @@ class _MyAppState extends State<MyApp> {
|
|||||||
const Locale('fr', 'FR'),
|
const Locale('fr', 'FR'),
|
||||||
],*/
|
],*/
|
||||||
theme: ThemeData(
|
theme: ThemeData(
|
||||||
primaryColor: widget.tabletAppContext != null ? widget.tabletAppContext!.configuration != null ? widget.tabletAppContext!.configuration!.primaryColor != null ? new Color(int.parse(widget.tabletAppContext!.configuration!.secondaryColor!.split('(0x')[1].split(')')[0], radix: 16)): kTestSecondColor : kTestSecondColor : kTestSecondColor,
|
primaryColor: widget.tabletAppContext != null ? widget.tabletAppContext!.configuration != null ? widget.tabletAppContext!.configuration!.primaryColor != null ? new Color(int.parse(widget.tabletAppContext!.configuration!.primaryColor!.split('(0x')[1].split(')')[0], radix: 16)): kTestSecondColor : kTestSecondColor : kTestSecondColor,
|
||||||
primarySwatch: Colors.grey,
|
primarySwatch: Colors.grey,
|
||||||
scaffoldBackgroundColor: widget.tabletAppContext != null ? widget.tabletAppContext!.configuration != null ? widget.tabletAppContext!.configuration!.secondaryColor != null ? new Color(int.parse(widget.tabletAppContext!.configuration!.secondaryColor!.split('(0x')[1].split(')')[0], radix: 16)): kBackgroundGrey : kBackgroundGrey : kBackgroundGrey,
|
scaffoldBackgroundColor: widget.tabletAppContext != null ? widget.tabletAppContext!.configuration != null ? widget.tabletAppContext!.configuration!.secondaryColor != null ? new Color(int.parse(widget.tabletAppContext!.configuration!.secondaryColor!.split('(0x')[1].split(')')[0], radix: 16)): kBackgroundGrey : kBackgroundGrey : kBackgroundGrey,
|
||||||
fontFamily: "Roboto",
|
fontFamily: "Roboto",
|
||||||
textTheme: TextTheme(bodyLarge: TextStyle(color: kTestSecondColor)),
|
textSelectionTheme: TextSelectionThemeData(
|
||||||
|
selectionHandleColor: widget.tabletAppContext != null ? widget.tabletAppContext!.configuration != null ? widget.tabletAppContext!.configuration!.primaryColor != null ? new Color(int.parse(widget.tabletAppContext!.configuration!.primaryColor!.split('(0x')[1].split(')')[0], radix: 16)): kTestSecondColor : kTestSecondColor : kTestSecondColor,
|
||||||
|
cursorColor: Colors.white,
|
||||||
|
selectionColor: widget.tabletAppContext != null ? widget.tabletAppContext!.configuration != null ? widget.tabletAppContext!.configuration!.primaryColor != null ? new Color(int.parse(widget.tabletAppContext!.configuration!.primaryColor!.split('(0x')[1].split(')')[0], radix: 16)): kTestSecondColor : kTestSecondColor : kTestSecondColor,
|
||||||
|
),
|
||||||
|
textTheme: TextTheme(bodyLarge: TextStyle(color: widget.tabletAppContext != null ? widget.tabletAppContext!.configuration != null ? widget.tabletAppContext!.configuration!.primaryColor != null ? new Color(int.parse(widget.tabletAppContext!.configuration!.primaryColor!.split('(0x')[1].split(')')[0], radix: 16)): kTestSecondColor : kTestSecondColor : kTestSecondColor)),
|
||||||
visualDensity: VisualDensity.adaptivePlatformDensity,
|
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||||
),
|
),
|
||||||
routes: {
|
routes: {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user