fix Pop message doesn't get sent if more than 1 prompt screen on the stack

This commit is contained in:
Chris Danford
2005-03-23 06:46:24 +00:00
parent 7c6ed89975
commit 659def4479
17 changed files with 53 additions and 50 deletions
+2 -2
View File
@@ -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
{
+2 -2
View File
@@ -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;
+8 -6
View File
@@ -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:
{
+1 -1
View File
@@ -217,7 +217,7 @@ void ScreenEditMenu::MenuStart( PlayerNumber pn )
ASSERT( pSteps );
if( HOME_EDIT_MODE )
{
SCREENMAN->AddNewScreenToTop( "ScreenEditMenuDeleteSteps", SM_None );
SCREENMAN->AddNewScreenToTop( "ScreenEditMenuDeleteSteps" );
}
else
{
+6 -17
View File
@@ -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 )
+7 -8
View File
@@ -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;
+3 -3
View File
@@ -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 )
+2 -2
View File
@@ -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
+4 -2
View File
@@ -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();
+2
View File
@@ -3,6 +3,8 @@
#include "ScreenOptionsMaster.h"
const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+3);
class ScreenPlayerOptions : public ScreenOptionsMaster
{
public:
+4 -2
View File
@@ -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;
}
}
+2 -1
View File
@@ -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;
+2 -2
View File
@@ -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 );
}
+2
View File
@@ -3,6 +3,8 @@
#include "ScreenOptionsMaster.h"
const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+4);
class ScreenSongOptions : public ScreenOptionsMaster
{
public:
+1 -1
View File
@@ -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;
+3 -1
View File
@@ -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;
}
}
+2
View File
@@ -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;