nuclide/Source/vgui/ui_scrollbar.cpp

245 lines
8 KiB
C++

/***
*
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
*
* See the file LICENSE attached with the sources for usage details.
*
****/
enumflags
{
SCROLLBAR_VISIBLE,
SCROLLBAR_UP_DOWN,
SCROLLBAR_DN_DOWN,
SCROLLBAR_SLIDER_DOWN
};
class CUIScrollbar : CUIWidget
{
vector m_vecColor;
float m_flAlpha;
int m_iLength;
float m_flMin;
float m_flMax;
float m_flStep;
float m_flValue;
void() CUIScrollbar;
virtual void() m_vChangedCB = 0;
virtual void( int ) SetLength;
virtual int() GetLength;
virtual void( float ) SetMin;
virtual float() GetMin;
virtual void( float ) SetMax;
virtual float() GetMax;
virtual void( float ) SetStep;
virtual float() GetStep;
virtual void( float, int ) SetValue;
virtual float() GetValue;
virtual void( void() ) CallOnChange;
virtual void( float, float, float, float ) Input;
virtual void() Draw;
};
void CUIScrollbar :: CUIScrollbar ( void )
{
m_vecColor = UI_MAINCOLOR;
m_flAlpha = 1.0f;
m_iFlags = SCROLLBAR_VISIBLE;
}
void CUIScrollbar :: Draw ( void )
{
vector vecSize = [ 20, m_iLength ];
#ifndef CLASSIC_VGUI
drawfill( m_parent.m_vecOrigin + m_vecOrigin, m_vecSize, m_vecColor, m_flAlpha );
if ( m_iFlags & BUTTON_DOWN ) {
drawfill( m_parent.m_vecOrigin + m_vecOrigin + [ 0, vecSize[1] - 1], [vecSize[0], 1], '1 1 1', 0.5f );
drawfill( m_parent.m_vecOrigin + m_vecOrigin, [vecSize[0], 1], '0 0 0', 0.5f );
drawfill( m_parent.m_vecOrigin + m_vecOrigin + [ 0, 1], [1, vecSize[1] - 2], '0 0 0', 0.5f );
drawfill( m_parent.m_vecOrigin + m_vecOrigin + [ vecSize[0] - 1, 1], [1, vecSize[1] - 2], '1 1 1', 0.5f );
} else {
drawfill( m_parent.m_vecOrigin + m_vecOrigin + [ 0, vecSize[1] - 1], [vecSize[0], 1], '0 0 0', 0.5f );
drawfill( m_parent.m_vecOrigin + m_vecOrigin, [vecSize[0], 1], '1 1 1', 0.5f );
drawfill( m_parent.m_vecOrigin + m_vecOrigin + [ 0, 1], [1, vecSize[1] - 2], '1 1 1', 0.5f );
drawfill( m_parent.m_vecOrigin + m_vecOrigin + [ vecSize[0] - 1, 1], [1, vecSize[1] - 2], '0 0 0', 0.5f );
}
#else
drawfill( m_parent.m_vecOrigin + m_vecOrigin + [ 0, vecSize[1] - 1], [vecSize[0], 1], m_vecColor, 1.0f );
drawfill( m_parent.m_vecOrigin + m_vecOrigin, [vecSize[0], 1], m_vecColor, 1.0f );
drawfill( m_parent.m_vecOrigin + m_vecOrigin + [ 0, 1], [1, vecSize[1] - 2], m_vecColor, 1.0f );
drawfill( m_parent.m_vecOrigin + m_vecOrigin + [ vecSize[0] - 1, 1], [1, vecSize[1] - 2], m_vecColor, 1.0f );
#endif
vector vecUpPos = m_parent.m_vecOrigin + m_vecOrigin;
vector vecDownPos = m_parent.m_vecOrigin + m_vecOrigin + [ 0, m_iLength - 20 ];
vector vecSliderPos = m_parent.m_vecOrigin + m_vecOrigin + [ 0, 20 ];
vecSliderPos[1] += ( m_iLength - 60 ) * ( m_flValue / m_flMax );
// Slider Button
drawfill( vecSliderPos, '20 20', m_vecColor, m_flAlpha );
if ( m_iFlags & SCROLLBAR_SLIDER_DOWN ) {
drawfill( vecSliderPos, [20, 1], '0 0 0', 0.5f );
drawfill( vecSliderPos + [ 0, 19], [20, 1], '1 1 1', 0.5f );
drawfill( vecSliderPos + [ 0, 1], [1, 18], '0 0 0', 0.5f );
drawfill( vecSliderPos + [ 19, 1], [1, 18], '1 1 1', 0.5f );
} else {
drawfill( vecSliderPos, [20, 1], '1 1 1', 0.5f );
drawfill( vecSliderPos + [ 0, 19], [20, 1], '0 0 0', 0.5f );
drawfill( vecSliderPos + [ 0, 1], [1, 18], '1 1 1', 0.5f );
drawfill( vecSliderPos + [ 19, 1], [1, 18], '0 0 0', 0.5f );
}
// Button UP
#ifndef CLASSIC_VGUI
drawfill( vecUpPos, '20 20', m_vecColor, m_flAlpha );
if ( m_iFlags & SCROLLBAR_UP_DOWN ) {
drawfill( vecUpPos, [20, 1], '0 0 0', 0.5f );
drawfill( vecUpPos + [ 0, 19], [20, 1], '1 1 1', 0.5f );
drawfill( vecUpPos + [ 0, 1], [1, 18], '0 0 0', 0.5f );
drawfill( vecUpPos + [ 19, 1], [1, 18], '1 1 1', 0.5f );
} else {
drawfill( vecUpPos, [20, 1], '1 1 1', 0.5f );
drawfill( vecUpPos + [ 0, 19], [20, 1], '0 0 0', 0.5f );
drawfill( vecUpPos + [ 0, 1], [1, 18], '1 1 1', 0.5f );
drawfill( vecUpPos + [ 19, 1], [1, 18], '0 0 0', 0.5f );
}
drawpic( vecUpPos + '2 2', "textures/ui/steam/icon_up", '16 16', '1 1 1', 1.0f );
#else
if ( m_iFlags & SCROLLBAR_UP_DOWN ) {
drawfill( vecUpPos, '20 20', m_vecColor, 0.25f );
drawfill( vecUpPos, [20, 1], m_vecColor, 1.0f );
drawfill( vecUpPos + [ 0, 19], [20, 1], m_vecColor, 1.0f );
drawfill( vecUpPos + [ 0, 1], [1, 18], m_vecColor, 1.0f );
drawfill( vecUpPos + [ 19, 1], [1, 18], m_vecColor, 1.0f );
} else {
drawfill( vecUpPos, [20, 1], '1 1 1', 0.5f );
drawfill( vecUpPos + [ 0, 19], [20, 1], m_vecColor, 1.0f );
drawfill( vecUpPos + [ 0, 1], [1, 18], m_vecColor, 1.0f );
drawfill( vecUpPos + [ 19, 1], [1, 18], m_vecColor, 1.0f );
}
drawpic( vecUpPos + '2 2', "textures/ui/steam/icon_up", '16 16', m_vecColor, 1.0f );
#endif
// Button DOWN
#ifndef CLASSIC_VGUI
drawfill( vecDownPos, '20 20', m_vecColor, m_flAlpha );
if ( m_iFlags & SCROLLBAR_DN_DOWN ) {
drawfill( vecDownPos, [20, 1], '0 0 0', 0.5f );
drawfill( vecDownPos + [ 0, 19], [20, 1], '1 1 1', 0.5f );
drawfill( vecDownPos + [ 0, 1], [1, 18], '0 0 0', 0.5f );
drawfill( vecDownPos + [ 19, 1], [1, 18], '1 1 1', 0.5f );
} else {
drawfill( vecDownPos, [20, 1], '1 1 1', 0.5f );
drawfill( vecDownPos+ [ 0, 19], [20, 1], '0 0 0', 0.5f );
drawfill( vecDownPos + [ 0, 1], [1, 18], '1 1 1', 0.5f );
drawfill( vecDownPos + [ 19, 1], [1, 18], '0 0 0', 0.5f );
}
drawpic( vecDownPos + '2 2', "textures/ui/steam/icon_down", '16 16', '1 1 1', 1.0f );
#else
if ( m_iFlags & SCROLLBAR_DN_DOWN ) {
drawfill( vecDownPos, '20 20', m_vecColor, 0.25f );
drawfill( vecDownPos, [20, 1], m_vecColor, 1.0f );
drawfill( vecDownPos + [ 0, 19], [20, 1], m_vecColor, 1.0f );
drawfill( vecDownPos + [ 0, 1], [1, 18], m_vecColor, 1.0f );
drawfill( vecDownPos + [ 19, 1], [1, 18], m_vecColor, 1.0f );
} else {
drawfill( vecDownPos, [20, 1], m_vecColor, 1.0f );
drawfill( vecDownPos+ [ 0, 19], [20, 1], m_vecColor, 1.0f );
drawfill( vecDownPos + [ 0, 1], [1, 18], m_vecColor, 1.0f );
drawfill( vecDownPos + [ 19, 1], [1, 18], m_vecColor, 1.0f );
}
drawpic( vecDownPos + '2 2', "textures/ui/steam/icon_down", '16 16', m_vecColor, 1.0f );
#endif
}
void CUIScrollbar :: Input ( float flEVType, float flKey, float flChar, float flDevID )
{
vector vecUpPos = m_parent.m_vecOrigin + m_vecOrigin;
vector vecDownPos = m_parent.m_vecOrigin + m_vecOrigin + [ 0, m_iLength - 20 ];
if ( flEVType == IE_KEYDOWN ) {
if ( flKey == K_MOUSE1 ) {
if ( Util_MouseAbove( getmousepos(), vecUpPos, '20 20' ) ) {
m_iFlags |= SCROLLBAR_UP_DOWN;
} else if ( Util_MouseAbove( getmousepos(), vecDownPos, '20 20' ) ) {
m_iFlags |= SCROLLBAR_DN_DOWN;
}
}
} else if ( flEVType == IE_KEYUP ) {
if ( flKey == K_MOUSE1 ) {
if ( m_iFlags & SCROLLBAR_UP_DOWN && Util_MouseAbove( getmousepos(), vecUpPos, '20 20' ) ) {
SetValue( GetValue() - GetStep(), TRUE );
} else if ( m_iFlags & SCROLLBAR_DN_DOWN && Util_MouseAbove( getmousepos(), vecDownPos, '20 20' ) ) {
SetValue( GetValue() + GetStep(), TRUE );
}
m_iFlags -= ( m_iFlags & SCROLLBAR_UP_DOWN );
m_iFlags -= ( m_iFlags & SCROLLBAR_DN_DOWN );
} else if ( flKey == K_MWHEELDOWN && Util_MouseAbove( getmousepos(), m_parent.m_vecOrigin + m_vecOrigin, [ 20, m_iLength ] ) ) {
SetValue( GetValue() + GetStep(), TRUE );
} else if ( flKey == K_MWHEELUP && Util_MouseAbove( getmousepos(), m_parent.m_vecOrigin + m_vecOrigin, [ 20, m_iLength ] ) ) {
SetValue( GetValue() - GetStep(), TRUE );
}
}
}
void CUIScrollbar :: SetLength ( int iLength )
{
m_iLength = iLength;
}
int CUIScrollbar :: GetLength ( void )
{
return m_iLength;
}
void CUIScrollbar :: SetMin ( float flVal )
{
m_flMin = flVal;
}
float CUIScrollbar :: GetMin ( void )
{
return m_flMin;
}
void CUIScrollbar :: SetMax ( float flVal )
{
m_flMax = flVal;
}
float CUIScrollbar :: GetMax ( void )
{
return m_flMax;
}
void CUIScrollbar :: SetStep ( float flVal )
{
m_flStep = flVal;
}
float CUIScrollbar :: GetStep ( void )
{
return m_flStep;
}
void CUIScrollbar :: SetValue ( float flVal, int iCallBack )
{
m_flValue = bound( m_flMin, flVal, m_flMax );
if ( m_vChangedCB && iCallBack ) {
m_vChangedCB();
}
}
float CUIScrollbar :: GetValue ( void )
{
return m_flValue;
}
void CUIScrollbar :: CallOnChange ( void() vFunc )
{
m_vChangedCB = vFunc;
}