Scroll Panel
This commit is contained in:
parent
121e7c772c
commit
f8ca8af387
@ -37,6 +37,8 @@ namespace ui
|
|||||||
inline Window* const GetParentWindow() const { return parentstate_; }
|
inline Window* const GetParentWindow() const { return parentstate_; }
|
||||||
bool IsFocused() const;
|
bool IsFocused() const;
|
||||||
|
|
||||||
|
void Invalidate() { drawn = false; }
|
||||||
|
|
||||||
Point Position;
|
Point Position;
|
||||||
Point Size;
|
Point Size;
|
||||||
bool Locked;
|
bool Locked;
|
||||||
|
@ -7,25 +7,40 @@
|
|||||||
#include "interface/Point.h"
|
#include "interface/Point.h"
|
||||||
#include "interface/Window.h"
|
#include "interface/Window.h"
|
||||||
#include "interface/Component.h"
|
#include "interface/Component.h"
|
||||||
|
#include "graphics/Graphics.h"
|
||||||
|
|
||||||
using namespace ui;
|
using namespace ui;
|
||||||
|
|
||||||
Panel::Panel(Window* parent_state):
|
|
||||||
Component(parent_state)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Panel::Panel(Point position, Point size):
|
Panel::Panel(Point position, Point size):
|
||||||
Component(position, size)
|
Component(position, size),
|
||||||
|
InnerSize(size),
|
||||||
|
ViewportPosition(0, 0),
|
||||||
|
mouseInside(false)
|
||||||
{
|
{
|
||||||
|
#ifdef OGLI
|
||||||
|
GLint lastVid;
|
||||||
|
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &lastVid);
|
||||||
|
|
||||||
}
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glGenTextures(1, &myVidTex);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, myVidTex);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, XRES+BARSIZE, YRES+MENUSIZE, 0, GL_RGBA, GL_FLOAT, NULL);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
|
||||||
|
|
||||||
Panel::Panel():
|
//FBO
|
||||||
Component()
|
glGenFramebuffers(1, &myVid);
|
||||||
{
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, myVid);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, myVidTex, 0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Reset framebuffer binding
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, lastVid);
|
||||||
|
#else
|
||||||
|
myVid = new pixel[(XRES+BARSIZE)*(YRES+MENUSIZE)];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Panel::~Panel()
|
Panel::~Panel()
|
||||||
@ -35,11 +50,18 @@ Panel::~Panel()
|
|||||||
if( children[i] )
|
if( children[i] )
|
||||||
delete children[i];
|
delete children[i];
|
||||||
}
|
}
|
||||||
|
#ifdef OGLI
|
||||||
|
glDeleteTextures(1, &myVidTex);
|
||||||
|
glDeleteFramebuffers(1, &myVid);
|
||||||
|
#else
|
||||||
|
delete[] myVid;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Panel::AddChild(Component* c)
|
void Panel::AddChild(Component* c)
|
||||||
{
|
{
|
||||||
c->SetParent(this);
|
c->SetParent(this);
|
||||||
|
c->SetParentWindow(this->GetParentWindow());
|
||||||
}
|
}
|
||||||
|
|
||||||
int Panel::GetChildCount()
|
int Panel::GetChildCount()
|
||||||
@ -75,8 +97,20 @@ void Panel::RemoveChild(unsigned idx, bool freeMem)
|
|||||||
|
|
||||||
void Panel::Draw(const Point& screenPos)
|
void Panel::Draw(const Point& screenPos)
|
||||||
{
|
{
|
||||||
|
|
||||||
// draw ourself first
|
// draw ourself first
|
||||||
XDraw(screenPos);
|
XDraw(screenPos);
|
||||||
|
#ifdef OGLI
|
||||||
|
GLint lastVid;
|
||||||
|
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &lastVid);
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, myVid);
|
||||||
|
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
#else
|
||||||
|
pixel * lastVid = ui::Engine::Ref().g->vid;
|
||||||
|
ui::Engine::Ref().g->vid = myVid;
|
||||||
|
std::fill(myVid, myVid+((XRES+BARSIZE)*(YRES+MENUSIZE)), 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
// attempt to draw all children
|
// attempt to draw all children
|
||||||
for(int i = 0; i < children.size(); ++i)
|
for(int i = 0; i < children.size(); ++i)
|
||||||
@ -84,26 +118,52 @@ void Panel::Draw(const Point& screenPos)
|
|||||||
// the component must be visible
|
// the component must be visible
|
||||||
if(children[i]->Visible)
|
if(children[i]->Visible)
|
||||||
{
|
{
|
||||||
if(GetParentWindow()->AllowExclusiveDrawing)
|
//check if the component is in the screen, draw if it is
|
||||||
|
if( children[i]->Position.X + ViewportPosition.X + children[i]->Size.X >= 0 &&
|
||||||
|
children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y >= 0 &&
|
||||||
|
children[i]->Position.X + ViewportPosition.X < ui::Engine::Ref().GetWidth() &&
|
||||||
|
children[i]->Position.Y + ViewportPosition.Y < ui::Engine::Ref().GetHeight() )
|
||||||
{
|
{
|
||||||
//who cares if the component is off the screen? draw anyway.
|
Point scrpos = /*screenPos + */children[i]->Position + ViewportPosition;
|
||||||
Point scrpos = screenPos + children[i]->Position;
|
|
||||||
children[i]->Draw(scrpos);
|
children[i]->Draw(scrpos);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
//check if the component is in the screen, draw if it is
|
|
||||||
if( children[i]->Position.X + children[i]->Size.X >= 0 &&
|
|
||||||
children[i]->Position.Y + children[i]->Size.Y >= 0 &&
|
|
||||||
children[i]->Position.X < ui::Engine::Ref().GetWidth() &&
|
|
||||||
children[i]->Position.Y < ui::Engine::Ref().GetHeight() )
|
|
||||||
{
|
|
||||||
Point scrpos = screenPos + children[i]->Position;
|
|
||||||
children[i]->Draw(scrpos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef OGLI
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, lastVid);
|
||||||
|
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, myVidTex);
|
||||||
|
|
||||||
|
int x = screenPos.X, y = screenPos.Y;
|
||||||
|
int h = Size.Y, w = Size.X;
|
||||||
|
|
||||||
|
double texX = double(Size.X)/double(XRES+BARSIZE), texY = 1, texYB = 1-(double(Size.Y)/double(YRES+MENUSIZE));
|
||||||
|
|
||||||
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glTexCoord2d(0, texYB);
|
||||||
|
glVertex2f(x, y+h);
|
||||||
|
glTexCoord2d(texX, texYB);
|
||||||
|
glVertex2f(x+w, y+h);
|
||||||
|
glTexCoord2d(texX, texY);
|
||||||
|
glVertex2f(x+w, y);
|
||||||
|
glTexCoord2d(0, texY);
|
||||||
|
glVertex2f(x, y);
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
#else
|
||||||
|
ui::Engine::Ref().g->vid = lastVid;
|
||||||
|
|
||||||
|
//dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x;
|
||||||
|
for (int row = 0; row < Size.Y; row++)
|
||||||
|
{
|
||||||
|
std::copy(myVid+(row*Size.W), myVid+(row*Size.W)+Size.W, lastVid+(screenPos.Y*(XRES+BARSIZE))+screenPos.X);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Panel::Tick(float dt)
|
void Panel::Tick(float dt)
|
||||||
@ -137,14 +197,14 @@ void Panel::OnMouseClick(int localx, int localy, unsigned button)
|
|||||||
if(!children[i]->Locked)
|
if(!children[i]->Locked)
|
||||||
{
|
{
|
||||||
//is mouse inside?
|
//is mouse inside?
|
||||||
if( localx >= children[i]->Position.X &&
|
if( localx >= children[i]->Position.X + ViewportPosition.X &&
|
||||||
localy >= children[i]->Position.Y &&
|
localy >= children[i]->Position.Y + ViewportPosition.Y &&
|
||||||
localx < children[i]->Position.X + children[i]->Size.X &&
|
localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X &&
|
||||||
localy < children[i]->Position.Y + children[i]->Size.Y )
|
localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y )
|
||||||
{
|
{
|
||||||
childclicked = true;
|
childclicked = true;
|
||||||
GetParentWindow()->FocusComponent(children[i]);
|
GetParentWindow()->FocusComponent(children[i]);
|
||||||
children[i]->OnMouseClick(localx - children[i]->Position.X, localy - children[i]->Position.Y, button);
|
children[i]->OnMouseClick(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, button);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -196,7 +256,7 @@ void Panel::OnMouseMoved(int localx, int localy, int dx, int dy)
|
|||||||
for(int i = 0; i < children.size(); ++i)
|
for(int i = 0; i < children.size(); ++i)
|
||||||
{
|
{
|
||||||
if(!children[i]->Locked)
|
if(!children[i]->Locked)
|
||||||
children[i]->OnMouseMoved(localx - children[i]->Position.X, localy - children[i]->Position.Y, dx, dy);
|
children[i]->OnMouseMoved(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, dx, dy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,7 +266,7 @@ void Panel::OnMouseMovedInside(int localx, int localy, int dx, int dy)
|
|||||||
{
|
{
|
||||||
if(!children[i]->Locked)
|
if(!children[i]->Locked)
|
||||||
{
|
{
|
||||||
Point local (localx - children[i]->Position.X, localy - children[i]->Position.Y)
|
Point local (localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y)
|
||||||
, prevlocal (local.X - dx, local.Y - dy);
|
, prevlocal (local.X - dx, local.Y - dy);
|
||||||
|
|
||||||
// mouse currently inside?
|
// mouse currently inside?
|
||||||
@ -215,7 +275,7 @@ void Panel::OnMouseMovedInside(int localx, int localy, int dx, int dy)
|
|||||||
local.X < children[i]->Size.X &&
|
local.X < children[i]->Size.X &&
|
||||||
local.Y < children[i]->Size.Y )
|
local.Y < children[i]->Size.Y )
|
||||||
{
|
{
|
||||||
children[i]->OnMouseMovedInside(localx - children[i]->Position.X, localy - children[i]->Position.Y, dx, dy);
|
children[i]->OnMouseMovedInside(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, dx, dy);
|
||||||
|
|
||||||
// was the mouse outside?
|
// was the mouse outside?
|
||||||
if(!(prevlocal.X >= 0 &&
|
if(!(prevlocal.X >= 0 &&
|
||||||
@ -248,11 +308,13 @@ void Panel::OnMouseMovedInside(int localx, int localy, int dx, int dy)
|
|||||||
|
|
||||||
void Panel::OnMouseEnter(int localx, int localy)
|
void Panel::OnMouseEnter(int localx, int localy)
|
||||||
{
|
{
|
||||||
|
mouseInside = true;
|
||||||
XOnMouseEnter(localx, localy);
|
XOnMouseEnter(localx, localy);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Panel::OnMouseLeave(int localx, int localy)
|
void Panel::OnMouseLeave(int localx, int localy)
|
||||||
{
|
{
|
||||||
|
mouseInside = false;
|
||||||
XOnMouseLeave(localx, localy);
|
XOnMouseLeave(localx, localy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,13 +329,13 @@ void Panel::OnMouseUnclick(int localx, int localy, unsigned button)
|
|||||||
if(!children[i]->Locked)
|
if(!children[i]->Locked)
|
||||||
{
|
{
|
||||||
//is mouse inside?
|
//is mouse inside?
|
||||||
if( localx >= children[i]->Position.X &&
|
if( localx >= children[i]->Position.X + ViewportPosition.X &&
|
||||||
localy >= children[i]->Position.Y &&
|
localy >= children[i]->Position.Y + ViewportPosition.Y &&
|
||||||
localx < children[i]->Position.X + children[i]->Size.X &&
|
localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X &&
|
||||||
localy < children[i]->Position.Y + children[i]->Size.Y )
|
localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y )
|
||||||
{
|
{
|
||||||
childunclicked = true;
|
childunclicked = true;
|
||||||
children[i]->OnMouseUnclick(localx - children[i]->Position.X, localy - children[i]->Position.Y, button);
|
children[i]->OnMouseUnclick(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, button);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -302,7 +364,7 @@ void Panel::OnMouseWheel(int localx, int localy, int d)
|
|||||||
for(int i = 0; i < children.size(); ++i)
|
for(int i = 0; i < children.size(); ++i)
|
||||||
{
|
{
|
||||||
if(!children[i]->Locked)
|
if(!children[i]->Locked)
|
||||||
children[i]->OnMouseWheel(localx - children[i]->Position.X, localy - children[i]->Position.Y, d);
|
children[i]->OnMouseWheel(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,12 +378,12 @@ void Panel::OnMouseWheelInside(int localx, int localy, int d)
|
|||||||
if(!children[i]->Locked)
|
if(!children[i]->Locked)
|
||||||
{
|
{
|
||||||
//is mouse inside?
|
//is mouse inside?
|
||||||
if( localx >= children[i]->Position.X &&
|
if( localx >= children[i]->Position.X + ViewportPosition.X &&
|
||||||
localy >= children[i]->Position.Y &&
|
localy >= children[i]->Position.Y + ViewportPosition.Y &&
|
||||||
localx < children[i]->Position.X + children[i]->Size.X &&
|
localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X &&
|
||||||
localy < children[i]->Position.Y + children[i]->Size.Y )
|
localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y )
|
||||||
{
|
{
|
||||||
children[i]->OnMouseWheelInside(localx - children[i]->Position.X, localy - children[i]->Position.Y, d);
|
children[i]->OnMouseWheelInside(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,12 @@
|
|||||||
#include "interface/Window.h"
|
#include "interface/Window.h"
|
||||||
#include "interface/Component.h"
|
#include "interface/Component.h"
|
||||||
|
|
||||||
|
#ifdef OGLI
|
||||||
|
#include "graphics/OpenGLHeaders.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
class Graphics;
|
||||||
namespace ui
|
namespace ui
|
||||||
{
|
{
|
||||||
/* class XComponent
|
/* class XComponent
|
||||||
@ -15,15 +21,22 @@ namespace ui
|
|||||||
*
|
*
|
||||||
* See sys::Component
|
* See sys::Component
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Component;
|
class Component;
|
||||||
class Panel : public Component
|
class Panel : public Component
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
friend class Component;
|
friend class Component;
|
||||||
|
|
||||||
Panel(Window* parent_state);
|
#ifdef OGLI
|
||||||
|
GLuint myVid, myVidTex;
|
||||||
|
#else
|
||||||
|
pixel * myVid;
|
||||||
|
#endif
|
||||||
|
ui::Point InnerSize;
|
||||||
|
ui::Point ViewportPosition;
|
||||||
|
|
||||||
Panel(Point position, Point size);
|
Panel(Point position, Point size);
|
||||||
Panel();
|
|
||||||
virtual ~Panel();
|
virtual ~Panel();
|
||||||
|
|
||||||
/* Add a child component.
|
/* Add a child component.
|
||||||
@ -65,6 +78,7 @@ class Component;
|
|||||||
protected:
|
protected:
|
||||||
// child components
|
// child components
|
||||||
std::vector<ui::Component*> children;
|
std::vector<ui::Component*> children;
|
||||||
|
bool mouseInside;
|
||||||
|
|
||||||
//UI functions:
|
//UI functions:
|
||||||
/*
|
/*
|
||||||
|
117
src/interface/ScrollPanel.cpp
Normal file
117
src/interface/ScrollPanel.cpp
Normal file
@ -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--;
|
||||||
|
}
|
25
src/interface/ScrollPanel.h
Normal file
25
src/interface/ScrollPanel.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Panel.h"
|
||||||
|
|
||||||
|
namespace ui
|
||||||
|
{
|
||||||
|
class ScrollPanel: public Panel
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
int scrollBarWidth;
|
||||||
|
Point maxOffset;
|
||||||
|
float offsetX;
|
||||||
|
float offsetY;
|
||||||
|
float yScrollVel;
|
||||||
|
float xScrollVel;
|
||||||
|
public:
|
||||||
|
ScrollPanel(Point position, Point size);
|
||||||
|
|
||||||
|
int GetScrollLimit();
|
||||||
|
|
||||||
|
virtual void XDraw(const Point& screenPos);
|
||||||
|
virtual void XTick(float dt);
|
||||||
|
virtual void XOnMouseWheelInside(int localx, int localy, int d);
|
||||||
|
};
|
||||||
|
}
|
@ -17,6 +17,7 @@
|
|||||||
#include "Style.h"
|
#include "Style.h"
|
||||||
#include "search/Thumbnail.h"
|
#include "search/Thumbnail.h"
|
||||||
#include "client/Client.h"
|
#include "client/Client.h"
|
||||||
|
#include "interface/ScrollPanel.h"
|
||||||
|
|
||||||
class PreviewView::LoginAction: public ui::ButtonAction
|
class PreviewView::LoginAction: public ui::ButtonAction
|
||||||
{
|
{
|
||||||
@ -54,11 +55,6 @@ PreviewView::PreviewView():
|
|||||||
ui::Window(ui::Point(-1, -1), ui::Point((XRES/2)+200, (YRES/2)+150)),
|
ui::Window(ui::Point(-1, -1), ui::Point((XRES/2)+200, (YRES/2)+150)),
|
||||||
savePreview(NULL),
|
savePreview(NULL),
|
||||||
doOpen(false),
|
doOpen(false),
|
||||||
commentsOffset(0),
|
|
||||||
commentsVel(0),
|
|
||||||
maxOffset(0),
|
|
||||||
commentsBegin(true),
|
|
||||||
commentsEnd(false),
|
|
||||||
addCommentBox(NULL),
|
addCommentBox(NULL),
|
||||||
submitCommentButton(NULL),
|
submitCommentButton(NULL),
|
||||||
commentBoxHeight(20)
|
commentBoxHeight(20)
|
||||||
@ -160,6 +156,9 @@ PreviewView::PreviewView():
|
|||||||
pageInfo = new ui::Label(ui::Point((XRES/2) + 5, Size.Y+1), ui::Point(Size.X-((XRES/2) + 10), 15), "Page 1 of 1");
|
pageInfo = new ui::Label(ui::Point((XRES/2) + 5, Size.Y+1), ui::Point(Size.X-((XRES/2) + 10), 15), "Page 1 of 1");
|
||||||
pageInfo->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; authorDateLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
|
pageInfo->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; authorDateLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
|
||||||
|
|
||||||
|
commentsPanel = new ui::ScrollPanel(ui::Point(XRES/2, 0), ui::Point(Size.X-(XRES/2), Size.Y-commentBoxHeight));
|
||||||
|
AddComponent(commentsPanel);
|
||||||
|
|
||||||
AddComponent(pageInfo);
|
AddComponent(pageInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,7 +169,7 @@ void PreviewView::commentBoxAutoHeight()
|
|||||||
int textWidth = Graphics::textwidth(addCommentBox->GetText().c_str());
|
int textWidth = Graphics::textwidth(addCommentBox->GetText().c_str());
|
||||||
if(textWidth+5 > Size.X-(XRES/2)-48)
|
if(textWidth+5 > Size.X-(XRES/2)-48)
|
||||||
{
|
{
|
||||||
commentBoxHeight = 58;
|
commentBoxHeight = 59;
|
||||||
addCommentBox->SetMultiline(true);
|
addCommentBox->SetMultiline(true);
|
||||||
addCommentBox->Appearance.VerticalAlign = ui::Appearance::AlignTop;
|
addCommentBox->Appearance.VerticalAlign = ui::Appearance::AlignTop;
|
||||||
|
|
||||||
@ -190,7 +189,7 @@ void PreviewView::commentBoxAutoHeight()
|
|||||||
commentBoxSizeX = Size.X-(XRES/2)-48;
|
commentBoxSizeX = Size.X-(XRES/2)-48;
|
||||||
commentBoxSizeY = 17;
|
commentBoxSizeY = 17;
|
||||||
}
|
}
|
||||||
displayComments(commentsOffset);
|
commentsPanel->Size.Y = Size.Y-commentBoxHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PreviewView::DoDraw()
|
void PreviewView::DoDraw()
|
||||||
@ -237,52 +236,19 @@ void PreviewView::OnDraw()
|
|||||||
|
|
||||||
for(int i = 0; i < commentTextComponents.size(); i++)
|
for(int i = 0; i < commentTextComponents.size(); i++)
|
||||||
{
|
{
|
||||||
|
int linePos = commentTextComponents[i]->Position.Y+commentsPanel->ViewportPosition.Y+commentTextComponents[i]->Size.Y+4;
|
||||||
|
if(linePos > 0 && linePos < Size.Y-commentBoxHeight)
|
||||||
g->draw_line(
|
g->draw_line(
|
||||||
Position.X+XRES/2,
|
Position.X+XRES/2,
|
||||||
Position.Y+commentTextComponents[i]->Position.Y+commentTextComponents[i]->Size.Y+4,
|
Position.Y+linePos,
|
||||||
Position.X+Size.X-1,
|
Position.X+Size.X-1,
|
||||||
Position.Y+commentTextComponents[i]->Position.Y+commentTextComponents[i]->Size.Y+4,
|
Position.Y+linePos,
|
||||||
100, 100, 100, 255);
|
100, 100, 100, 255);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PreviewView::OnTick(float dt)
|
void PreviewView::OnTick(float dt)
|
||||||
{
|
{
|
||||||
if(commentsVel > 5.0f) commentsVel = 5.0f;
|
|
||||||
if(commentsVel < -5.0f) commentsVel = -5.0f;
|
|
||||||
if(commentsVel > -0.5f && commentsVel < 0.5)
|
|
||||||
commentsVel = 0;
|
|
||||||
|
|
||||||
int oldOffset = commentsOffset;
|
|
||||||
commentsOffset += commentsVel;
|
|
||||||
|
|
||||||
commentsVel*=0.99f;
|
|
||||||
|
|
||||||
if(oldOffset!=int(commentsOffset))
|
|
||||||
{
|
|
||||||
if(commentsOffset<0)
|
|
||||||
{
|
|
||||||
commentsOffset = 0;
|
|
||||||
commentsVel = 0;
|
|
||||||
commentsBegin = true;
|
|
||||||
commentsEnd = false;
|
|
||||||
}
|
|
||||||
else if(commentsOffset>maxOffset)
|
|
||||||
{
|
|
||||||
commentsOffset = maxOffset;
|
|
||||||
commentsVel = 0;
|
|
||||||
commentsEnd = true;
|
|
||||||
commentsBegin = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
commentsEnd = false;
|
|
||||||
commentsBegin = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
displayComments(commentsOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(addCommentBox)
|
if(addCommentBox)
|
||||||
{
|
{
|
||||||
ui::Point positionDiff = ui::Point(commentBoxPositionX, commentBoxPositionY)-addCommentBox->Position;
|
ui::Point positionDiff = ui::Point(commentBoxPositionX, commentBoxPositionY)-addCommentBox->Position;
|
||||||
@ -309,6 +275,7 @@ void PreviewView::OnTick(float dt)
|
|||||||
if(xdiff == 0)
|
if(xdiff == 0)
|
||||||
xdiff = 1*isign(sizeDiff.X);
|
xdiff = 1*isign(sizeDiff.X);
|
||||||
addCommentBox->Size.X += xdiff;
|
addCommentBox->Size.X += xdiff;
|
||||||
|
addCommentBox->Invalidate();
|
||||||
}
|
}
|
||||||
if(sizeDiff.Y!=0)
|
if(sizeDiff.Y!=0)
|
||||||
{
|
{
|
||||||
@ -316,6 +283,7 @@ void PreviewView::OnTick(float dt)
|
|||||||
if(ydiff == 0)
|
if(ydiff == 0)
|
||||||
ydiff = 1*isign(sizeDiff.Y);
|
ydiff = 1*isign(sizeDiff.Y);
|
||||||
addCommentBox->Size.Y += ydiff;
|
addCommentBox->Size.Y += ydiff;
|
||||||
|
addCommentBox->Invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,6 +296,15 @@ void PreviewView::OnMouseDown(int x, int y, unsigned button)
|
|||||||
c->Exit();
|
c->Exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PreviewView::OnMouseWheel(int x, int y, int d)
|
||||||
|
{
|
||||||
|
if(commentsPanel->GetScrollLimit() == 1 && d < 0)
|
||||||
|
c->NextCommentPage();
|
||||||
|
if(commentsPanel->GetScrollLimit() == -1 && d > 0)
|
||||||
|
c->PrevCommentPage();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void PreviewView::NotifySaveChanged(PreviewModel * sender)
|
void PreviewView::NotifySaveChanged(PreviewModel * sender)
|
||||||
{
|
{
|
||||||
SaveInfo * save = sender->GetSave();
|
SaveInfo * save = sender->GetSave();
|
||||||
@ -392,60 +369,6 @@ void PreviewView::submitComment()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PreviewView::displayComments(int yOffset)
|
|
||||||
{
|
|
||||||
for(int i = 0; i < commentComponents.size(); i++)
|
|
||||||
{
|
|
||||||
RemoveComponent(commentComponents[i]);
|
|
||||||
delete commentComponents[i];
|
|
||||||
}
|
|
||||||
commentComponents.clear();
|
|
||||||
commentTextComponents.clear();
|
|
||||||
|
|
||||||
int currentY = -yOffset;
|
|
||||||
ui::Label * tempUsername;
|
|
||||||
ui::Label * tempComment;
|
|
||||||
for(int i = 0; i < comments.size(); i++)
|
|
||||||
{
|
|
||||||
int usernameY = currentY+5, commentY;
|
|
||||||
tempUsername = new ui::Label(ui::Point((XRES/2) + 5, currentY+5), ui::Point(Size.X-((XRES/2) + 10), 16), comments[i].authorName);
|
|
||||||
tempUsername->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempUsername->Appearance.VerticalAlign = ui::Appearance::AlignBottom;
|
|
||||||
currentY += 16;
|
|
||||||
|
|
||||||
if(currentY+5 > Size.Y-commentBoxHeight || usernameY < 0)
|
|
||||||
{
|
|
||||||
delete tempUsername;
|
|
||||||
if(currentY+5 > Size.Y-commentBoxHeight)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
commentComponents.push_back(tempUsername);
|
|
||||||
AddComponent(tempUsername);
|
|
||||||
}
|
|
||||||
|
|
||||||
commentY = currentY+5;
|
|
||||||
tempComment = new ui::Label(ui::Point((XRES/2) + 5, currentY+5), ui::Point(Size.X-((XRES/2) + 10), -1), comments[i].comment);
|
|
||||||
tempComment->SetMultiline(true);
|
|
||||||
tempComment->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempComment->Appearance.VerticalAlign = ui::Appearance::AlignTop;
|
|
||||||
tempComment->SetTextColour(ui::Colour(180, 180, 180));
|
|
||||||
currentY += tempComment->Size.Y+4;
|
|
||||||
|
|
||||||
if(currentY+5 > Size.Y-commentBoxHeight || commentY < 0)
|
|
||||||
{
|
|
||||||
delete tempComment;
|
|
||||||
if(currentY+5 > Size.Y-commentBoxHeight)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
commentComponents.push_back(tempComment);
|
|
||||||
AddComponent(tempComment);
|
|
||||||
commentTextComponents.push_back(tempComment);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PreviewView::NotifyCommentBoxEnabledChanged(PreviewModel * sender)
|
void PreviewView::NotifyCommentBoxEnabledChanged(PreviewModel * sender)
|
||||||
{
|
{
|
||||||
if(addCommentBox)
|
if(addCommentBox)
|
||||||
@ -502,48 +425,44 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender)
|
|||||||
comments.clear();
|
comments.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
ui::Label * tempUsername;
|
|
||||||
ui::Label * tempComment;
|
|
||||||
int maxY = 0;
|
|
||||||
for(int i = 0; i < comments.size(); i++)
|
|
||||||
{
|
{
|
||||||
tempUsername = new ui::Label(ui::Point(0, 0), ui::Point(Size.X-((XRES/2) + 10), 16), comments[i].authorName);
|
for(int i = 0; i < commentComponents.size(); i++)
|
||||||
tempUsername->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
|
{
|
||||||
tempUsername->Appearance.VerticalAlign = ui::Appearance::AlignBottom;
|
commentsPanel->RemoveChild(commentComponents[i]);
|
||||||
maxY += 16;
|
delete commentComponents[i];
|
||||||
tempComment = new ui::Label(ui::Point(0, 0), ui::Point(Size.X-((XRES/2) + 10), -1), comments[i].comment);
|
}
|
||||||
tempComment->SetMultiline(true);
|
commentComponents.clear();
|
||||||
tempComment->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
|
commentTextComponents.clear();
|
||||||
tempComment->Appearance.VerticalAlign = ui::Appearance::AlignTop;
|
|
||||||
tempComment->SetTextColour(ui::Colour(180, 180, 180));
|
|
||||||
maxY += tempComment->Size.Y+4;
|
|
||||||
|
|
||||||
delete tempUsername;
|
int currentY = 0;//-yOffset;
|
||||||
delete tempComment;
|
ui::Label * tempUsername;
|
||||||
}
|
ui::Label * tempComment;
|
||||||
|
for(int i = 0; i < comments.size(); i++)
|
||||||
|
{
|
||||||
|
int usernameY = currentY+5, commentY;
|
||||||
|
tempUsername = new ui::Label(ui::Point(5, currentY+5), ui::Point(Size.X-((XRES/2) + 10), 16), comments[i].authorName);
|
||||||
|
tempUsername->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
|
||||||
|
tempUsername->Appearance.VerticalAlign = ui::Appearance::AlignBottom;
|
||||||
|
currentY += 16;
|
||||||
|
|
||||||
|
commentComponents.push_back(tempUsername);
|
||||||
|
commentsPanel->AddChild(tempUsername);
|
||||||
|
|
||||||
|
|
||||||
maxOffset = (maxY-(Size.Y-commentBoxHeight))+16;
|
commentY = currentY+5;
|
||||||
commentsBegin = true;
|
tempComment = new ui::Label(ui::Point(5, currentY+5), ui::Point(Size.X-((XRES/2) + 10), -1), comments[i].comment);
|
||||||
commentsEnd = false;
|
tempComment->SetMultiline(true);
|
||||||
commentsOffset = 0;
|
tempComment->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
|
||||||
commentsVel = 0;
|
tempComment->Appearance.VerticalAlign = ui::Appearance::AlignTop;
|
||||||
displayComments(commentsOffset);
|
tempComment->SetTextColour(ui::Colour(180, 180, 180));
|
||||||
}
|
currentY += tempComment->Size.Y+4;
|
||||||
|
|
||||||
void PreviewView::OnMouseWheel(int x, int y, int d)
|
commentComponents.push_back(tempComment);
|
||||||
{
|
commentsPanel->AddChild(tempComment);
|
||||||
if(!d)
|
commentTextComponents.push_back(tempComment);
|
||||||
return;
|
}
|
||||||
commentsVel-=d;
|
|
||||||
|
|
||||||
if(d<0)
|
commentsPanel->InnerSize = ui::Point(commentsPanel->Size.X, currentY+4);
|
||||||
{
|
|
||||||
if(commentsEnd)
|
|
||||||
c->NextCommentPage();
|
|
||||||
} else {
|
|
||||||
if(commentsBegin)
|
|
||||||
c->PrevCommentPage();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,6 +18,11 @@
|
|||||||
#include "interface/Label.h"
|
#include "interface/Label.h"
|
||||||
#include "interface/Textbox.h"
|
#include "interface/Textbox.h"
|
||||||
|
|
||||||
|
namespace ui
|
||||||
|
{
|
||||||
|
class ScrollPanel;
|
||||||
|
}
|
||||||
|
|
||||||
class PreviewModel;
|
class PreviewModel;
|
||||||
class PreviewController;
|
class PreviewController;
|
||||||
class PreviewView: public ui::Window {
|
class PreviewView: public ui::Window {
|
||||||
@ -36,6 +41,7 @@ class PreviewView: public ui::Window {
|
|||||||
ui::Label * authorDateLabel;
|
ui::Label * authorDateLabel;
|
||||||
ui::Label * pageInfo;
|
ui::Label * pageInfo;
|
||||||
ui::Label * saveDescriptionLabel;
|
ui::Label * saveDescriptionLabel;
|
||||||
|
ui::ScrollPanel * commentsPanel;
|
||||||
std::vector<SaveComment> comments;
|
std::vector<SaveComment> comments;
|
||||||
std::vector<ui::Component*> commentComponents;
|
std::vector<ui::Component*> commentComponents;
|
||||||
std::vector<ui::Component*> commentTextComponents;
|
std::vector<ui::Component*> commentTextComponents;
|
||||||
@ -43,19 +49,13 @@ class PreviewView: public ui::Window {
|
|||||||
int votesDown;
|
int votesDown;
|
||||||
bool doOpen;
|
bool doOpen;
|
||||||
|
|
||||||
bool commentsEnd;
|
|
||||||
bool commentsBegin;
|
|
||||||
int maxOffset;
|
|
||||||
float commentsOffset;
|
|
||||||
float commentsVel;
|
|
||||||
|
|
||||||
int commentBoxHeight;
|
int commentBoxHeight;
|
||||||
float commentBoxPositionX;
|
float commentBoxPositionX;
|
||||||
float commentBoxPositionY;
|
float commentBoxPositionY;
|
||||||
float commentBoxSizeX;
|
float commentBoxSizeX;
|
||||||
float commentBoxSizeY;
|
float commentBoxSizeY;
|
||||||
|
|
||||||
void displayComments(int yOffset);
|
void displayComments();
|
||||||
void commentBoxAutoHeight();
|
void commentBoxAutoHeight();
|
||||||
void submitComment();
|
void submitComment();
|
||||||
public:
|
public:
|
||||||
|
Loading…
Reference in New Issue
Block a user