Files
gps-speedo/lib/providers/settings_provider.dart
T
Mikkeli Matlock 71b7611a48 Implement v1.1 enhancements: auto-rotate, interactive gauge, and extended units
Features added:
- Auto-rotate support for portrait/landscape orientations
- Interactive gauge: tap to switch between digital and analog modes
- Extended speed units: added knots with quick selector buttons
- New SpeedUnitSelector widget for convenient unit switching

Known issues identified:
- 10 package dependencies need updates to latest compatible versions
- Orientation switching needs to override system auto-rotate toggle
- Background color customization moved back to TODO (build issues)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-21 01:58:46 +09:00

110 lines
3.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
enum SpeedUnit { kmh, mph, knots }
enum SpeedometerStyle { digital, analog }
class SettingsProvider extends ChangeNotifier {
bool _isDarkMode = false;
SpeedUnit _speedUnit = SpeedUnit.kmh;
SpeedometerStyle _speedometerStyle = SpeedometerStyle.digital;
bool _showCoordinates = false;
bool _showDistance = false;
bool _showTripTime = false;
bool _showAccuracy = false;
bool get isDarkMode => _isDarkMode;
SpeedUnit get speedUnit => _speedUnit;
SpeedometerStyle get speedometerStyle => _speedometerStyle;
bool get showCoordinates => _showCoordinates;
bool get showDistance => _showDistance;
bool get showTripTime => _showTripTime;
bool get showAccuracy => _showAccuracy;
String get speedUnitString {
switch (_speedUnit) {
case SpeedUnit.kmh:
return 'km/h';
case SpeedUnit.mph:
return 'mph';
case SpeedUnit.knots:
return 'knots';
}
}
SettingsProvider() {
_loadSettings();
}
Future<void> _loadSettings() async {
final prefs = await SharedPreferences.getInstance();
_isDarkMode = prefs.getBool('isDarkMode') ?? false;
_speedUnit = SpeedUnit.values[prefs.getInt('speedUnit') ?? 0];
_speedometerStyle = SpeedometerStyle.values[prefs.getInt('speedometerStyle') ?? 0];
_showCoordinates = prefs.getBool('showCoordinates') ?? false;
_showDistance = prefs.getBool('showDistance') ?? false;
_showTripTime = prefs.getBool('showTripTime') ?? false;
_showAccuracy = prefs.getBool('showAccuracy') ?? false;
notifyListeners();
}
Future<void> setDarkMode(bool value) async {
_isDarkMode = value;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('isDarkMode', value);
notifyListeners();
}
Future<void> setSpeedUnit(SpeedUnit unit) async {
_speedUnit = unit;
final prefs = await SharedPreferences.getInstance();
await prefs.setInt('speedUnit', unit.index);
notifyListeners();
}
Future<void> setSpeedometerStyle(SpeedometerStyle style) async {
_speedometerStyle = style;
final prefs = await SharedPreferences.getInstance();
await prefs.setInt('speedometerStyle', style.index);
notifyListeners();
}
Future<void> setShowCoordinates(bool value) async {
_showCoordinates = value;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('showCoordinates', value);
notifyListeners();
}
Future<void> setShowDistance(bool value) async {
_showDistance = value;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('showDistance', value);
notifyListeners();
}
Future<void> setShowTripTime(bool value) async {
_showTripTime = value;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('showTripTime', value);
notifyListeners();
}
Future<void> setShowAccuracy(bool value) async {
_showAccuracy = value;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('showAccuracy', value);
notifyListeners();
}
double convertSpeed(double speedMps) {
switch (_speedUnit) {
case SpeedUnit.kmh:
return speedMps * 3.6;
case SpeedUnit.mph:
return speedMps * 2.237;
case SpeedUnit.knots:
return speedMps * 1.944;
}
}
}