diff --git a/lib/Screens/Map/google_map_view.dart b/lib/Screens/Map/google_map_view.dart index 5741e04..a41100e 100644 --- a/lib/Screens/Map/google_map_view.dart +++ b/lib/Screens/Map/google_map_view.dart @@ -72,7 +72,7 @@ class _GoogleMapViewState extends State { )); //}); }, - infoWindow: kIsWeb ? InfoWindow.noText : InfoWindow(title: element.title))); + infoWindow: InfoWindow.noText)); } }); return markers; diff --git a/lib/Screens/Map/marker_view.dart b/lib/Screens/Map/marker_view.dart index 795673e..eae3fa5 100644 --- a/lib/Screens/Map/marker_view.dart +++ b/lib/Screens/Map/marker_view.dart @@ -3,9 +3,13 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; +import 'package:manager_api/api.dart'; import 'package:photo_view/photo_view.dart'; import 'package:provider/provider.dart'; +import 'package:tablet_app/Components/show_element_for_resource.dart'; import 'package:tablet_app/Models/map-marker.dart'; +import 'package:tablet_app/Screens/Quizz/quizz_view.dart'; +import 'package:tablet_app/app_context.dart'; import '../../constants.dart'; import 'map_context.dart'; @@ -20,7 +24,7 @@ class MarkerViewWidget extends StatefulWidget { class _MarkerInfoWidget extends State { Size sizeScreen = new Size(1080.0, 1920.0); // Tablet resolution CarouselController? sliderController; - int currentIndex = 1; + ValueNotifier currentIndex = ValueNotifier(1); @override void initState() { @@ -39,19 +43,20 @@ class _MarkerInfoWidget extends State { Size size = MediaQuery.of(context).size; final mapContext = Provider.of(context); + Size sizeMarker = Size(size.width * 0.42, size.height * 0.8); return new AnimatedPositioned( duration: const Duration(milliseconds: 1500), curve: Curves.easeInOutSine, - right: 120, // 140 - top: 50, // 150 + right: 25, // 140 + top: 10, // 150 child: Visibility( - visible: mapContext.getSelectedMarker().longitude != null, + visible: (mapContext.getSelectedMarker() as MapMarker).longitude != null, child: Container( - width: size.width * 0.37, - height: size.height * 0.75, + width: sizeMarker.width, + height: sizeMarker.height, margin: EdgeInsets.symmetric(vertical: 3, horizontal: 4), decoration: BoxDecoration( - color: kBackgroundLight, + color: kBackgroundLight, // Colors.amberAccent //kBackgroundLight, shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(10.0), boxShadow: [ @@ -102,7 +107,7 @@ class _MarkerInfoWidget extends State { child: Padding( padding: const EdgeInsets.only(top: 20), child: HtmlWidget( - mapContext.getSelectedMarker().title, + (mapContext.getSelectedMarker() as MapMarker).title!, customStylesBuilder: (element) { return {'text-align': 'center'}; }, @@ -119,72 +124,66 @@ class _MarkerInfoWidget extends State { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - if(mapContext.getSelectedMarker().images != null && mapContext.getSelectedMarker().images.length > 0) - CarouselSlider( - carouselController: sliderController, - options: CarouselOptions( - onPageChanged: (int index, CarouselPageChangedReason reason) { - setState(() { - currentIndex = index + 1; - }); - }, - height: size.height *0.3, - enlargeCenterPage: true, - pageSnapping: true, - reverse: false, - ), - items: mapContext.getSelectedMarker().images.map((i) { - return Builder( - builder: (BuildContext context) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: Container( - //width: MediaQuery.of(context).size.width *0.9, - /*decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20.0), - border: Border.all(width: 0.3, color: kSecondGrey), - image: i.imageSource != null ? new DecorationImage( - fit: BoxFit.contain, - image: new NetworkImage( - i.imageSource, - ), - ): null, - boxShadow: [ - BoxShadow( - color: kBackgroundSecondGrey, - spreadRadius: 0.3, - blurRadius: 3, - offset: Offset(0, 1.1), // changes position of shadow - ), - ], - ),*/ - child: AspectRatio( - aspectRatio: 16 / 9, - child: ClipRect( - child: i.imageSource != null ? PhotoView( - imageProvider: CachedNetworkImageProvider(i.imageSource), /*new NetworkImage( - i.imageSource, - ),*/ - minScale: PhotoViewComputedScale.contained * 0.8, - maxScale: PhotoViewComputedScale.contained * 3.0, - backgroundDecoration: BoxDecoration( - color: kBackgroundSecondGrey, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(15.0), - ), - ) : Center(child: Text('No data')), - ), - ) + if((mapContext.getSelectedMarker() as MapMarker).contents != null && (mapContext.getSelectedMarker() as MapMarker).contents!.length > 0) + Stack( + children: [ + Container( + //color: Colors.green, + child: CarouselSlider( + carouselController: sliderController, + options: CarouselOptions( + onPageChanged: (int index, CarouselPageChangedReason reason) { + currentIndex.value = index + 1; + }, + height: size.height *0.35, + enlargeCenterPage: true, + pageSnapping: true, + reverse: false, + ), + items: (mapContext.getSelectedMarker() as MapMarker).contents!.map((ContentGeoPoint i) { + return Builder( + builder: (BuildContext context) { + AppContext appContext = Provider.of(context); + var resourcetoShow = getElementForResource(context, appContext, i); + return Padding( + padding: const EdgeInsets.all(8.0), + child: resourcetoShow, + ); + }, + ); + }).toList(), + ), + ), + Positioned( + bottom: 0, + child: Container( + //color: Colors.red, + height: 25, + width: sizeMarker.width, + //color: Colors.amber, + child: Padding( + padding: const EdgeInsets.only(top: 0), + child: Align( + alignment: Alignment.bottomCenter, + child: ValueListenableBuilder( + valueListenable: currentIndex, + builder: (context, value, _) { + return Text( + value.toString()+'/'+(mapContext.getSelectedMarker() as MapMarker).contents!.length.toString(), + style: TextStyle(fontSize: 15, fontWeight: FontWeight.w500), + ); + } + ) ), - ); - }, - ); - }).toList(), - ), + ), + ), + ), + ], + ), // Description Container( - height: mapContext.getSelectedMarker().images != null && mapContext.getSelectedMarker().images.length > 0 ? size.height *0.3 : size.height *0.6, - width: MediaQuery.of(context).size.width *0.35, + height: (mapContext.getSelectedMarker() as MapMarker).contents != null && (mapContext.getSelectedMarker() as MapMarker).contents!.length > 0 ? size.height *0.3 : size.height *0.6, + width: MediaQuery.of(context).size.width *0.4, decoration: BoxDecoration( color: kBackgroundColor, shape: BoxShape.rectangle, @@ -202,7 +201,7 @@ class _MarkerInfoWidget extends State { child: Padding( padding: const EdgeInsets.all(15.0), child: HtmlWidget( - mapContext.getSelectedMarker().description, + (mapContext.getSelectedMarker() as MapMarker).description!, customStylesBuilder: (element) { return {'text-align': 'center'}; }, @@ -213,13 +212,13 @@ class _MarkerInfoWidget extends State { ), ] ), - if(mapContext.getSelectedMarker().images != null && mapContext.getSelectedMarker().images.length > 1) + if((mapContext.getSelectedMarker() as MapMarker).contents != null && (mapContext.getSelectedMarker() as MapMarker).contents!.length > 1) Positioned( top: MediaQuery.of(context).size.height * 0.125, right: -10, child: InkWell( onTap: () { - if (mapContext.getSelectedMarker().images.length > 0) + if ((mapContext.getSelectedMarker() as MapMarker).contents!.length > 0) sliderController!.nextPage(duration: new Duration(milliseconds: 500), curve: Curves.fastOutSlowIn); }, child: Icon( @@ -229,13 +228,13 @@ class _MarkerInfoWidget extends State { ), ) ), - if(mapContext.getSelectedMarker().images != null && mapContext.getSelectedMarker().images.length > 1) + if((mapContext.getSelectedMarker() as MapMarker).contents != null && (mapContext.getSelectedMarker() as MapMarker).contents!.length > 1) Positioned( top: MediaQuery.of(context).size.height * 0.125, left: -10, child: InkWell( onTap: () { - if (mapContext.getSelectedMarker().images.length > 0) + if ((mapContext.getSelectedMarker() as MapMarker).contents!.length > 0) sliderController!.previousPage(duration: new Duration(milliseconds: 500), curve: Curves.fastOutSlowIn); }, child: Icon( @@ -256,3 +255,53 @@ class _MarkerInfoWidget extends State { } } +getElementForResource(BuildContext context, AppContext appContext, ContentGeoPoint i) { + var widgetToInclude; + + switch(i.resourceType) { + case ResourceType.Image: + case ResourceType.ImageUrl: + widgetToInclude = AspectRatio( + aspectRatio: 16 / 9, + child: ClipRect( + child: i.resourceUrl != null ? PhotoView( + imageProvider: CachedNetworkImageProvider(i.resourceUrl!), /*new NetworkImage( + i.imageSource, + ),*/ + minScale: PhotoViewComputedScale.contained * 0.8, + maxScale: PhotoViewComputedScale.contained * 3.0, + backgroundDecoration: BoxDecoration( + color: kBackgroundSecondGrey, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(15.0), + ), + ) : Center(child: Text('No data')), + ), + ); + break; + case ResourceType.Video: + case ResourceType.VideoUrl: + case ResourceType.Audio: + widgetToInclude = Container( + decoration: BoxDecoration( + color: kBackgroundSecondGrey, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(15.0), + ), + child: showElementForResource(ResourceDTO(id: i.resourceId, url: i.resourceUrl, type: i.resourceType), appContext, false, true), + ); + break; + } + + return Center( + child: Container( + child: AspectRatio( + aspectRatio: 16 / 9, + child: ClipRect( + child: widgetToInclude, + ), + ), + ), + ); +} + diff --git a/lib/Screens/PDF/pdf_view.dart b/lib/Screens/PDF/pdf_view.dart index 531210c..fcbc3b3 100644 --- a/lib/Screens/PDF/pdf_view.dart +++ b/lib/Screens/PDF/pdf_view.dart @@ -80,68 +80,71 @@ class _PDFViewWidget extends State { @override Widget build(BuildContext context) => pdfDTO.resourceUrl != null && pdfDTO.resourceUrl!.length > 0 ? - FutureBuilder( - future: createFileOfPdfUrl(pdfDTO.resourceUrl!), - builder: (context, AsyncSnapshot snapshot) { - print("snapshot.data"); - print(snapshot.data); - if (snapshot.connectionState == ConnectionState.done) { - return Stack( - children: [ - PDFView( - filePath: snapshot.data.path, - enableSwipe: true, - swipeHorizontal: true, - autoSpacing: true, - pageFling: true, - fitPolicy: FitPolicy.HEIGHT, - onRender: (_pages) { - //setState(() { - pages = _pages; - isReady = true; - //}); - }, - onError: (error) { - print(error.toString()); - }, - onPageError: (page, error) { - print('$page: ${error.toString()}'); - }, - onViewCreated: (PDFViewController pdfViewController) { - //_controller.complete(pdfViewController); - }, - onPageChanged: (int? page, int? total) { - currentPage = page; - pages = total; - currentState.value = {'page': page!, 'total': total!}; + Padding( + padding: const EdgeInsets.all(12.5), + child: FutureBuilder( + future: createFileOfPdfUrl(pdfDTO.resourceUrl!), + builder: (context, AsyncSnapshot snapshot) { + print("snapshot.data"); + print(snapshot.data); + if (snapshot.connectionState == ConnectionState.done) { + return Stack( + children: [ + PDFView( + filePath: snapshot.data.path, + enableSwipe: true, + swipeHorizontal: true, + autoSpacing: true, + pageFling: true, + fitPolicy: FitPolicy.HEIGHT, + onRender: (_pages) { + //setState(() { + pages = _pages; + isReady = true; + //}); + }, + onError: (error) { + print(error.toString()); + }, + onPageError: (page, error) { + print('$page: ${error.toString()}'); + }, + onViewCreated: (PDFViewController pdfViewController) { + //_controller.complete(pdfViewController); + }, + onPageChanged: (int? page, int? total) { + currentPage = page; + pages = total; + currentState.value = {'page': page!, 'total': total!}; - print('page change: $page/$total'); - }, - ), - Positioned( - bottom: 20, - right: 20, - child: ValueListenableBuilder>( - valueListenable: currentState, - builder: (context, value, _) { - return Container( - //color: Colors.blueAccent, - child: Text("${value["page"]!+1}/${value["total"]!}", - style: TextStyle(color: Colors.black, fontSize: 30)) - ); - }, - ), - ), - ], - ); - } else { - return Center( - child: Container( - child: LoadingCommon() - ) - ); + print('page change: $page/$total'); + }, + ), + Positioned( + bottom: 20, + right: 20, + child: ValueListenableBuilder>( + valueListenable: currentState, + builder: (context, value, _) { + return Container( + //color: Colors.blueAccent, + child: Text("${value["page"]!+1}/${value["total"]!}", + style: TextStyle(color: Colors.black, fontSize: 30)) + ); + }, + ), + ), + ], + ); + } else { + return Center( + child: Container( + child: LoadingCommon() + ) + ); + } } - } + ), ) : Center(child: Text("Le PDF ne peut pas ĂȘtre affichĂ©, il n'existe pas")); } //_webView \ No newline at end of file diff --git a/lib/Screens/Quizz/quizz_view.dart b/lib/Screens/Quizz/quizz_view.dart index a559be3..8ee1843 100644 --- a/lib/Screens/Quizz/quizz_view.dart +++ b/lib/Screens/Quizz/quizz_view.dart @@ -304,13 +304,13 @@ class _QuizzView extends State { child: Container( //width: MediaQuery.of(context).size.width *0.65, height: MediaQuery.of(context).size.height *0.3, - color: Colors.green, + //color: Colors.green, child: Padding( padding: const EdgeInsets.all(10.0), child: Center( child: Container( decoration: BoxDecoration( - color: Colors.orange,// kBackgroundLight, + color: kBackgroundLight, // Colors.orange,// kBackgroundLight, shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(10.0), boxShadow: [ diff --git a/pubspec.yaml b/pubspec.yaml index 4f82dce..da55df9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,7 +32,7 @@ dependencies: # Specific Web google_maps_flutter_web: ^0.5.4+2 # Specific WEB - youtube_player_iframe: ^5.0.0 # Handle mobile and web here => TO TEST + youtube_player_iframe: ^4.0.4 # Handle mobile and web here => TO TEST flare_flutter: ^3.0.2 provider: ^6.0.5