diff --git a/finlog_app/app/lib/core/ui/controller/locale_controller.dart b/finlog_app/app/lib/core/ui/controller/locale_controller.dart new file mode 100644 index 0000000..127b163 --- /dev/null +++ b/finlog_app/app/lib/core/ui/controller/locale_controller.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:fluttery/fluttery.dart'; +import 'package:fluttery/preferences.dart'; + +/// Controls the current app language (system, de, en, ...). +/// Loads the locale from Preferences or falls back to system default. +class LocaleController extends ChangeNotifier { + final Preferences _prefs; + + LocaleController() : _prefs = App.service(); + + static const _key = 'language'; + + String _current = 'system'; + + Future init() async { + final saved = await _prefs.getString(_key); + _current = saved ?? 'system'; + notifyListeners(); + } + + void setLanguage(String lang) { + _current = lang; + notifyListeners(); + _prefs.setString(_key, lang); + } + + /// Returns the actual Locale or null = system. + Locale? get locale { + switch (_current) { + case 'de': + return const Locale('de'); + case 'en': + return const Locale('en'); + case 'system': + default: + return null; + } + } + + String get language => _current; +} diff --git a/finlog_app/app/lib/core/ui/controller/scale_controller.dart b/finlog_app/app/lib/core/ui/controller/scale_controller.dart new file mode 100644 index 0000000..241bb36 --- /dev/null +++ b/finlog_app/app/lib/core/ui/controller/scale_controller.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:fluttery/fluttery.dart'; +import 'package:fluttery/preferences.dart'; + +/// Controls the current text scale (system, small, medium, large). +/// Loads the value from Preferences or falls back to system default. +class ScaleController extends ChangeNotifier { + final Preferences _prefs; + + ScaleController() : _prefs = App.service(); + + static const _key = 'textScale'; + + /// supported sizes + static const Map _factors = { + 'system': 1.0, + 'small': 0.9, + 'medium': 1.1, + 'large': 1.25, + }; + + String _current = 'system'; + + /// Loads text scale from Preferences. + Future init() async { + final saved = await _prefs.getString(_key); + _current = saved ?? 'system'; + if (!_factors.containsKey(_current)) { + _current = 'system'; + } + notifyListeners(); + } + + /// Set text scale and persist. + void setScale(String scale) { + if (!_factors.containsKey(scale)) return; + _current = scale; + notifyListeners(); + _prefs.setString(_key, scale); + } + + /// get current factor (e.g. for MediaQuery.textScaler) + double get factor => _factors[_current]!; + + /// get current string (system/small/medium/large) + String get scale => _current; +} diff --git a/finlog_app/app/lib/core/app/theme.dart b/finlog_app/app/lib/core/ui/controller/theme.dart similarity index 94% rename from finlog_app/app/lib/core/app/theme.dart rename to finlog_app/app/lib/core/ui/controller/theme.dart index b57954c..f061e0f 100644 --- a/finlog_app/app/lib/core/app/theme.dart +++ b/finlog_app/app/lib/core/ui/controller/theme.dart @@ -7,7 +7,7 @@ import 'package:fluttery/preferences.dart'; class ThemeController extends ChangeNotifier { final Preferences _prefs; - // vars + /// themeMode (system, dark or white) ThemeMode _themeMode = ThemeMode.system; /// Constructor @@ -43,5 +43,6 @@ class ThemeController extends ChangeNotifier { } } + /// get current ThemeMode ThemeMode get themeMode => _themeMode; } diff --git a/finlog_app/app/lib/main.dart b/finlog_app/app/lib/main.dart index b6402cb..3ea7a71 100644 --- a/finlog_app/app/lib/main.dart +++ b/finlog_app/app/lib/main.dart @@ -1,6 +1,6 @@ import 'package:app/core/app/router.dart'; import 'package:app/core/app/startup/domain/initialize_app.dart'; -import 'package:app/core/app/theme.dart'; +import 'package:app/core/ui/controller/theme.dart'; import 'package:flutter/material.dart'; import 'package:fluttery/fluttery.dart'; import 'package:fluttery/logger.dart'; diff --git a/finlog_app/app/lib/modules/settings/modules/app/app_settings_view.dart b/finlog_app/app/lib/modules/settings/modules/app/app_settings_view.dart index 4c0bd9b..e251f20 100644 --- a/finlog_app/app/lib/modules/settings/modules/app/app_settings_view.dart +++ b/finlog_app/app/lib/modules/settings/modules/app/app_settings_view.dart @@ -1,4 +1,4 @@ -import 'package:app/core/app/theme.dart'; +import 'package:app/core/ui/controller/theme.dart'; import 'package:app/modules/settings/modules/app/model/app_settings_view_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/finlog_app/app/lib/modules/settings/modules/app/model/app_settings_view_model.dart b/finlog_app/app/lib/modules/settings/modules/app/model/app_settings_view_model.dart index f9ac6ae..842e5c2 100644 --- a/finlog_app/app/lib/modules/settings/modules/app/model/app_settings_view_model.dart +++ b/finlog_app/app/lib/modules/settings/modules/app/model/app_settings_view_model.dart @@ -1,4 +1,4 @@ -import 'package:app/core/app/theme.dart'; +import 'package:app/core/ui/controller/theme.dart'; import 'package:flutter/material.dart'; /// Domain-ish enums for clarity and easy (de)serialization.