Files
MobilApp/lib/pages/map_survey/presentations/widgets/stakeout_settings_dialog.dart
T

111 lines
4.4 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../../services/stakeout_service.dart';
/// Kitűzési beállítások dialógus — a panel fogaskerék-ikonjáról.
/// Minden érték a StakeoutService Rx-eiben él, és a service perzisztálja
/// (SharedPreferences), így app-újraindítás után is megmaradnak.
Future<void> showStakeoutSettingsDialog() async {
final svc = StakeoutService.to;
final tolCtrl = TextEditingController(
text: (svc.toleranceXY.value * 100).toStringAsFixed(0));
final maxOffCtrl = TextEditingController(
text: svc.maxOffset.value > 0
? svc.maxOffset.value.toStringAsFixed(1)
: '');
await Get.dialog(AlertDialog(
title: const Text('Kitűzési beállítások'),
content: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
controller: tolCtrl,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
labelText: 'Tűrés (cm)',
helperText: 'A céltábla zöld köre és a "tűrésen belül" jelzés',
isDense: true,
),
),
const SizedBox(height: 14),
const Text('Átlagolás tároláskor',
style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600)),
const SizedBox(height: 6),
Obx(() => SegmentedButton<int>(
segments: const [
ButtonSegment(value: 0, label: Text('Ki')),
ButtonSegment(value: 3, label: Text('3 s')),
ButtonSegment(value: 5, label: Text('5 s')),
ButtonSegment(value: 10, label: Text('10 s')),
],
selected: {svc.averagingSeconds.value},
onSelectionChanged: (s) => svc.averagingSeconds.value = s.first,
showSelectedIcon: false,
style: const ButtonStyle(visualDensity: VisualDensity.compact),
)),
const SizedBox(height: 4),
Text(
'Bekapcsolva a "Tárol" a megadott ideig gyűjti és átlagolja '
'a pozíciókat — csökkenti a pillanatnyi zaj hatását.',
style: TextStyle(fontSize: 11, color: Colors.grey.shade600),
),
const SizedBox(height: 10),
Obx(() => SwitchListTile(
contentPadding: EdgeInsets.zero,
dense: true,
title: const Text('Haptikus visszajelzés'),
subtitle: const Text('közeledve sűrűsödő rezgés',
style: TextStyle(fontSize: 11)),
value: svc.hapticsEnabled.value,
onChanged: (v) => svc.hapticsEnabled.value = v,
)),
Obx(() => SwitchListTile(
contentPadding: EdgeInsets.zero,
dense: true,
title: const Text('Hangjelzés'),
subtitle: const Text('kattanás a pulzusokkal, hang a tűrésnél',
style: TextStyle(fontSize: 11)),
value: svc.soundEnabled.value,
onChanged: (v) => svc.soundEnabled.value = v,
)),
const SizedBox(height: 6),
TextField(
controller: maxOffCtrl,
keyboardType: const TextInputType.numberWithOptions(decimal: true),
decoration: const InputDecoration(
labelText: 'Max. crossline eltolás (m, üres = nincs korlát)',
labelStyle: TextStyle(fontSize: 12),
helperText: 'A specifikáció szerinti offset-korlát — '
'e fölött az eltolás-dialógus figyelmeztet.',
helperMaxLines: 2,
isDense: true,
),
),
],
),
),
actions: [
TextButton(onPressed: Get.back, child: const Text('Mégse')),
FilledButton(
onPressed: () async {
final tolCm = double.tryParse(tolCtrl.text.replaceAll(',', '.'));
if (tolCm != null && tolCm > 0) {
svc.toleranceXY.value = tolCm / 100.0;
}
final maxOff = double.tryParse(maxOffCtrl.text.replaceAll(',', '.'));
svc.maxOffset.value = maxOff ?? 0;
await svc.saveSettings();
Get.back();
},
child: const Text('Mentés'),
),
],
));
}