| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- import 'package:flutter/material.dart';
- import 'package:get/get.dart';
- import 'package:get_storage/get_storage.dart';
- import 'package:trackoffical_app/logger.dart';
- import 'package:trackoffical_app/model.dart';
- import 'package:trackoffical_app/pb.dart' as pb;
- class UserProfile {
- final token = ''.val('token');
- final lastUseSportWearMac = ''.val('lastUseSportWearMac');
- var username = ''.obs;
- var head = MNetImage().obs;
- final _sexIndex = Sex.Male.index.val('UserProfile_sex');
- Sex get sex => Sex.values[_sexIndex.val];
- set sex(Sex v) {
- _sexIndex.val = v.index;
- }
- var age = 12.val('UserProfile_age');
- var weightKg = 42.0.val('UserProfile_weightKg');
- var heightCm = 150.0.val('UserProfile_heightCm');
- var rhr = 60.val('UserProfile_rhr');
- /// 已经询问过开屏权限
- final isAskPermissions = false.val('UserProfile_isAskPermissions');
- var isCompassUseRealNorth = true.val('UserProfile_isCompassUseRealNorth');
- final isInGameUISimplifyMode = true.val('UserProfile_isInGameUISimplifyMode');
- final isEnableOutBoundaryWarn =
- true.val('UserProfile_isEnableOutBoundaryWarn');
- static const inGameTrajectorySecondsList = <int>[60, 90, 120];
- final inGameTrajectorySeconds =
- inGameTrajectorySecondsList[0].val('UserProfile_inGameTrajectorySeconds');
- final isEnableUserLocation = true.val('UserProfile_isUserLocationEnable');
- final isStartShowWarn = true.val('UserProfile_isStartShowWarn');
- final isEnableGameSound = true.val('UserProfile_isEnableGameSound');
- final isEnableGameVibrate = true.val('UserProfile_isEnableGameVibrate');
- /// 文创
- final isEnableGameCulture = true.val('UserProfile_isEnableGameCulture');
- /// 游戏开始后是否显示提示
- final isEnableInGameStartWarn =
- true.val('UserProfile_isEnableInGameStartWarn');
- /// 游戏开始后是否显示开始点气泡
- final isEnableInGameStartCPBubble =
- true.val('UserProfile_isEnableInGameStartCPBubble');
- /// 首页是否显示提示
- final isEnableHomeSpecialWarn =
- true.val('UserProfile_isEnableHomeSpecialWarn');
- /// 游戏开始后是否屏幕最亮
- final isEnableInGameBrightnessMax =
- false.val('UserProfile_isEnableInGameBrightnessMax');
- final gameSettingsUIMode = GameSettingsValue<GameUIMode, int>(
- 'map_mode', GameUIMode.electronicMap,
- storageFmt: (v) => v.index,
- storageFmtRe: (s)=> GameUIMode.values[s]
- );
- final gameSettingsSimpleDashboard =
- GameSettingsValue('simple_dashboard', true);
- final gameSettingsBoundaryWarn = GameSettingsValue('boundary_warn', true);
- final gameSettingsTrackLengthSeconds = GameSettingsValue('track_length', 60);
- final gameSettingsShowMyLocation =
- GameSettingsValue('show_my_location', true);
- final gameSettingsStartRemind = GameSettingsValue('start_remind', true);
- final gameSettingsSoundPrompt = GameSettingsValue('sound_prompt', true);
- final gameSettingsVibrationPrompt =
- GameSettingsValue('vibration_prompt', true);
- final gameSettingsShowOriginality =
- GameSettingsValue('show_originality', true);
- final gameSettingsRealNorth = GameSettingsValue('real_north', true);
- final gameSettingsGpsTrack = GameSettingsValue('gps_track', true);
- final gameSettingsTargetErrorMeter = GameSettingsValue('target_error', 5);
- final gameSettingsPunchRadiusMeter = GameSettingsValue('punch_radius', 2);
- final gameSettingsCpRadiusMeter = GameSettingsValue('cp_radius', 15);
- final gameSettingsCpColor = gameSettingsColor('cp_color', const Color(0xffff00f7));
- final gameSettingsCpTargetColor = gameSettingsColor('target_cp_color', const Color(0xfff44336));
- final gameSettingsCpJumpColor = gameSettingsColor('jump_cp_color', const Color(0xff9e9e9e));
- final gameSettingsCpPunchedColor = gameSettingsColor('punched_cp_color', const Color(0xff4caf50));
- final gameSettingsRoutePreview = GameSettingsValue('route_preview', false);
- final gameSettingsPunchErrorPrompt = GameSettingsValue('punch_error_prompt', true);
- final gameSettingsHotZonePrompt = GameSettingsValue('hotspot_prompt', true);
- final gameSettingsVCPPunchType = GameSettingsValue<VCPPunchType, int>(
- 'vcp_punch_type', VCPPunchType.manual,
- storageFmt: (v) => v.index,
- storageFmtRe: (s)=> VCPPunchType.values[s]
- );
- final _gameSettingsIndex = <String, GameSettingsValue>{};
- void _gameSettingsInitIndex(List<GameSettingsValue> list) {
- for (final one in list) {
- _gameSettingsIndex[one.name] = one;
- }
- }
- UserProfile() {
- _gameSettingsInitIndex([
- gameSettingsUIMode,
- gameSettingsSimpleDashboard,
- gameSettingsBoundaryWarn,
- gameSettingsTrackLengthSeconds,
- gameSettingsShowMyLocation,
- gameSettingsStartRemind,
- gameSettingsSoundPrompt,
- gameSettingsVibrationPrompt,
- gameSettingsShowOriginality,
- gameSettingsRealNorth,
- gameSettingsGpsTrack,
- gameSettingsTargetErrorMeter,
- gameSettingsPunchRadiusMeter,
- gameSettingsCpRadiusMeter,
- gameSettingsCpColor,
- gameSettingsCpTargetColor,
- gameSettingsCpJumpColor,
- gameSettingsCpPunchedColor,
- gameSettingsRoutePreview,
- gameSettingsPunchErrorPrompt,
- gameSettingsHotZonePrompt,
- gameSettingsVCPPunchType,
- ]);
- }
- void gameSettingsLoadLock(List<pb.ActivityRule> rules) {
- var msg = '载入服务器配置:\n';
- for (final rule in rules) {
- final s = _gameSettingsIndex[rule.arName];
- if (s != null && rule.isLock) {
- s.parseStringLock(rule.arValue);
- msg += '${rule.arName}: ${rule.arValue}';
- }
- }
- info(msg);
- }
- void cleanGameSettingsLock() {
- for (final one in _gameSettingsIndex.values) {
- one.lockValue = null;
- }
- }
- }
- enum GameUIMode { electronicMap, noMap, paperMap }
- enum VCPPunchType{ manual, auto }
- GameSettingsValue<Color, int> gameSettingsColor(String name, Color color){
- return GameSettingsValue<Color, int>(name,
- color,
- storageFmt: (v) => v.value,
- storageFmtRe: (s)=> Color(s)
- );
- }
- class GameSettingsValue<T, S> {
- GameSettingsValue(this.name, T value,
- {S Function(T)? storageFmt, T Function(S)? storageFmtRe})
- : _same = storageFmt==null,
- _storageFmt = storageFmt,
- _storageFmtRe = storageFmtRe{
- final key = 'GameSettingsValue_$name';
- if(_same){
- _storage = value.val(key);
- }else{
- _storage = storageFmt!(value).val(key);
- }
- }
- /// 类型T和S相同
- final bool _same;
- final String name;
- late ReadWriteValue<dynamic> _storage;
- final S Function(T)? _storageFmt;
- final T Function(S)? _storageFmtRe;
- T? lockValue;
- bool get isLocked => lockValue != null;
- parseStringLock(String value) {
- switch (T) {
- case bool:
- lockValue = (bool.tryParse(value) ?? false) as T;
- break;
- case int:
- lockValue = (int.tryParse(value) ?? 0) as T;
- break;
- case GameUIMode:
- lockValue = GameUIMode.values[int.tryParse(value) ?? 0] as T;
- break;
- case VCPPunchType:
- lockValue = VCPPunchType.values[int.tryParse(value) ?? 0] as T;
- break;
- default:
- throw Exception("T: $T name:$name v:$value 不支持");
- }
- }
- set value(T v) {
- if (lockValue == null) {
- if (_same) {
- _storage.val = v;
- } else {
- _storage.val = _storageFmt!(v);
- }
- }
- }
- T get value {
- if (_same) {
- return lockValue ?? _storage.val;
- } else {
- return lockValue ?? _storageFmtRe!(_storage.val);
- }
- }
- }
|