From 72267f29bbabc5e748cffde4c96e5558ee84650c Mon Sep 17 00:00:00 2001 From: Akira Date: Fri, 26 Apr 2024 18:44:22 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=9E=E3=83=BC=E3=82=92?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=81=A7=E5=A4=89=E6=9B=B4=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F=E3=80=82?= =?UTF-8?q?=E7=8F=BE=E5=9C=A8=E5=9C=B0=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=AE?= =?UTF-8?q?=E9=95=B7=E6=8A=BC=E3=81=97=E3=81=8A=E3=82=88=E3=81=B3=E3=83=89?= =?UTF-8?q?=E3=83=AD=E3=83=AF=E3=83=BC=E3=81=B8=E3=81=AE=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 3 + lib/pages/drawer/drawer_page.dart | 9 +++ lib/pages/settings/settings_binding.dart | 12 ++++ lib/pages/settings/settings_controller.dart | 26 ++++++++ lib/pages/settings/settings_page.dart | 63 ++++++++++++++++++ lib/routes/app_pages.dart | 8 +++ lib/routes/app_routes.dart | 1 + lib/widgets/current_position_widget.dart | 33 +++++---- lib/widgets/map_widget.dart | 74 +++++++++++++-------- 9 files changed, 191 insertions(+), 38 deletions(-) create mode 100644 lib/pages/settings/settings_binding.dart create mode 100644 lib/pages/settings/settings_controller.dart create mode 100644 lib/pages/settings/settings_page.dart diff --git a/lib/main.dart b/lib/main.dart index 3462522..af20605 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,8 @@ import 'package:get/get.dart'; //import 'package:vm_service/vm_service.dart'; //import 'package:dart_vm_info/dart_vm_info.dart'; +import 'package:rogapp/pages/settings/settings_controller.dart'; + import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/index/index_binding.dart'; import 'package:rogapp/routes/app_pages.dart'; @@ -78,6 +80,7 @@ void main() async { //Get.put(LocationController()); // startMemoryMonitoring(); // 2024-4-8 Akira: メモリ使用量のチェックを開始 See #2810 + Get.put(SettingsController()); // これを追加 runZonedGuarded(() { runApp(const ProviderScope(child: MyApp())); diff --git a/lib/pages/drawer/drawer_page.dart b/lib/pages/drawer/drawer_page.dart index ff2a740..529b73e 100644 --- a/lib/pages/drawer/drawer_page.dart +++ b/lib/pages/drawer/drawer_page.dart @@ -238,6 +238,15 @@ class DrawerPage extends StatelessWidget { onTap: () { _launchURL("https://rogaining.sumasen.net/api/privacy/"); }, + ), + ListTile( + leading: const Icon(Icons.settings), + title: const Text('設定'), + onTap: () { + Get.back(); // ドロワーを閉じる + Get.toNamed(Routes.SETTINGS); + }, + ) // ListTile( // leading: const Icon(Icons.router), diff --git a/lib/pages/settings/settings_binding.dart b/lib/pages/settings/settings_binding.dart new file mode 100644 index 0000000..1281300 --- /dev/null +++ b/lib/pages/settings/settings_binding.dart @@ -0,0 +1,12 @@ +// lib/pages/settings/settings_binding.dart + +import 'package:get/get.dart'; +import 'package:rogapp/pages/settings/settings_controller.dart'; + +class SettingsBinding extends Bindings { + @override + void dependencies() { + Get.put(SettingsController()); // これを修正 + //Get.lazyPut(() => SettingsController()); + } +} diff --git a/lib/pages/settings/settings_controller.dart b/lib/pages/settings/settings_controller.dart new file mode 100644 index 0000000..0479d68 --- /dev/null +++ b/lib/pages/settings/settings_controller.dart @@ -0,0 +1,26 @@ +// lib/pages/settings/settings_controller.dart + +import 'package:get/get.dart'; +import 'package:rogapp/widgets/map_widget.dart'; + + +class SettingsController extends GetxController { + var timerDuration = Duration(seconds: 10).obs; + var autoReturnDisabled = false.obs; + final MapResetController mapResetController = Get.put(MapResetController()); + + void updateTimerDuration(int seconds) { + timerDuration.value = Duration(seconds: seconds); + } + + void setAutoReturnDisabled(bool value) { + autoReturnDisabled.value = value; + if (!value) { + resetIdleTimer(); + } + } + + void resetIdleTimer() { + mapResetController.resetIdleTimer!(); + } +} diff --git a/lib/pages/settings/settings_page.dart b/lib/pages/settings/settings_page.dart new file mode 100644 index 0000000..394e83d --- /dev/null +++ b/lib/pages/settings/settings_page.dart @@ -0,0 +1,63 @@ +// lib/pages/settings/settings_page.dart + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:rogapp/pages/settings/settings_controller.dart'; + +class SettingsPage extends GetView { + const SettingsPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('設定'), + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'タイマーの長さ', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 8), + Obx( + () => controller.autoReturnDisabled.value + ? Container() + : Slider( + value: controller.timerDuration.value.inSeconds.toDouble(), + min: 5, + max: 30, + divisions: 5, + label: '${controller.timerDuration.value.inSeconds}秒', + onChanged: (value) { + controller.updateTimerDuration(value.toInt()); + }, + ), + ), + const SizedBox(height: 8), + const Text( + 'マップ操作がなければ自動的に現在地に復帰します。そのタイマー秒数を入れて下さい。チェックボックスをチェックすると、自動復帰は行われなくなります。', + style: TextStyle(fontSize: 14), + ), + const SizedBox(height: 16), + Obx( + () => CheckboxListTile( + title: const Text('自動復帰なし'), + value: controller.autoReturnDisabled.value, + onChanged: (value) { + controller.setAutoReturnDisabled(value!); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index 2c7cca0..233e577 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -19,6 +19,8 @@ import 'package:rogapp/pages/progress/progress.dart'; import 'package:rogapp/pages/register/register_page.dart'; import 'package:rogapp/pages/search/search_binding.dart'; import 'package:rogapp/pages/search/search_page.dart'; +import 'package:rogapp/pages/settings/settings_page.dart'; +import 'package:rogapp/pages/settings/settings_binding.dart'; import 'package:rogapp/pages/subperf/subperf_page.dart'; import 'package:rogapp/spa/spa_binding.dart'; import 'package:rogapp/spa/spa_page.dart'; @@ -48,6 +50,7 @@ class AppPages { static const PROGRESS = Routes.PROGRESS; static const HISTORY = Routes.HISTORY; static const GPS = Routes.GPS; + static const SETTINGS = Routes.SETTINGS; static final routes = [ GetPage( @@ -108,6 +111,11 @@ class AppPages { GetPage( name: Routes.GPS, page: () => const GpsPage(), + ), + GetPage( + name: Routes.SETTINGS, + page: () => const SettingsPage(), + binding: SettingsBinding(), ) ]; } diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index acc45f6..a97eb8b 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -26,4 +26,5 @@ abstract class Routes { static const PROGRESS = '/progress'; static const HISTORY = '/history'; static const GPS = '/gp'; + static const SETTINGS = '/settings'; } diff --git a/lib/widgets/current_position_widget.dart b/lib/widgets/current_position_widget.dart index a992076..3e2fa66 100644 --- a/lib/widgets/current_position_widget.dart +++ b/lib/widgets/current_position_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rogapp/pages/destination/destination_controller.dart'; +import 'package:rogapp/routes/app_pages.dart'; // これを追加 class CurrentPosition extends StatefulWidget { const CurrentPosition({super.key}); @@ -13,20 +14,28 @@ class _CurrentPositionState extends State { final DestinationController destinationController = Get.find(); + void _onLongPress() { + Get.toNamed(AppPages.SETTINGS); // これを追加 + } + @override Widget build(BuildContext context) { - return Container( - width: 40, - height: 40, - decoration: BoxDecoration( - color: Colors.grey, borderRadius: BorderRadius.circular(20.0)), - child: IconButton( - onPressed: () { - destinationController.centerMapToCurrentLocation(); - }, - icon: const Icon( - Icons.location_searching, - color: Colors.white, + return GestureDetector( // GestureDetectorを追加 + onLongPress: _onLongPress, // 長押しイベントを追加 + child: Container ( +// return Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: Colors.grey, borderRadius: BorderRadius.circular(20.0)), + child: IconButton( + onPressed: () { + destinationController.centerMapToCurrentLocation(); + }, + icon: const Icon( + Icons.location_searching, + color: Colors.white, + ), ), ), ); diff --git a/lib/widgets/map_widget.dart b/lib/widgets/map_widget.dart index f62061d..689e25b 100644 --- a/lib/widgets/map_widget.dart +++ b/lib/widgets/map_widget.dart @@ -6,6 +6,7 @@ import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:geojson_vi/geojson_vi.dart'; import 'package:get/get.dart'; import 'package:latlong2/latlong.dart'; +import 'package:rogapp/pages/settings/settings_binding.dart'; import 'package:rogapp/model/destination.dart'; import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/index/index_controller.dart'; @@ -16,8 +17,13 @@ import 'package:rogapp/widgets/base_layer_widget.dart'; import 'package:rogapp/widgets/bottom_sheet_new.dart'; import 'package:rogapp/widgets/current_position_widget.dart'; import 'package:rogapp/widgets/game_state_view.dart'; +import 'package:rogapp/pages/settings/settings_controller.dart'; import 'package:flutter_map_tile_caching/flutter_map_tile_caching.dart'; +class MapResetController { + void Function()? resetIdleTimer; +} + class MapWidget extends StatefulWidget { const MapWidget({Key? key}) : super(key: key); @@ -31,6 +37,7 @@ class _MapWidgetState extends State with WidgetsBindingObserver { final DestinationController destinationController = Get.find(); final LocationController locationController = Get.find(); + final SettingsController settingsController = Get.find(); late MapController mapController; final Completer mapControllerCompleter = Completer(); @@ -45,6 +52,7 @@ class _MapWidgetState extends State with WidgetsBindingObserver { @override void initState() { super.initState(); + SettingsBinding().dependencies(); // これを追加 _startIdleTimer(); mapController = MapController(); indexController.mapController = mapController; @@ -67,10 +75,19 @@ class _MapWidgetState extends State with WidgetsBindingObserver { }); }); + late MapResetController mapResetController = MapResetController(); + mapResetController.resetIdleTimer = _resetIdleTimer; + Get.put(mapResetController); + // indexController.mapController = MapController(initCompleter: mapControllerCompleter); } + void _resetIdleTimer() { + _timer?.cancel(); + _startIdleTimer(); + } + @override void dispose() { WidgetsBinding.instance.removeObserver(this); // added @@ -90,7 +107,10 @@ class _MapWidgetState extends State with WidgetsBindingObserver { // _centerMapOnUser を10秒間でコール void _startIdleTimer() { - _timer = Timer(const Duration(milliseconds: (1000 * 10)), _centerMapOnUser); + final settingsController = Get.find(); + if (!settingsController.autoReturnDisabled.value) { + _timer = Timer(settingsController.timerDuration.value, _centerMapOnUser); + } } // タイマーをリセットして_startIdleTimer をコール @@ -174,6 +194,7 @@ class _MapWidgetState extends State with WidgetsBindingObserver { // Widget getMarkerShape(GeoJSONFeature i, BuildContext context) { Widget getMarkerShape(GeoJSONFeature i) { + /* String labelText = TextUtils.getDisplayTextFeture(i); if( i.properties!['cp'] == 0 ){ labelText="Start/Goal"; @@ -184,10 +205,11 @@ class _MapWidgetState extends State with WidgetsBindingObserver { //}else{ // labelText=i.properties!['cp']; } + */ //if( i.properties!['cp'] <= 0 ) { // debugPrint("Text=${labelText}"); //} - final double maxWidth = labelText.length * 16.0; //16.0; + //final double maxWidth = labelText.length * 16.0; //16.0; GeoJSONMultiPoint p = i.geometry as GeoJSONMultiPoint; return InkWell( onTap: () { @@ -238,21 +260,20 @@ class _MapWidgetState extends State with WidgetsBindingObserver { Icons.circle, size: 6.0, ), - i.properties!['cp'] <= 0 - ? Transform.translate + i.properties!['cp'] <= 0 ? Transform.translate ( - offset: const Offset(-3, 0), + offset: const Offset(-3, 0), //-3 child: Transform.rotate( - alignment: Alignment.centerLeft, - origin: Offset.fromDirection(1, 26), - angle: 270 * pi / 180, - child: const Icon( - Icons.play_arrow_outlined, - color: Colors.red, - size: 70, - ), - ), + alignment: Alignment.centerLeft, + origin: Offset.fromDirection(1, 26), + angle: 270 * pi / 180, + child: const Icon( + Icons.play_arrow_outlined, + color: Colors.red, + size: 70, + )), ) + : Container( color: Colors.transparent, ), @@ -262,42 +283,42 @@ class _MapWidgetState extends State with WidgetsBindingObserver { Transform.translate( offset: const Offset(30, 0), // 30,0 child: Align( - alignment: Alignment.centerLeft, + alignment: Alignment.center, child: Container ( //width: 200, // 幅を指定 //height: 60, // 40 color: Colors.transparent, //child: Text(' '). //constraints: const BoxConstraints(maxWidth: 1000.0), // 最大幅を設定 - constraints: BoxConstraints(maxWidth: maxWidth), // 最大幅を設定 + //constraints: BoxConstraints(maxWidth: maxWidth), // 最大幅を設定 //color: Colors.purple.withOpacity(0.2), child: Stack( children: [ Text( // アウトライン - labelText, + TextUtils.getDisplayTextFeture(i), style: TextStyle( - fontSize: 14, // 16 + fontSize: 16, // 16 fontWeight: FontWeight.w700, - height: 1.2, + //height: 1.2, foreground: Paint() ..style = PaintingStyle.stroke ..strokeWidth = 2 ..color = Colors.white, ), - maxLines: 1, // テキストを1行に制限 - softWrap: false, // テキストの折り返しを無効化 + //maxLines: 1, // テキストを1行に制限 + //softWrap: false, // テキストの折り返しを無効化 ), Text( // テキスト - labelText, + TextUtils.getDisplayTextFeture(i), style: const TextStyle( - fontSize: 14, + fontSize: 16, fontWeight: FontWeight.w700, //fontWeight: FontWeight.bold, - height: 1.2, + //height: 1.2, color: Colors.black, ), - maxLines: 1, // テキストを1行に制限 - softWrap: false, // テキストの折り返しを無効化 + //maxLines: 1, // テキストを1行に制限 + //softWrap: false, // テキストの折り返しを無効化 ), ], ), @@ -321,6 +342,7 @@ class _MapWidgetState extends State with WidgetsBindingObserver { @override Widget build(BuildContext context) { + final settingsController = Get.find(); // これを追加 //final PopupController popupController = PopupController(); return Stack( children: [