mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-05-29 17:46:29 +03:00
345 lines
8.1 KiB
C++
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 );
|
|
}
|
|
|
|
}}
|