can change comment pages without the scrollwheel, click and hold scrollbar area to have it scroll to that point

This commit is contained in:
jacob1 2013-07-21 17:05:55 -04:00
parent a63f5b875b
commit e0913d2639
6 changed files with 77 additions and 40 deletions

View File

@ -12,6 +12,8 @@ ScrollPanel::ScrollPanel(Point position, Point size):
xScrollVel(0.0f), xScrollVel(0.0f),
scrollBarWidth(0), scrollBarWidth(0),
isMouseInsideScrollbar(false), isMouseInsideScrollbar(false),
isMouseInsideScrollbarArea(false),
scrollbarClickLocation(0),
scrollbarSelected(false), scrollbarSelected(false),
scrollbarInitialYOffset(0), scrollbarInitialYOffset(0),
scrollbarInitialYClick(0) scrollbarInitialYClick(0)
@ -21,9 +23,9 @@ ScrollPanel::ScrollPanel(Point position, Point size):
int ScrollPanel::GetScrollLimit() int ScrollPanel::GetScrollLimit()
{ {
if(ViewportPosition.Y == 0) if (ViewportPosition.Y == 0)
return -1; return -1;
else if(maxOffset.Y == -ViewportPosition.Y) else if (maxOffset.Y == -ViewportPosition.Y)
return 1; return 1;
return 0; return 0;
} }
@ -31,11 +33,12 @@ int ScrollPanel::GetScrollLimit()
void ScrollPanel::SetScrollPosition(int position) void ScrollPanel::SetScrollPosition(int position)
{ {
offsetY = position; offsetY = position;
ViewportPosition.Y = position;
} }
void ScrollPanel::XOnMouseWheelInside(int localx, int localy, int d) void ScrollPanel::XOnMouseWheelInside(int localx, int localy, int d)
{ {
if(!d) if (!d)
return; return;
yScrollVel -= d*2; yScrollVel -= d*2;
} }
@ -47,11 +50,11 @@ void ScrollPanel::Draw(const Point& screenPos)
Graphics * g = ui::Engine::Ref().g; Graphics * g = ui::Engine::Ref().g;
//Vertical scroll bar //Vertical scroll bar
if(maxOffset.Y>0 && InnerSize.Y>0) if (maxOffset.Y>0 && InnerSize.Y>0)
{ {
float scrollHeight = float(Size.Y)*(float(Size.Y)/float(InnerSize.Y)); float scrollHeight = float(Size.Y)*(float(Size.Y)/float(InnerSize.Y));
float scrollPos = 0; float scrollPos = 0;
if(-ViewportPosition.Y>0) if (-ViewportPosition.Y>0)
{ {
scrollPos = float(Size.Y-scrollHeight)*(float(offsetY)/float(maxOffset.Y)); scrollPos = float(Size.Y-scrollHeight)*(float(offsetY)/float(maxOffset.Y));
} }
@ -67,13 +70,16 @@ void ScrollPanel::XOnMouseClick(int x, int y, unsigned int button)
{ {
scrollbarSelected = true; scrollbarSelected = true;
scrollbarInitialYOffset = offsetY; scrollbarInitialYOffset = offsetY;
scrollbarInitialYClick = y;
} }
scrollbarInitialYClick = y;
scrollbarClickLocation = 100;
} }
void ScrollPanel::XOnMouseUp(int x, int y, unsigned int button) void ScrollPanel::XOnMouseUp(int x, int y, unsigned int button)
{ {
scrollbarSelected = false; scrollbarSelected = false;
isMouseInsideScrollbarArea = false;
scrollbarClickLocation = 0;
} }
void ScrollPanel::XOnMouseMoved(int x, int y, int dx, int dy) void ScrollPanel::XOnMouseMoved(int x, int y, int dx, int dy)
@ -82,7 +88,7 @@ void ScrollPanel::XOnMouseMoved(int x, int y, int dx, int dy)
{ {
float scrollHeight = float(Size.Y)*(float(Size.Y)/float(InnerSize.Y)); float scrollHeight = float(Size.Y)*(float(Size.Y)/float(InnerSize.Y));
float scrollPos = 0; float scrollPos = 0;
if(-ViewportPosition.Y>0) if (-ViewportPosition.Y>0)
{ {
scrollPos = float(Size.Y-scrollHeight)*(float(offsetY)/float(maxOffset.Y)); scrollPos = float(Size.Y-scrollHeight)*(float(offsetY)/float(maxOffset.Y));
} }
@ -102,8 +108,12 @@ void ScrollPanel::XOnMouseMoved(int x, int y, int dx, int dy)
} }
} }
if (x > (Size.X-scrollBarWidth) && x < (Size.X-scrollBarWidth)+scrollBarWidth && y > scrollPos && y < scrollPos+scrollHeight) if (x > (Size.X-scrollBarWidth) && x < (Size.X-scrollBarWidth)+scrollBarWidth)
isMouseInsideScrollbar = true; {
if (y > scrollPos && y < scrollPos+scrollHeight)
isMouseInsideScrollbar = true;
isMouseInsideScrollbarArea = true;
}
else else
isMouseInsideScrollbar = false; isMouseInsideScrollbar = false;
} }
@ -111,14 +121,12 @@ void ScrollPanel::XOnMouseMoved(int x, int y, int dx, int dy)
void ScrollPanel::XTick(float dt) void ScrollPanel::XTick(float dt)
{ {
//if(yScrollVel > 7.0f) yScrollVel = 7.0f; if (yScrollVel > -0.5f && yScrollVel < 0.5)
//if(yScrollVel < -7.0f) yScrollVel = -7.0f;
if(yScrollVel > -0.5f && yScrollVel < 0.5)
yScrollVel = 0; yScrollVel = 0;
if(xScrollVel > 7.0f) xScrollVel = 7.0f; if (xScrollVel > 7.0f) xScrollVel = 7.0f;
if(xScrollVel < -7.0f) xScrollVel = -7.0f; if (xScrollVel < -7.0f) xScrollVel = -7.0f;
if(xScrollVel > -0.5f && xScrollVel < 0.5) if (xScrollVel > -0.5f && xScrollVel < 0.5)
xScrollVel = 0; xScrollVel = 0;
maxOffset = InnerSize-Size; maxOffset = InnerSize-Size;
@ -133,46 +141,55 @@ void ScrollPanel::XTick(float dt)
yScrollVel*=0.98f; yScrollVel*=0.98f;
xScrollVel*=0.98f; xScrollVel*=0.98f;
if(oldOffsetY!=int(offsetY)) if (oldOffsetY!=int(offsetY))
{ {
if(offsetY<0) if (offsetY<0)
{ {
offsetY = 0; offsetY = 0;
yScrollVel = 0; yScrollVel = 0;
//commentsBegin = true;
//commentsEnd = false;
} }
else if(offsetY>maxOffset.Y) else if (offsetY>maxOffset.Y)
{ {
offsetY = maxOffset.Y; offsetY = maxOffset.Y;
yScrollVel = 0; yScrollVel = 0;
//commentsEnd = true;
//commentsBegin = false;
}
else
{
//commentsEnd = false;
//commentsBegin = false;
} }
ViewportPosition.Y = -offsetY; ViewportPosition.Y = -offsetY;
} }
else else
{ {
if(offsetY<0) if (offsetY<0)
{ {
offsetY = 0; offsetY = 0;
yScrollVel = 0; yScrollVel = 0;
ViewportPosition.Y = -offsetY; ViewportPosition.Y = -offsetY;
} }
else if(offsetY>maxOffset.Y) else if (offsetY>maxOffset.Y)
{ {
offsetY = maxOffset.Y; offsetY = maxOffset.Y;
ViewportPosition.Y = -offsetY; ViewportPosition.Y = -offsetY;
} }
} }
if(mouseInside && scrollBarWidth < 6) if (mouseInside && scrollBarWidth < 6)
scrollBarWidth++; scrollBarWidth++;
else if(!mouseInside && scrollBarWidth > 0 && !scrollbarSelected) else if (!mouseInside && scrollBarWidth > 0 && !scrollbarSelected)
scrollBarWidth--; 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;
}
} }

