2005-03-27 03:56:10 +00:00
|
|
|
#include "global.h"
|
|
|
|
|
#include "WheelBase.h"
|
|
|
|
|
#include "RageUtil.h"
|
|
|
|
|
#include "GameManager.h"
|
|
|
|
|
#include "PrefsManager.h"
|
|
|
|
|
#include "ScreenManager.h" // for sending SM_PlayMusicSample
|
|
|
|
|
#include "RageLog.h"
|
|
|
|
|
#include "GameConstantsAndTypes.h"
|
|
|
|
|
#include "GameState.h"
|
|
|
|
|
#include "RageMath.h"
|
|
|
|
|
#include "ThemeManager.h"
|
|
|
|
|
#include "RageTextureManager.h"
|
|
|
|
|
#include "ActorUtil.h"
|
|
|
|
|
#include "Foreach.h"
|
|
|
|
|
#include "Style.h"
|
|
|
|
|
#include "ThemeMetric.h"
|
|
|
|
|
#include "ScreenDimensions.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const int MAX_WHEEL_SOUND_SPEED = 15;
|
|
|
|
|
|
|
|
|
|
WheelBase::WheelBase()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WheelBase::~WheelBase()
|
|
|
|
|
{
|
|
|
|
|
FOREACH( WheelItemBase*, m_WheelBaseItems, i )
|
|
|
|
|
SAFE_DELETE( *i );
|
|
|
|
|
m_WheelBaseItems.clear();
|
|
|
|
|
FOREACH( WheelItemBaseData*, m_WheelBaseItemsData, i )
|
|
|
|
|
SAFE_DELETE( *i );
|
|
|
|
|
m_WheelBaseItems.clear();
|
|
|
|
|
m_WheelBaseItemsData.clear();
|
|
|
|
|
m_LastSelection = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
void WheelBase::Load( RString sType )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
2005-04-24 05:52:35 +00:00
|
|
|
LOG->Trace( "WheelBase::Load('%s')", sType.c_str() );
|
|
|
|
|
|
|
|
|
|
LoadFromMetrics( sType );
|
|
|
|
|
LoadVariables();
|
|
|
|
|
|
|
|
|
|
FOREACH( WheelItemBase*, m_WheelBaseItems, i )
|
|
|
|
|
SAFE_DELETE( *i );
|
|
|
|
|
m_WheelBaseItems.clear();
|
|
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
|
|
|
|
|
{
|
|
|
|
|
m_WheelBaseItems.push_back( new WheelItemBase );
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:27:43 +00:00
|
|
|
m_WheelState = STATE_SELECTING;
|
2005-04-24 05:52:35 +00:00
|
|
|
|
|
|
|
|
BuildWheelItemsData(m_WheelBaseItemsData);
|
|
|
|
|
RebuildWheelItems();
|
|
|
|
|
}
|
|
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
void WheelBase::LoadFromMetrics( RString sType )
|
2005-05-05 02:24:03 +00:00
|
|
|
{
|
2006-04-25 08:46:43 +00:00
|
|
|
SWITCH_SECONDS .Load(sType,"SwitchSeconds");
|
2005-03-27 03:56:10 +00:00
|
|
|
LOCKED_INITIAL_VELOCITY .Load(sType,"LockedInitialVelocity");
|
2006-04-25 08:46:43 +00:00
|
|
|
SCROLL_BAR_X .Load(sType,"ScrollBarX");
|
|
|
|
|
SCROLL_BAR_HEIGHT .Load(sType,"ScrollBarHeight");
|
|
|
|
|
ITEM_CURVE_X .Load(sType,"ItemCurveX");
|
|
|
|
|
USE_LINEAR_WHEEL .Load(sType,"NoCurving");
|
|
|
|
|
ITEM_SPACING_Y .Load(sType,"ItemSpacingY");
|
|
|
|
|
WHEEL_3D_RADIUS .Load(sType,"Wheel3DRadius");
|
|
|
|
|
CIRCLE_PERCENT .Load(sType,"CirclePercent");
|
|
|
|
|
USE_3D .Load(sType,"Use3D");
|
2005-03-27 03:56:10 +00:00
|
|
|
NUM_WHEEL_ITEMS_TO_DRAW .Load(sType,"NumWheelItems");
|
|
|
|
|
WHEEL_ITEM_ON_DELAY_CENTER .Load(sType,"WheelItemOnDelayCenter");
|
|
|
|
|
WHEEL_ITEM_ON_DELAY_OFFSET .Load(sType,"WheelItemOnDelayOffset");
|
|
|
|
|
WHEEL_ITEM_OFF_DELAY_CENTER .Load(sType,"WheelItemOffDelayCenter");
|
|
|
|
|
WHEEL_ITEM_OFF_DELAY_OFFSET .Load(sType,"WheelItemOffDelayOffset");
|
2006-04-25 08:46:43 +00:00
|
|
|
WHEEL_ITEM_LOCKED_COLOR .Load(sType,"WheelItemLockedColor");
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-04-24 05:52:35 +00:00
|
|
|
m_soundChangeMusic.Load( THEME->GetPathS(sType,"change"), true );
|
2006-04-25 08:46:43 +00:00
|
|
|
m_soundLocked.Load( THEME->GetPathS(sType,"locked"), true );
|
2005-03-27 03:56:10 +00:00
|
|
|
|
|
|
|
|
m_sprHighlight.Load( THEME->GetPathG(sType,"highlight") );
|
|
|
|
|
m_sprHighlight->SetName( "Highlight" );
|
|
|
|
|
this->AddChild( m_sprHighlight );
|
|
|
|
|
ActorUtil::OnCommand( m_sprHighlight, sType );
|
|
|
|
|
|
|
|
|
|
m_ScrollBar.SetX( SCROLL_BAR_X );
|
|
|
|
|
m_ScrollBar.SetBarHeight( SCROLL_BAR_HEIGHT );
|
|
|
|
|
this->AddChild( &m_ScrollBar );
|
2005-04-24 05:52:35 +00:00
|
|
|
}
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-05-05 02:24:03 +00:00
|
|
|
void WheelBase::LoadVariables()
|
|
|
|
|
{
|
2005-04-24 05:52:35 +00:00
|
|
|
m_isEmpty = true;
|
|
|
|
|
m_LastSelection = NULL;
|
2005-03-27 03:56:10 +00:00
|
|
|
m_iSelection = 0;
|
|
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
m_iSwitchesLeftInSpinDown = 0;
|
|
|
|
|
m_Moving = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WheelBase::GetItemPosition( float fPosOffsetsFromMiddle, float& fX_out, float& fY_out, float& fZ_out, float& fRotationX_out )
|
|
|
|
|
{
|
|
|
|
|
if( USE_3D )
|
|
|
|
|
{
|
|
|
|
|
const float curve = CIRCLE_PERCENT*2*PI;
|
|
|
|
|
fRotationX_out = SCALE(fPosOffsetsFromMiddle,-NUM_WHEEL_ITEMS/2.0f,+NUM_WHEEL_ITEMS/2.0f,-curve/2.f,+curve/2.f);
|
|
|
|
|
fX_out = (1-cosf(fPosOffsetsFromMiddle/PI))*ITEM_CURVE_X;
|
|
|
|
|
fY_out = WHEEL_3D_RADIUS*sinf(fRotationX_out);
|
|
|
|
|
fZ_out = -100+WHEEL_3D_RADIUS*cosf(fRotationX_out);
|
|
|
|
|
fRotationX_out *= 180.f/PI; // to degrees
|
|
|
|
|
|
|
|
|
|
// printf( "fRotationX_out = %f\n", fRotationX_out );
|
|
|
|
|
}
|
|
|
|
|
else if(!USE_LINEAR_WHEEL.GetValue())
|
|
|
|
|
{
|
|
|
|
|
fX_out = (1-cosf(fPosOffsetsFromMiddle/PI))*ITEM_CURVE_X;
|
|
|
|
|
fY_out = fPosOffsetsFromMiddle*ITEM_SPACING_Y;
|
|
|
|
|
fZ_out = 0;
|
|
|
|
|
fRotationX_out = 0;
|
|
|
|
|
|
|
|
|
|
fX_out = roundf( fX_out );
|
|
|
|
|
fY_out = roundf( fY_out );
|
|
|
|
|
fZ_out = roundf( fZ_out );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
fX_out = fPosOffsetsFromMiddle*ITEM_CURVE_X;
|
|
|
|
|
fY_out = fPosOffsetsFromMiddle*ITEM_SPACING_Y;
|
|
|
|
|
fZ_out = 0;
|
|
|
|
|
fRotationX_out = 0;
|
|
|
|
|
|
|
|
|
|
fX_out = roundf( fX_out );
|
|
|
|
|
fY_out = roundf( fY_out );
|
|
|
|
|
fZ_out = roundf( fZ_out );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WheelBase::SetItemPosition( Actor &item, float fPosOffsetsFromMiddle )
|
|
|
|
|
{
|
|
|
|
|
float fX, fY, fZ, fRotationX;
|
|
|
|
|
GetItemPosition( fPosOffsetsFromMiddle, fX, fY, fZ, fRotationX );
|
|
|
|
|
item.SetXY( fX, fY );
|
|
|
|
|
item.SetZ( fZ );
|
|
|
|
|
item.SetRotationX( fRotationX );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WheelBase::DrawPrimitives()
|
|
|
|
|
{
|
|
|
|
|
// draw outside->inside
|
|
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS/2; i++ )
|
|
|
|
|
DrawItem( i );
|
|
|
|
|
for( int i=NUM_WHEEL_ITEMS-1; i>=NUM_WHEEL_ITEMS/2; i-- )
|
|
|
|
|
DrawItem( i );
|
|
|
|
|
|
|
|
|
|
ActorFrame::DrawPrimitives();
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:55:05 +00:00
|
|
|
void WheelBase::DrawItem( int i )
|
|
|
|
|
{
|
|
|
|
|
DrawItem( i, m_WheelBaseItems[i], i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection );
|
|
|
|
|
}
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-04-29 02:42:31 +00:00
|
|
|
void WheelBase::DrawItem( int i, WheelItemBase *display, const float fThisBannerPositionOffsetFromSelection)
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
|
|
|
|
if( fabsf(fThisBannerPositionOffsetFromSelection) > NUM_WHEEL_ITEMS_TO_DRAW/2 )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
2005-09-19 09:27:43 +00:00
|
|
|
case STATE_SELECTING:
|
2005-03-27 03:56:10 +00:00
|
|
|
case STATE_LOCKED:
|
|
|
|
|
{
|
|
|
|
|
SetItemPosition( *display, fThisBannerPositionOffsetFromSelection );
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( m_WheelState == STATE_LOCKED && i != NUM_WHEEL_ITEMS/2 )
|
2006-04-25 08:46:43 +00:00
|
|
|
display->m_colorLocked = WHEEL_ITEM_LOCKED_COLOR.GetValue();
|
2005-03-27 03:56:10 +00:00
|
|
|
else
|
2006-04-25 08:46:43 +00:00
|
|
|
display->m_colorLocked = RageColor(0,0,0,0);
|
2005-03-27 03:56:10 +00:00
|
|
|
|
|
|
|
|
display->Draw();
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
void WheelBase::UpdateScrollbar( unsigned int iSize )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
int iTotalNumItems = iSize;
|
|
|
|
|
float fItemAt = m_iSelection - m_fPositionOffsetFromSelection;
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
if( NUM_WHEEL_ITEMS >= iTotalNumItems )
|
2005-04-06 00:17:25 +00:00
|
|
|
{
|
2005-03-27 03:56:10 +00:00
|
|
|
m_ScrollBar.SetPercentage( 0, 1 );
|
2005-09-19 09:19:54 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
float fSize = float(NUM_WHEEL_ITEMS) / iTotalNumItems;
|
|
|
|
|
float fCenter = fItemAt / iTotalNumItems;
|
|
|
|
|
fSize *= 0.5f;
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
m_ScrollBar.SetPercentage( fCenter - fSize, fCenter + fSize );
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool WheelBase::IsSettled() const
|
|
|
|
|
{
|
|
|
|
|
if( m_Moving )
|
|
|
|
|
return false;
|
2005-09-19 09:27:43 +00:00
|
|
|
if( m_WheelState != STATE_SELECTING && m_WheelState != STATE_LOCKED )
|
2005-03-27 03:56:10 +00:00
|
|
|
return false;
|
|
|
|
|
if( m_fPositionOffsetFromSelection != 0 )
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WheelBase::Update( float fDeltaTime )
|
|
|
|
|
{
|
|
|
|
|
ActorFrame::Update( fDeltaTime );
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
UpdateItems( fDeltaTime );
|
2005-04-29 02:42:31 +00:00
|
|
|
|
2005-04-24 05:52:35 +00:00
|
|
|
//Moved to CommonUpdateProcedure, seems to work fine
|
|
|
|
|
//Revert if it happens to break something
|
2005-03-27 03:56:10 +00:00
|
|
|
UpdateScrollbar();
|
|
|
|
|
|
|
|
|
|
if( m_Moving )
|
|
|
|
|
{
|
|
|
|
|
m_TimeBeforeMovingBegins -= fDeltaTime;
|
|
|
|
|
m_TimeBeforeMovingBegins = max(m_TimeBeforeMovingBegins, 0);
|
|
|
|
|
}
|
2005-04-29 02:42:31 +00:00
|
|
|
|
2005-03-27 03:56:10 +00:00
|
|
|
// update wheel state
|
|
|
|
|
m_fTimeLeftInState -= fDeltaTime;
|
|
|
|
|
if( m_fTimeLeftInState <= 0 ) // time to go to a new state
|
|
|
|
|
{
|
2005-04-29 02:42:31 +00:00
|
|
|
UpdateSwitch();
|
2005-04-24 05:52:35 +00:00
|
|
|
}
|
|
|
|
|
|
2005-03-27 03:56:10 +00:00
|
|
|
if( m_WheelState == STATE_LOCKED )
|
|
|
|
|
{
|
|
|
|
|
/* Do this in at most .1 sec chunks, so we don't get weird if we
|
|
|
|
|
* stop for some reason (and so it behaves the same when being
|
|
|
|
|
* single stepped). */
|
2005-09-19 09:19:54 +00:00
|
|
|
float fTime = fDeltaTime;
|
|
|
|
|
while( fTime > 0 )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
float t = min( fTime, 0.1f );
|
|
|
|
|
fTime -= t;
|
2005-03-27 03:56:10 +00:00
|
|
|
|
|
|
|
|
m_fPositionOffsetFromSelection = clamp( m_fPositionOffsetFromSelection, -0.3f, +0.3f );
|
|
|
|
|
|
|
|
|
|
float fSpringForce = - m_fPositionOffsetFromSelection * LOCKED_INITIAL_VELOCITY;
|
|
|
|
|
m_fLockedWheelVelocity += fSpringForce;
|
|
|
|
|
|
|
|
|
|
float fDrag = -m_fLockedWheelVelocity * t*4;
|
|
|
|
|
m_fLockedWheelVelocity += fDrag;
|
|
|
|
|
|
|
|
|
|
m_fPositionOffsetFromSelection += m_fLockedWheelVelocity*t;
|
|
|
|
|
|
|
|
|
|
if( fabsf(m_fPositionOffsetFromSelection) < 0.01f && fabsf(m_fLockedWheelVelocity) < 0.01f )
|
|
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
m_fLockedWheelVelocity = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( IsMoving() )
|
|
|
|
|
{
|
|
|
|
|
/* We're automatically moving. Move linearly, and don't clamp
|
|
|
|
|
* to the selection. */
|
|
|
|
|
float fSpinSpeed = m_SpinSpeed*m_Moving;
|
|
|
|
|
m_fPositionOffsetFromSelection -= fSpinSpeed*fDeltaTime;
|
|
|
|
|
|
|
|
|
|
/* Make sure that we don't go further than 1 away, in case the
|
|
|
|
|
* speed is very high or we miss a lot of frames. */
|
|
|
|
|
m_fPositionOffsetFromSelection = clamp(m_fPositionOffsetFromSelection, -1.0f, 1.0f);
|
|
|
|
|
|
|
|
|
|
/* If it passed the selection, move again. */
|
|
|
|
|
if((m_Moving == -1 && m_fPositionOffsetFromSelection >= 0) ||
|
|
|
|
|
(m_Moving == 1 && m_fPositionOffsetFromSelection <= 0))
|
|
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
ChangeMusic( m_Moving );
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
if( PREFSMAN->m_iMusicWheelSwitchSpeed < MAX_WHEEL_SOUND_SPEED )
|
2005-03-27 03:56:10 +00:00
|
|
|
m_soundChangeMusic.Play();
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
if( PREFSMAN->m_iMusicWheelSwitchSpeed >= MAX_WHEEL_SOUND_SPEED &&
|
|
|
|
|
m_MovingSoundTimer.PeekDeltaTime() >= 1.0f / MAX_WHEEL_SOUND_SPEED )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
|
|
|
|
m_MovingSoundTimer.GetDeltaTime();
|
|
|
|
|
m_soundChangeMusic.Play();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// "rotate" wheel toward selected song
|
2005-09-19 09:19:54 +00:00
|
|
|
float fSpinSpeed = 0.2f + fabsf( m_fPositionOffsetFromSelection ) / SWITCH_SECONDS;
|
2005-03-27 03:56:10 +00:00
|
|
|
|
|
|
|
|
if( m_fPositionOffsetFromSelection > 0 )
|
|
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection -= fSpinSpeed*fDeltaTime;
|
|
|
|
|
if( m_fPositionOffsetFromSelection < 0 )
|
|
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
}
|
|
|
|
|
else if( m_fPositionOffsetFromSelection < 0 )
|
|
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection += fSpinSpeed*fDeltaTime;
|
|
|
|
|
if( m_fPositionOffsetFromSelection > 0 )
|
|
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
void WheelBase::UpdateItems( float fDeltaTime )
|
|
|
|
|
{
|
2005-04-29 02:42:31 +00:00
|
|
|
for( unsigned i = 0; i < unsigned(NUM_WHEEL_ITEMS); i++)
|
|
|
|
|
{
|
|
|
|
|
m_WheelBaseItems[i]->Update( fDeltaTime );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
void WheelBase::UpdateSwitch()
|
|
|
|
|
{
|
2005-04-29 02:42:31 +00:00
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
|
|
|
|
case STATE_TWEENING_ON_SCREEN:
|
|
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
if( (GAMESTATE->IsExtraStage() && !PREFSMAN->m_bPickExtraStage) || GAMESTATE->IsExtraStage2() )
|
|
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_LOCKED;
|
|
|
|
|
SCREENMAN->PlayStartSound();
|
|
|
|
|
m_fLockedWheelVelocity = 0;
|
|
|
|
|
}
|
2005-09-19 09:19:54 +00:00
|
|
|
else
|
2005-04-29 02:42:31 +00:00
|
|
|
{
|
2005-09-19 09:27:43 +00:00
|
|
|
m_WheelState = STATE_SELECTING;
|
2005-04-29 02:42:31 +00:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case STATE_TWEENING_OFF_SCREEN:
|
|
|
|
|
m_WheelState = STATE_WAITING_OFF_SCREEN;
|
|
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
break;
|
2005-09-19 09:27:43 +00:00
|
|
|
case STATE_SELECTING:
|
2005-04-29 02:42:31 +00:00
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
break;
|
|
|
|
|
case STATE_WAITING_OFF_SCREEN:
|
|
|
|
|
break;
|
|
|
|
|
case STATE_LOCKED:
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
ASSERT(0); // all state changes should be handled explicitly
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-03-27 03:56:10 +00:00
|
|
|
bool WheelBase::Select() // return true if this selection ends the screen
|
|
|
|
|
{
|
|
|
|
|
LOG->Trace( "WheelBase::Select()" );
|
|
|
|
|
|
|
|
|
|
m_Moving = 0;
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
if( !m_isEmpty )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
2005-04-06 00:17:25 +00:00
|
|
|
switch( m_WheelBaseItemsData[m_iSelection]->m_Type )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
2005-04-06 00:17:25 +00:00
|
|
|
case TYPE_GENERIC:
|
|
|
|
|
m_LastSelection = m_WheelBaseItemsData[m_iSelection];
|
|
|
|
|
return false;
|
2005-04-24 05:52:35 +00:00
|
|
|
case TYPE_SECTION:
|
2005-04-06 00:17:25 +00:00
|
|
|
{
|
2006-01-22 01:00:06 +00:00
|
|
|
RString sThisItemSectionName = m_WheelBaseItemsData[m_iSelection]->m_sText;
|
2005-04-06 00:17:25 +00:00
|
|
|
if( m_sExpandedSectionName == sThisItemSectionName ) // already expanded
|
|
|
|
|
m_sExpandedSectionName = ""; // collapse it
|
|
|
|
|
else // already collapsed
|
|
|
|
|
m_sExpandedSectionName = sThisItemSectionName; // expand it
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-04-06 00:17:25 +00:00
|
|
|
m_soundExpand.Play();
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
default:
|
|
|
|
|
ASSERT(0);
|
|
|
|
|
return false;
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
2005-04-06 00:17:25 +00:00
|
|
|
return false;
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
// return true if this selection ends the screen
|
|
|
|
|
WheelItemBaseData* WheelBase::GetItem( unsigned int iIndex )
|
2005-05-03 01:05:11 +00:00
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
if( !m_isEmpty && iIndex < m_WheelBaseItemsData.size() )
|
|
|
|
|
return m_WheelBaseItemsData[iIndex];
|
2005-05-03 01:05:11 +00:00
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2005-03-27 03:56:10 +00:00
|
|
|
int WheelBase::IsMoving() const
|
|
|
|
|
{
|
|
|
|
|
return m_Moving && m_TimeBeforeMovingBegins == 0;
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
void WheelBase::TweenOnScreen( bool bChangingSort )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_TWEENING_ON_SCREEN;
|
|
|
|
|
|
|
|
|
|
SetItemPosition( *m_sprHighlight, 0 );
|
|
|
|
|
|
|
|
|
|
COMMAND( m_sprHighlight, "StartOn");
|
2005-09-19 09:19:54 +00:00
|
|
|
if( bChangingSort )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
|
|
|
|
const float delay = fabsf(NUM_WHEEL_ITEMS/2-WHEEL_ITEM_ON_DELAY_CENTER) * WHEEL_ITEM_ON_DELAY_OFFSET;
|
|
|
|
|
m_sprHighlight->BeginTweening( delay ); // sleep
|
|
|
|
|
COMMAND( m_sprHighlight, "FinishOnSort");
|
2005-09-19 09:19:54 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2005-03-27 03:56:10 +00:00
|
|
|
COMMAND( m_sprHighlight, "FinishOn");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_ScrollBar.SetX( SCROLL_BAR_X );
|
|
|
|
|
m_ScrollBar.AddX( 30 );
|
2005-09-19 09:19:54 +00:00
|
|
|
if( bChangingSort )
|
2005-03-27 03:56:10 +00:00
|
|
|
m_ScrollBar.BeginTweening( 0.2f ); // sleep
|
|
|
|
|
else
|
|
|
|
|
m_ScrollBar.BeginTweening( 0.7f ); // sleep
|
2006-01-23 04:42:12 +00:00
|
|
|
m_ScrollBar.BeginTweening( 0.2f , TWEEN_ACCELERATE );
|
2005-03-27 03:56:10 +00:00
|
|
|
m_ScrollBar.AddX( -30 );
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
TweenOnScreenUpdateItems( bChangingSort );
|
2005-04-29 02:42:31 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
if( bChangingSort )
|
2005-04-29 02:42:31 +00:00
|
|
|
HurryTweening( 0.25f );
|
|
|
|
|
|
|
|
|
|
m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f;
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
void WheelBase::TweenOnScreenUpdateItems( bool bChangingSort )
|
|
|
|
|
{
|
2005-03-27 03:56:10 +00:00
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
|
|
|
|
|
{
|
|
|
|
|
WheelItemBase *display = m_WheelBaseItems[i];
|
|
|
|
|
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection;
|
|
|
|
|
SetItemPosition( *display, fThisBannerPositionOffsetFromSelection );
|
|
|
|
|
|
|
|
|
|
COMMAND( display, "StartOn");
|
|
|
|
|
const float delay = fabsf(i-WHEEL_ITEM_ON_DELAY_CENTER) * WHEEL_ITEM_ON_DELAY_OFFSET;
|
|
|
|
|
display->BeginTweening( delay ); // sleep
|
|
|
|
|
COMMAND( display, "FinishOn");
|
2005-09-19 09:19:54 +00:00
|
|
|
if( bChangingSort )
|
2005-03-27 03:56:10 +00:00
|
|
|
display->HurryTweening( 0.25f );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
void WheelBase::TweenOffScreen( bool bChangingSort )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_TWEENING_OFF_SCREEN;
|
|
|
|
|
|
|
|
|
|
SetItemPosition( *m_sprHighlight, 0 );
|
|
|
|
|
|
|
|
|
|
COMMAND( m_sprHighlight, "StartOff");
|
2005-09-19 09:19:54 +00:00
|
|
|
if( bChangingSort )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
|
|
|
|
/* When changing sort, tween the overlay with the item in the center;
|
|
|
|
|
* having it separate looks messy when we're moving fast. */
|
|
|
|
|
const float delay = fabsf(NUM_WHEEL_ITEMS/2-WHEEL_ITEM_ON_DELAY_CENTER) * WHEEL_ITEM_ON_DELAY_OFFSET;
|
|
|
|
|
m_sprHighlight->BeginTweening( delay ); // sleep
|
|
|
|
|
COMMAND( m_sprHighlight, "FinishOffSort");
|
2005-06-11 10:27:56 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2005-03-27 03:56:10 +00:00
|
|
|
COMMAND( m_sprHighlight, "FinishOff");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_ScrollBar.BeginTweening( 0 );
|
2006-01-23 04:42:12 +00:00
|
|
|
m_ScrollBar.BeginTweening( 0.2f, TWEEN_ACCELERATE );
|
2005-03-27 03:56:10 +00:00
|
|
|
m_ScrollBar.SetX( SCROLL_BAR_X+30 );
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
TweenOffScreenUpdateItems( bChangingSort );
|
2005-04-29 02:42:31 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
if( bChangingSort )
|
2005-04-29 02:42:31 +00:00
|
|
|
HurryTweening( 0.25f );
|
|
|
|
|
|
|
|
|
|
m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f;
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
void WheelBase::TweenOffScreenUpdateItems( bool bChangingSort )
|
2005-04-29 02:42:31 +00:00
|
|
|
{
|
2005-03-27 03:56:10 +00:00
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
|
|
|
|
|
{
|
|
|
|
|
WheelItemBase *display = m_WheelBaseItems[i];
|
|
|
|
|
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection;
|
|
|
|
|
SetItemPosition( *display, fThisBannerPositionOffsetFromSelection );
|
|
|
|
|
|
|
|
|
|
COMMAND( display, "StartOff");
|
|
|
|
|
const float delay = fabsf(i-WHEEL_ITEM_OFF_DELAY_CENTER) * WHEEL_ITEM_OFF_DELAY_OFFSET;
|
|
|
|
|
display->BeginTweening( delay ); // sleep
|
|
|
|
|
COMMAND( display, "FinishOff");
|
2005-09-19 09:19:54 +00:00
|
|
|
if( bChangingSort )
|
2005-03-27 03:56:10 +00:00
|
|
|
display->HurryTweening( 0.25f );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:01:21 +00:00
|
|
|
void WheelBase::ChangeMusicUnlessLocked( int n )
|
|
|
|
|
{
|
|
|
|
|
if( m_WheelState == STATE_LOCKED )
|
|
|
|
|
{
|
|
|
|
|
if(n)
|
|
|
|
|
{
|
|
|
|
|
int iSign = n/abs(n);
|
|
|
|
|
m_fLockedWheelVelocity = iSign*LOCKED_INITIAL_VELOCITY;
|
|
|
|
|
m_soundLocked.Play();
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ChangeMusic( n );
|
|
|
|
|
}
|
|
|
|
|
|
2005-03-27 03:56:10 +00:00
|
|
|
void WheelBase::Move(int n)
|
|
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
if( n == m_Moving )
|
2005-03-27 03:56:10 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if( m_WheelState == STATE_LOCKED )
|
|
|
|
|
{
|
|
|
|
|
if(n)
|
|
|
|
|
{
|
|
|
|
|
int iSign = n/abs(n);
|
|
|
|
|
m_fLockedWheelVelocity = iSign*LOCKED_INITIAL_VELOCITY;
|
|
|
|
|
m_soundLocked.Play();
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2005-04-29 02:42:31 +00:00
|
|
|
if (!MoveSpecific(n))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_TimeBeforeMovingBegins = 1/4.0f;
|
|
|
|
|
m_SpinSpeed = float(PREFSMAN->m_iMusicWheelSwitchSpeed);
|
|
|
|
|
m_Moving = n;
|
|
|
|
|
|
2005-09-19 09:20:57 +00:00
|
|
|
if( m_Moving )
|
2005-04-29 02:42:31 +00:00
|
|
|
ChangeMusic(m_Moving);
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 08:49:09 +00:00
|
|
|
bool WheelBase::MoveSpecific( int n )
|
|
|
|
|
{
|
2005-03-27 03:56:10 +00:00
|
|
|
/* If we're not selecting, discard this. We won't ignore it; we'll
|
|
|
|
|
* get called again every time the key is repeated. */
|
|
|
|
|
/* Still process Move(0) so we sometimes continue moving immediate
|
|
|
|
|
* after the sort change finished and before the repeat event causes a
|
|
|
|
|
* Move(0). -Chris */
|
|
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
2005-09-19 09:27:43 +00:00
|
|
|
case STATE_SELECTING:
|
2005-03-27 03:56:10 +00:00
|
|
|
break;
|
|
|
|
|
case STATE_FLYING_OFF_BEFORE_NEXT_SORT:
|
|
|
|
|
case STATE_FLYING_ON_AFTER_NEXT_SORT:
|
|
|
|
|
if( n!= 0 )
|
2005-04-29 02:42:31 +00:00
|
|
|
return false;
|
2005-03-27 03:56:10 +00:00
|
|
|
break;
|
|
|
|
|
default:
|
2005-04-29 02:42:31 +00:00
|
|
|
return false; // don't continue
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(m_Moving != 0 && n == 0 && m_TimeBeforeMovingBegins == 0)
|
|
|
|
|
{
|
|
|
|
|
/* We were moving, and now we're stopping. If we're really close to
|
|
|
|
|
* the selection, move to the next one, so we have a chance to spin down
|
|
|
|
|
* smoothly. */
|
|
|
|
|
if(fabsf(m_fPositionOffsetFromSelection) < 0.25f )
|
|
|
|
|
ChangeMusic(m_Moving);
|
|
|
|
|
|
|
|
|
|
/* Make sure the user always gets an SM_SongChanged when
|
|
|
|
|
* Moving() is 0, so the final banner, etc. always gets set. */
|
2005-04-24 05:52:35 +00:00
|
|
|
// SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 );
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
|
2005-04-29 02:42:31 +00:00
|
|
|
return true;
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:20:57 +00:00
|
|
|
void WheelBase::AddItem( WheelItemBaseData* pItemData )
|
2005-04-06 00:17:25 +00:00
|
|
|
{
|
2005-09-19 09:20:57 +00:00
|
|
|
m_WheelBaseItemsData.push_back( pItemData );
|
|
|
|
|
int iVisible = FirstVisibleIndex();
|
|
|
|
|
int iIndex = m_WheelBaseItemsData.size();
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
if( m_isEmpty )
|
2005-04-06 00:17:25 +00:00
|
|
|
{
|
|
|
|
|
m_isEmpty = false;
|
2005-09-19 09:19:54 +00:00
|
|
|
// Remove the - Empty - field when we add an object from an empty state.
|
2005-04-06 00:17:25 +00:00
|
|
|
RemoveItem(0);
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
// If the item was shown in the wheel, rebuild the wheel
|
2005-09-19 09:20:57 +00:00
|
|
|
if( 0 <= iIndex - iVisible && iIndex - iVisible < NUM_WHEEL_ITEMS )
|
2005-04-06 00:17:25 +00:00
|
|
|
{
|
2005-05-03 01:05:11 +00:00
|
|
|
RebuildWheelItems();
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
void WheelBase::ChangeMusic( int iDist )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
m_iSelection += iDist;
|
2005-03-27 03:56:10 +00:00
|
|
|
wrap( m_iSelection, m_WheelBaseItemsData.size() );
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
RebuildWheelItems( iDist );
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
m_fPositionOffsetFromSelection += iDist;
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-04-24 05:52:35 +00:00
|
|
|
// SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 );
|
2005-03-27 03:56:10 +00:00
|
|
|
|
|
|
|
|
/* If we're moving automatically, don't play this; it'll be called in Update. */
|
|
|
|
|
if(!IsMoving())
|
|
|
|
|
m_soundChangeMusic.Play();
|
|
|
|
|
}
|
|
|
|
|
|
2005-04-06 00:17:25 +00:00
|
|
|
void WheelBase::BuildWheelItemsData( vector<WheelItemBaseData*> &arrayWheelItemDatas )
|
|
|
|
|
{
|
2005-03-27 03:56:10 +00:00
|
|
|
if( arrayWheelItemDatas.empty() )
|
|
|
|
|
{
|
|
|
|
|
arrayWheelItemDatas.push_back( new WheelItemBaseData(TYPE_GENERIC, "- EMPTY -", RageColor(1,0,0,1)) );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
void WheelBase::RebuildWheelItems( int iDist )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
2005-09-19 09:55:05 +00:00
|
|
|
const vector<WheelItemBaseData *> &data = m_WheelBaseItemsData;
|
2005-09-19 09:48:41 +00:00
|
|
|
vector<WheelItemBase *> &items = m_WheelBaseItems;
|
|
|
|
|
|
2005-03-27 03:56:10 +00:00
|
|
|
// rewind to first index that will be displayed;
|
|
|
|
|
int iFirstVisibleIndex = m_iSelection;
|
2005-09-19 09:48:41 +00:00
|
|
|
if( m_iSelection > int(data.size()-1) )
|
2005-03-27 03:56:10 +00:00
|
|
|
m_iSelection = 0;
|
|
|
|
|
|
|
|
|
|
// find the first wheel item shown
|
|
|
|
|
iFirstVisibleIndex -= NUM_WHEEL_ITEMS/2;
|
|
|
|
|
|
2005-09-19 09:48:41 +00:00
|
|
|
ASSERT(data.size());
|
|
|
|
|
wrap( iFirstVisibleIndex, data.size() );
|
2005-03-27 03:56:10 +00:00
|
|
|
|
|
|
|
|
// iIndex is now the index of the lowest WheelItem to draw
|
|
|
|
|
|
2005-09-19 09:36:21 +00:00
|
|
|
if( iDist == INT_MAX )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
|
|
|
|
// Refresh all
|
|
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
|
|
|
|
|
{
|
|
|
|
|
int iIndex = iFirstVisibleIndex + i;
|
2005-09-19 09:48:41 +00:00
|
|
|
wrap( iIndex, data.size() );
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:48:41 +00:00
|
|
|
WheelItemBaseData *pData = data[iIndex];
|
|
|
|
|
WheelItemBase *pDisplay = items[i];
|
2005-09-19 09:36:21 +00:00
|
|
|
|
2005-09-19 09:48:41 +00:00
|
|
|
pDisplay->LoadFromWheelItemBaseData( pData );
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Shift items and refresh only those that have changed.
|
2005-09-19 09:48:41 +00:00
|
|
|
CircularShift( items, iDist );
|
2005-09-19 09:19:54 +00:00
|
|
|
if( iDist > 0 )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
for( int i=NUM_WHEEL_ITEMS-iDist; i<NUM_WHEEL_ITEMS; i++ )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
|
|
|
|
int iIndex = iFirstVisibleIndex + i;
|
2005-09-19 09:48:41 +00:00
|
|
|
wrap( iIndex, data.size() );
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:48:41 +00:00
|
|
|
WheelItemBaseData *pData = data[iIndex];
|
|
|
|
|
WheelItemBase *pDisplay = items[i];
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:48:41 +00:00
|
|
|
pDisplay->LoadFromWheelItemBaseData( pData );
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
2005-09-19 09:19:54 +00:00
|
|
|
else if( iDist < 0 )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
for( int i=0; i < -iDist; i++ )
|
2005-03-27 03:56:10 +00:00
|
|
|
{
|
|
|
|
|
int iIndex = iFirstVisibleIndex + i;
|
2005-09-26 19:52:04 +00:00
|
|
|
wrap( iIndex, data.size() );
|
2005-09-19 09:37:47 +00:00
|
|
|
|
2005-09-19 09:48:41 +00:00
|
|
|
WheelItemBaseData *pData = data[iIndex];
|
|
|
|
|
WheelItemBase *pDisplay = items[i];
|
2005-09-19 09:37:47 +00:00
|
|
|
|
2005-09-19 09:48:41 +00:00
|
|
|
pDisplay->LoadFromWheelItemBaseData( pData );
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WheelItemBaseData* WheelBase::LastSelected( )
|
|
|
|
|
{
|
2005-04-06 00:17:25 +00:00
|
|
|
if (m_isEmpty)
|
|
|
|
|
return NULL;
|
|
|
|
|
else
|
|
|
|
|
return m_LastSelection;
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
|
2005-04-06 00:17:25 +00:00
|
|
|
void WheelBase::RemoveItem( int index )
|
|
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
if( m_isEmpty || index >= (int)m_WheelBaseItemsData.size() )
|
|
|
|
|
return;
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
vector<WheelItemBaseData *>::iterator i = m_WheelBaseItemsData.begin();
|
|
|
|
|
i += index;
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
// If this item's data happened to be last selected, make it NULL.
|
|
|
|
|
if( m_LastSelection == *i )
|
|
|
|
|
m_LastSelection = NULL;
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
SAFE_DELETE( *i );
|
|
|
|
|
m_WheelBaseItemsData.erase(i);
|
2005-04-06 00:17:25 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
if( m_WheelBaseItemsData.size() < 1 )
|
|
|
|
|
{
|
|
|
|
|
m_isEmpty = true;
|
|
|
|
|
BuildWheelItemsData(m_WheelBaseItemsData);
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
2005-09-19 09:19:54 +00:00
|
|
|
|
|
|
|
|
RebuildWheelItems();
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
|
2005-04-06 00:17:25 +00:00
|
|
|
int WheelBase::FirstVisibleIndex()
|
|
|
|
|
{
|
2005-09-19 09:19:54 +00:00
|
|
|
// rewind to first index that will be displayed;
|
|
|
|
|
int iFirstVisibleIndex = m_iSelection;
|
|
|
|
|
if( m_iSelection > int(m_WheelBaseItemsData.size()-1) )
|
|
|
|
|
m_iSelection = 0;
|
|
|
|
|
|
|
|
|
|
// find the first wheel item shown
|
|
|
|
|
iFirstVisibleIndex -= NUM_WHEEL_ITEMS/2;
|
2005-03-27 03:56:10 +00:00
|
|
|
|
2005-09-19 09:19:54 +00:00
|
|
|
wrap( iFirstVisibleIndex, m_WheelBaseItemsData.size() );
|
|
|
|
|
return iFirstVisibleIndex;
|
2005-03-27 03:56:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* (c) 2001-2004 Chris Danford, Chris Gomez, Glenn Maynard, Josh Allen
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
|
* copy of this software and associated documentation files (the
|
|
|
|
|
* "Software"), to deal in the Software without restriction, including
|
|
|
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
|
|
|
|
* whom the Software is furnished to do so, provided that the above
|
|
|
|
|
* copyright notice(s) and this permission notice appear in all copies of
|
|
|
|
|
* the Software and that both the above copyright notice(s) and this
|
|
|
|
|
* permission notice appear in supporting documentation.
|
|
|
|
|
*
|
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
|
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
|
|
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
|
|
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
|
|
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
|
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
*/
|