diff --git a/lib/layerSelectorMapPlugin.dart b/lib/layerSelectorMapPlugin.dart index 3ce6291..c4245d2 100644 --- a/lib/layerSelectorMapPlugin.dart +++ b/lib/layerSelectorMapPlugin.dart @@ -4,7 +4,8 @@ import 'package:get_it/get_it.dart'; import 'package:redux/redux.dart'; import 'models/appState.dart'; -import 'redux/actions.dart'; +import 'models/fireMapState.dart'; +import 'redux/fireMapActions.dart'; /// Layer selector widget for changing map layers class LayerSelectorMapPluginWidget extends StatelessWidget { @@ -29,14 +30,62 @@ class LayerSelectorMapPluginWidget extends StatelessWidget { } Widget _LayerSelectorButton(Store store) { - return new FloatingActionButton( + final key = GlobalKey>(); + + return PopupMenuButton( + key: key, + initialValue: store.state.fireMapState.layer, + onSelected: (FireMapLayer layer) { + store.dispatch(SelectMapLayerAction(layer)); + }, + itemBuilder: (BuildContext context) { + return FireMapLayer.values.map((FireMapLayer layer) { + final isSelected = store.state.fireMapState.layer == layer; + return PopupMenuItem( + value: layer, + child: Row( + children: [ + Icon( + isSelected ? Icons.check : Icons.check, + color: isSelected ? Colors.blue : Colors.transparent, + size: 20, + ), + SizedBox(width: 8), + Text( + _getLayerName(layer), + style: TextStyle( + fontWeight: + isSelected ? FontWeight.bold : FontWeight.normal, + ), + ), + ], + ), + ); + }).toList(); + }, + child: FloatingActionButton( backgroundColor: Colors.black26, mini: true, - child: Icon( - Icons.layers, - ), + child: Icon(Icons.layers), onPressed: () { - store.dispatch(new ToggleMapLayerAction()); - }); + key.currentState?.showButtonMenu(); + }, + ), + ); + } + + String _getLayerName(FireMapLayer layer) { + switch (layer) { + case FireMapLayer.osmcGrey: + return 'OSMC Grey'; + case FireMapLayer.osmc: + return 'OSMC'; + case FireMapLayer.esri: + return 'Esri Street'; + case FireMapLayer.esriSatellite: + return 'Esri Satellite'; + case FireMapLayer.esriTerrain: + return 'Esri Terrain'; + } } } diff --git a/lib/redux/fireMapActions.dart b/lib/redux/fireMapActions.dart index e96db9f..4cd409d 100644 --- a/lib/redux/fireMapActions.dart +++ b/lib/redux/fireMapActions.dart @@ -1,5 +1,6 @@ import 'package:fires_flutter/models/yourLocation.dart'; import 'package:fires_flutter/models/fireNotification.dart'; +import 'package:fires_flutter/models/fireMapState.dart'; abstract class FiresMapActions {} @@ -42,7 +43,7 @@ class EditYourLocationAction extends FiresMapActions { EditYourLocationAction(this.loc); } -class EditConfirmYourLocationAction extends FiresMapActions{ +class EditConfirmYourLocationAction extends FiresMapActions { YourLocation loc; EditConfirmYourLocationAction(this.loc); @@ -53,4 +54,8 @@ class EditCancelYourLocationAction extends FiresMapActions { EditCancelYourLocationAction(this.loc); } -class ToggleMapLayerAction extends FiresMapActions {} +class SelectMapLayerAction extends FiresMapActions { + final FireMapLayer layer; + + SelectMapLayerAction(this.layer); +} diff --git a/lib/redux/fireMapReducer.dart b/lib/redux/fireMapReducer.dart index d054641..32a76ea 100644 --- a/lib/redux/fireMapReducer.dart +++ b/lib/redux/fireMapReducer.dart @@ -21,7 +21,7 @@ final fireMapReducer = combineReducers([ _editConfirmYourLocationMap), new TypedReducer( _editCancelYourLocationMap), - new TypedReducer(_toggleMapLayer), + new TypedReducer(_selectMapLayer), new TypedReducer( _updateYourLocationMap) ]); @@ -99,12 +99,6 @@ FireMapState _editCancelYourLocationMap( FireMapStatus restoreStatusAfterSave(loc) => loc.subscribed ? FireMapStatus.unsubscribe : FireMapStatus.view; -FireMapState _toggleMapLayer(FireMapState state, ToggleMapLayerAction action) { - FireMapLayer currentLayer = state.layer; - List list = FireMapLayer.values; - int currentPos = list.indexOf(currentLayer); - currentPos++; - FireMapLayer next = - list.elementAt(currentPos >= list.length ? 0 : currentPos); - return state.copyWith(layer: next); +FireMapState _selectMapLayer(FireMapState state, SelectMapLayerAction action) { + return state.copyWith(layer: action.layer); }