2003-12-27 07:26:03 +01:00
|
|
|
/*
|
|
|
|
IGUIScrollBar
|
|
|
|
by Gustav Larsson
|
|
|
|
gee@pyro.nu
|
|
|
|
*/
|
|
|
|
|
2004-06-03 20:38:14 +02:00
|
|
|
#include "precompiled.h"
|
2003-12-27 07:26:03 +01:00
|
|
|
#include "GUI.h"
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
2004-05-29 06:06:50 +02:00
|
|
|
CGUIScrollBarVertical::CGUIScrollBarVertical()
|
2003-12-27 07:26:03 +01:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2004-05-29 06:06:50 +02:00
|
|
|
CGUIScrollBarVertical::~CGUIScrollBarVertical()
|
2003-12-27 07:26:03 +01:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2004-05-29 06:06:50 +02:00
|
|
|
void CGUIScrollBarVertical::SetPosFromMousePos(const CPos &mouse)
|
2003-12-27 07:26:03 +01:00
|
|
|
{
|
2004-05-29 06:06:50 +02:00
|
|
|
if (!GetStyle())
|
|
|
|
return;
|
2003-12-27 07:26:03 +01:00
|
|
|
|
2004-05-29 13:59:59 +02:00
|
|
|
m_Pos = (int)(m_PosWhenPressed + (float)m_ScrollRange*((float)mouse.y-m_BarPressedAtPos.y)/(m_Length-GetStyle()->m_Width*2));
|
2004-05-29 06:06:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CGUIScrollBarVertical::Draw()
|
|
|
|
{
|
|
|
|
if (!GetStyle())
|
2003-12-27 07:26:03 +01:00
|
|
|
{
|
2004-05-29 06:06:50 +02:00
|
|
|
// TODO Gee: Report in error log
|
|
|
|
return;
|
|
|
|
}
|
2003-12-27 07:26:03 +01:00
|
|
|
|
2004-05-29 06:06:50 +02:00
|
|
|
if (GetGUI())
|
|
|
|
{
|
|
|
|
CRect outline = GetOuterRect();
|
|
|
|
|
|
|
|
// Draw background
|
|
|
|
GetGUI()->DrawSprite(GetStyle()->m_SpriteBackVertical, m_Z+0.1f,
|
|
|
|
CRect( outline.left,
|
|
|
|
outline.top+(m_UseEdgeButtons?GetStyle()->m_Width:0),
|
|
|
|
outline.right,
|
|
|
|
outline.bottom-(m_UseEdgeButtons?GetStyle()->m_Width:0))
|
|
|
|
);
|
|
|
|
|
|
|
|
if (m_UseEdgeButtons)
|
|
|
|
{
|
|
|
|
// Get Appropriate sprites
|
|
|
|
CStr button_top, button_bottom;
|
|
|
|
|
|
|
|
// figure out what sprite to use for top button
|
|
|
|
if (m_ButtonMinusHovered)
|
|
|
|
{
|
|
|
|
if (m_ButtonMinusPressed)
|
|
|
|
button_top = GUI<>::FallBackSprite(GetStyle()->m_SpriteButtonTopPressed, GetStyle()->m_SpriteButtonTop);
|
|
|
|
else
|
|
|
|
button_top = GUI<>::FallBackSprite(GetStyle()->m_SpriteButtonTopOver, GetStyle()->m_SpriteButtonTop);
|
|
|
|
}
|
|
|
|
else button_top = GetStyle()->m_SpriteButtonTop;
|
|
|
|
|
|
|
|
// figure out what sprite to use for top button
|
|
|
|
if (m_ButtonPlusHovered)
|
|
|
|
{
|
|
|
|
if (m_ButtonPlusPressed)
|
|
|
|
button_bottom = GUI<>::FallBackSprite(GetStyle()->m_SpriteButtonBottomPressed, GetStyle()->m_SpriteButtonBottom);
|
|
|
|
else
|
|
|
|
button_bottom = GUI<>::FallBackSprite(GetStyle()->m_SpriteButtonBottomOver, GetStyle()->m_SpriteButtonBottom);
|
|
|
|
}
|
|
|
|
else button_bottom = GetStyle()->m_SpriteButtonBottom;
|
|
|
|
|
|
|
|
// Draw top button
|
|
|
|
GetGUI()->DrawSprite(button_top,
|
|
|
|
m_Z+0.2f,
|
|
|
|
CRect(outline.left,
|
|
|
|
outline.top,
|
|
|
|
outline.right,
|
|
|
|
outline.top+GetStyle()->m_Width)
|
|
|
|
);
|
|
|
|
|
|
|
|
// Draw bottom button
|
|
|
|
GetGUI()->DrawSprite(button_bottom,
|
|
|
|
m_Z+0.2f,
|
|
|
|
CRect(outline.left,
|
|
|
|
outline.bottom-GetStyle()->m_Width,
|
|
|
|
outline.right,
|
|
|
|
outline.bottom)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Draw bar
|
|
|
|
if (m_BarPressed)
|
|
|
|
GetGUI()->DrawSprite(GUI<>::FallBackSprite(GetStyle()->m_SpriteBarVerticalPressed, GetStyle()->m_SpriteBarVertical),
|
|
|
|
m_Z+0.2f,
|
|
|
|
GetBarRect());
|
|
|
|
else
|
|
|
|
if (m_BarHovered)
|
|
|
|
GetGUI()->DrawSprite(GUI<>::FallBackSprite(GetStyle()->m_SpriteBarVerticalOver, GetStyle()->m_SpriteBarVertical),
|
|
|
|
m_Z+0.2f,
|
|
|
|
GetBarRect());
|
|
|
|
else
|
|
|
|
GetGUI()->DrawSprite(GetStyle()->m_SpriteBarVertical,
|
|
|
|
m_Z+0.2f,
|
|
|
|
GetBarRect());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGUIScrollBarVertical::HandleMessage(const SGUIMessage &Message)
|
|
|
|
{
|
|
|
|
IGUIScrollBar::HandleMessage(Message);
|
2003-12-27 07:26:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
CRect CGUIScrollBarVertical::GetBarRect() const
|
|
|
|
{
|
2004-05-29 06:06:50 +02:00
|
|
|
CRect ret;
|
|
|
|
if (!GetStyle())
|
|
|
|
return ret;
|
|
|
|
|
2003-12-27 07:26:03 +01:00
|
|
|
int size;
|
|
|
|
float from, to;
|
|
|
|
|
2004-05-29 06:06:50 +02:00
|
|
|
// is edge buttons used?
|
|
|
|
if (m_UseEdgeButtons)
|
|
|
|
{
|
|
|
|
size = (int)((m_Length-GetStyle()->m_Width*2)*m_BarSize);
|
|
|
|
if (size < GetStyle()->m_MinimumBarSize)
|
|
|
|
size = GetStyle()->m_MinimumBarSize;
|
|
|
|
|
|
|
|
from = (float)(m_Y+GetStyle()->m_Width);
|
|
|
|
to = (float)(m_Y+m_Length-GetStyle()->m_Width-size);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
size = (int)(m_Length*m_BarSize);
|
|
|
|
if (size < GetStyle()->m_MinimumBarSize)
|
|
|
|
size = GetStyle()->m_MinimumBarSize;
|
|
|
|
|
|
|
|
from = (float)(m_Y);
|
|
|
|
to = (float)(m_Y+m_Length-size);
|
|
|
|
}
|
2003-12-27 07:26:03 +01:00
|
|
|
|
|
|
|
// Setup rectangle
|
2004-05-29 06:06:50 +02:00
|
|
|
ret.top = (int)(from + (to-from)*((float)m_Pos/(float)(max(1,m_ScrollRange - m_ScrollSpace))));
|
2003-12-27 07:26:03 +01:00
|
|
|
ret.bottom = ret.top+size;
|
2004-05-29 06:06:50 +02:00
|
|
|
ret.right = m_X + ((m_RightAligned)?(0):(GetStyle()->m_Width));
|
|
|
|
ret.left = ret.right - GetStyle()->m_Width;
|
2003-12-27 07:26:03 +01:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2004-05-29 06:06:50 +02:00
|
|
|
CRect CGUIScrollBarVertical::GetOuterRect() const
|
2003-12-27 07:26:03 +01:00
|
|
|
{
|
2004-05-29 06:06:50 +02:00
|
|
|
CRect ret;
|
|
|
|
if (!GetStyle())
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
ret.top = m_Y;
|
|
|
|
ret.bottom = m_Y+m_Length;
|
|
|
|
ret.right = m_X + ((m_RightAligned)?(0):(GetStyle()->m_Width));
|
|
|
|
ret.left = ret.right - GetStyle()->m_Width;
|
2003-12-27 07:26:03 +01:00
|
|
|
|
2004-05-29 06:06:50 +02:00
|
|
|
return ret;
|
2003-12-27 07:26:03 +01:00
|
|
|
}
|
|
|
|
|
2004-05-29 06:06:50 +02:00
|
|
|
bool CGUIScrollBarVertical::HoveringButtonMinus(const CPos &mouse)
|
2003-12-27 07:26:03 +01:00
|
|
|
{
|
2004-05-29 06:06:50 +02:00
|
|
|
if (!GetStyle())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
int StartX = (m_RightAligned)?(m_X-GetStyle()->m_Width):(m_X);
|
|
|
|
|
|
|
|
return (mouse.x >= StartX &&
|
|
|
|
mouse.x <= StartX + GetStyle()->m_Width &&
|
|
|
|
mouse.y >= m_Y &&
|
|
|
|
mouse.y <= m_Y + GetStyle()->m_Width);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CGUIScrollBarVertical::HoveringButtonPlus(const CPos &mouse)
|
|
|
|
{
|
|
|
|
if (!GetStyle())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
int StartX = (m_RightAligned)?(m_X-GetStyle()->m_Width):(m_X);
|
2003-12-27 07:26:03 +01:00
|
|
|
|
2004-05-29 06:06:50 +02:00
|
|
|
return (mouse.x > StartX &&
|
|
|
|
mouse.x < StartX + GetStyle()->m_Width &&
|
|
|
|
mouse.y > m_Y + m_Length - GetStyle()->m_Width &&
|
|
|
|
mouse.y < m_Y + m_Length);
|
2003-12-27 07:26:03 +01:00
|
|
|
}
|