instead of loading actors inside OptionRow, load a single copy of each
one we need, and then make copies as needed. This avoids lots of extra loading (which can be slow, even with refcounted data; lots of path lookups, etc). (Trying to get this to the point where we can construct new OptionRows for a menu without making a whole new menu.) This approach means we don't lose the potential to have different sTypes of OptionRow in a single menu. (The annoying bit is that any actor we copy has to handle copying, which is tricky for ActorFrame and doesn't work yet for AutoActor. Working on it ...)
This commit is contained in:
+69
-54
@@ -58,17 +58,16 @@ CString OptionRow::OptionTitle( CString s ) const
|
||||
CString ITEMS_LONG_ROW_X_NAME( size_t p ) { return ssprintf("ItemsLongRowP%dX",int(p+1)); }
|
||||
CString ICONS_X_NAME( size_t p ) { return ssprintf("IconsP%dX",int(p+1)); }
|
||||
|
||||
OptionRow::OptionRow()
|
||||
OptionRow::OptionRow( const OptionRowType *pSource )
|
||||
{
|
||||
m_pActors = pSource;
|
||||
m_pHand = NULL;
|
||||
|
||||
Clear();
|
||||
m_sprBullet = NULL;
|
||||
m_textTitle = NULL;
|
||||
ZERO( m_OptionIcons );
|
||||
|
||||
FOREACH_PlayerNumber( p )
|
||||
m_Frame.AddChild( &m_OptionIcons[p] );
|
||||
m_Frame.AddChild( &m_sprBullet );
|
||||
m_Frame.AddChild( &m_textTitle );
|
||||
m_Frame.AddChild( &m_ItemFrame );
|
||||
Clear();
|
||||
|
||||
this->AddChild( &m_Frame );
|
||||
}
|
||||
@@ -85,7 +84,7 @@ void OptionRow::Clear()
|
||||
FOREACH_PlayerNumber( p )
|
||||
m_vbSelected[p].clear();
|
||||
|
||||
m_ItemFrame.DeleteAllChildren();
|
||||
m_Frame.DeleteAllChildren();
|
||||
m_textItems.clear();
|
||||
FOREACH_PlayerNumber( p )
|
||||
m_Underline[p].clear();
|
||||
@@ -107,9 +106,17 @@ void OptionRow::DetachHandler()
|
||||
m_pHand = NULL;
|
||||
}
|
||||
|
||||
void OptionRowType::Load( const CString &sType )
|
||||
{
|
||||
m_textItemParent.LoadFromFont( THEME->GetPathF(sType,"item") );
|
||||
m_UnderlineParent.Load( sType, OptionsCursor::underline );
|
||||
m_textTitle.LoadFromFont( THEME->GetPathF(sType,"title") );
|
||||
m_sprBullet.Load( THEME->GetPathG(sType,"bullet") );
|
||||
m_OptionIcon.Load( sType );
|
||||
}
|
||||
|
||||
void OptionRow::LoadMetrics( const CString &sType )
|
||||
{
|
||||
m_sType = sType;
|
||||
ARROWS_X .Load(sType,"ArrowsX");
|
||||
LABELS_X .Load(sType,"LabelsX");
|
||||
LABELS_ON_COMMAND .Load(sType,"LabelsOnCommand");
|
||||
@@ -133,17 +140,6 @@ void OptionRow::LoadMetrics( const CString &sType )
|
||||
THEME_ITEMS .Load(sType,"ThemeItems");
|
||||
THEME_TITLES .Load(sType,"ThemeTitles");
|
||||
SHOW_BPM_IN_SPEED_TITLE .Load(sType,"ShowBpmInSpeedTitle");
|
||||
|
||||
FOREACH_PlayerNumber( p )
|
||||
{
|
||||
m_OptionIcons[p].Load( m_sType );
|
||||
m_OptionIcons[p].RunCommands( ICONS_ON_COMMAND );
|
||||
}
|
||||
|
||||
m_textItemParent.LoadFromFont( THEME->GetPathF(m_sType,"item") );
|
||||
m_UnderlineParent.Load( m_sType, OptionsCursor::underline );
|
||||
m_textTitle.LoadFromFont( THEME->GetPathF(m_sType,"title") );
|
||||
m_sprBullet.Load( THEME->GetPathG(m_sType,"bullet") );
|
||||
}
|
||||
|
||||
void OptionRow::LoadNormal( const OptionRowDefinition &def, OptionRowHandler *pHand, bool bFirstItemGoesDown )
|
||||
@@ -233,14 +229,38 @@ void OptionRow::InitText()
|
||||
{
|
||||
/* If we have elements already, we're being updated from a new set of options.
|
||||
* Delete the old ones. */
|
||||
m_ItemFrame.DeleteAllChildren();
|
||||
m_Frame.DeleteAllChildren();
|
||||
m_textItems.clear();
|
||||
FOREACH_PlayerNumber( p )
|
||||
m_Underline[p].clear();
|
||||
|
||||
m_textTitle = new BitmapText( m_pActors->m_textTitle );
|
||||
m_Frame.AddChild( m_textTitle );
|
||||
|
||||
m_sprBullet = new Sprite( m_pActors->m_sprBullet );
|
||||
m_sprBullet->SetDrawOrder(-1); // under title
|
||||
m_Frame.AddChild( m_sprBullet );
|
||||
|
||||
switch( m_RowType )
|
||||
{
|
||||
case ROW_NORMAL:
|
||||
FOREACH_PlayerNumber( p )
|
||||
{
|
||||
m_OptionIcons[p] = new OptionIcon( m_pActors->m_OptionIcon );
|
||||
m_OptionIcons[p]->SetDrawOrder(-1); // under title
|
||||
m_OptionIcons[p]->RunCommands( ICONS_ON_COMMAND );
|
||||
|
||||
m_Frame.AddChild( m_OptionIcons[p] );
|
||||
SetOptionIcon( p, "" );
|
||||
}
|
||||
break;
|
||||
case ROW_EXIT:
|
||||
break;
|
||||
}
|
||||
|
||||
// If the items will go off the edge of the screen, then re-init with the "long row" style.
|
||||
{
|
||||
BitmapText bt( m_textItemParent );
|
||||
BitmapText bt( m_pActors->m_textItemParent );
|
||||
bt.RunCommands( ITEMS_ON_COMMAND );
|
||||
|
||||
float fX = ITEMS_START_X;
|
||||
@@ -273,7 +293,7 @@ void OptionRow::InitText()
|
||||
// init text
|
||||
FOREACH_HumanPlayer( p )
|
||||
{
|
||||
BitmapText *bt = new BitmapText( m_textItemParent );
|
||||
BitmapText *bt = new BitmapText( m_pActors->m_textItemParent );
|
||||
m_textItems.push_back( bt );
|
||||
|
||||
bt->RunCommands( ITEMS_ON_COMMAND );
|
||||
@@ -293,7 +313,7 @@ void OptionRow::InitText()
|
||||
// init underlines
|
||||
FOREACH_HumanPlayer( p )
|
||||
{
|
||||
OptionsCursor *ul = new OptionsCursor( m_UnderlineParent );
|
||||
OptionsCursor *ul = new OptionsCursor( m_pActors->m_UnderlineParent );
|
||||
m_Underline[p].push_back( ul );
|
||||
|
||||
ul->Set( p );
|
||||
@@ -312,7 +332,7 @@ void OptionRow::InitText()
|
||||
for( unsigned c=0; c<m_RowDef.m_vsChoices.size(); c++ )
|
||||
{
|
||||
// init text
|
||||
BitmapText *bt = new BitmapText( m_textItemParent );
|
||||
BitmapText *bt = new BitmapText( m_pActors->m_textItemParent );
|
||||
m_textItems.push_back( bt );
|
||||
CString sText = m_RowDef.m_vsChoices[c];
|
||||
PrepareItemText( sText );
|
||||
@@ -328,7 +348,7 @@ void OptionRow::InitText()
|
||||
// init underlines
|
||||
FOREACH_HumanPlayer( p )
|
||||
{
|
||||
OptionsCursor *ul = new OptionsCursor( m_UnderlineParent );
|
||||
OptionsCursor *ul = new OptionsCursor( m_pActors->m_UnderlineParent );
|
||||
m_Underline[p].push_back( ul );
|
||||
ul->Set( p );
|
||||
ul->SetX( fX );
|
||||
@@ -345,22 +365,24 @@ void OptionRow::InitText()
|
||||
}
|
||||
|
||||
for( unsigned c=0; c<m_textItems.size(); c++ )
|
||||
m_ItemFrame.AddChild( m_textItems[c] );
|
||||
m_Frame.AddChild( m_textItems[c] );
|
||||
FOREACH_PlayerNumber( p )
|
||||
for( unsigned c=0; c<m_Underline[p].size(); c++ )
|
||||
m_ItemFrame.AddChild( m_Underline[p][c] );
|
||||
m_Frame.AddChild( m_Underline[p][c] );
|
||||
m_Frame.SortByDrawOrder();
|
||||
|
||||
switch( GetRowType() )
|
||||
{
|
||||
case OptionRow::ROW_NORMAL:
|
||||
m_textTitle.SetText( GetRowTitle() );
|
||||
m_textTitle.SetX( LABELS_X );
|
||||
m_textTitle.RunCommands( LABELS_ON_COMMAND );
|
||||
m_sprBullet.SetX( ARROWS_X );
|
||||
m_textTitle->SetText( GetRowTitle() );
|
||||
m_textTitle->SetX( LABELS_X );
|
||||
m_textTitle->RunCommands( LABELS_ON_COMMAND );
|
||||
|
||||
m_sprBullet->SetX( ARROWS_X );
|
||||
break;
|
||||
case OptionRow::ROW_EXIT:
|
||||
m_textTitle.SetHidden( true );
|
||||
m_sprBullet.SetHidden( true );
|
||||
m_textTitle->SetHidden( true );
|
||||
m_sprBullet->SetHidden( true );
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -409,10 +431,6 @@ void OptionRow::AfterImportOptions()
|
||||
}
|
||||
}
|
||||
|
||||
// init row icons
|
||||
FOREACH_HumanPlayer( p )
|
||||
SetOptionIcon( p, "" );
|
||||
|
||||
//
|
||||
// HACK: Set focus to one item in the row, which is "go down"
|
||||
//
|
||||
@@ -437,9 +455,6 @@ void OptionRow::LoadExit()
|
||||
vbSelected.resize( m_RowDef.m_vsChoices.size(), false );
|
||||
vbSelected[0] = true;
|
||||
}
|
||||
|
||||
FOREACH_PlayerNumber( p )
|
||||
m_OptionIcons[p].SetHidden( true );
|
||||
}
|
||||
|
||||
void OptionRow::PositionUnderlines( PlayerNumber pn )
|
||||
@@ -484,7 +499,7 @@ void OptionRow::PositionIcons()
|
||||
|
||||
FOREACH_HumanPlayer( p ) // foreach player
|
||||
{
|
||||
OptionIcon &icon = m_OptionIcons[p];
|
||||
OptionIcon &icon = *m_OptionIcons[p];
|
||||
|
||||
icon.SetX( ICONS_X.GetValue(p) );
|
||||
|
||||
@@ -544,9 +559,9 @@ void OptionRow::UpdateEnabledDisabled()
|
||||
}
|
||||
|
||||
if( bThisRowHasFocusByAny )
|
||||
m_textTitle.RunCommands( LABEL_GAIN_FOCUS_COMMAND );
|
||||
m_textTitle->RunCommands( LABEL_GAIN_FOCUS_COMMAND );
|
||||
else
|
||||
m_textTitle.RunCommands( LABEL_LOSE_FOCUS_COMMAND );
|
||||
m_textTitle->RunCommands( LABEL_LOSE_FOCUS_COMMAND );
|
||||
|
||||
/* Don't tween selection colors at all. */
|
||||
RageColor color;
|
||||
@@ -557,8 +572,8 @@ void OptionRow::UpdateEnabledDisabled()
|
||||
if( m_bHidden )
|
||||
color.a = 0;
|
||||
|
||||
m_sprBullet.SetGlobalDiffuseColor( color );
|
||||
m_textTitle.SetGlobalDiffuseColor( color );
|
||||
m_sprBullet->SetGlobalDiffuseColor( color );
|
||||
m_textTitle->SetGlobalDiffuseColor( color );
|
||||
|
||||
|
||||
for( unsigned j=0; j<m_textItems.size(); j++ )
|
||||
@@ -639,20 +654,20 @@ void OptionRow::UpdateEnabledDisabled()
|
||||
m_textItems[0]->SetEffectNone();
|
||||
}
|
||||
|
||||
if( m_sprBullet.DestTweenState().diffuse[0] != color )
|
||||
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 );
|
||||
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 OptionRow::SetOptionIcon( PlayerNumber pn, const CString &sText )
|
||||
{
|
||||
m_OptionIcons[pn].Set( pn, sText, false );
|
||||
m_OptionIcons[pn]->Set( pn, sText, false );
|
||||
}
|
||||
|
||||
BitmapText &OptionRow::GetTextItemForRow( PlayerNumber pn, int iChoiceOnRow )
|
||||
|
||||
@@ -82,10 +82,23 @@ struct OptionRowDefinition
|
||||
}
|
||||
};
|
||||
|
||||
class OptionRowType
|
||||
{
|
||||
public:
|
||||
void Load( const CString &sType );
|
||||
|
||||
BitmapText m_textItemParent;
|
||||
OptionsCursor m_UnderlineParent;
|
||||
Sprite m_sprBullet;
|
||||
BitmapText m_textTitle;
|
||||
OptionIcon m_OptionIcon;
|
||||
};
|
||||
|
||||
class OptionRow : public ActorFrame
|
||||
{
|
||||
public:
|
||||
OptionRow();
|
||||
const OptionRowType *m_pActors;
|
||||
OptionRow( const OptionRowType *pType );
|
||||
~OptionRow();
|
||||
|
||||
void Clear();
|
||||
@@ -167,19 +180,18 @@ public:
|
||||
protected:
|
||||
CString GetRowTitle() const;
|
||||
|
||||
CString m_sType;
|
||||
OptionRowDefinition m_RowDef;
|
||||
RowType m_RowType;
|
||||
OptionRowHandler* m_pHand;
|
||||
|
||||
ActorFrame m_Frame;
|
||||
ActorFrame m_ItemFrame;
|
||||
BitmapText m_textItemParent;
|
||||
|
||||
vector<BitmapText *> m_textItems; // size depends on m_bRowIsLong and which players are joined
|
||||
OptionsCursor m_UnderlineParent;
|
||||
vector<OptionsCursor *> m_Underline[NUM_PLAYERS]; // size depends on m_bRowIsLong and which players are joined
|
||||
Sprite m_sprBullet;
|
||||
BitmapText m_textTitle;
|
||||
OptionIcon m_OptionIcons[NUM_PLAYERS];
|
||||
Sprite *m_sprBullet;
|
||||
BitmapText *m_textTitle;
|
||||
OptionIcon *m_OptionIcons[NUM_PLAYERS];
|
||||
|
||||
bool m_bFirstItemGoesDown;
|
||||
bool m_bRowHasFocus[NUM_PLAYERS];
|
||||
|
||||
|
||||
@@ -206,10 +206,15 @@ void ScreenOptions::InitMenu( const vector<OptionRowDefinition> &vDefs, const ve
|
||||
|
||||
ASSERT( vDefs.size() == vHands.size() );
|
||||
|
||||
m_OptionRowType.Load( m_sName );
|
||||
|
||||
for( unsigned r=0; r<vDefs.size(); r++ ) // foreach row
|
||||
{
|
||||
m_pRows.push_back( new OptionRow() );
|
||||
m_pRows.push_back( new OptionRow(&m_OptionRowType) );
|
||||
OptionRow &row = *m_pRows.back();
|
||||
row.SetDrawOrder( 1 );
|
||||
m_framePage.AddChild( &row );
|
||||
|
||||
const OptionRowDefinition &def = vDefs[r];
|
||||
OptionRowHandler* hand = vHands[r];
|
||||
|
||||
@@ -229,17 +234,10 @@ void ScreenOptions::InitMenu( const vector<OptionRowDefinition> &vDefs, const ve
|
||||
row.AfterImportOptions();
|
||||
}
|
||||
|
||||
for( unsigned r=0; r<m_pRows.size(); r++ ) // foreach row
|
||||
{
|
||||
OptionRow &row = *m_pRows[r];
|
||||
row.SetDrawOrder( 1 );
|
||||
m_framePage.AddChild( &row );
|
||||
}
|
||||
|
||||
if( SHOW_EXIT_ROW )
|
||||
{
|
||||
// TRICKY: Add "EXIT" item
|
||||
m_pRows.push_back( new OptionRow() );
|
||||
m_pRows.push_back( new OptionRow(&m_OptionRowType) );
|
||||
OptionRow &row = *m_pRows.back();
|
||||
row.LoadMetrics( m_sName );
|
||||
row.LoadExit();
|
||||
|
||||
@@ -36,6 +36,8 @@ public:
|
||||
virtual void HandleScreenMessage( const ScreenMessage SM );
|
||||
|
||||
protected:
|
||||
OptionRowType m_OptionRowType;
|
||||
|
||||
virtual void TweenOnScreen();
|
||||
|
||||
virtual void ImportOptions( int iRow, const vector<PlayerNumber> &vpns ) = 0;
|
||||
|
||||
Reference in New Issue
Block a user