From 36ac19ebc1ba85ea7ab353d1b18e26f491a663d0 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Wed, 25 Jul 2012 01:43:16 -0400 Subject: [PATCH] Make the lower arrow a child of the menu instead. When you scroll, make the lower arrow scroll the same way to give the illusion that it isn't moving at all. So, now both arrows scroll on MouseDown, but, Deskbar crashes on resolution change. --- src/apps/deskbar/ScrollArrowView.cpp | 66 +++++++--------------------- src/apps/deskbar/ScrollArrowView.h | 5 --- 2 files changed, 16 insertions(+), 55 deletions(-) diff --git a/src/apps/deskbar/ScrollArrowView.cpp b/src/apps/deskbar/ScrollArrowView.cpp index 8335e243bb..707a8600ef 100644 --- a/src/apps/deskbar/ScrollArrowView.cpp +++ b/src/apps/deskbar/ScrollArrowView.cpp @@ -62,7 +62,7 @@ public: ScrollArrow::ScrollArrow(BRect frame) : - BView(frame, "menu scroll arrow", 0, B_WILL_DRAW | B_FRAME_EVENTS), + BView(frame, "menu scroll arrow", B_FOLLOW_NONE, B_WILL_DRAW), fEnabled(false) { SetViewColor(ui_color(B_MENU_BACKGROUND_COLOR)); @@ -174,7 +174,10 @@ DownScrollArrow::MouseDown(BPoint where) if (!IsEnabled()) return; - dynamic_cast(Parent())->ScrollBy(kDefaultScrollStep); + TScrollArrowView* grandparent + = dynamic_cast(Parent()->Parent()); + + grandparent->ScrollBy(kDefaultScrollStep); snooze(5000); } @@ -266,15 +269,15 @@ TScrollArrowView::AttachScrollers() AddChild(fUpperScrollArrow); } - fMenu->MoveBy(0, kScrollerHeight); - if (fLowerScrollArrow == NULL) { fLowerScrollArrow = new DownScrollArrow( - BRect(0, frame.bottom - kScrollerHeight + 1, frame.right, - frame.bottom)); - AddChild(fLowerScrollArrow, fMenu); + BRect(0, frame.bottom - 2 * kScrollerHeight + 1, frame.right, + frame.bottom - kScrollerHeight)); + fMenu->AddChild(fLowerScrollArrow); } + fMenu->MoveBy(0, kScrollerHeight); + fUpperScrollArrow->SetEnabled(false); fLowerScrollArrow->SetEnabled(true); @@ -353,64 +356,27 @@ TScrollArrowView::ScrollBy(const float& step) if (fValue + step >= fLimit) { // If we reached the limit, only scroll to the end fMenu->ScrollBy(0, fLimit - fValue); - fValue = fLimit; + fLowerScrollArrow->MoveBy(0, fLimit - fValue); fLowerScrollArrow->SetEnabled(false); + fValue = fLimit; } else { fMenu->ScrollBy(0, step); + fLowerScrollArrow->MoveBy(0, step); fValue += step; } - fMenu->Invalidate(); } else if (step < 0) { if (fValue == fLimit) fLowerScrollArrow->SetEnabled(true); if (fValue + step <= 0) { fMenu->ScrollBy(0, -fValue); - fValue = 0; + fLowerScrollArrow->MoveBy(0, -fValue); fUpperScrollArrow->SetEnabled(false); + fValue = 0; } else { fMenu->ScrollBy(0, step); + fLowerScrollArrow->MoveBy(0, step); fValue += step; } - fMenu->Invalidate(); } } - - -bool -TScrollArrowView::CheckForScrolling(const BPoint &cursor) -{ - if (!HasScrollers()) - return false; - - return _Scroll(cursor); -} - - -bool -TScrollArrowView::_Scroll(const BPoint& where) -{ - ASSERT((fLowerScrollArrow != NULL)); - ASSERT((fUpperScrollArrow != NULL)); - - const BPoint cursor = ConvertFromScreen(where); - const BRect &lowerFrame = fLowerScrollArrow->Frame(); - const BRect &upperFrame = fUpperScrollArrow->Frame(); - - int32 delta = 0; - if (fLowerScrollArrow->IsEnabled() && lowerFrame.Contains(cursor)) - delta = 1; - else if (fUpperScrollArrow->IsEnabled() && upperFrame.Contains(cursor)) - delta = -1; - - if (delta == 0) - return false; - - float smallStep; - GetSteps(&smallStep, NULL); - ScrollBy(smallStep * delta); - - snooze(5000); - - return true; -} diff --git a/src/apps/deskbar/ScrollArrowView.h b/src/apps/deskbar/ScrollArrowView.h index ad2b1893b0..0a71c29c5c 100644 --- a/src/apps/deskbar/ScrollArrowView.h +++ b/src/apps/deskbar/ScrollArrowView.h @@ -33,13 +33,8 @@ public: void SetSmallStep(float step); void GetSteps(float* _smallStep, float* _largeStep) const; - - bool CheckForScrolling(const BPoint& cursor); void ScrollBy(const float& step); -protected: - bool _Scroll(const BPoint& cursor); - private: BMenu* fMenu; ScrollArrow* fUpperScrollArrow;