diff --git a/lib/feature/map_libre/provider/map_style.dart b/lib/core/provider/map_style/map_style.dart similarity index 100% rename from lib/feature/map_libre/provider/map_style.dart rename to lib/core/provider/map_style/map_style.dart diff --git a/lib/feature/map_libre/provider/map_style.g.dart b/lib/core/provider/map_style/map_style.g.dart similarity index 100% rename from lib/feature/map_libre/provider/map_style.g.dart rename to lib/core/provider/map_style/map_style.g.dart diff --git a/lib/feature/earthquake_history_details/component/earthquake_map.dart b/lib/feature/earthquake_history_details/component/earthquake_map.dart index 886f10c20..f74d1c0e3 100644 --- a/lib/feature/earthquake_history_details/component/earthquake_map.dart +++ b/lib/feature/earthquake_history_details/component/earthquake_map.dart @@ -9,8 +9,8 @@ import 'package:eqmonitor/core/provider/capture/intensity_icon_render.dart'; import 'package:eqmonitor/core/provider/config/theme/intensity_color/intensity_color_provider.dart'; import 'package:eqmonitor/core/provider/config/theme/intensity_color/model/intensity_color_model.dart'; import 'package:eqmonitor/core/provider/jma_parameter/jma_parameter.dart'; +import 'package:eqmonitor/core/provider/map_style/map_style.dart'; import 'package:eqmonitor/feature/earthquake_history/model/state/earthquake_history_item.dart'; -import 'package:eqmonitor/feature/map_libre/provider/map_style.dart'; import 'package:extensions/extensions.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/lib/feature/home/features/map/view/main_map_view.dart b/lib/feature/home/features/map/view/main_map_view.dart index ef7a66cbf..7380e766e 100644 --- a/lib/feature/home/features/map/view/main_map_view.dart +++ b/lib/feature/home/features/map/view/main_map_view.dart @@ -1,9 +1,13 @@ import 'dart:async'; +import 'dart:convert'; import 'package:eqmonitor/core/provider/capture/intensity_icon_render.dart'; +import 'package:eqmonitor/core/provider/map_style/map_style.dart'; +import 'package:eqmonitor/feature/home/features/debugger/debugger_provider.dart'; +import 'package:eqmonitor/feature/home/features/estimated_intensity/provider/estimated_intensity_provider.dart'; import 'package:eqmonitor/feature/home/features/map/viewmodel/main_map_viewmodel.dart'; import 'package:eqmonitor/feature/home/features/travel_time/provider/travel_time_provider.dart'; -import 'package:eqmonitor/feature/map_libre/provider/map_style.dart'; +import 'package:eqmonitor/gen/fonts.gen.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -27,6 +31,7 @@ class MainMapView extends HookConsumerWidget { useFuture( getStyleJsonFuture, ); + final cameraPosition = useState(''); final controller = useAnimationController( duration: const Duration(microseconds: 1000), @@ -92,7 +97,19 @@ class MainMapView extends HookConsumerWidget { zoom: 3, ), styleString: stylePath.value, - onMapCreated: (controller) => mapController.value = controller, + onMapCreated: (controller) { + mapController.value = controller; + + controller.addListener( + () { + final position = controller.cameraPosition; + if (position != null) { + cameraPosition.value = + const JsonEncoder.withIndent(' ').convert(position.toMap()); + } + }, + ); + }, onStyleLoadedCallback: () async { final controller = mapController.value; await controller?.setSymbolIconAllowOverlap(true); @@ -139,8 +156,76 @@ class MainMapView extends HookConsumerWidget { }, rotateGesturesEnabled: false, tiltGesturesEnabled: false, + trackCameraPosition: true, + ), + ); + return Stack( + children: [ + map, + if (ref + .watch(debuggerProvider.select((value) => value.isDebugger))) ...[ + _MapDebugWidget(cameraPosition: cameraPosition), + ], + ], + ); + } +} + +class _MapDebugWidget extends HookConsumerWidget { + const _MapDebugWidget({ + required this.cameraPosition, + }); + + final ValueNotifier cameraPosition; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final isExpanded = useState(false); + if (!isExpanded.value) { + return AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + child: Align( + alignment: Alignment.topLeft, + child: Padding( + padding: const EdgeInsets.all(8), + child: FilledButton.tonalIcon( + onPressed: () => isExpanded.value = true, + label: const Text( + 'Debug', + style: TextStyle( + fontFamily: FontFamily.jetBrainsMono, + ), + ), + icon: const Icon(Icons.bug_report), + ), + ), + ), + ); + } + return AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + child: InkWell( + onTap: () => isExpanded.value = false, + child: Card( + color: Theme.of(context).colorScheme.surface.withOpacity(0.8), + child: Padding( + padding: const EdgeInsets.all(8), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '${cameraPosition.value}\n' + 'EewEstimatedIntensity: ${ref.watch(estimatedIntensityProvider).firstOrNull}', + style: const TextStyle( + fontSize: 10, + fontFamily: FontFamily.jetBrainsMono, + ), + ), + ], + ), + ), + ), ), ); - return map; } } diff --git a/lib/feature/home/features/map/viewmodel/main_map_viewmodel.dart b/lib/feature/home/features/map/viewmodel/main_map_viewmodel.dart index f5eca6235..c8650f503 100644 --- a/lib/feature/home/features/map/viewmodel/main_map_viewmodel.dart +++ b/lib/feature/home/features/map/viewmodel/main_map_viewmodel.dart @@ -7,12 +7,12 @@ import 'package:eqapi_types/lib.dart'; import 'package:eqmonitor/core/provider/capture/intensity_icon_render.dart'; import 'package:eqmonitor/core/provider/config/theme/intensity_color/intensity_color_provider.dart'; import 'package:eqmonitor/core/provider/config/theme/intensity_color/model/intensity_color_model.dart'; +import 'package:eqmonitor/core/provider/map_style/map_style.dart'; import 'package:eqmonitor/feature/earthquake_history/model/state/earthquake_history_item.dart'; import 'package:eqmonitor/feature/home/features/eew/provider/eew_alive_telegram.dart'; import 'package:eqmonitor/feature/home/features/kmoni/viewmodel/kmoni_view_model.dart'; import 'package:eqmonitor/feature/home/features/kmoni_observation_points/model/kmoni_observation_point.dart'; import 'package:eqmonitor/feature/home/features/travel_time/provider/travel_time_provider.dart'; -import 'package:eqmonitor/feature/map_libre/provider/map_style.dart'; import 'package:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:lat_lng/lat_lng.dart' as lat_lng; @@ -102,7 +102,7 @@ class MainMapViewModel extends _$MainMapViewModel { _eewPsWaveService!.tick(now: now), _eewHypocenterService!.tick(), ).wait; - // ignore: avoid_catches_without_on_clauses, empty_catches + // ignore: avoid_catches_without_on_clauses, empty_catches } catch (e) {} } @@ -172,9 +172,10 @@ class MainMapViewModel extends _$MainMapViewModel { _controller?.addImage(name, bytes); // ignore: use_setters_to_change_properties - void registerMapController(MaplibreMapController controller) => - // ignore: void_checks - _controller = controller; + void registerMapController(MaplibreMapController controller) { + // ignore: void_checks + _controller = controller; + } bool isMapControllerRegistered() => _controller != null; @@ -338,8 +339,7 @@ class _EewEstimatedIntensityService { /// 予想震度を更新する /// [areas] は Map<予想震度, List<地域コード>> Future update(Map> areas) => [ - - // 各予想震度ごとにFill Layerを追加 + // 各予想震度ごとにFill Layerを追加 for (final intensity in JmaForecastIntensity.values) controller.setFilter( getFillLayerId(intensity), @@ -351,8 +351,7 @@ class _EewEstimatedIntensityService { areas[intensity] ?? [], ] ], - ) - , + ), ].wait; Future dispose() => [ diff --git a/packages/jma_parameter_types/lib/tsunami_param.pbjson.dart b/packages/jma_parameter_types/lib/tsunami_param.pbjson.dart index 0aa7c0421..09f97b764 100644 --- a/packages/jma_parameter_types/lib/tsunami_param.pbjson.dart +++ b/packages/jma_parameter_types/lib/tsunami_param.pbjson.dart @@ -23,7 +23,7 @@ const TsunamiParameter$json = { '4': 3, '5': 11, '6': '.TsunamiParameterItem', - '10': 'items' + '10': 'items', }, ], };