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 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; }
|
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
|
static bool JoinInput( const MenuInput &MenuI ); // return true if a player joined
|
||||||
|
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ public:
|
|||||||
virtual void HandleScreenMessage( const ScreenMessage SM );
|
virtual void HandleScreenMessage( const ScreenMessage SM );
|
||||||
|
|
||||||
protected:
|
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 TransitionEditState( EditState em );
|
||||||
void ScrollTo( float fDestinationBeat );
|
void ScrollTo( float fDestinationBeat );
|
||||||
|
|||||||
@@ -283,6 +283,17 @@ Screen *ScreenManager::GetTopScreen()
|
|||||||
return g_ScreenStack[g_ScreenStack.size()-1].m_pScreen;
|
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
|
bool ScreenManager::IsStackedScreen( const Screen *pScreen ) const
|
||||||
{
|
{
|
||||||
/* True if the screen is in the screen stack, but not the first. */
|
/* True if the screen is in the screen stack, but not the first. */
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ public:
|
|||||||
void PopTopScreen( ScreenMessage SM );
|
void PopTopScreen( ScreenMessage SM );
|
||||||
void PopAllScreens();
|
void PopAllScreens();
|
||||||
Screen *GetTopScreen();
|
Screen *GetTopScreen();
|
||||||
|
bool AllowOperatorMenuButton() const;
|
||||||
|
|
||||||
// System messages
|
// System messages
|
||||||
void SystemMessage( const RString &sMessage );
|
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
|
/* 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
|
* do this if we're on a "system menu", which includes the editor
|
||||||
* (to prevent quitting without storing changes). */
|
* (to prevent quitting without storing changes). */
|
||||||
if( SCREENMAN->GetTopScreen()->GetScreenType() != system_menu )
|
if( SCREENMAN->AllowOperatorMenuButton() )
|
||||||
{
|
{
|
||||||
SCREENMAN->SystemMessage( SERVICE_SWITCH_PRESSED );
|
SCREENMAN->SystemMessage( SERVICE_SWITCH_PRESSED );
|
||||||
GAMESTATE->Reset();
|
GAMESTATE->Reset();
|
||||||
|
|||||||
Reference in New Issue
Block a user