feat: proper routing
This commit is contained in:
98
lib/components/EventLog.dart
Normal file
98
lib/components/EventLog.dart
Normal file
@ -0,0 +1,98 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:uninav/nav/graph.dart';
|
||||
import 'package:uninav/util/util.dart';
|
||||
|
||||
class EventLog extends StatefulWidget {
|
||||
final List<GraphFeature> events;
|
||||
|
||||
const EventLog({Key? key, required this.events}) : super(key: key);
|
||||
|
||||
@override
|
||||
_EventLogState createState() => _EventLogState();
|
||||
}
|
||||
|
||||
class _EventLogState extends State<EventLog> {
|
||||
int _selectedIndex = -1;
|
||||
|
||||
void _onEventTapped(int index) {
|
||||
setState(() {
|
||||
_selectedIndex = index;
|
||||
});
|
||||
_scrollController.animateTo(
|
||||
index * _itemExtent,
|
||||
duration: const Duration(milliseconds: 500),
|
||||
curve: Curves.easeInOut,
|
||||
);
|
||||
}
|
||||
|
||||
final ScrollController _scrollController = ScrollController();
|
||||
static const double _itemExtent = 60.0;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Theme(
|
||||
data: ThemeData.light(),
|
||||
child: SizedBox(
|
||||
height: 200,
|
||||
child: ListView.builder(
|
||||
controller: _scrollController,
|
||||
itemExtent: _itemExtent + 8.0,
|
||||
itemCount: widget.events.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
final event = widget.events[index];
|
||||
final isActive = index >= _selectedIndex;
|
||||
return GestureDetector(
|
||||
onTap: () => _onEventTapped(index),
|
||||
child: Container(
|
||||
margin: const EdgeInsets.symmetric(vertical: 4.0),
|
||||
padding: const EdgeInsets.all(4.0),
|
||||
decoration: BoxDecoration(
|
||||
color:
|
||||
isActive ? Colors.white : Colors.white.withOpacity(0.6),
|
||||
borderRadius: BorderRadius.circular(8.0),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.1),
|
||||
blurRadius: 4.0,
|
||||
offset: const Offset(0, 2),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(getIconForEvent(event)),
|
||||
const SizedBox(width: 8.0),
|
||||
Text(
|
||||
getLabelForEvent(event),
|
||||
style: TextStyle(color: Colors.black),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
IconData getIconForEvent(GraphFeature event) => event.when(
|
||||
buildingFloor: (level, feature) => Icons.directions_walk,
|
||||
portal: (fromFloor, from, toFloor, to, baseFeature) =>
|
||||
baseFeature.type.maybeWhen(
|
||||
door: (connects) => Icons.door_front_door,
|
||||
stairs: (connects) => Icons.stairs,
|
||||
lift: (connects_levels) => Icons.elevator,
|
||||
orElse: () => Icons.question_mark,
|
||||
),
|
||||
basicFeature: (level, building, baseFeature) => Icons.location_on,
|
||||
);
|
||||
|
||||
String getLabelForEvent(GraphFeature event) => event.when(
|
||||
buildingFloor: (level, feature) => feature.name,
|
||||
portal: (fromFloor, from, toFloor, to, baseFeature) =>
|
||||
"$from:$fromFloor -> $to:$toFloor",
|
||||
basicFeature: (level, building, baseFeature) =>
|
||||
formatFeatureTitle(baseFeature),
|
||||
);
|
@ -3,7 +3,9 @@ import 'package:flutter/widgets.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:uninav/components/colorful_chips.dart';
|
||||
import 'package:uninav/controllers/map_controller.dart';
|
||||
import 'package:uninav/controllers/navigation_controller.dart';
|
||||
import 'package:uninav/data/geo/model.dart';
|
||||
import 'package:uninav/nav/graph.dart';
|
||||
import 'package:uninav/util/util.dart';
|
||||
|
||||
final _colorfulBoxDeco = BoxDecoration(
|
||||
@ -90,7 +92,39 @@ Future<void> showFeatureBottomSheet(
|
||||
),
|
||||
],
|
||||
),
|
||||
onPressed: () => {},
|
||||
onPressed: () {
|
||||
print("trying to start navigation...");
|
||||
final navController = Get.find<NavigationController>();
|
||||
final mapController = Get.find<MyMapController>();
|
||||
|
||||
// make feature into graphFeature
|
||||
final wrapped = wrap(
|
||||
feature,
|
||||
mapController.currentLevel.value,
|
||||
feature.buildingName ?? "")
|
||||
.first;
|
||||
|
||||
print("1");
|
||||
Get.back();
|
||||
if (navController.position.value == null) {
|
||||
print("2");
|
||||
Get.snackbar(
|
||||
"Navigation failed!",
|
||||
"Please set your position first!",
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
margin: const EdgeInsets.only(
|
||||
bottom: 20, left: 10, right: 10),
|
||||
colorText: Colors.white,
|
||||
backgroundColor: Colors.red,
|
||||
duration: const Duration(seconds: 3),
|
||||
);
|
||||
} else {
|
||||
print("3");
|
||||
navController.navigate(navController.position.value!,
|
||||
(feature) => feature.id == wrapped.id);
|
||||
}
|
||||
print("4");
|
||||
},
|
||||
),
|
||||
],
|
||||
)
|
||||
|
34
lib/components/render_route.dart
Normal file
34
lib/components/render_route.dart
Normal file
@ -0,0 +1,34 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_map/flutter_map.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
import 'package:rust_core/iter.dart';
|
||||
import 'package:uninav/controllers/navigation_controller.dart';
|
||||
import 'package:uninav/nav/graph.dart';
|
||||
|
||||
class NavigationPathLayer extends StatelessWidget {
|
||||
const NavigationPathLayer({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Obx(() {
|
||||
// compute the polylines and markers
|
||||
List<(GraphFeature, double)> route =
|
||||
Get.find<NavigationController>().nav.iter().toList();
|
||||
|
||||
// distance-position pairs
|
||||
// List<Polyline> polylines = [];
|
||||
|
||||
List<LatLng> polylinePoints =
|
||||
route.map((e) => e.$1.getCenter().unwrap()).toList();
|
||||
|
||||
return PolylineLayer(polylines: [
|
||||
Polyline(
|
||||
points: polylinePoints,
|
||||
strokeWidth: 4.0,
|
||||
color: Colors.blue,
|
||||
),
|
||||
]);
|
||||
});
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user