Files
eepp/src/ui/cuislider.cpp
2011-08-22 22:41:56 -03:00

345 lines
8.1 KiB
C++

#include "cuislider.hpp"
#include "cuimanager.hpp"
namespace EE { namespace UI {
cUISlider::cUISlider( const cUISlider::CreateParams& Params ) :
cUIComplexControl( Params ),
mVertical( Params.VerticalSlider ),
mAllowHalfSliderOut( Params.AllowHalfSliderOut ),
mExpandBackground( Params.ExpandBackground ),
mBackSlider( NULL ),
mSlider( NULL ),
mMinValue( 0.f ),
mMaxValue( 1.f ),
mValue( 0.f ),
mClickStep( 0.1f ),
mOnPosChange( false )
{
cUIControl::CreateParams BgParams;
BgParams.Parent( this );
if ( !mVertical )
BgParams.Size = eeSize( mSize.Width() - 16, 8 );
else
BgParams.Size = eeSize( 8, mSize.Width() - 16 );
mBackSlider = eeNew( cUIControlAnim, ( BgParams ) );
mBackSlider->Visible( true );
mBackSlider->Enabled( true );
mBackSlider->Center();
cUIDragable::CreateParams SlideParams;
SlideParams.Parent( this );
SlideParams.Size = eeSize( 16, 16 );
SlideParams.PosSet( eeVector2i( 0, 0 ) );
mSlider = eeNew( Private::cUISliderButton, ( SlideParams ) );
mSlider->Enabled( true );
mSlider->Visible( true );
mSlider->DragEnable( true );
if ( !mVertical )
mSlider->CenterVertical();
else
mSlider->CenterHorizontal();
ApplyDefaultTheme();
}
cUISlider::~cUISlider() {
}
Uint32 cUISlider::Type() const {
return UI_TYPE_SLIDER;
}
bool cUISlider::IsType( const Uint32& type ) const {
return cUISlider::Type() == type ? true : cUIComplexControl::IsType( type );
}
void cUISlider::SetTheme( cUITheme * Theme ) {
if ( !mVertical ) {
cUIControl::SetTheme( Theme, "hslider" );
mBackSlider->ForceThemeSkin( Theme, "hslider_bg" );
mSlider->ForceThemeSkin( Theme, "hslider_button" );
} else {
cUIControl::SetTheme( Theme, "vslider" );
mBackSlider->ForceThemeSkin( Theme, "vslider_bg" );
mSlider->ForceThemeSkin( Theme, "vslider_button" );
}
AdjustChilds();
Value( mValue );
}
void cUISlider::OnSizeChange() {
cUIComplexControl::OnSizeChange();
AdjustChilds();
}
void cUISlider::AdjustChilds() {
cShape * tShape = NULL;
cUISkin * tSkin = NULL;
tSkin = mSlider->GetSkin();
if ( NULL != tSkin ) {
tShape = tSkin->GetShape( cUISkinState::StateNormal );
if ( NULL != tShape ) {
mSlider->Size( tShape->RealSize() );
if ( !mVertical )
mSlider->CenterVertical();
else
mSlider->CenterHorizontal();
}
}
tSkin = mBackSlider->GetSkin();
if ( NULL != tSkin ) {
tShape = tSkin->GetShape( cUISkinState::StateNormal );
if ( NULL != tShape ) {
if ( !mVertical ) {
Int32 Height;
if ( mExpandBackground )
Height = mSize.Height();
else
Height = tShape->RealSize().Height();
if ( mAllowHalfSliderOut )
mBackSlider->Size( eeSize( mSize.Width() - mSlider->Size().Width(), Height ) );
else
mBackSlider->Size( eeSize( mSize.Width(), Height ) );
} else {
Int32 Width;
if ( mExpandBackground )
Width = mSize.Width();
else
Width = tShape->RealSize().Width();
if ( mAllowHalfSliderOut )
mBackSlider->Size( eeSize( Width, mSize.Height() - mSlider->Size().Height() ) );
else
mBackSlider->Size( eeSize( Width, mSize.Height() ) );
}
mBackSlider->Center();
}
}
}
void cUISlider::FixSliderPos() {
if ( !mOnPosChange ) {
mOnPosChange = true;
if ( !mVertical ) {
mSlider->Pos( mSlider->Pos().x, 0 );
if ( mSlider->Pos().x < 0 )
mSlider->Pos( 0, 0 );
if ( mAllowHalfSliderOut ) {
if ( mSlider->Pos().x > mBackSlider->Size().Width() )
mSlider->Pos( mBackSlider->Size().Width(), 0 );
} else {
if ( mSlider->Pos().x > mBackSlider->Size().Width() - mSlider->Size().Width() )
mSlider->Pos( mBackSlider->Size().Width() - mSlider->Size().Width(), 0 );
}
mSlider->CenterVertical();
if ( mAllowHalfSliderOut )
Value( mMinValue + (eeFloat)mSlider->Pos().x * ( mMaxValue - mMinValue ) / (eeFloat)mBackSlider->Size().Width() );
else
Value( mMinValue + (eeFloat)mSlider->Pos().x * ( mMaxValue - mMinValue ) / ( (eeFloat)mSize.Width() - mSlider->Size().Width() ) );
} else {
mSlider->Pos( 0, mSlider->Pos().y );
if ( mSlider->Pos().y < 0 )
mSlider->Pos( 0, 0 );
if ( mAllowHalfSliderOut ) {
if ( mSlider->Pos().y > mBackSlider->Size().Height() )
mSlider->Pos( 0, mBackSlider->Size().Height() );
} else {
if ( mSlider->Pos().y > mBackSlider->Size().Height() - mSlider->Size().Height() )
mSlider->Pos( 0, mBackSlider->Size().Height() - mSlider->Size().Height() );
}
mSlider->CenterHorizontal();
if ( mAllowHalfSliderOut )
Value( mMinValue + (eeFloat)mSlider->Pos().y * ( mMaxValue - mMinValue ) / (eeFloat)mBackSlider->Size().Height() );
else
Value( mMinValue + (eeFloat)mSlider->Pos().y * ( mMaxValue - mMinValue ) / ( (eeFloat)mSize.Height() - mSlider->Size().Height() ) );
}
mOnPosChange = false;
}
}
void cUISlider::Value( eeFloat Val ) {
if ( Val < mMinValue ) Val = mMinValue;
if ( Val > mMaxValue ) Val = mMaxValue;
if ( Val >= mMinValue && Val <= mMaxValue ) {
mValue = Val;
if ( !mOnPosChange ) {
eeFloat Percent = ( Val - mMinValue ) / ( mMaxValue - mMinValue );
mOnPosChange = true;
if ( !mVertical ) {
if ( mAllowHalfSliderOut )
mSlider->Pos( (Int32)( (eeFloat)mBackSlider->Size().Width() * Percent ), mSlider->Pos().y );
else
mSlider->Pos( (Int32)( ( (eeFloat)mSize.Width() - mSlider->Size().Width() ) * Percent ), mSlider->Pos().y );
} else {
if ( mAllowHalfSliderOut )
mSlider->Pos( mSlider->Pos().x, (Int32)( (eeFloat)mBackSlider->Size().Height() * Percent ) );
else
mSlider->Pos( mSlider->Pos().x, (Int32)( ( (eeFloat)mSize.Height() - mSlider->Size().Height() ) * Percent ) );
}
mOnPosChange = false;
}
OnValueChange();
}
}
const eeFloat& cUISlider::Value() const {
return mValue;
}
void cUISlider::MinValue( const eeFloat& MinVal ) {
mMinValue = MinVal;
if ( mValue < mMinValue )
mValue = mMinValue;
FixSliderPos();
}
const eeFloat& cUISlider::MinValue() const {
return mMinValue;
}
void cUISlider::MaxValue( const eeFloat& MaxVal ) {
mMaxValue = MaxVal;
if ( mValue > mMaxValue )
mValue = mMaxValue;
FixSliderPos();
}
const eeFloat& cUISlider::MaxValue() const {
return mMaxValue;
}
void cUISlider::ClickStep( const eeFloat& step ) {
mClickStep = step;
}
const eeFloat& cUISlider::ClickStep() const {
return mClickStep;
}
const bool& cUISlider::IsVertical() const {
return mVertical;
}
void cUISlider::Update() {
cUIControlAnim::Update();
if ( IsMouseOver() || mBackSlider->IsMouseOver() || mSlider->IsMouseOver() ) {
ManageClick( cUIManager::instance()->GetInput()->ClickTrigger() );
}
}
Uint32 cUISlider::OnKeyDown( const cUIEventKey &Event ) {
if ( eeGetTicks() - mLastTickMove > 100 ) {
if ( Event.KeyCode() == KEY_DOWN ) {
mLastTickMove = eeGetTicks();
Value( mValue + mClickStep );
} else if ( Event.KeyCode() == KEY_UP ) {
mLastTickMove = eeGetTicks();
Value( mValue - mClickStep );
} else if ( Event.KeyCode() == KEY_PAGEUP ) {
mLastTickMove = eeGetTicks();
Value( mMinValue );
} else if ( Event.KeyCode() == KEY_PAGEDOWN ) {
mLastTickMove = eeGetTicks();
Value( mMaxValue );
}
}
return cUIComplexControl::OnKeyDown( Event );
}
void cUISlider::ManageClick( const Uint32& Flags ) {
if ( Flags ) {
eeVector2i ControlPos = cUIManager::instance()->GetMousePos();
mSlider->ScreenToControl( ControlPos );
if ( Flags & EE_BUTTON_LMASK && !mSlider->IsMouseOver() ) {
if ( !mVertical ) {
if ( ControlPos.x < 0 )
Value( mValue - mClickStep );
else
Value( mValue + mClickStep );
} else {
if ( ControlPos.y < 0 )
Value( mValue - mClickStep );
else
Value( mValue + mClickStep );
}
} else if ( Flags & EE_BUTTONS_WUWD ) {
if ( Flags & EE_BUTTON_WUMASK )
Value( mValue - mClickStep );
else
Value( mValue + mClickStep );
}
}
}
cUIControl * cUISlider::GetBackSlider() const {
return mBackSlider;
}
cUIDragable * cUISlider::GetSliderButton() const {
return mSlider;
}
const bool& cUISlider::AllowHalfSliderOut() const {
return mAllowHalfSliderOut;
}
const bool& cUISlider::ExpandBackground() const {
return mExpandBackground;
}
void cUISlider::OnAlphaChange() {
cUIControlAnim::OnAlphaChange();
mBackSlider->Alpha( mAlpha );
mSlider->Alpha( mAlpha );
}
}}