summaryrefslogtreecommitdiff
path: root/src/interface/ScrollPanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/interface/ScrollPanel.cpp')
-rw-r--r--src/interface/ScrollPanel.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/interface/ScrollPanel.cpp b/src/interface/ScrollPanel.cpp
new file mode 100644
index 0000000..36ce5f8
--- /dev/null
+++ b/src/interface/ScrollPanel.cpp
@@ -0,0 +1,117 @@
+#include <iostream>
+#include "ScrollPanel.h"
+
+using namespace ui;
+
+ScrollPanel::ScrollPanel(Point position, Point size):
+ Panel(position, size),
+ maxOffset(0, 0),
+ offsetX(0),
+ offsetY(0),
+ yScrollVel(0.0f),
+ xScrollVel(0.0f),
+ scrollBarWidth(0)
+{
+
+}
+
+int ScrollPanel::GetScrollLimit()
+{
+ if(maxOffset.Y == -ViewportPosition.Y)
+ return 1;
+ else if(ViewportPosition.Y == 0)
+ return -1;
+ return 0;
+}
+
+void ScrollPanel::XOnMouseWheelInside(int localx, int localy, int d)
+{
+ if(!d)
+ return;
+ yScrollVel -= d;
+}
+
+void ScrollPanel::XDraw(const Point& screenPos)
+{
+ Graphics * g = ui::Engine::Ref().g;
+
+ //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, 255, 255, 255, 55);
+ g->fillrect(screenPos.X+(Size.X-scrollBarWidth), screenPos.Y+scrollPos, scrollBarWidth, scrollHeight, 255, 255, 255, 255);
+ }
+}
+
+void ScrollPanel::XTick(float dt)
+{
+ if(yScrollVel > 7.0f) yScrollVel = 7.0f;
+ if(yScrollVel < -7.0f) yScrollVel = -7.0f;
+ if(yScrollVel > -0.5f && yScrollVel < 0.5)
+ yScrollVel = 0;
+
+ 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;
+
+ int oldOffsetY = offsetY;
+ offsetY += yScrollVel;
+ int oldOffsetX = offsetX;
+ offsetX += xScrollVel;
+
+ yScrollVel*=0.99f;
+ xScrollVel*=0.99f;
+
+ if(oldOffsetY!=int(offsetY))
+ {
+ if(offsetY<0)
+ {
+ offsetY = 0;
+ yScrollVel = 0;
+ //commentsBegin = true;
+ //commentsEnd = false;
+ }
+ else if(offsetY>maxOffset.Y)
+ {
+ offsetY = maxOffset.Y;
+ yScrollVel = 0;
+ //commentsEnd = true;
+ //commentsBegin = false;
+ }
+ else
+ {
+ //commentsEnd = false;
+ //commentsBegin = false;
+ }
+ 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)
+ scrollBarWidth--;
+} \ No newline at end of file