Scroll Panel

This commit is contained in:
Simon Robertshaw 2012-07-26 21:51:30 +01:00
parent 121e7c772c
commit f8ca8af387
7 changed files with 327 additions and 188 deletions

View File

@ -37,6 +37,8 @@ namespace ui
inline Window* const GetParentWindow() const { return parentstate_; }
bool IsFocused() const;
void Invalidate() { drawn = false; }
Point Position;
Point Size;
bool Locked;

View File

@ -7,25 +7,40 @@
#include "interface/Point.h"
#include "interface/Window.h"
#include "interface/Component.h"
#include "graphics/Graphics.h"
using namespace ui;
Panel::Panel(Window* parent_state):
Component(parent_state)
{
}
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():
Component()
{
//FBO
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()
@ -35,11 +50,18 @@ Panel::~Panel()
if( children[i] )
delete children[i];
}
#ifdef OGLI
glDeleteTextures(1, &myVidTex);
glDeleteFramebuffers(1, &myVid);
#else
delete[] myVid;
#endif
}
void Panel::AddChild(Component* c)
{
c->SetParent(this);
c->SetParentWindow(this->GetParentWindow());
}
int Panel::GetChildCount()
@ -75,35 +97,73 @@ void Panel::RemoveChild(unsigned idx, bool freeMem)
void Panel::Draw(const Point& screenPos)
{
// draw ourself first
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
for(int i = 0; i < children.size(); ++i)
{
// the component must be visible
if(children[i]->Visible)
{
if(GetParentWindow()->AllowExclusiveDrawing)
{
//who cares if the component is off the screen? draw anyway.
Point scrpos = screenPos + children[i]->Position;
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() )
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() )
{
Point scrpos = screenPos + children[i]->Position;
Point scrpos = /*screenPos + */children[i]->Position + ViewportPosition;
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)
@ -137,14 +197,14 @@ void Panel::OnMouseClick(int localx, int localy, unsigned button)
if(!children[i]->Locked)
{
//is mouse inside?
if( localx >= children[i]->Position.X &&
localy >= children[i]->Position.Y &&
localx < children[i]->Position.X + children[i]->Size.X &&
localy < children[i]->Position.Y + children[i]->Size.Y )
if( localx >= children[i]->Position.X + ViewportPosition.X &&
localy >= children[i]->Position.Y + ViewportPosition.Y &&
localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X &&
localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y )
{
childclicked = true;
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;
}
}
@ -196,7 +256,7 @@ void Panel::OnMouseMoved(int localx, int localy, int dx, int dy)
for(int i = 0; i < children.size(); ++i)
{
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)
{
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);
// 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.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?
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)
{
mouseInside = true;
XOnMouseEnter(localx, localy);
}
void Panel::OnMouseLeave(int localx, int localy)
{
mouseInside = false;
XOnMouseLeave(localx, localy);
}
@ -267,13 +329,13 @@ void Panel::OnMouseUnclick(int localx, int localy, unsigned button)
if(!children[i]->Locked)
{
//is mouse inside?
if( localx >= children[i]->Position.X &&
localy >= children[i]->Position.Y &&
localx < children[i]->Position.X + children[i]->Size.X &&
localy < children[i]->Position.Y + children[i]->Size.Y )
if( localx >= children[i]->Position.X + ViewportPosition.X &&
localy >= children[i]->Position.Y + ViewportPosition.Y &&
localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X &&
localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y )
{
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;
}
}
@ -302,7 +364,7 @@ void Panel::OnMouseWheel(int localx, int localy, int d)
for(int i = 0; i < children.size(); ++i)
{
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)
{
//is mouse inside?
if( localx >= children[i]->Position.X &&
localy >= children[i]->Position.Y &&
localx < children[i]->Position.X + children[i]->Size.X &&
localy < children[i]->Position.Y + children[i]->Size.Y )
if( localx >= children[i]->Position.X + ViewportPosition.X &&
localy >= children[i]->Position.Y + ViewportPosition.Y &&
localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X &&
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;
}
}

View File

@ -6,6 +6,12 @@
#include "interface/Window.h"
#include "interface/Component.h"
#ifdef OGLI
#include "graphics/OpenGLHeaders.h"
#endif
class Graphics;
namespace ui
{
/* class XComponent
@ -15,15 +21,22 @@ namespace ui
*
* See sys::Component
*/
class Component;
class Panel : public Component
{
public:
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();
virtual ~Panel();
/* Add a child component.
@ -65,6 +78,7 @@ class Component;
protected:
// child components
std::vector<ui::Component*> children;
bool mouseInside;
//UI functions:
/*

View 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--;
}

View 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);
};
}

View File

@ -17,6 +17,7 @@
#include "Style.h"
#include "search/Thumbnail.h"
#include "client/Client.h"
#include "interface/ScrollPanel.h"
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)),
savePreview(NULL),
doOpen(false),
commentsOffset(0),
commentsVel(0),
maxOffset(0),
commentsBegin(true),
commentsEnd(false),
addCommentBox(NULL),
submitCommentButton(NULL),
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->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);
}
@ -170,7 +169,7 @@ void PreviewView::commentBoxAutoHeight()
int textWidth = Graphics::textwidth(addCommentBox->GetText().c_str());
if(textWidth+5 > Size.X-(XRES/2)-48)
{
commentBoxHeight = 58;
commentBoxHeight = 59;
addCommentBox->SetMultiline(true);
addCommentBox->Appearance.VerticalAlign = ui::Appearance::AlignTop;
@ -190,7 +189,7 @@ void PreviewView::commentBoxAutoHeight()
commentBoxSizeX = Size.X-(XRES/2)-48;
commentBoxSizeY = 17;
}
displayComments(commentsOffset);
commentsPanel->Size.Y = Size.Y-commentBoxHeight;
}
void PreviewView::DoDraw()
@ -237,52 +236,19 @@ void PreviewView::OnDraw()
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(
Position.X+XRES/2,
Position.Y+commentTextComponents[i]->Position.Y+commentTextComponents[i]->Size.Y+4,
Position.Y+linePos,
Position.X+Size.X-1,
Position.Y+commentTextComponents[i]->Position.Y+commentTextComponents[i]->Size.Y+4,
Position.Y+linePos,
100, 100, 100, 255);
}
}
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)
{
ui::Point positionDiff = ui::Point(commentBoxPositionX, commentBoxPositionY)-addCommentBox->Position;
@ -309,6 +275,7 @@ void PreviewView::OnTick(float dt)
if(xdiff == 0)
xdiff = 1*isign(sizeDiff.X);
addCommentBox->Size.X += xdiff;
addCommentBox->Invalidate();
}
if(sizeDiff.Y!=0)
{
@ -316,6 +283,7 @@ void PreviewView::OnTick(float dt)
if(ydiff == 0)
ydiff = 1*isign(sizeDiff.Y);
addCommentBox->Size.Y += ydiff;
addCommentBox->Invalidate();
}
}
@ -328,6 +296,15 @@ void PreviewView::OnMouseDown(int x, int y, unsigned button)
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)
{
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)
{
if(addCommentBox)
@ -502,48 +425,44 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender)
comments.clear();
}
{
for(int i = 0; i < commentComponents.size(); i++)
{
commentsPanel->RemoveChild(commentComponents[i]);
delete commentComponents[i];
}
commentComponents.clear();
commentTextComponents.clear();
int currentY = 0;//-yOffset;
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);
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;
maxY += 16;
tempComment = new ui::Label(ui::Point(0, 0), ui::Point(Size.X-((XRES/2) + 10), -1), comments[i].comment);
currentY += 16;
commentComponents.push_back(tempUsername);
commentsPanel->AddChild(tempUsername);
commentY = currentY+5;
tempComment = new ui::Label(ui::Point(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));
maxY += tempComment->Size.Y+4;
currentY += tempComment->Size.Y+4;
delete tempUsername;
delete tempComment;
commentComponents.push_back(tempComment);
commentsPanel->AddChild(tempComment);
commentTextComponents.push_back(tempComment);
}
maxOffset = (maxY-(Size.Y-commentBoxHeight))+16;
commentsBegin = true;
commentsEnd = false;
commentsOffset = 0;
commentsVel = 0;
displayComments(commentsOffset);
}
void PreviewView::OnMouseWheel(int x, int y, int d)
{
if(!d)
return;
commentsVel-=d;
if(d<0)
{
if(commentsEnd)
c->NextCommentPage();
} else {
if(commentsBegin)
c->PrevCommentPage();
commentsPanel->InnerSize = ui::Point(commentsPanel->Size.X, currentY+4);
}
}

View File

@ -18,6 +18,11 @@
#include "interface/Label.h"
#include "interface/Textbox.h"
namespace ui
{
class ScrollPanel;
}
class PreviewModel;
class PreviewController;
class PreviewView: public ui::Window {
@ -36,6 +41,7 @@ class PreviewView: public ui::Window {
ui::Label * authorDateLabel;
ui::Label * pageInfo;
ui::Label * saveDescriptionLabel;
ui::ScrollPanel * commentsPanel;
std::vector<SaveComment> comments;
std::vector<ui::Component*> commentComponents;
std::vector<ui::Component*> commentTextComponents;
@ -43,19 +49,13 @@ class PreviewView: public ui::Window {
int votesDown;
bool doOpen;
bool commentsEnd;
bool commentsBegin;
int maxOffset;
float commentsOffset;
float commentsVel;
int commentBoxHeight;
float commentBoxPositionX;
float commentBoxPositionY;
float commentBoxSizeX;
float commentBoxSizeY;
void displayComments(int yOffset);
void displayComments();
void commentBoxAutoHeight();
void submitComment();
public: