ScreenType is being overloaded in incompatible ways:

- the editor sets "system_menu" to trick StepMania.cpp into not
   allowing the operator menu button, to prevent losing data;
 - the editor also sets "gameplay" in "playback" mode to influence
   ScreenSyncOverlay and ScreenDebugOverlay; this breaks the above,
   allowing scroll lock in play mode.

A similar problem happens when we push screens: scroll lock works
in the MiniMenus in the editor.

It's semantically unintuitive to call the editor a "system_menu", anyway.

Split out AllowOperatorMenuButton, and use it directly.  Check all
screens, and don't allow it if any screen on the stack disallows it.
This commit is contained in:
Glenn Maynard
2006-02-01 06:54:15 +00:00
parent d9c81c92cf
commit 7df95cd0d4
5 changed files with 15 additions and 2 deletions
+1
View File
@@ -56,6 +56,7 @@ public:
virtual bool UsesBackground() const { return true; } // override and set false if this screen shouldn't load a background
virtual ScreenType GetScreenType() const { return ALLOW_OPERATOR_MENU_BUTTON ? game_menu : system_menu; }
bool AllowOperatorMenuButton() const { return ALLOW_OPERATOR_MENU_BUTTON; }
static bool JoinInput( const MenuInput &MenuI ); // return true if a player joined
+1 -1
View File
@@ -160,7 +160,7 @@ public:
virtual void HandleScreenMessage( const ScreenMessage SM );
protected:
virtual ScreenType GetScreenType() const { return m_EditState==STATE_PLAYING ? gameplay : system_menu; }
virtual ScreenType GetScreenType() const { return m_EditState==STATE_PLAYING ? gameplay : ScreenWithMenuElements::GetScreenType(); }
void TransitionEditState( EditState em );
void ScrollTo( float fDestinationBeat );
+11
View File
@@ -283,6 +283,17 @@ Screen *ScreenManager::GetTopScreen()
return g_ScreenStack[g_ScreenStack.size()-1].m_pScreen;
}
bool ScreenManager::AllowOperatorMenuButton() const
{
FOREACH( LoadedScreen, g_ScreenStack, s )
{
if( !s->m_pScreen->AllowOperatorMenuButton() )
return false;
}
return true;
}
bool ScreenManager::IsStackedScreen( const Screen *pScreen ) const
{
/* True if the screen is in the screen stack, but not the first. */
+1
View File
@@ -40,6 +40,7 @@ public:
void PopTopScreen( ScreenMessage SM );
void PopAllScreens();
Screen *GetTopScreen();
bool AllowOperatorMenuButton() const;
// System messages
void SystemMessage( const RString &sMessage );
+1 -1
View File
@@ -1223,7 +1223,7 @@ bool HandleGlobalInputs( const InputEventPlus &input )
/* Global operator key, to get quick access to the options menu. Don't
* do this if we're on a "system menu", which includes the editor
* (to prevent quitting without storing changes). */
if( SCREENMAN->GetTopScreen()->GetScreenType() != system_menu )
if( SCREENMAN->AllowOperatorMenuButton() )
{
SCREENMAN->SystemMessage( SERVICE_SWITCH_PRESSED );
GAMESTATE->Reset();