fix Pop message doesn't get sent if more than 1 prompt screen on the stack
This commit is contained in:
@@ -11,6 +11,8 @@
|
||||
#include "ScreenMiniMenu.h"
|
||||
#include "ScreenManager.h"
|
||||
#include "PlayerState.h"
|
||||
#include "ScreenPlayerOptions.h" // for SM_BackFromPlayerOptions
|
||||
#include "ScreenSongOptions.h" // for SM_BackFromSongOptions
|
||||
|
||||
//
|
||||
// Defines specific to EditCoursesMenu
|
||||
@@ -33,8 +35,6 @@
|
||||
#define ROW_Y( i ) THEME->GetMetricF("EditCoursesMenu",ssprintf("Row%dY",i+1))
|
||||
|
||||
const ScreenMessage SM_BackFromCourseOptionsMenu = (ScreenMessage)(SM_User+1);
|
||||
const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+3);
|
||||
const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+4);
|
||||
|
||||
enum CourseEntryMenuRow
|
||||
{
|
||||
|
||||
@@ -160,14 +160,14 @@ void Screen::HandleScreenMessage( const ScreenMessage SM )
|
||||
break;
|
||||
case SM_GoToNextScreen:
|
||||
if( SCREENMAN->IsStackedScreen(this) )
|
||||
SCREENMAN->PopTopScreen();
|
||||
SCREENMAN->PopTopScreen( SM_None );
|
||||
else
|
||||
SCREENMAN->SetNewScreen( NEXT_SCREEN );
|
||||
break;
|
||||
case SM_GoToPrevScreen:
|
||||
SCREENMAN->DeletePreparedScreens();
|
||||
if( SCREENMAN->IsStackedScreen(this) )
|
||||
SCREENMAN->PopTopScreen();
|
||||
SCREENMAN->PopTopScreen( SM_None );
|
||||
else
|
||||
SCREENMAN->SetNewScreen( PREV_SCREEN );
|
||||
break;
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
#include "ActorUtil.h"
|
||||
#include "ScreenPrompt.h"
|
||||
#include "CommonMetrics.h"
|
||||
#include "ScreenPlayerOptions.h" // for SM_BackFromPlayerOptions
|
||||
#include "ScreenSongOptions.h" // for SM_BackFromSongOptions
|
||||
|
||||
//
|
||||
// Defines specific to ScreenEdit
|
||||
@@ -51,8 +53,6 @@ const ScreenMessage SM_BackFromStepsInformation = (ScreenMessage)(SM_User+3);
|
||||
const ScreenMessage SM_BackFromEditOptions = (ScreenMessage)(SM_User+4);
|
||||
const ScreenMessage SM_BackFromSongInformation = (ScreenMessage)(SM_User+5);
|
||||
const ScreenMessage SM_BackFromBGChange = (ScreenMessage)(SM_User+6);
|
||||
const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+7);
|
||||
const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+8);
|
||||
const ScreenMessage SM_BackFromInsertAttack = (ScreenMessage)(SM_User+9);
|
||||
const ScreenMessage SM_BackFromInsertAttackModifiers= (ScreenMessage)(SM_User+10);
|
||||
const ScreenMessage SM_BackFromPrefs = (ScreenMessage)(SM_User+11);
|
||||
@@ -1520,7 +1520,9 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
|
||||
int iDurationChoice = ScreenMiniMenu::s_viLastAnswers[0];
|
||||
g_fLastInsertAttackDurationSeconds = strtof( g_InsertAttack.rows[0].choices[iDurationChoice], NULL );
|
||||
GAMESTATE->StoreSelectedOptions(); // save so that we don't lose the options chosen for edit and playback
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertAttackModifiers );
|
||||
|
||||
// XXX: Fix me
|
||||
//SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertAttackModifiers );
|
||||
}
|
||||
break;
|
||||
case SM_BackFromInsertAttackModifiers:
|
||||
@@ -1755,7 +1757,7 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector<int> &iAns
|
||||
case save_on_exit: s = "ScreenMemcardSaveEditsAfterExit"; break;
|
||||
default: ASSERT(0);
|
||||
}
|
||||
SCREENMAN->AddNewScreenToTop( s, SM_None );
|
||||
SCREENMAN->AddNewScreenToTop( s );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1785,10 +1787,10 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector<int> &iAns
|
||||
PROMPT_YES_NO, ANSWER_NO );
|
||||
break;
|
||||
case player_options:
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromPlayerOptions );
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions" );
|
||||
break;
|
||||
case song_options:
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenSongOptions", SM_BackFromSongOptions );
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenSongOptions" );
|
||||
break;
|
||||
case edit_song_info:
|
||||
{
|
||||
|
||||
@@ -217,7 +217,7 @@ void ScreenEditMenu::MenuStart( PlayerNumber pn )
|
||||
ASSERT( pSteps );
|
||||
if( HOME_EDIT_MODE )
|
||||
{
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenEditMenuDeleteSteps", SM_None );
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenEditMenuDeleteSteps" );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -55,8 +55,6 @@ ScreenManager::ScreenManager()
|
||||
{
|
||||
m_pSharedBGA = new Actor;
|
||||
|
||||
m_MessageSendOnPop = SM_None;
|
||||
|
||||
m_bZeroNextUpdate = false;
|
||||
|
||||
/* By the time this is constructed, THEME has already been set up and set to
|
||||
@@ -463,7 +461,7 @@ retry:
|
||||
SetFromNewScreen( pNewScreen, false );
|
||||
}
|
||||
|
||||
void ScreenManager::AddNewScreenToTop( const CString &sScreenName, ScreenMessage messageSendOnPop )
|
||||
void ScreenManager::AddNewScreenToTop( const CString &sScreenName )
|
||||
{
|
||||
m_bZeroNextUpdate = true;
|
||||
|
||||
@@ -474,29 +472,26 @@ void ScreenManager::AddNewScreenToTop( const CString &sScreenName, ScreenMessage
|
||||
|
||||
Screen* pNewScreen = MakeNewScreen(sScreenName);
|
||||
SetFromNewScreen( pNewScreen, true );
|
||||
m_MessageSendOnPop = messageSendOnPop;
|
||||
}
|
||||
|
||||
#include "ScreenPrompt.h"
|
||||
#include "ScreenTextEntry.h"
|
||||
#include "ScreenMiniMenu.h"
|
||||
|
||||
void ScreenManager::Prompt( ScreenMessage SM_SendWhenDone, const CString &sText, PromptType type, PromptAnswer defaultAnswer, void(*OnYes)(void*), void(*OnNo)(void*), void* pCallbackData )
|
||||
void ScreenManager::Prompt( ScreenMessage smSendOnPop, const CString &sText, PromptType type, PromptAnswer defaultAnswer, void(*OnYes)(void*), void(*OnNo)(void*), void* pCallbackData )
|
||||
{
|
||||
if( m_ScreenStack.size() )
|
||||
m_ScreenStack.back()->HandleScreenMessage( SM_LoseFocus );
|
||||
|
||||
// add the new state onto the back of the array
|
||||
Screen *pNewScreen = new ScreenPrompt( sText, type, defaultAnswer, OnYes, OnNo, pCallbackData);
|
||||
Screen *pNewScreen = new ScreenPrompt( smSendOnPop, sText, type, defaultAnswer, OnYes, OnNo, pCallbackData);
|
||||
pNewScreen->Init();
|
||||
this->ZeroNextUpdate();
|
||||
SetFromNewScreen( pNewScreen, true );
|
||||
|
||||
m_MessageSendOnPop = SM_SendWhenDone;
|
||||
}
|
||||
|
||||
void ScreenManager::TextEntry(
|
||||
ScreenMessage SM_SendWhenDone,
|
||||
ScreenMessage smSendOnPop,
|
||||
CString sQuestion,
|
||||
CString sInitialAnswer,
|
||||
int iMaxInputLength,
|
||||
@@ -512,6 +507,7 @@ void ScreenManager::TextEntry(
|
||||
// add the new state onto the back of the array
|
||||
Screen *pNewScreen = new ScreenTextEntry(
|
||||
"ScreenTextEntry",
|
||||
smSendOnPop,
|
||||
sQuestion,
|
||||
sInitialAnswer,
|
||||
iMaxInputLength,
|
||||
@@ -522,8 +518,6 @@ void ScreenManager::TextEntry(
|
||||
pNewScreen->Init();
|
||||
this->ZeroNextUpdate();
|
||||
SetFromNewScreen( pNewScreen, true );
|
||||
|
||||
m_MessageSendOnPop = SM_SendWhenDone;
|
||||
}
|
||||
|
||||
void ScreenManager::MiniMenu( Menu* pDef, ScreenMessage SM_SendOnOK, ScreenMessage SM_SendOnCancel )
|
||||
@@ -549,14 +543,9 @@ void ScreenManager::PopTopScreen( ScreenMessage SM )
|
||||
|
||||
/* Post to the new top. This must be done now; otherwise, we'll have a single
|
||||
* frame between popping and these messages, which can result in a frame where eg.
|
||||
* input is accepted where it shouldn't be. Watch out; sending m_MessageSendOnPop
|
||||
* might push another screen (eg. editor menu -> PlayerOptions), which will set
|
||||
* a new m_MessageSendOnPop. */
|
||||
ScreenMessage MessageToSend = m_MessageSendOnPop;
|
||||
m_MessageSendOnPop = SM_None;
|
||||
* input is accepted where it shouldn't be. */
|
||||
SendMessageToTopScreen( SM );
|
||||
SendMessageToTopScreen( SM_GainFocus );
|
||||
SendMessageToTopScreen( MessageToSend );
|
||||
}
|
||||
|
||||
void ScreenManager::PostMessageToTopScreen( ScreenMessage SM, float fDelay )
|
||||
|
||||
@@ -55,10 +55,10 @@ public:
|
||||
void DeletePreparedScreens();
|
||||
|
||||
void SetNewScreen( const CString &sName );
|
||||
void AddNewScreenToTop( const CString &sName, ScreenMessage messageSendOnPop );
|
||||
void Prompt( ScreenMessage SM_SendWhenDone, const CString &sText, PromptType type = PROMPT_OK, PromptAnswer defaultAnswer = ANSWER_NO, void(*OnYes)(void*) = NULL, void(*OnNo)(void*) = NULL, void* pCallbackData = NULL );
|
||||
void AddNewScreenToTop( const CString &sName );
|
||||
void Prompt( ScreenMessage smSendOnPop, const CString &sText, PromptType type = PROMPT_OK, PromptAnswer defaultAnswer = ANSWER_NO, void(*OnYes)(void*) = NULL, void(*OnNo)(void*) = NULL, void* pCallbackData = NULL );
|
||||
void TextEntry(
|
||||
ScreenMessage SM_SendWhenDone,
|
||||
ScreenMessage smSendOnPop,
|
||||
CString sQuestion,
|
||||
CString sInitialAnswer,
|
||||
int iMaxInputLength,
|
||||
@@ -67,12 +67,12 @@ public:
|
||||
void(*OnCanel)() = NULL,
|
||||
bool bPassword = false
|
||||
);
|
||||
void Password( ScreenMessage SM_SendWhenDone, const CString &sQuestion, void(*OnOK)(CString sPassword) = NULL, void(*OnCanel)() = NULL )
|
||||
void Password( ScreenMessage smSendOnPop, const CString &sQuestion, void(*OnOK)(CString sPassword) = NULL, void(*OnCanel)() = NULL )
|
||||
{
|
||||
TextEntry( SM_SendWhenDone, sQuestion, "", 255, NULL, OnOK, OnCanel, true );
|
||||
TextEntry( smSendOnPop, sQuestion, "", 255, NULL, OnOK, OnCanel, true );
|
||||
}
|
||||
void MiniMenu( Menu* pDef, ScreenMessage SM_SendOnOK, ScreenMessage SM_SendOnCancel = SM_None );
|
||||
void PopTopScreen( ScreenMessage SM = SM_None );
|
||||
void MiniMenu( Menu* pDef, ScreenMessage smSendOnOK, ScreenMessage smSendOnCancel = SM_None );
|
||||
void PopTopScreen( ScreenMessage SM );
|
||||
void SystemMessage( const CString &sMessage );
|
||||
void SystemMessageNoAnimate( const CString &sMessage );
|
||||
|
||||
@@ -108,7 +108,6 @@ private:
|
||||
CString m_sLastLoadedBackgroundPath;
|
||||
CString m_sDelayedScreen;
|
||||
CString m_sSystemMessage;
|
||||
ScreenMessage m_MessageSendOnPop;
|
||||
vector<Screen*> m_vPreparedScreens;
|
||||
vector<Screen*> m_vScreensToDelete;
|
||||
|
||||
|
||||
@@ -20,10 +20,10 @@
|
||||
#include "MusicWheel.h"
|
||||
#include "InputMapper.h"
|
||||
#include "RageLog.h"
|
||||
#include "ScreenPlayerOptions.h" // for SM_BackFromPlayerOptions
|
||||
|
||||
const ScreenMessage SM_NoSongs = ScreenMessage(SM_User+3);
|
||||
const ScreenMessage SM_ChangeSong = ScreenMessage(SM_User+5);
|
||||
const ScreenMessage SM_BackFromOpts = ScreenMessage(SM_User+6);
|
||||
const ScreenMessage SM_SMOnlinePack = ScreenMessage(SM_User+8); //Unused, but should be known
|
||||
const ScreenMessage SM_SetWheelSong = ScreenMessage(SM_User+19);
|
||||
const ScreenMessage SM_RefreshWheelLocation = ScreenMessage(SM_User+20);
|
||||
@@ -257,7 +257,7 @@ void ScreenNetSelectMusic::HandleScreenMessage( const ScreenMessage SM )
|
||||
m_MusicWheel.Select();
|
||||
m_bAllowInput = true;
|
||||
break;
|
||||
case SM_BackFromOpts:
|
||||
case SM_BackFromPlayerOptions:
|
||||
//XXX: HACK: This will causes ScreenSelectOptions to go back here.
|
||||
NSMAN->ReportNSSOnOff(1);
|
||||
GAMESTATE->m_bEditing = false;
|
||||
@@ -328,7 +328,7 @@ void ScreenNetSelectMusic::MenuUp( PlayerNumber pn, const InputEventType type )
|
||||
{
|
||||
NSMAN->ReportNSSOnOff(3);
|
||||
GAMESTATE->m_bEditing = true;
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromOpts );
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions" );
|
||||
}
|
||||
|
||||
void ScreenNetSelectMusic::MenuDown( PlayerNumber pn, const InputEventType type )
|
||||
|
||||
@@ -145,7 +145,7 @@ void ScreenOptionsMaster::BeginFadingOut()
|
||||
void ScreenOptionsMaster::GoToNextScreen()
|
||||
{
|
||||
if( GAMESTATE->m_bEditing )
|
||||
SCREENMAN->PopTopScreen();
|
||||
SCREENMAN->PopTopScreen( SM_None );
|
||||
else if( m_sExportedNextScreen != "" )
|
||||
SCREENMAN->SetNewScreen( m_sExportedNextScreen );
|
||||
else if( NEXT_SCREEN != "" )
|
||||
@@ -157,7 +157,7 @@ void ScreenOptionsMaster::GoToPrevScreen()
|
||||
/* XXX: A better way to handle this would be to check if we're a pushed screen. */
|
||||
if( GAMESTATE->m_bEditing )
|
||||
{
|
||||
SCREENMAN->PopTopScreen();
|
||||
SCREENMAN->PopTopScreen( SM_None );
|
||||
// XXX: handle different destinations based on play mode?
|
||||
}
|
||||
else
|
||||
|
||||
@@ -79,7 +79,7 @@ void ScreenPlayerOptions::GoToPrevScreen()
|
||||
{
|
||||
if( GAMESTATE->m_bEditing )
|
||||
{
|
||||
SCREENMAN->PopTopScreen();
|
||||
SCREENMAN->PopTopScreen( SM_BackFromPlayerOptions );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -91,7 +91,9 @@ void ScreenPlayerOptions::GoToPrevScreen()
|
||||
void ScreenPlayerOptions::GoToNextScreen()
|
||||
{
|
||||
if( GAMESTATE->m_bEditing )
|
||||
SCREENMAN->PopTopScreen();
|
||||
{
|
||||
SCREENMAN->PopTopScreen( SM_BackFromPlayerOptions );
|
||||
}
|
||||
else
|
||||
{
|
||||
GAMESTATE->AdjustFailType();
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
#include "ScreenOptionsMaster.h"
|
||||
|
||||
const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+3);
|
||||
|
||||
class ScreenPlayerOptions : public ScreenOptionsMaster
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -17,6 +17,7 @@ bool ScreenPrompt::s_bCancelledLast = false;
|
||||
|
||||
//REGISTER_SCREEN_CLASS( ScreenPrompt );
|
||||
ScreenPrompt::ScreenPrompt(
|
||||
ScreenMessage smSendOnPop,
|
||||
CString sText,
|
||||
PromptType type,
|
||||
PromptAnswer defaultAnswer,
|
||||
@@ -28,13 +29,14 @@ ScreenPrompt::ScreenPrompt(
|
||||
{
|
||||
m_bIsTransparent = true; // draw screens below us
|
||||
|
||||
m_smSendOnPop = smSendOnPop;
|
||||
m_sText = sText;
|
||||
m_PromptType = type;
|
||||
m_Answer = defaultAnswer;
|
||||
CLAMP( (int&)m_Answer, 0, m_PromptType );
|
||||
m_pOnYes = OnYes;
|
||||
m_pOnNo = OnNo;
|
||||
m_pCallbackData = pCallbackData;
|
||||
m_sText = sText;
|
||||
}
|
||||
|
||||
void ScreenPrompt::Init()
|
||||
@@ -128,7 +130,7 @@ void ScreenPrompt::HandleScreenMessage( const ScreenMessage SM )
|
||||
case SM_DoneOpeningWipingLeft:
|
||||
break;
|
||||
case SM_DoneOpeningWipingRight:
|
||||
SCREENMAN->PopTopScreen();
|
||||
SCREENMAN->PopTopScreen( m_smSendOnPop );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ public:
|
||||
ScreenPrompt( CString sName );
|
||||
virtual void Init();
|
||||
ScreenPrompt(
|
||||
ScreenMessage smSendOnPop,
|
||||
CString sText,
|
||||
PromptType type = PROMPT_OK,
|
||||
PromptAnswer defaultAnswer = ANSWER_NO,
|
||||
@@ -67,7 +68,7 @@ protected:
|
||||
BitmapText m_textAnswer[NUM_PROMPT_ANSWERS];
|
||||
PromptType m_PromptType;
|
||||
PromptAnswer m_Answer;
|
||||
ScreenMessage m_SMSendWhenDone; // don't send on ANSWER_CANCEL
|
||||
ScreenMessage m_smSendOnPop; // don't send on ANSWER_CANCEL
|
||||
void(*m_pOnYes)(void*);
|
||||
void(*m_pOnNo)(void*);
|
||||
void* m_pCallbackData;
|
||||
|
||||
@@ -40,7 +40,7 @@ void ScreenSongOptions::GoToPrevScreen()
|
||||
{
|
||||
if( GAMESTATE->m_bEditing )
|
||||
{
|
||||
SCREENMAN->PopTopScreen( SM_None );
|
||||
SCREENMAN->PopTopScreen( SM_BackFromSongOptions );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -52,7 +52,7 @@ void ScreenSongOptions::GoToPrevScreen()
|
||||
void ScreenSongOptions::GoToNextScreen()
|
||||
{
|
||||
if( GAMESTATE->m_bEditing )
|
||||
SCREENMAN->PopTopScreen();
|
||||
SCREENMAN->PopTopScreen( SM_BackFromSongOptions );
|
||||
else
|
||||
SCREENMAN->SetNewScreen( NEXT_SCREEN );
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
#include "ScreenOptionsMaster.h"
|
||||
|
||||
const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+4);
|
||||
|
||||
class ScreenSongOptions : public ScreenOptionsMaster
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -45,7 +45,7 @@ void ScreenSplash::HandleScreenMessage( const ScreenMessage SM )
|
||||
break;
|
||||
case SM_GoToNextScreen:
|
||||
if( SCREENMAN->IsStackedScreen(SCREENMAN->GetTopScreen()) )
|
||||
SCREENMAN->PopTopScreen();
|
||||
SCREENMAN->PopTopScreen( SM_None );
|
||||
else
|
||||
SCREENMAN->SetNewScreen( NEXT_SCREEN );
|
||||
break;
|
||||
|
||||
@@ -48,6 +48,7 @@ bool ScreenTextEntry::s_bCancelledLast = false;
|
||||
|
||||
ScreenTextEntry::ScreenTextEntry(
|
||||
CString sClassName,
|
||||
ScreenMessage smSendOnPop,
|
||||
CString sQuestion,
|
||||
CString sInitialAnswer,
|
||||
int iMaxInputLength,
|
||||
@@ -59,6 +60,7 @@ ScreenTextEntry::ScreenTextEntry(
|
||||
{
|
||||
m_bIsTransparent = true; // draw screens below us
|
||||
|
||||
m_smSendOnPop = smSendOnPop;
|
||||
m_sQuestion = sQuestion;
|
||||
m_sAnswer = CStringToWstring( sInitialAnswer );
|
||||
m_iMaxInputLength = iMaxInputLength;
|
||||
@@ -200,7 +202,7 @@ void ScreenTextEntry::HandleScreenMessage( const ScreenMessage SM )
|
||||
case SM_DoneOpeningWipingLeft:
|
||||
break;
|
||||
case SM_DoneOpeningWipingRight:
|
||||
SCREENMAN->PopTopScreen();
|
||||
SCREENMAN->PopTopScreen( m_smSendOnPop );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ class ScreenTextEntry : public Screen
|
||||
public:
|
||||
ScreenTextEntry(
|
||||
CString sName,
|
||||
ScreenMessage smSendOnPop,
|
||||
CString sQuestion,
|
||||
CString sInitialAnswer,
|
||||
int iMaxInputLength,
|
||||
@@ -66,6 +67,7 @@ protected:
|
||||
void UpdateKeyboardText();
|
||||
void UpdateAnswerText();
|
||||
|
||||
ScreenMessage m_smSendOnPop;
|
||||
CString m_sQuestion;
|
||||
int m_iMaxInputLength;
|
||||
bool m_bPassword;
|
||||
|
||||
Reference in New Issue
Block a user