diff --git a/stepmania/src/WheelBase.cpp b/stepmania/src/WheelBase.cpp index 67eb248729..e0824b67bd 100644 --- a/stepmania/src/WheelBase.cpp +++ b/stepmania/src/WheelBase.cpp @@ -76,6 +76,7 @@ WheelBase::~WheelBase() void WheelBase::Load( CString sType ) { + m_isEmpty = true; LOG->Trace( "MusicWheel::Load('%s')", sType.c_str() ); SWITCH_SECONDS .Load(sType,"SwitchSeconds"); @@ -111,7 +112,8 @@ void WheelBase::Load( CString sType ) FOREACH( WheelItemBase*, m_WheelBaseItems, i ) SAFE_DELETE( *i ); m_WheelBaseItems.clear(); - for( int i=0; i= total_num_items) { + if(NUM_WHEEL_ITEMS >= total_num_items) + { m_ScrollBar.SetPercentage( 0, 1 ); } else { float size = float(NUM_WHEEL_ITEMS) / total_num_items; @@ -412,26 +415,30 @@ bool WheelBase::Select() // return true if this selection ends the screen m_Moving = 0; - switch( m_WheelBaseItemsData[m_iSelection]->m_Type ) + if (!m_isEmpty) { - case TYPE_GENERIC: - m_LastSelection = m_WheelBaseItemsData[m_iSelection]; - return false; - case TYPE_GROUP: + switch( m_WheelBaseItemsData[m_iSelection]->m_Type ) { - CString sThisItemSectionName = m_WheelBaseItemsData[m_iSelection]->m_sText; - if( m_sExpandedSectionName == sThisItemSectionName ) // already expanded - m_sExpandedSectionName = ""; // collapse it - else // already collapsed - m_sExpandedSectionName = sThisItemSectionName; // expand it + case TYPE_GENERIC: + m_LastSelection = m_WheelBaseItemsData[m_iSelection]; + return false; + case TYPE_GROUP: + { + CString sThisItemSectionName = m_WheelBaseItemsData[m_iSelection]->m_sText; + if( m_sExpandedSectionName == sThisItemSectionName ) // already expanded + m_sExpandedSectionName = ""; // collapse it + else // already collapsed + m_sExpandedSectionName = sThisItemSectionName; // expand it - m_soundExpand.Play(); + m_soundExpand.Play(); + } + return false; + default: + ASSERT(0); + return false; } - return false; - default: - ASSERT(0); - return false; } + return false; } int WheelBase::IsMoving() const @@ -582,14 +589,23 @@ void WheelBase::Move(int n) ChangeMusic(m_Moving); } -void WheelBase::AddItem(WheelItemBaseData* itemdata) { +void WheelBase::AddItem(WheelItemBaseData* itemdata) +{ int visible, index; m_WheelBaseItemsData.push_back(itemdata); visible = FirstVisibleIndex(); index = m_WheelBaseItemsData.size(); + if (m_isEmpty) + { + m_isEmpty = false; + //Remove the - Empty - field when we add an object from an empty state. + RemoveItem(0); + } + //If the item was shown in the wheel, rebuild the wheel - if ((0 <= (index - visible)) && ((index - visible) < NUM_WHEEL_ITEMS)) { + if ((0 <= (index - visible)) && ((index - visible) < NUM_WHEEL_ITEMS)) + { RebuildWheelItems(); SCREENMAN->SystemMessageNoAnimate("redraw"); } @@ -611,7 +627,8 @@ void WheelBase::ChangeMusic(int dist) m_soundChangeMusic.Play(); } -void WheelBase::BuildWheelItemsData( vector &arrayWheelItemDatas ) { +void WheelBase::BuildWheelItemsData( vector &arrayWheelItemDatas ) +{ if( arrayWheelItemDatas.empty() ) { arrayWheelItemDatas.push_back( new WheelItemBaseData(TYPE_GENERIC, "- EMPTY -", RageColor(1,0,0,1)) ); @@ -684,26 +701,41 @@ void WheelBase::RebuildWheelItems( int dist ) WheelItemBaseData* WheelBase::LastSelected( ) { - return m_LastSelection; + if (m_isEmpty) + return NULL; + else + return m_LastSelection; } -void WheelBase::RemoveItem( int index ) { - if (index < m_WheelBaseItemsData.size()) { - vector::iterator i = m_WheelBaseItemsData.begin(); - i += index; +void WheelBase::RemoveItem( int index ) +{ + if (!m_isEmpty) + { + if (index < m_WheelBaseItemsData.size()) + { + vector::iterator i = m_WheelBaseItemsData.begin(); + i += index; - //If this item's data happened to be last selected, make it NULL. - if (m_LastSelection == *i) - m_LastSelection = NULL; + //If this item's data happened to be last selected, make it NULL. + if (m_LastSelection == *i) + m_LastSelection = NULL; - SAFE_DELETE( *i ); - m_WheelBaseItemsData.erase(i); + SAFE_DELETE( *i ); + m_WheelBaseItemsData.erase(i); - RebuildWheelItems(); + if (m_WheelBaseItemsData.size() < 1) + { + m_isEmpty = true; + BuildWheelItemsData(m_WheelBaseItemsData); + } + + RebuildWheelItems(); + } } } -int WheelBase::FirstVisibleIndex() { +int WheelBase::FirstVisibleIndex() +{ // rewind to first index that will be displayed; int iFirstVisibleIndex = m_iSelection; if( m_iSelection > int(m_WheelBaseItemsData.size()-1) ) diff --git a/stepmania/src/WheelBase.h b/stepmania/src/WheelBase.h index d5a737a3d4..ac41130bda 100644 --- a/stepmania/src/WheelBase.h +++ b/stepmania/src/WheelBase.h @@ -16,7 +16,7 @@ #include "WheelItemBase.h" #include "ThemeMetric.h" -extern const AutoScreenMessage SM_SongChanged; // TODO: Replace this with a Message and MESSAGEMAN +AutoScreenMessage( SM_SongChanged ); // TODO: Replace this with a Message and MESSAGEMAN //struct CompareSongPointerArrayBySectionName; @@ -67,6 +67,7 @@ protected: vector m_WheelBaseItems; WheelItemBaseData* m_LastSelection; + bool m_isEmpty; int m_iSelection; // index into m_CurWheelItemBaseData CString m_sExpandedSectionName;