From 4e0c2a797d01708bc3c1a49f2d496dc465f833cf Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Fri, 3 Oct 2008 06:03:27 +0000 Subject: [PATCH] Menus can be scrolled also using the mouse wheel git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27844 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/interface/MenuWindow.h | 8 +++-- src/kits/interface/Menu.cpp | 25 ++++++++++++++- src/kits/interface/MenuWindow.cpp | 43 ++++++++++++++++++++------ 3 files changed, 62 insertions(+), 14 deletions(-) diff --git a/headers/private/interface/MenuWindow.h b/headers/private/interface/MenuWindow.h index 5d5a8039be..1f8053ab60 100644 --- a/headers/private/interface/MenuWindow.h +++ b/headers/private/interface/MenuWindow.h @@ -34,8 +34,9 @@ class BMenuWindow : public BWindow { void AttachScrollers(); void DetachScrollers(); - bool CheckForScrolling(BPoint cursor); - + bool CheckForScrolling(const BPoint &cursor); + bool TryScrollBy(const float &step); + private: BMenu *fMenu; BMenuFrame *fMenuFrame; @@ -45,7 +46,8 @@ class BMenuWindow : public BWindow { float fValue; float fLimit; - bool _Scroll(BPoint cursor); + bool _Scroll(const BPoint &cursor); + void _ScrollBy(const float &step); }; } // namespace BPrivate diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index 87198bda37..dfd0376e5b 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -813,7 +813,30 @@ BMenu::Superitem() const void BMenu::MessageReceived(BMessage *msg) { - BView::MessageReceived(msg); + switch (msg->what) { + case B_MOUSE_WHEEL_CHANGED: + { + //float deltaX = 0 + float deltaY = 0; + //msg->FindFloat("be:wheel_delta_x", &deltaX); + msg->FindFloat("be:wheel_delta_y", &deltaY); + if (deltaY == 0) + return; + + BMenuWindow *window = dynamic_cast(Window()); + if (window == NULL) + return; + + window->TryScrollBy(deltaY); + + break; + } + default: + BView::MessageReceived(msg); + break; + } + + } diff --git a/src/kits/interface/MenuWindow.cpp b/src/kits/interface/MenuWindow.cpp index ba5a7e548d..64463cd235 100644 --- a/src/kits/interface/MenuWindow.cpp +++ b/src/kits/interface/MenuWindow.cpp @@ -336,7 +336,7 @@ BMenuWindow::DetachScrollers() bool -BMenuWindow::CheckForScrolling(BPoint cursor) +BMenuWindow::CheckForScrolling(const BPoint &cursor) { if (!fMenuFrame || !fUpperScroller || !fLowerScroller) return false; @@ -346,17 +346,45 @@ BMenuWindow::CheckForScrolling(BPoint cursor) bool -BMenuWindow::_Scroll(BPoint cursor) +BMenuWindow::TryScrollBy(const float &step) +{ + if (!fMenuFrame || !fUpperScroller || !fLowerScroller) + return false; + + _ScrollBy(step); + + return true; +} + + +bool +BMenuWindow::_Scroll(const BPoint &where) { ASSERT((fLowerScroller != NULL)); ASSERT((fUpperScroller != NULL)); - ConvertFromScreen(&cursor); + const BPoint cursor = ConvertFromScreen(where); BRect lowerFrame = fLowerScroller->Frame(); BRect upperFrame = fUpperScroller->Frame(); if (fLowerScroller->IsEnabled() && lowerFrame.Contains(cursor)) { + _ScrollBy(1); + } else if (fUpperScroller->IsEnabled() && upperFrame.Contains(cursor)) { + _ScrollBy(-1); + } else + return false; + + snooze(10000); + + return true; +} + + +void +BMenuWindow::_ScrollBy(const float &step) +{ + if (step > 0) { if (fValue == 0) { fUpperScroller->SetEnabled(true); fUpperScroller->Invalidate(); @@ -374,7 +402,7 @@ BMenuWindow::_Scroll(BPoint cursor) fMenu->ScrollBy(0, kScrollStep); fValue += kScrollStep; } - } else if (fUpperScroller->IsEnabled() && upperFrame.Contains(cursor)) { + } else if (step < 0) { if (fValue == fLimit) { fLowerScroller->SetEnabled(true); fLowerScroller->Invalidate(); @@ -390,11 +418,6 @@ BMenuWindow::_Scroll(BPoint cursor) fMenu->ScrollBy(0, -kScrollStep); fValue -= kScrollStep; } - } else - return false; - - snooze(10000); - - return true; + } }