View File

@ -14,9 +14,11 @@ namespace ui
float yScrollVel; float yScrollVel;
float xScrollVel; float xScrollVel;
bool isMouseInsideScrollbar; bool isMouseInsideScrollbar;
bool isMouseInsideScrollbarArea;
bool scrollbarSelected; bool scrollbarSelected;
int scrollbarInitialYOffset; int scrollbarInitialYOffset;
int scrollbarInitialYClick; int scrollbarInitialYClick;
int scrollbarClickLocation;
public: public:
ScrollPanel(Point position, Point size); ScrollPanel(Point position, Point size);

View File

@ -162,16 +162,24 @@ void PreviewController::OpenInBrowser()
OpenURI(uriStream.str()); OpenURI(uriStream.str());
} }
void PreviewController::NextCommentPage() bool PreviewController::NextCommentPage()
{ {
if(previewModel->GetCommentsPageNum() < previewModel->GetCommentsPageCount() && previewModel->GetCommentsLoaded()) if(previewModel->GetCommentsPageNum() < previewModel->GetCommentsPageCount() && previewModel->GetCommentsLoaded())
{
previewModel->UpdateComments(previewModel->GetCommentsPageNum()+1); previewModel->UpdateComments(previewModel->GetCommentsPageNum()+1);
return true;
}
return false;
} }
void PreviewController::PrevCommentPage() bool PreviewController::PrevCommentPage()
{ {
if(previewModel->GetCommentsPageNum()>1 && previewModel->GetCommentsLoaded()) if(previewModel->GetCommentsPageNum()>1 && previewModel->GetCommentsLoaded())
{
previewModel->UpdateComments(previewModel->GetCommentsPageNum()-1); previewModel->UpdateComments(previewModel->GetCommentsPageNum()-1);
return true;
}
return false;
} }
void PreviewController::Exit() void PreviewController::Exit()

