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:
@@ -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
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -40,6 +40,7 @@ public:
|
||||
void PopTopScreen( ScreenMessage SM );
|
||||
void PopAllScreens();
|
||||
Screen *GetTopScreen();
|
||||
bool AllowOperatorMenuButton() const;
|
||||
|
||||
// System messages
|
||||
void SystemMessage( const RString &sMessage );
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user