LRESULT DesktopShellView::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) { switch(nmsg) { case WM_CONTEXTMENU: if (!DoContextMenu(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam))) DoDesktopContextMenu(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); break; case PM_SET_ICON_ALGORITHM: _icon_algo = wparam; PositionIcons(); break; case PM_GET_ICON_ALGORITHM: return _icon_algo; case PM_DISPLAY_VERSION: return SendMessage(_hwndListView, nmsg, wparam, lparam); default: return super::WndProc(nmsg, wparam, lparam); } return 0; }
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(); }