mirror of
https://github.com/bulletphysics/bullet3
synced 2024-12-16 06:30:05 +00:00
138 lines
3.3 KiB
C++
138 lines
3.3 KiB
C++
/*
|
|
GWEN
|
|
Copyright (c) 2010 Facepunch Studios
|
|
See license in Gwen.h
|
|
*/
|
|
|
|
|
|
#include "Gwen/Controls/ScrollBar.h"
|
|
#include "Gwen/Controls/VerticalScrollBar.h"
|
|
|
|
using namespace Gwen;
|
|
using namespace Gwen::Controls;
|
|
|
|
GWEN_CONTROL_CONSTRUCTOR( VerticalScrollBar )
|
|
{
|
|
m_Bar->SetVertical();
|
|
|
|
m_ScrollButton[SCROLL_BUTTON_UP]->SetDirectionUp();
|
|
m_ScrollButton[SCROLL_BUTTON_UP]->onPress.Add( this, &VerticalScrollBar::NudgeUp );
|
|
|
|
m_ScrollButton[SCROLL_BUTTON_DOWN]->SetDirectionDown();
|
|
m_ScrollButton[SCROLL_BUTTON_DOWN]->onPress.Add( this, &VerticalScrollBar::NudgeDown );
|
|
|
|
m_Bar->onDragged.Add( this, &VerticalScrollBar::OnBarMoved );
|
|
}
|
|
|
|
void VerticalScrollBar::Layout( Skin::Base* skin )
|
|
{
|
|
BaseClass::Layout( skin );
|
|
|
|
m_ScrollButton[SCROLL_BUTTON_UP]->Dock(Pos::Top);
|
|
m_ScrollButton[SCROLL_BUTTON_UP]->SetHeight( Width() );
|
|
|
|
m_ScrollButton[SCROLL_BUTTON_DOWN]->Dock(Pos::Bottom);
|
|
m_ScrollButton[SCROLL_BUTTON_DOWN]->SetHeight( Width() );
|
|
|
|
m_Bar->SetWidth( GetButtonSize() );
|
|
//Add padding
|
|
m_Bar->SetPadding( Padding(0, GetButtonSize(), 0, GetButtonSize() ) );
|
|
|
|
//Calculate bar sizes
|
|
float barHeight = (m_fViewableContentSize / m_fContentSize) * (Height() - (GetButtonSize() * 2));
|
|
|
|
if ( barHeight < GetButtonSize() * 0.5 )
|
|
barHeight = GetButtonSize() * 0.5;
|
|
|
|
m_Bar->SetHeight(barHeight);
|
|
m_Bar->SetHidden( Height() - (GetButtonSize() * 2) <= barHeight );
|
|
|
|
if ( Hidden() )
|
|
SetScrolledAmount(0, true);
|
|
|
|
//Based on our last scroll amount, produce a position for the bar
|
|
if ( !m_Bar->IsDepressed() )
|
|
{
|
|
SetScrolledAmount( GetScrolledAmount(), true );
|
|
}
|
|
}
|
|
|
|
void VerticalScrollBar::ScrollToTop()
|
|
{
|
|
SetScrolledAmount(0, true);
|
|
}
|
|
void VerticalScrollBar::ScrollToBottom()
|
|
{
|
|
SetScrolledAmount(1, true);
|
|
}
|
|
void VerticalScrollBar::NudgeUp( Base* /*control*/ )
|
|
{
|
|
if ( !IsDisabled() )
|
|
SetScrolledAmount(GetScrolledAmount() - GetNudgeAmount(), true);
|
|
}
|
|
|
|
void VerticalScrollBar::NudgeDown( Base* /*control*/ )
|
|
{
|
|
if ( !IsDisabled() )
|
|
SetScrolledAmount(GetScrolledAmount() + GetNudgeAmount(), true);
|
|
}
|
|
|
|
float VerticalScrollBar::GetNudgeAmount()
|
|
{
|
|
if ( m_bDepressed )
|
|
return m_fViewableContentSize / m_fContentSize;
|
|
else
|
|
return BaseClass::GetNudgeAmount();
|
|
}
|
|
|
|
void VerticalScrollBar::OnMouseClickLeft( int x, int y, bool bDown )
|
|
{
|
|
if ( bDown )
|
|
{
|
|
m_bDepressed = true;
|
|
Gwen::MouseFocus = this;
|
|
}
|
|
else
|
|
{
|
|
Gwen::Point clickPos = CanvasPosToLocal( Gwen::Point( x, y ) );
|
|
if ( clickPos.y < m_Bar->Y() )
|
|
NudgeUp( this );
|
|
else if ( clickPos.y > m_Bar->Y() + m_Bar->Height() )
|
|
NudgeDown( this );
|
|
|
|
m_bDepressed = false;
|
|
Gwen::MouseFocus = NULL;
|
|
}
|
|
}
|
|
|
|
float VerticalScrollBar::CalculateScrolledAmount()
|
|
{
|
|
return (float)(m_Bar->Y() - GetButtonSize()) / (float)(Height() - m_Bar->Height() - (GetButtonSize() * 2 ));
|
|
}
|
|
|
|
bool VerticalScrollBar::SetScrolledAmount(float amount, bool forceUpdate)
|
|
{
|
|
amount = Gwen::Clamp( amount, 0, 1 );
|
|
|
|
if ( !BaseClass::SetScrolledAmount( amount, forceUpdate ) )
|
|
return false;
|
|
|
|
if ( forceUpdate )
|
|
{
|
|
int newY = GetButtonSize() + (amount * ((Height() - m_Bar->Height()) - (GetButtonSize()*2)));
|
|
m_Bar->MoveTo( m_Bar->X(), newY);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void VerticalScrollBar::OnBarMoved( Controls::Base* control )
|
|
{
|
|
if ( m_Bar->IsDepressed() )
|
|
{
|
|
SetScrolledAmount( CalculateScrolledAmount(), false );
|
|
BaseClass::OnBarMoved(control);
|
|
}
|
|
else
|
|
InvalidateParent();
|
|
} |