Skip to content
Snippets Groups Projects
main_layout.dart 10.20 KiB
import 'dart:typed_data';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:shared_preferences/shared_preferences.dart';

import 'satellite_layer.dart';
import 'osm_layer.dart';
import 'stat_charts.dart';
import '../../consts.dart';
import 'choropleth_map.dart';
import '../data_classes.dart';
import 'quick_view_chart.dart';

/// MapContainerWidget is the main widget that contains the map with all
/// its layers, polygons and markers.
class MapContainerWidget extends StatefulWidget {
  final List<Measurement> markerList;
  final  Uint8List relation;
  final bool serverConnection;

  const MapContainerWidget({Key? key,
    required this.markerList,
    required this.relation,
    required this.serverConnection,
  }) : super(key: key);

  @override
  _MapContainerWidgetState createState() => _MapContainerWidgetState();
}

class _MapContainerWidgetState extends State<MapContainerWidget> {

  Measurement? selectedTile;  // Containing data for selected marker
  bool isMinimized = true;      // Quick view box state tacker

  bool satLayer = false;        // Satellite layer visibility tracker
  bool OSMlayer = false;

  bool isSatTapped = false;        // Button tap state tracker, satellite
  bool isMapTapped = false;        // Button tap state tracker, OSmap

  // Initialise lastUpdate variable from persistent storage if server fetch fails
  Future<void> checkAndSetLastUpdate() async {
    if (lastUpdate == null) {
      final prefs = await SharedPreferences.getInstance();
      final updateString = prefs.getString('lastUpdate');

      if (updateString != null && updateString.isNotEmpty) {
        final updateData = DateTime.parse(updateString);
        setState(() {
          lastUpdate = updateData;
        });
      }
    }
  }

  // Tile selection handler
  void handleSelection(int index) {
    String indexString = index.toString();
    setState(() {
      // NB should be optimalised
      for (Measurement measurement in widget.markerList) {
        for (SubDiv subdivision in measurement.subDivs) {
          if (subdivision.sub_div_id == indexString) {
            selectedTile= widget.markerList[index];
            break;
          }
        }
      }