211 lines
4.6 KiB
C++
211 lines
4.6 KiB
C++
#include "ScrollPanel.h"
|
|
#include "Engine.h"
|
|
|
|
#include "graphics/Graphics.h"
|
|
|
|
#include "common/tpt-minmax.h"
|
|
|
|
#include "client/Client.h"
|
|
|
|
using namespace ui;
|
|
|
|
ScrollPanel::ScrollPanel(Point position, Point size):
|
|
Panel(position, size),
|
|
scrollBarWidth(0),
|
|
maxOffset(0, 0),
|
|
offsetX(0),
|
|
offsetY(0),
|
|
yScrollVel(0.0f),
|
|
xScrollVel(0.0f),
|
|
isMouseInsideScrollbar(false),
|
|
isMouseInsideScrollbarArea(false),
|
|
scrollbarSelected(false),
|
|
scrollbarInitialYOffset(0),
|
|
scrollbarInitialYClick(0),
|
|
scrollbarClickLocation(0)
|
|
{
|
|
}
|
|
|
|
int ScrollPanel::GetScrollLimit()
|
|
{
|
|
if (ViewportPosition.Y == 0)
|
|
return -1;
|
|
else if (maxOffset.Y == -ViewportPosition.Y)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
void ScrollPanel::SetScrollPosition(int position)
|
|
{
|
|
offsetY = position;
|
|
ViewportPosition.Y = -position;
|
|
}
|
|
|
|
void ScrollPanel::XOnMouseWheelInside(int localx, int localy, int d)
|
|
{
|
|
if (!d)
|
|
return;
|
|
if (ui::Engine::Ref().GetMomentumScroll())
|
|
yScrollVel -= d * 2;
|
|
else
|
|
yScrollVel -= d * 20;
|
|
}
|
|
|
|
void ScrollPanel::Draw(const Point& screenPos)
|
|
{
|
|
Panel::Draw(screenPos);
|
|
|
|
Graphics * g = GetGraphics();
|
|
|
|
//Vertical scroll bar
|
|
if (maxOffset.Y>0 && InnerSize.Y>0)
|
|
{
|
|
float scrollHeight = float(Size.Y)*(float(Size.Y)/float(InnerSize.Y));
|
|
float scrollPos = 0;
|
|
if (-ViewportPosition.Y>0)
|
|
{
|
|
scrollPos = float(Size.Y-scrollHeight)*(float(offsetY)/float(maxOffset.Y));
|
|
}
|
|
|
|
g->fillrect(screenPos.X+(Size.X-scrollBarWidth), screenPos.Y, scrollBarWidth, Size.Y, 125, 125, 125, 100);
|
|
g->fillrect(screenPos.X+(Size.X-scrollBarWidth), screenPos.Y+scrollPos, scrollBarWidth, scrollHeight+1, 255, 255, 255, 255);
|
|
}
|
|
}
|
|
|
|
void ScrollPanel::XOnMouseClick(int x, int y, unsigned int button)
|
|
{
|
|
if (isMouseInsideScrollbar)
|
|
{
|
|
scrollbarSelected = true;
|
|
scrollbarInitialYOffset = offsetY;
|
|
}
|
|
scrollbarInitialYClick = y;
|
|
scrollbarClickLocation = 100;
|
|
}
|
|
|
|
void ScrollPanel::XOnMouseUp(int x, int y, unsigned int button)
|
|
{
|
|
scrollbarSelected = false;
|
|
isMouseInsideScrollbarArea = false;
|
|
scrollbarClickLocation = 0;
|
|
}
|
|
|
|
void ScrollPanel::XOnMouseMoved(int x, int y, int dx, int dy)
|
|
{
|
|
if(maxOffset.Y>0 && InnerSize.Y>0)
|
|
{
|
|
float scrollHeight = float(Size.Y)*(float(Size.Y)/float(InnerSize.Y));
|
|
float scrollPos = 0;
|
|
if (-ViewportPosition.Y>0)
|
|
{
|
|
scrollPos = float(Size.Y-scrollHeight)*(float(offsetY)/float(maxOffset.Y));
|
|
}
|
|
|
|
if (scrollbarSelected)
|
|
{
|
|
if (x > 0)
|
|
{
|
|
int scrollY = float(y-scrollbarInitialYClick)/float(Size.Y)*float(InnerSize.Y)+scrollbarInitialYOffset;
|
|
ViewportPosition.Y = -scrollY;
|
|
offsetY = scrollY;
|
|
}
|
|
else
|
|
{
|
|
ViewportPosition.Y = -scrollbarInitialYOffset;
|
|
offsetY = scrollbarInitialYOffset;
|
|
}
|
|
}
|
|
|
|
if (x > (Size.X-scrollBarWidth) && x < (Size.X-scrollBarWidth)+scrollBarWidth)
|
|
{
|
|
if (y > scrollPos && y < scrollPos+scrollHeight)
|
|
isMouseInsideScrollbar = true;
|
|
isMouseInsideScrollbarArea = true;
|
|
}
|
|
else
|
|
isMouseInsideScrollbar = false;
|
|
}
|
|
}
|
|
|
|
void ScrollPanel::XTick(float dt)
|
|
{
|
|
if (xScrollVel > 7.0f) xScrollVel = 7.0f;
|
|
if (xScrollVel < -7.0f) xScrollVel = -7.0f;
|
|
if (xScrollVel > -0.5f && xScrollVel < 0.5)
|
|
xScrollVel = 0;
|
|
|
|
maxOffset = InnerSize-Size;
|
|
maxOffset.Y = std::max(0, maxOffset.Y);
|
|
maxOffset.X = std::max(0, maxOffset.X);
|
|
|
|
int oldOffsetY = offsetY;
|
|
offsetY += yScrollVel;
|
|
offsetX += xScrollVel;
|
|
|
|
|
|
if (ui::Engine::Ref().GetMomentumScroll())
|
|
{
|
|
if (yScrollVel > -0.5f && yScrollVel < 0.5)
|
|
yScrollVel = 0;
|
|
yScrollVel *= 0.98f;
|
|
}
|
|
else
|
|
{
|
|
yScrollVel = 0.0f;
|
|
}
|
|
|
|
xScrollVel*=0.98f;
|
|
|
|
if (oldOffsetY!=int(offsetY))
|
|
{
|
|
if (offsetY<0)
|
|
{
|
|
offsetY = 0;
|
|
yScrollVel = 0;
|
|
}
|
|
else if (offsetY>maxOffset.Y)
|
|
{
|
|
offsetY = maxOffset.Y;
|
|
yScrollVel = 0;
|
|
}
|
|
ViewportPosition.Y = -offsetY;
|
|
}
|
|
else
|
|
{
|
|
if (offsetY<0)
|
|
{
|
|
offsetY = 0;
|
|
yScrollVel = 0;
|
|
ViewportPosition.Y = -offsetY;
|
|
}
|
|
else if (offsetY>maxOffset.Y)
|
|
{
|
|
offsetY = maxOffset.Y;
|
|
ViewportPosition.Y = -offsetY;
|
|
}
|
|
}
|
|
|
|
if (mouseInside && scrollBarWidth < 6)
|
|
scrollBarWidth++;
|
|
else if (!mouseInside && scrollBarWidth > 0 && !scrollbarSelected)
|
|
scrollBarWidth--;
|
|
|
|
if (isMouseInsideScrollbarArea && scrollbarClickLocation && !scrollbarSelected)
|
|
{
|
|
float scrollHeight = float(Size.Y)*(float(Size.Y)/float(InnerSize.Y));
|
|
float scrollPos = 0;
|
|
if (-ViewportPosition.Y > 0)
|
|
scrollPos = float(Size.Y-scrollHeight)*(float(offsetY)/float(maxOffset.Y));
|
|
|
|
if (scrollbarInitialYClick <= scrollPos)
|
|
scrollbarClickLocation = -1;
|
|
else if (scrollbarInitialYClick >= scrollPos+scrollHeight)
|
|
scrollbarClickLocation = 1;
|
|
else
|
|
scrollbarClickLocation = 0;
|
|
|
|
offsetY += scrollbarClickLocation*scrollHeight/10;
|
|
ViewportPosition.Y -= scrollbarClickLocation*scrollHeight/10;
|
|
}
|
|
}
|