View File

@ -36,8 +36,8 @@ public:
void FavouriteSave(); void FavouriteSave();
bool SubmitComment(std::string comment); bool SubmitComment(std::string comment);
void NextCommentPage(); bool NextCommentPage();
void PrevCommentPage(); bool PrevCommentPage();
virtual ~PreviewController(); virtual ~PreviewController();
}; };

View File

@ -376,12 +376,23 @@ void PreviewView::OnMouseWheel(int x, int y, int d)
c->NextCommentPage(); c->NextCommentPage();
if(commentsPanel->GetScrollLimit() == -1 && d > 0) if(commentsPanel->GetScrollLimit() == -1 && d > 0)
{ {
prevPage = true; if (c->PrevCommentPage())
c->PrevCommentPage(); prevPage = true;
} }
} }
void PreviewView::OnMouseUp(int x, int y, unsigned int button)
{
if(commentsPanel->GetScrollLimit() == 1)
c->NextCommentPage();
if(commentsPanel->GetScrollLimit() == -1)
{
if (c->PrevCommentPage())
prevPage = true;
}
}
void PreviewView::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt) void PreviewView::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt)
{ {
if ((key == KEY_ENTER || key == KEY_RETURN) && (!addCommentBox || !addCommentBox->IsFocused())) if ((key == KEY_ENTER || key == KEY_RETURN) && (!addCommentBox || !addCommentBox->IsFocused()))
@ -558,7 +569,7 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender)
} }
if(showAvatars) if(showAvatars)
tempUsername = new ui::Label(ui::Point(31, currentY+3), ui::Point(Size.X-((XRES/2) + 13), 16), comments->at(i)->authorNameFormatted); tempUsername = new ui::Label(ui::Point(31, currentY+3), ui::Point(Size.X-((XRES/2) + 13 + 26), 16), comments->at(i)->authorNameFormatted);
else else
tempUsername = new ui::Label(ui::Point(5, currentY+3), ui::Point(Size.X-((XRES/2) + 13), 16), comments->at(i)->authorNameFormatted); tempUsername = new ui::Label(ui::Point(5, currentY+3), ui::Point(Size.X-((XRES/2) + 13), 16), comments->at(i)->authorNameFormatted);
tempUsername->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempUsername->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
@ -593,8 +604,6 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender)
{ {
prevPage = false; prevPage = false;
commentsPanel->SetScrollPosition(currentY); commentsPanel->SetScrollPosition(currentY);
//update positions of the comments so that it doesn't start at the top for a frame
commentsPanel->Tick(0);
} }
} }
} }

View File

@ -72,6 +72,7 @@ public:
virtual void OnTick(float dt); virtual void OnTick(float dt);
virtual void OnTryExit(ExitMethod method); virtual void OnTryExit(ExitMethod method);
virtual void OnMouseWheel(int x, int y, int d); virtual void OnMouseWheel(int x, int y, int d);
virtual void OnMouseUp(int x, int y, unsigned int button);
virtual void OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt); virtual void OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt);
virtual ~PreviewView(); virtual ~PreviewView();
}; };