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:
Glenn Maynard
2005-07-16 02:51:17 +00:00
parent a75ef49210
commit b925b2d7ca
4 changed files with 98 additions and 71 deletions
+69 -54
View File
@@ -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 )
+20 -8
View File
@@ -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];
+7 -9
View File
@@ -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();
+2
View File
@@ -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;