Moving the right direction I think

This commit is contained in:
stopflock
2025-10-02 17:23:17 -05:00
parent 408b52cdb0
commit 763fa31266
5 changed files with 106 additions and 57 deletions
+53 -37
View File
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:provider/provider.dart';
import '../../app_state.dart';
import '../../dev_config.dart';
@@ -13,6 +14,7 @@ class MapOverlays extends StatelessWidget {
final AddNodeSession? session;
final EditNodeSession? editSession;
final String? attribution; // Attribution for current tile provider
final VoidCallback? onSearchPressed; // Callback for search button
const MapOverlays({
super.key,
@@ -21,6 +23,7 @@ class MapOverlays extends StatelessWidget {
this.session,
this.editSession,
this.attribution,
this.onSearchPressed,
});
@override
@@ -113,45 +116,58 @@ class MapOverlays extends StatelessWidget {
Positioned(
bottom: bottomPositionFromButtonBar(kZoomControlsSpacingAboveButtonBar, MediaQuery.of(context).padding.bottom),
right: 16,
child: Column(
children: [
// Layer selector button
const LayerSelectorButton(),
const SizedBox(height: 8),
// Zoom in button
FloatingActionButton(
mini: true,
heroTag: "zoom_in",
onPressed: () {
try {
final zoom = mapController.camera.zoom;
mapController.move(mapController.camera.center, zoom + 1);
} catch (_) {
// Map controller not ready yet
}
},
child: const Icon(Icons.add),
),
const SizedBox(height: 8),
// Zoom out button
FloatingActionButton(
mini: true,
heroTag: "zoom_out",
onPressed: () {
try {
final zoom = mapController.camera.zoom;
mapController.move(mapController.camera.center, zoom - 1);
} catch (_) {
// Map controller not ready yet
}
},
child: const Icon(Icons.remove),
),
],
child: Consumer<AppState>(
builder: (context, appState, child) {
return Column(
children: [
// Search/Route button (top of controls)
if (onSearchPressed != null)
FloatingActionButton(
mini: true,
heroTag: "search_nav",
onPressed: onSearchPressed,
tooltip: appState.hasActiveRoute ? 'Route Overview' : 'Search Location',
child: Icon(appState.hasActiveRoute ? Icons.route : Icons.search),
),
if (onSearchPressed != null) const SizedBox(height: 8),
// Layer selector button
const LayerSelectorButton(),
const SizedBox(height: 8),
// Zoom in button
FloatingActionButton(
mini: true,
heroTag: "zoom_in",
onPressed: () {
try {
final zoom = mapController.camera.zoom;
mapController.move(mapController.camera.center, zoom + 1);
} catch (_) {
// Map controller not ready yet
}
},
child: const Icon(Icons.add),
),
const SizedBox(height: 8),
// Zoom out button
FloatingActionButton(
mini: true,
heroTag: "zoom_out",
onPressed: () {
try {
final zoom = mapController.camera.zoom;
mapController.move(mapController.camera.center, zoom - 1);
} catch (_) {
// Map controller not ready yet
}
},
child: const Icon(Icons.remove),
),
],
);
},
),
),
],
);
}
+3
View File
@@ -38,6 +38,7 @@ class MapView extends StatefulWidget {
this.sheetHeight = 0.0,
this.selectedNodeId,
this.onNodeTap,
this.onSearchPressed,
});
final FollowMeMode followMeMode;
@@ -45,6 +46,7 @@ class MapView extends StatefulWidget {
final double sheetHeight;
final int? selectedNodeId;
final void Function(OsmNode)? onNodeTap;
final VoidCallback? onSearchPressed;
@override
State<MapView> createState() => MapViewState();
@@ -497,6 +499,7 @@ class MapViewState extends State<MapView> {
session: session,
editSession: editSession,
attribution: appState.selectedTileType?.attribution,
onSearchPressed: widget.onSearchPressed,
),
// Network status indicator (top-left) - conditionally shown
+10 -7
View File
@@ -180,22 +180,25 @@ class _LocationSearchBarState extends State<LocationSearchBar> {
focusNode: _focusNode,
decoration: InputDecoration(
hintText: 'Search places or coordinates...',
prefixIcon: const Icon(Icons.search),
suffixIcon: Row(
prefixIcon: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (_controller.text.isNotEmpty)
IconButton(
icon: const Icon(Icons.clear),
onPressed: _onClear,
),
IconButton(
icon: const Icon(Icons.close),
onPressed: _onCancel,
tooltip: 'Cancel search',
),
const Icon(Icons.search),
],
),
prefixIconConstraints: const BoxConstraints(minWidth: 80),
suffixIcon: _controller.text.isNotEmpty
? IconButton(
icon: const Icon(Icons.clear),
onPressed: _onClear,
tooltip: 'Clear text',
)
: null,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide.none,