11import 'dart:io' ;
22import 'package:flutter/foundation.dart' ;
33import 'package:flutter_riverpod/flutter_riverpod.dart' ;
4+ import 'package:fladder/models/media_playback_model.dart' ;
5+ import 'package:fladder/providers/video_player_provider.dart' ;
46import 'package:window_manager/window_manager.dart' ;
57
68/// Manages the context-aware window title.
79final windowTitleProvider = StateNotifierProvider <WindowTitleNotifier , String >((ref) {
8- return WindowTitleNotifier ();
10+ return WindowTitleNotifier (ref );
911});
1012
1113class WindowTitleNotifier extends StateNotifier <String > {
12- WindowTitleNotifier () : super ('Fladder' );
14+ final Ref ref;
15+ WindowTitleNotifier (this .ref) : super ('Fladder' );
1316
14- final List <String > _navStack = [];
17+ final Map <Object , String > _titles = {};
18+ final List <Object > _stackKeys = [];
1519 String ? _playTitle;
1620
17- void pushNavTitle (String title) {
18- _navStack.add (title);
21+ void updateTitle (Object key, String title) {
22+ _stackKeys.remove (key);
23+ _stackKeys.add (key);
24+ _titles[key] = title;
1925 _update ();
2026 }
2127
22- void popNavTitle (String title) {
23- _navStack.remove (title);
24- _update ();
25- }
26-
27- void replaceNavTitle (String oldTitle, String newTitle) {
28- final index = _navStack.lastIndexOf (oldTitle);
29- if (index != - 1 ) {
30- _navStack[index] = newTitle;
31- } else {
32- _navStack.add (newTitle);
28+ void removeTitle (Object key) {
29+ final removed = _stackKeys.remove (key);
30+ _titles.remove (key);
31+ if (removed) {
32+ _update ();
3333 }
34- _update ();
3534 }
3635
3736 void clearStack () {
38- _navStack.clear ();
37+ _stackKeys.clear ();
38+ _titles.clear ();
3939 _update ();
4040 }
4141
@@ -45,17 +45,30 @@ class WindowTitleNotifier extends StateNotifier<String> {
4545 }
4646
4747 void _update () {
48- final nav = _navStack .isNotEmpty ? _navStack .last : null ;
49- final title = _playTitle ?? nav ;
48+ final nav = _stackKeys .isNotEmpty ? _titles[_stackKeys .last] : null ;
49+ final playerState = ref. read (mediaPlaybackProvider).state ;
5050
51- if (kIsWeb) {
52- state = title != null ? 'Fladder • $title ' : 'Fladder' ;
53- } else {
54- state = title ?? 'Fladder' ;
55- }
51+ final isPlayerActive = playerState != VideoPlayerState .disposed;
52+ final isPlayerMinimized = playerState == VideoPlayerState .minimized;
53+
54+ // Use playTitle if player is active and expanded/fullscreen.
55+ // If player is minimized or inactive, prefer navigation title.
56+ final title = (isPlayerActive && ! isPlayerMinimized)
57+ ? (_playTitle ?? nav)
58+ : (nav ?? _playTitle);
59+
60+ final newState = kIsWeb ? (title != null ? 'Fladder • $title ' : 'Fladder' ) : (title ?? 'Fladder' );
61+
62+ if (state == newState) return ;
63+
64+ Future .microtask (() {
65+ state = newState;
66+ });
5667
5768 if (! kIsWeb && (Platform .isLinux || Platform .isMacOS || Platform .isWindows)) {
58- windowManager.setTitle (state);
69+ // Setting window title directly is safe even during build
70+ windowManager.setTitle (newState);
5971 }
6072 }
73+
6174}
0 commit comments