Add simple double-tap confirmation functionality to ScreenSelect menus.
This commit is contained in:
@@ -119,6 +119,7 @@ IdleCommentSeconds=12
|
|||||||
IdleTimeoutSeconds=30
|
IdleTimeoutSeconds=30
|
||||||
IdleTimeoutScreen=THEME:GetMetric("Common","FirstAttractScreen")
|
IdleTimeoutScreen=THEME:GetMetric("Common","FirstAttractScreen")
|
||||||
OutDelay=.2
|
OutDelay=.2
|
||||||
|
DoublePressToSelect=false
|
||||||
|
|
||||||
[ScreenExit]
|
[ScreenExit]
|
||||||
Class="ScreenExit"
|
Class="ScreenExit"
|
||||||
@@ -207,6 +208,7 @@ ExplanationPage2X=0
|
|||||||
ExplanationPage2Y=0
|
ExplanationPage2Y=0
|
||||||
HeaderOnCommand=
|
HeaderOnCommand=
|
||||||
HeaderOffCommand=
|
HeaderOffCommand=
|
||||||
|
DoublePressToSelect=false
|
||||||
|
|
||||||
[ScreenSelectPlayMode]
|
[ScreenSelectPlayMode]
|
||||||
Fallback="ScreenWithMenuElements"
|
Fallback="ScreenWithMenuElements"
|
||||||
@@ -263,6 +265,7 @@ ExplanationPage2X=0
|
|||||||
ExplanationPage2Y=0
|
ExplanationPage2Y=0
|
||||||
HeaderOnCommand=
|
HeaderOnCommand=
|
||||||
HeaderOffCommand=
|
HeaderOffCommand=
|
||||||
|
DoublePressToSelect=false
|
||||||
|
|
||||||
[ScreenSelectMode]
|
[ScreenSelectMode]
|
||||||
Fallback="ScreenSelect"
|
Fallback="ScreenSelect"
|
||||||
@@ -2649,6 +2652,8 @@ CursorP2OffsetXFromIcon=0
|
|||||||
CursorP2OffsetYFromIcon=0
|
CursorP2OffsetYFromIcon=0
|
||||||
DisabledColor=#606060
|
DisabledColor=#606060
|
||||||
|
|
||||||
|
DoublePressToSelect=false
|
||||||
|
|
||||||
# Blank defaults for a few options.
|
# Blank defaults for a few options.
|
||||||
IconChoice1SwitchToPage1Command=
|
IconChoice1SwitchToPage1Command=
|
||||||
IconChoice1SwitchToPage2Command=
|
IconChoice1SwitchToPage2Command=
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ ScreenSelectMaster::ScreenSelectMaster()
|
|||||||
{
|
{
|
||||||
ZERO( m_iChoice );
|
ZERO( m_iChoice );
|
||||||
ZERO( m_bChosen );
|
ZERO( m_bChosen );
|
||||||
|
ZERO( m_bDoubleChoice );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenSelectMaster::Init()
|
void ScreenSelectMaster::Init()
|
||||||
@@ -69,6 +70,7 @@ void ScreenSelectMaster::Init()
|
|||||||
SCROLLER_TRANSFORM.Load( m_sName, "ScrollerTransform" );
|
SCROLLER_TRANSFORM.Load( m_sName, "ScrollerTransform" );
|
||||||
SCROLLER_SUBDIVISIONS.Load( m_sName, "ScrollerSubdivisions" );
|
SCROLLER_SUBDIVISIONS.Load( m_sName, "ScrollerSubdivisions" );
|
||||||
DEFAULT_CHOICE.Load( m_sName, "DefaultChoice" );
|
DEFAULT_CHOICE.Load( m_sName, "DefaultChoice" );
|
||||||
|
DOUBLE_PRESS_TO_SELECT.Load(m_sName,"DoublePressToSelect");
|
||||||
|
|
||||||
ScreenSelect::Init();
|
ScreenSelect::Init();
|
||||||
|
|
||||||
@@ -253,6 +255,7 @@ void ScreenSelectMaster::BeginScreen()
|
|||||||
m_iChoice[p] = (iDefaultChoice!=-1) ? iDefaultChoice : 0;
|
m_iChoice[p] = (iDefaultChoice!=-1) ? iDefaultChoice : 0;
|
||||||
CLAMP( m_iChoice[p], 0, (int)m_aGameCommands.size()-1 );
|
CLAMP( m_iChoice[p], 0, (int)m_aGameCommands.size()-1 );
|
||||||
m_bChosen[p] = false;
|
m_bChosen[p] = false;
|
||||||
|
m_bDoubleChoice[p] = false;
|
||||||
}
|
}
|
||||||
if( !SHARED_SELECTION )
|
if( !SHARED_SELECTION )
|
||||||
{
|
{
|
||||||
@@ -396,6 +399,14 @@ void ScreenSelectMaster::MenuLeft( const InputEventPlus &input )
|
|||||||
m_soundChange.Play();
|
m_soundChange.Play();
|
||||||
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuLeftP1+pn) );
|
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuLeftP1+pn) );
|
||||||
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuSelectionChanged) );
|
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuSelectionChanged) );
|
||||||
|
|
||||||
|
// if they use double select
|
||||||
|
if(DOUBLE_PRESS_TO_SELECT)
|
||||||
|
{
|
||||||
|
m_bDoubleChoice[pn] = false; // player has cancelled their selection
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -419,6 +430,12 @@ void ScreenSelectMaster::MenuRight( const InputEventPlus &input )
|
|||||||
m_soundChange.Play();
|
m_soundChange.Play();
|
||||||
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuRightP1+pn) );
|
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuRightP1+pn) );
|
||||||
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuSelectionChanged) );
|
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuSelectionChanged) );
|
||||||
|
|
||||||
|
// if they use double select
|
||||||
|
if(DOUBLE_PRESS_TO_SELECT)
|
||||||
|
{
|
||||||
|
m_bDoubleChoice[pn] = false; // player has cancelled their selection
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,6 +459,14 @@ void ScreenSelectMaster::MenuUp( const InputEventPlus &input )
|
|||||||
m_soundChange.Play();
|
m_soundChange.Play();
|
||||||
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuUpP1+pn) );
|
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuUpP1+pn) );
|
||||||
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuSelectionChanged) );
|
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuSelectionChanged) );
|
||||||
|
|
||||||
|
// if they use double select
|
||||||
|
if(DOUBLE_PRESS_TO_SELECT)
|
||||||
|
{
|
||||||
|
m_bDoubleChoice[pn] = false; // player has cancelled their selection
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -465,6 +490,13 @@ void ScreenSelectMaster::MenuDown( const InputEventPlus &input )
|
|||||||
m_soundChange.Play();
|
m_soundChange.Play();
|
||||||
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuDownP1+pn) );
|
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuDownP1+pn) );
|
||||||
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuSelectionChanged) );
|
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuSelectionChanged) );
|
||||||
|
|
||||||
|
// if they use double select
|
||||||
|
if(DOUBLE_PRESS_TO_SELECT)
|
||||||
|
{
|
||||||
|
m_bDoubleChoice[pn] = false; // player has cancelled their selection
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -570,10 +602,34 @@ bool ScreenSelectMaster::ChangeSelection( PlayerNumber pn, MenuDir dir, int iNew
|
|||||||
bOldStillHasFocus |= m_iChoice[p2] == iOldChoice;
|
bOldStillHasFocus |= m_iChoice[p2] == iOldChoice;
|
||||||
bNewAlreadyHadFocus |= m_iChoice[p2] == iNewChoice;
|
bNewAlreadyHadFocus |= m_iChoice[p2] == iNewChoice;
|
||||||
}
|
}
|
||||||
if( !bOldStillHasFocus )
|
|
||||||
m_vsprIcon[iOldChoice]->PlayCommand( "LoseFocus" );
|
|
||||||
if( !bNewAlreadyHadFocus )
|
if(DOUBLE_PRESS_TO_SELECT)
|
||||||
m_vsprIcon[iNewChoice]->PlayCommand( "GainFocus" );
|
{
|
||||||
|
// this player is currently on a single press, which they are cancelling
|
||||||
|
if(m_bDoubleChoice[pn])
|
||||||
|
{
|
||||||
|
if( !bOldStillHasFocus )
|
||||||
|
m_vsprIcon[iOldChoice]->PlayCommand( "LoseFocus" );
|
||||||
|
if( !bNewAlreadyHadFocus )
|
||||||
|
m_vsprIcon[iNewChoice]->PlayCommand( "GainFocus" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( !bOldStillHasFocus )
|
||||||
|
m_vsprIcon[iOldChoice]->PlayCommand( "LoseFocus" );
|
||||||
|
if( !bNewAlreadyHadFocus )
|
||||||
|
m_vsprIcon[iNewChoice]->PlayCommand( "GainFocus" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // not using double selection
|
||||||
|
{
|
||||||
|
|
||||||
|
if( !bOldStillHasFocus )
|
||||||
|
m_vsprIcon[iOldChoice]->PlayCommand( "LostSelectedLoseFocus" );
|
||||||
|
if( !bNewAlreadyHadFocus )
|
||||||
|
m_vsprIcon[iNewChoice]->PlayCommand( "LostSelectedGainFocus" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( SHOW_CURSOR )
|
if( SHOW_CURSOR )
|
||||||
@@ -604,8 +660,26 @@ bool ScreenSelectMaster::ChangeSelection( PlayerNumber pn, MenuDir dir, int iNew
|
|||||||
|
|
||||||
scroller.SetDestinationItem( (float)iNewChoice );
|
scroller.SetDestinationItem( (float)iNewChoice );
|
||||||
|
|
||||||
vScroll[iOldChoice]->PlayCommand( "LoseFocus" );
|
// using double selections
|
||||||
vScroll[iNewChoice]->PlayCommand( "GainFocus" );
|
if(DOUBLE_PRESS_TO_SELECT)
|
||||||
|
{
|
||||||
|
// this player is currently on a single press, which they are cancelling
|
||||||
|
if(m_bDoubleChoice[pn])
|
||||||
|
{
|
||||||
|
vScroll[iOldChoice]->PlayCommand( "LostSelectedLoseFocus" );
|
||||||
|
vScroll[iNewChoice]->PlayCommand( "LostSelectedGainFocus" );
|
||||||
|
}
|
||||||
|
else // the player hasn't made any selections yet
|
||||||
|
{
|
||||||
|
vScroll[iOldChoice]->PlayCommand( "LoseFocus" );
|
||||||
|
vScroll[iNewChoice]->PlayCommand( "GainFocus" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // regular lose/gain focus
|
||||||
|
{
|
||||||
|
vScroll[iOldChoice]->PlayCommand( "LoseFocus" );
|
||||||
|
vScroll[iNewChoice]->PlayCommand( "GainFocus" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -680,6 +754,22 @@ void ScreenSelectMaster::MenuStart( const InputEventPlus &input )
|
|||||||
if( !ProcessMenuStart( pn ) )
|
if( !ProcessMenuStart( pn ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// double press is enabled and the player hasn't made their first press
|
||||||
|
if(DOUBLE_PRESS_TO_SELECT && !m_bDoubleChoice[pn])
|
||||||
|
{
|
||||||
|
m_soundStart.PlayCopy();
|
||||||
|
m_bDoubleChoice[pn] = true;
|
||||||
|
|
||||||
|
if(SHOW_SCROLLER)
|
||||||
|
{
|
||||||
|
vector<AutoActor> &vScroll = SHARED_SELECTION ? m_vsprScroll[0] : m_vsprScroll[pn];
|
||||||
|
vScroll[m_iChoice[pn]]->PlayCommand( "InitialSelection" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const GameCommand &mc = m_aGameCommands[m_iChoice[pn]];
|
const GameCommand &mc = m_aGameCommands[m_iChoice[pn]];
|
||||||
|
|
||||||
/* If no options are playable, then we're just waiting for one to become available.
|
/* If no options are playable, then we're just waiting for one to become available.
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ protected:
|
|||||||
Page GetPage( int iChoiceIndex ) const;
|
Page GetPage( int iChoiceIndex ) const;
|
||||||
Page GetCurrentPage() const;
|
Page GetCurrentPage() const;
|
||||||
|
|
||||||
|
ThemeMetric<bool> DOUBLE_PRESS_TO_SELECT;
|
||||||
ThemeMetric<bool> SHOW_ICON;
|
ThemeMetric<bool> SHOW_ICON;
|
||||||
ThemeMetric<bool> SHOW_SCROLLER;
|
ThemeMetric<bool> SHOW_SCROLLER;
|
||||||
ThemeMetric<bool> SHOW_CURSOR;
|
ThemeMetric<bool> SHOW_CURSOR;
|
||||||
@@ -98,6 +99,7 @@ protected:
|
|||||||
|
|
||||||
int m_iChoice[NUM_PLAYERS];
|
int m_iChoice[NUM_PLAYERS];
|
||||||
bool m_bChosen[NUM_PLAYERS];
|
bool m_bChosen[NUM_PLAYERS];
|
||||||
|
bool m_bDoubleChoice[NUM_PLAYERS];
|
||||||
|
|
||||||
GameButton m_TrackingRepeatingInput;
|
GameButton m_TrackingRepeatingInput;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user