source-engine/game/gamepadui/gamepadui_scrollbar.cpp
2024-04-13 19:58:55 +03:00

161 lines
3.9 KiB
C++

#include "gamepadui_scrollbar.h"
#include "vgui/IInput.h"
void GamepadUIScrollBar::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
GetPos( m_nStartX, m_nStartY );
if (m_bHorizontal)
{
m_flScrollSize = m_flWidth;
}
else
{
m_flScrollSize = m_flHeight;
}
}
void GamepadUIScrollBar::OnThink()
{
BaseClass::OnThink();
if (!m_pScrollState)
return;
if (m_nMouseOffset != -1)
{
int nMouseX, nMouseY;
vgui::input()->GetCursorPos( nMouseX, nMouseY );
if (m_bHorizontal)
{
float flRatio = ((float)((nMouseX - m_nStartX) - m_nMouseOffset)) / m_flScrollSize;
m_pScrollState->SetScrollTarget( flRatio * m_flMax, GamepadUI::GetInstance().GetTime() );
}
else
{
float flRatio = ((float)((nMouseY - m_nStartY) - m_nMouseOffset)) / m_flScrollSize;
m_pScrollState->SetScrollTarget( flRatio * m_flMax, GamepadUI::GetInstance().GetTime() );
}
}
else if (m_flKeyDir != 0)
{
m_pScrollState->SetScrollTarget( m_pScrollState->GetScrollProgress() + m_flKeyDir, GamepadUI::GetInstance().GetTime() );
}
if (m_flMax > 0.0f)
{
if (m_bHorizontal)
{
int nX = m_nStartX + (m_flScrollSize * ((m_pScrollState->GetScrollProgress() - m_flMin) / m_flMax));
SetPos( nX, m_nStartY );
}
else
{
int nY = m_nStartY + (m_flScrollSize * ((m_pScrollState->GetScrollProgress() - m_flMin) / m_flMax));
SetPos( m_nStartX, nY );
}
}
}
void GamepadUIScrollBar::InitScrollBar( GamepadUIScrollState *pScrollState, int nX, int nY )
{
m_pScrollState = pScrollState;
m_nStartX = nX;
m_nStartY = nY;
}
void GamepadUIScrollBar::UpdateScrollBounds( float flMin, float flMax, float flRegionSize, float flScrollSize )
{
if (flMin == 0.0f && flMax == 0.0f)
{
SetVisible( false );
m_pScrollState = NULL;
return;
}
SetVisible( true );
m_flMin = flMin;
m_flMax = flMax;
m_flRegionSize = flRegionSize;
if (m_bHorizontal)
{
m_flWidth = flScrollSize * (m_flRegionSize / (m_flMax + m_flRegionSize));
for (int i = 0; i < ButtonStates::Count; i++)
m_flWidthAnimationValue[i] = m_flWidth;
m_flScrollSize = flScrollSize - m_flWidth;
}
else
{
m_flHeight = flScrollSize * (m_flRegionSize / (m_flMax + m_flRegionSize));
for (int i = 0; i < ButtonStates::Count; i++)
m_flHeightAnimationValue[i] = m_flHeight;
m_flScrollSize = flScrollSize - m_flHeight;
}
}
void GamepadUIScrollBar::OnMousePressed( vgui::MouseCode code )
{
BaseClass::OnMousePressed( code );
int nX, nY;
GetPos( nX, nY );
int nMouseX, nMouseY;
vgui::input()->GetCursorPos( nMouseX, nMouseY );
m_nMouseOffset = (m_bHorizontal ? nMouseX - nX : nMouseY - nY);
}
void GamepadUIScrollBar::OnMouseReleased( vgui::MouseCode code )
{
BaseClass::OnMouseReleased( code );
m_nMouseOffset = -1;
}
void GamepadUIScrollBar::OnKeyCodePressed( vgui::KeyCode code )
{
ButtonCode_t buttonCode = GetBaseButtonCode( code );
switch ( buttonCode )
{
case KEY_UP:
case KEY_XBUTTON_UP:
m_flKeyDir = -m_flScrollSpeed;
break;
case KEY_DOWN:
case KEY_XBUTTON_DOWN:
m_flKeyDir = m_flScrollSpeed;
break;
default:
return BaseClass::OnKeyCodePressed( code );
}
}
void GamepadUIScrollBar::OnKeyCodeReleased( vgui::KeyCode code )
{
ButtonCode_t buttonCode = GetBaseButtonCode( code );
switch ( buttonCode )
{
case KEY_UP:
case KEY_XBUTTON_UP:
case KEY_DOWN:
case KEY_XBUTTON_DOWN:
m_flKeyDir = 0;
break;
default:
return BaseClass::OnKeyCodeReleased( code );
}
}