From e0913d2639dbec89d7ab795be8de12d1e9ec0efb Mon Sep 17 00:00:00 2001 From: jacob1 Date: Sun, 21 Jul 2013 17:05:55 -0400 Subject: [PATCH] can change comment pages without the scrollwheel, click and hold scrollbar area to have it scroll to that point --- src/gui/interface/ScrollPanel.cpp | 79 ++++++++++++++++----------- src/gui/interface/ScrollPanel.h | 2 + src/gui/preview/PreviewController.cpp | 12 +++- src/gui/preview/PreviewController.h | 4 +- src/gui/preview/PreviewView.cpp | 19 +++++-- src/gui/preview/PreviewView.h | 1 + 6 files changed, 77 insertions(+), 40 deletions(-) diff --git a/src/gui/interface/ScrollPanel.cpp b/src/gui/interface/ScrollPanel.cpp index f1e80949b..cf1dcf1ba 100644 --- a/src/gui/interface/ScrollPanel.cpp +++ b/src/gui/interface/ScrollPanel.cpp @@ -12,6 +12,8 @@ ScrollPanel::ScrollPanel(Point position, Point size): xScrollVel(0.0f), scrollBarWidth(0), isMouseInsideScrollbar(false), + isMouseInsideScrollbarArea(false), + scrollbarClickLocation(0), scrollbarSelected(false), scrollbarInitialYOffset(0), scrollbarInitialYClick(0) @@ -21,9 +23,9 @@ ScrollPanel::ScrollPanel(Point position, Point size): int ScrollPanel::GetScrollLimit() { - if(ViewportPosition.Y == 0) + if (ViewportPosition.Y == 0) return -1; - else if(maxOffset.Y == -ViewportPosition.Y) + else if (maxOffset.Y == -ViewportPosition.Y) return 1; return 0; } @@ -31,11 +33,12 @@ int ScrollPanel::GetScrollLimit() void ScrollPanel::SetScrollPosition(int position) { offsetY = position; + ViewportPosition.Y = position; } void ScrollPanel::XOnMouseWheelInside(int localx, int localy, int d) { - if(!d) + if (!d) return; yScrollVel -= d*2; } @@ -47,11 +50,11 @@ void ScrollPanel::Draw(const Point& screenPos) Graphics * g = ui::Engine::Ref().g; //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 scrollPos = 0; - if(-ViewportPosition.Y>0) + if (-ViewportPosition.Y>0) { 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; scrollbarInitialYOffset = offsetY; - scrollbarInitialYClick = y; } + 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) @@ -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 scrollPos = 0; - if(-ViewportPosition.Y>0) + if (-ViewportPosition.Y>0) { 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) - isMouseInsideScrollbar = true; + if (x > (Size.X-scrollBarWidth) && x < (Size.X-scrollBarWidth)+scrollBarWidth) + { + if (y > scrollPos && y < scrollPos+scrollHeight) + isMouseInsideScrollbar = true; + isMouseInsideScrollbarArea = true; + } else isMouseInsideScrollbar = false; } @@ -111,14 +121,12 @@ void ScrollPanel::XOnMouseMoved(int x, int y, int dx, int dy) 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) + 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) + 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; @@ -133,46 +141,55 @@ void ScrollPanel::XTick(float dt) yScrollVel*=0.98f; xScrollVel*=0.98f; - if(oldOffsetY!=int(offsetY)) + if (oldOffsetY!=int(offsetY)) { - if(offsetY<0) + if (offsetY<0) { offsetY = 0; yScrollVel = 0; - //commentsBegin = true; - //commentsEnd = false; } - else if(offsetY>maxOffset.Y) + 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) + if (offsetY<0) { offsetY = 0; yScrollVel = 0; ViewportPosition.Y = -offsetY; } - else if(offsetY>maxOffset.Y) + else if (offsetY>maxOffset.Y) { offsetY = maxOffset.Y; ViewportPosition.Y = -offsetY; } } - if(mouseInside && scrollBarWidth < 6) + if (mouseInside && scrollBarWidth < 6) scrollBarWidth++; - else if(!mouseInside && scrollBarWidth > 0 && !scrollbarSelected) + 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; + } } diff --git a/src/gui/interface/ScrollPanel.h b/src/gui/interface/ScrollPanel.h index 0d48658fe..ea56ac93c 100644 --- a/src/gui/interface/ScrollPanel.h +++ b/src/gui/interface/ScrollPanel.h @@ -14,9 +14,11 @@ namespace ui float yScrollVel; float xScrollVel; bool isMouseInsideScrollbar; + bool isMouseInsideScrollbarArea; bool scrollbarSelected; int scrollbarInitialYOffset; int scrollbarInitialYClick; + int scrollbarClickLocation; public: ScrollPanel(Point position, Point size); diff --git a/src/gui/preview/PreviewController.cpp b/src/gui/preview/PreviewController.cpp index 3e6dd387e..3a7961ae1 100644 --- a/src/gui/preview/PreviewController.cpp +++ b/src/gui/preview/PreviewController.cpp @@ -162,16 +162,24 @@ void PreviewController::OpenInBrowser() OpenURI(uriStream.str()); } -void PreviewController::NextCommentPage() +bool PreviewController::NextCommentPage() { if(previewModel->GetCommentsPageNum() < previewModel->GetCommentsPageCount() && previewModel->GetCommentsLoaded()) + { previewModel->UpdateComments(previewModel->GetCommentsPageNum()+1); + return true; + } + return false; } -void PreviewController::PrevCommentPage() +bool PreviewController::PrevCommentPage() { if(previewModel->GetCommentsPageNum()>1 && previewModel->GetCommentsLoaded()) + { previewModel->UpdateComments(previewModel->GetCommentsPageNum()-1); + return true; + } + return false; } void PreviewController::Exit() diff --git a/src/gui/preview/PreviewController.h b/src/gui/preview/PreviewController.h index e1e429d6e..c5a4306df 100644 --- a/src/gui/preview/PreviewController.h +++ b/src/gui/preview/PreviewController.h @@ -36,8 +36,8 @@ public: void FavouriteSave(); bool SubmitComment(std::string comment); - void NextCommentPage(); - void PrevCommentPage(); + bool NextCommentPage(); + bool PrevCommentPage(); virtual ~PreviewController(); }; diff --git a/src/gui/preview/PreviewView.cpp b/src/gui/preview/PreviewView.cpp index 590798e3f..de175319b 100644 --- a/src/gui/preview/PreviewView.cpp +++ b/src/gui/preview/PreviewView.cpp @@ -376,12 +376,23 @@ void PreviewView::OnMouseWheel(int x, int y, int d) c->NextCommentPage(); if(commentsPanel->GetScrollLimit() == -1 && d > 0) { - prevPage = true; - c->PrevCommentPage(); + if (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) { if ((key == KEY_ENTER || key == KEY_RETURN) && (!addCommentBox || !addCommentBox->IsFocused())) @@ -558,7 +569,7 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender) } 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 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; @@ -593,8 +604,6 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender) { prevPage = false; commentsPanel->SetScrollPosition(currentY); - //update positions of the comments so that it doesn't start at the top for a frame - commentsPanel->Tick(0); } } } diff --git a/src/gui/preview/PreviewView.h b/src/gui/preview/PreviewView.h index 9ddbb712e..9975afc40 100644 --- a/src/gui/preview/PreviewView.h +++ b/src/gui/preview/PreviewView.h @@ -72,6 +72,7 @@ public: virtual void OnTick(float dt); virtual void OnTryExit(ExitMethod method); 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 ~PreviewView(); };