multiple updates
- colour theme implemented. ThemeService based global switching for future light detection triggers - test flipflop service for various fun - navigator widget class with state switching
This commit is contained in:
50
pi/ui/lib/services/test_flipflop_service.dart
Normal file
50
pi/ui/lib/services/test_flipflop_service.dart
Normal file
@@ -0,0 +1,50 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
import '../widgets/navigator_widget.dart';
|
||||
import 'theme_service.dart';
|
||||
|
||||
/// Debug service that flip-flops theme and navigator emotion every 2 seconds.
|
||||
///
|
||||
/// Usage:
|
||||
/// ```dart
|
||||
/// TestFlipFlopService.instance.start(navigatorKey: _navigatorKey);
|
||||
/// // Later:
|
||||
/// TestFlipFlopService.instance.stop();
|
||||
/// ```
|
||||
class TestFlipFlopService {
|
||||
TestFlipFlopService._();
|
||||
static final instance = TestFlipFlopService._();
|
||||
|
||||
Timer? _timer;
|
||||
bool _running = false;
|
||||
|
||||
bool get isRunning => _running;
|
||||
|
||||
/// Start the flip-flop cycle.
|
||||
/// Pass the navigator's GlobalKey to trigger emotion changes.
|
||||
void start({required GlobalKey<NavigatorWidgetState> navigatorKey}) {
|
||||
stop();
|
||||
_running = true;
|
||||
|
||||
_timer = Timer.periodic(const Duration(seconds: 2), (_) {
|
||||
// Toggle theme
|
||||
ThemeService.instance.toggle();
|
||||
|
||||
// Surprise the navigator
|
||||
if (navigatorKey.currentState?.emotion == 'surprise') {
|
||||
navigatorKey.currentState?.reset();
|
||||
} else {
|
||||
navigatorKey.currentState?.setEmotion('surprise');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// Stop the flip-flop cycle.
|
||||
void stop() {
|
||||
_timer?.cancel();
|
||||
_timer = null;
|
||||
_running = false;
|
||||
}
|
||||
}
|
||||
40
pi/ui/lib/services/theme_service.dart
Normal file
40
pi/ui/lib/services/theme_service.dart
Normal file
@@ -0,0 +1,40 @@
|
||||
/// Theme switching service - singleton pattern matching OverheatMonitor
|
||||
///
|
||||
/// Manages dark/bright mode state and notifies listeners on change.
|
||||
/// Default is dark mode. Call setDarkMode() from sensor readings.
|
||||
class ThemeService {
|
||||
ThemeService._();
|
||||
static final instance = ThemeService._();
|
||||
|
||||
bool _isDarkMode = true;
|
||||
final List<void Function()> _listeners = [];
|
||||
|
||||
/// Current theme mode
|
||||
bool get isDarkMode => _isDarkMode;
|
||||
|
||||
/// Set theme mode. Notifies listeners if changed.
|
||||
void setDarkMode(bool dark) {
|
||||
if (_isDarkMode == dark) return;
|
||||
_isDarkMode = dark;
|
||||
_notifyListeners();
|
||||
}
|
||||
|
||||
/// Toggle between dark and bright
|
||||
void toggle() => setDarkMode(!_isDarkMode);
|
||||
|
||||
/// Add a listener for theme changes
|
||||
void addListener(void Function() listener) {
|
||||
_listeners.add(listener);
|
||||
}
|
||||
|
||||
/// Remove a listener
|
||||
void removeListener(void Function() listener) {
|
||||
_listeners.remove(listener);
|
||||
}
|
||||
|
||||
void _notifyListeners() {
|
||||
for (final listener in _listeners) {
|
||||
listener();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user