77using osu . Framework . Development ;
88using osu . Framework . Graphics ;
99using osu . Framework . Graphics . Containers ;
10+ using osu . Framework . Graphics . Cursor ;
1011using osu . Framework . Logging ;
12+ using osu . Framework . Screens ;
1113using osu . Framework . Testing ;
1214using osu . Game . Graphics ;
1315using osu . Game . Overlays ;
@@ -32,7 +34,7 @@ public abstract partial class ScreenTestScene : OsuManualInputManagerTestScene,
3234 protected DialogOverlay DialogOverlay { get ; private set ; }
3335
3436 [ Cached ]
35- private ScreenFooter footer ;
37+ protected ScreenFooter Footer { get ; private set ; }
3638
3739 protected ScreenTestScene ( )
3840 {
@@ -43,17 +45,32 @@ protected ScreenTestScene()
4345 Name = nameof ( ScreenTestScene ) ,
4446 RelativeSizeAxes = Axes . Both
4547 } ,
46- content = new Container { RelativeSizeAxes = Axes . Both } ,
48+ new PopoverContainer
49+ {
50+ RelativeSizeAxes = Axes . Both ,
51+ Children = new Drawable [ ]
52+ {
53+ content = new Container { RelativeSizeAxes = Axes . Both } ,
54+ Footer = new ScreenFooter ( ) ,
55+ }
56+ } ,
4757 overlayContent = new Container
4858 {
4959 RelativeSizeAxes = Axes . Both ,
5060 Child = DialogOverlay = new DialogOverlay ( )
5161 } ,
52- footer = new ScreenFooter ( ) ,
5362 } ) ;
5463
55- Stack . ScreenPushed += ( _ , newScreen ) => Logger . Log ( $ "{ nameof ( ScreenTestScene ) } screen changed → { newScreen } ") ;
56- Stack . ScreenExited += ( _ , newScreen ) => Logger . Log ( $ "{ nameof ( ScreenTestScene ) } screen changed ← { newScreen } ") ;
64+ Stack . ScreenPushed += ( oldScreen , newScreen ) =>
65+ {
66+ updateFooter ( oldScreen , newScreen ) ;
67+ Logger . Log ( $ "{ nameof ( ScreenTestScene ) } screen changed → { newScreen } ") ;
68+ } ;
69+ Stack . ScreenExited += ( oldScreen , newScreen ) =>
70+ {
71+ updateFooter ( oldScreen , newScreen ) ;
72+ Logger . Log ( $ "{ nameof ( ScreenTestScene ) } screen changed ← { newScreen } ") ;
73+ } ;
5774 }
5875
5976 protected void LoadScreen ( OsuScreen screen ) => Stack . Push ( screen ) ;
@@ -79,6 +96,39 @@ private void addExitAllScreensStep()
7996 } ) ;
8097 }
8198
99+ private void updateFooter ( IScreen ? _ , IScreen ? newScreen )
100+ {
101+ if ( newScreen is OsuScreen osuScreen && osuScreen . ShowFooter )
102+ {
103+ Footer . Show ( ) ;
104+
105+ if ( osuScreen . IsLoaded )
106+ updateFooterButtons ( ) ;
107+ else
108+ {
109+ // ensure the current buttons are immediately disabled on screen change (so they can't be pressed).
110+ Footer . SetButtons ( Array . Empty < ScreenFooterButton > ( ) ) ;
111+
112+ osuScreen . OnLoadComplete += _ => updateFooterButtons ( ) ;
113+ }
114+
115+ void updateFooterButtons ( )
116+ {
117+ var buttons = osuScreen . CreateFooterButtons ( ) ;
118+
119+ osuScreen . LoadComponentsAgainstScreenDependencies ( buttons ) ;
120+
121+ Footer . SetButtons ( buttons ) ;
122+ Footer . Show ( ) ;
123+ }
124+ }
125+ else
126+ {
127+ Footer . Hide ( ) ;
128+ Footer . SetButtons ( Array . Empty < ScreenFooterButton > ( ) ) ;
129+ }
130+ }
131+
82132 #region IOverlayManager
83133
84134 IBindable < OverlayActivation > IOverlayManager . OverlayActivationMode { get ; } = new Bindable < OverlayActivation > ( OverlayActivation . All ) ;
0 commit comments