void Screen::HandleScreenMessage( const ScreenMessage SM ) { switch( SM ) { case SM_MenuTimer: FOREACH_HumanPlayer(p) MenuStart( p ); break; case SM_GoToNextScreen: if( SCREENMAN->IsStackedScreen(this) ) SCREENMAN->PopTopScreen( SM_None ); else SCREENMAN->SetNewScreen( NEXT_SCREEN ); break; case SM_GoToPrevScreen: SCREENMAN->DeletePreparedScreens(); if( SCREENMAN->IsStackedScreen(this) ) SCREENMAN->PopTopScreen( SM_None ); else SCREENMAN->SetNewScreen( PREV_SCREEN ); break; } }
void OptionRow::Reload() { switch( GetRowType() ) { case OptionRow::ROW_NORMAL: { if( m_pHand == NULL ) return; vector<PlayerNumber> vpns; FOREACH_HumanPlayer( p ) vpns.push_back( p ); // TODO: Nothing uses this yet and it causes skips when changing options. //if( m_RowDef.m_bExportOnChange ) //{ // bool bRowHasFocus[NUM_PLAYERS]; // ZERO( bRowHasFocus ); // ExportOptions( vpns, bRowHasFocus ); //} m_pHand->Reload( m_RowDef ); ASSERT( !m_RowDef.choices.empty() ); FOREACH_PlayerNumber( p ) m_vbSelected[p].resize( m_RowDef.choices.size(), false ); // TODO: Nothing uses this yet and it causes skips when changing options. //ImportOptions( vpns ); switch( m_RowDef.selectType ) { case SELECT_ONE: FOREACH_HumanPlayer( p ) m_iChoiceInRowWithFocus[p] = GetOneSelection(p); break; case SELECT_MULTIPLE: FOREACH_HumanPlayer( p ) CLAMP( m_iChoiceInRowWithFocus[p], 0, m_RowDef.choices.size()-1 ); break; default: ASSERT(0); } // TODO: Nothing uses this yet and it causes skips when changing options. //if( m_RowDef.m_bExportOnChange ) //{ // bool bRowHasFocus[NUM_PLAYERS]; // ZERO( bRowHasFocus ); // ExportOptions( vpns, bRowHasFocus ); //} UpdateEnabledDisabled(); UpdateText(); FOREACH_HumanPlayer( p ) PositionUnderlines( p ); } break; case OptionRow::ROW_EXIT: // nothing to do break; default: ASSERT(0); } }
void OptionRow::UpdateEnabledDisabled() { /* COLOR_SELECTED, COLOR_NOT_SELECTED, COLOR_DISABLED, TWEEN_SECONDS */ bool bThisRowHasFocusByAny = false; FOREACH_HumanPlayer( p ) bThisRowHasFocusByAny |= m_bRowHasFocus[p]; bool bThisRowHasFocusByAll = true; FOREACH_HumanPlayer( p ) bThisRowHasFocusByAll &= m_bRowHasFocus[p]; bool bRowEnabled = !m_RowDef.m_vEnabledForPlayers.empty(); if( m_Frame.GetDestY() != m_fY ) { m_Frame.StopTweening(); m_Frame.BeginTweening( TWEEN_SECONDS ); m_Frame.SetY( m_fY ); } /* Don't tween selection colors at all. */ RageColor color; if( bThisRowHasFocusByAny ) color = COLOR_SELECTED; else if( bRowEnabled ) color = COLOR_NOT_SELECTED; else color = COLOR_DISABLED; if( m_bHidden ) color.a = 0; m_sprBullet.SetGlobalDiffuseColor( color ); m_textTitle.SetGlobalDiffuseColor( color ); switch( m_RowDef.layoutType ) { case LAYOUT_SHOW_ALL_IN_ROW: for( unsigned j=0; j<m_textItems.size(); j++ ) { if( m_textItems[j]->DestTweenState().diffuse[0] == color ) continue; m_textItems[j]->StopTweening(); m_textItems[j]->BeginTweening( TWEEN_SECONDS ); m_textItems[j]->SetDiffuse( color ); } break; case LAYOUT_SHOW_ONE_IN_ROW: FOREACH_HumanPlayer( pn ) { bool bRowEnabled = m_RowDef.m_vEnabledForPlayers.find(pn) != m_RowDef.m_vEnabledForPlayers.end(); if( m_bRowHasFocus[pn] ) color = COLOR_SELECTED; else if( bRowEnabled ) color = COLOR_NOT_SELECTED; else color = COLOR_DISABLED; if( m_bHidden ) color.a = 0; unsigned item_no = m_RowDef.bOneChoiceForAllPlayers ? 0 : pn; // If player_no is 2 and there is no player 1: item_no = min( item_no, m_textItems.size()-1 ); BitmapText &bt = *m_textItems[item_no]; if( bt.DestTweenState().diffuse[0] != color ) { bt.StopTweening(); bt.BeginTweening( TWEEN_SECONDS ); bt.SetDiffuse( color ); OptionsCursor &ul = *m_Underline[pn][0]; ul.StopTweening(); ul.BeginTweening( TWEEN_SECONDS ); ul.SetDiffuseAlpha( color.a ); } } break; default: ASSERT(0); } if( m_RowType == OptionRow::ROW_EXIT ) { if( bThisRowHasFocusByAll ) m_textItems[0]->SetEffectDiffuseShift( 1.0f, COLOR_SELECTED, COLOR_NOT_SELECTED ); else m_textItems[0]->SetEffectNone(); } if( m_sprBullet.DestTweenState().diffuse[0] != color ) { m_sprBullet.StopTweening(); m_textTitle.StopTweening(); m_sprBullet.BeginTweening( TWEEN_SECONDS ); m_textTitle.BeginTweening( TWEEN_SECONDS ); m_sprBullet.SetDiffuseAlpha( color.a ); m_textTitle.SetDiffuseAlpha( color.a ); } }
void ScreenOptions::PositionAllUnderlines() { for( unsigned r=0; r<m_Rows.size(); r++ ) FOREACH_HumanPlayer( p ) PositionUnderlines( r, p ); }
void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &vDefs, const vector<OptionRowHandler*> &vHands ) { LOG->Trace( "ScreenOptions::Set()" ); ASSERT( vDefs.size() == vHands.size() ); m_InputMode = im; for( unsigned r=0; r<vDefs.size(); r++ ) // foreach row { m_Rows.push_back( new OptionRow() ); OptionRow &row = *m_Rows.back(); const OptionRowDefinition &def = vDefs[r]; OptionRowHandler* hand = vHands[r]; bool bFirstRowGoesDown = m_OptionsNavigation==NAV_TOGGLE_THREE_KEY; row.LoadMetrics( m_sName ); row.LoadNormal( def, hand, bFirstRowGoesDown ); vector<PlayerNumber> vpns; FOREACH_HumanPlayer( p ) vpns.push_back( p ); this->ImportOptions( r, vpns ); CHECKPOINT_M( ssprintf("row %i: %s", r, row.GetRowDef().name.c_str()) ); row.AfterImportOptions(); } m_sprPage.Load( THEME->GetPathG(m_sName,"page") ); m_sprPage->SetName( "Page" ); SET_XY_AND_ON_COMMAND( m_sprPage ); m_framePage.AddChild( m_sprPage ); // init line line highlights FOREACH_HumanPlayer( p ) { m_sprLineHighlight[p].Load( THEME->GetPathG(m_sName,"line highlight") ); m_sprLineHighlight[p].SetName( "LineHighlight" ); m_sprLineHighlight[p].SetX( SCREEN_CENTER_X ); m_framePage.AddChild( &m_sprLineHighlight[p] ); ON_COMMAND( m_sprLineHighlight[p] ); } // init cursors FOREACH_HumanPlayer( p ) { m_Cursor[p].Load( m_sName, OptionsCursor::cursor ); m_Cursor[p].Set( p ); m_framePage.AddChild( &m_Cursor[p] ); } for( unsigned r=0; r<m_Rows.size(); r++ ) // foreach row { OptionRow &row = *m_Rows[r]; m_framePage.AddChild( &row ); } if( SHOW_EXIT_ROW ) { // TRICKY: Add "EXIT" item m_Rows.push_back( new OptionRow() ); OptionRow &row = *m_Rows.back(); row.LoadMetrics( m_sName ); row.LoadExit(); m_framePage.AddChild( &row ); } // add explanation here so it appears on top FOREACH_PlayerNumber( p ) { m_textExplanation[p].LoadFromFont( THEME->GetPathF(m_sName,"explanation") ); m_textExplanation[p].SetZoom( EXPLANATION_ZOOM ); m_textExplanation[p].SetShadowLength( 0 ); m_framePage.AddChild( &m_textExplanation[p] ); } if( SHOW_SCROLL_BAR ) { m_ScrollBar.SetName( "ScrollBar" ); m_ScrollBar.SetBarHeight( SCROLL_BAR_HEIGHT ); m_ScrollBar.SetBarTime( SCROLL_BAR_TIME ); FOREACH_PlayerNumber( p ) m_ScrollBar.EnablePlayer( p, GAMESTATE->IsHumanPlayer(p) ); m_ScrollBar.Load( "DualScrollBar" ); SET_XY( m_ScrollBar ); m_framePage.AddChild( &m_ScrollBar ); } m_sprMore.Load( THEME->GetPathG( m_sName,"more") ); m_sprMore->SetName( "More" ); SET_XY_AND_ON_COMMAND( m_sprMore ); COMMAND( m_sprMore, m_bMoreShown? "ShowMore":"HideMore" ); m_framePage.AddChild( m_sprMore ); switch( m_InputMode ) { case INPUTMODE_INDIVIDUAL: { FOREACH_PlayerNumber( p ) m_textExplanation[p].SetXY( EXPLANATION_X.GetValue(p), EXPLANATION_Y.GetValue(p) ); } break; case INPUTMODE_SHARE_CURSOR: m_textExplanation[0].SetXY( EXPLANATION_TOGETHER_X, EXPLANATION_TOGETHER_Y ); break; default: ASSERT(0); } FOREACH_PlayerNumber( p ) { m_sprDisqualify[p].Load( THEME->GetPathG(m_sName,"disqualify") ); m_sprDisqualify[p]->SetName( ssprintf("DisqualifyP%i",p+1) ); SET_XY_AND_ON_COMMAND( m_sprDisqualify[p] ); m_sprDisqualify[p]->SetHidden( true ); // unhide later if handicapping options are discovered m_framePage.AddChild( m_sprDisqualify[p] ); } // poke once at all the explanation metrics so that we catch missing ones early for( int r=0; r<(int)m_Rows.size(); r++ ) // foreach row { GetExplanationText( r ); } // put focus on the first enabled row FOREACH_PlayerNumber( p ) { for( unsigned r=0; r<m_Rows.size(); r++ ) { const OptionRow &row = *m_Rows[r]; if( row.GetRowDef().IsEnabledForPlayer(p) ) { m_iCurrentRow[p] = r; break; } } } // Hide highlight if no rows are enabled. FOREACH_HumanPlayer( p ) if( m_iCurrentRow[p] == -1 ) m_sprLineHighlight[p].SetHidden( true ); CHECKPOINT; PositionItems(); PositionAllUnderlines(); PositionIcons(); RefreshAllIcons(); PositionCursors(); UpdateEnabledDisabled(); FOREACH_PlayerNumber( p ) OnChange( p ); CHECKPOINT; /* It's tweening into position, but on the initial tween-in we only want to * tween in the whole page at once. Since the tweens are nontrivial, it's * easiest to queue the tweens and then force them to finish. */ for( int r=0; r<(int) m_Rows.size(); r++ ) // foreach options line { OptionRow &row = *m_Rows[r]; row.FinishTweening(); } m_sprMore->FinishTweening(); this->SortByDrawOrder(); }