From 4898c615d6c4f72deb9433c784b9e6d84419efb0 Mon Sep 17 00:00:00 2001 From: Jessica Hamilton Date: Sat, 4 May 2013 00:13:41 +1200 Subject: [PATCH] BMenu: scroll marked item into view when menu has scrollers attached. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Axel Dörfler --- headers/private/interface/MenuWindow.h | 1 + src/kits/interface/Menu.cpp | 14 ++++++++++++++ src/kits/interface/MenuWindow.cpp | 11 +++++++++++ 3 files changed, 26 insertions(+) diff --git a/headers/private/interface/MenuWindow.h b/headers/private/interface/MenuWindow.h index 80c03716d7..eb1b943c9d 100644 --- a/headers/private/interface/MenuWindow.h +++ b/headers/private/interface/MenuWindow.h @@ -40,6 +40,7 @@ public: bool HasScrollers() const; bool CheckForScrolling(const BPoint& cursor); bool TryScrollBy(const float& step); + bool TryScrollTo(const float& where); private: bool _Scroll(const BPoint& cursor); diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index e8b7283e72..97373d6a9a 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -2871,6 +2871,20 @@ BMenu::_UpdateWindowViewSize(const bool &move) } window->AttachScrollers(); + + BMenuItem* selectedItem = FindMarked(); + if (selectedItem != NULL && fLayout == B_ITEMS_IN_COLUMN) { + // scroll to the selected item + if (Supermenu() == NULL) { + window->TryScrollTo(selectedItem->Frame().top); + } else { + BPoint point = selectedItem->Frame().LeftTop(); + BPoint superpoint = Superitem()->Frame().LeftTop(); + Supermenu()->ConvertToScreen(&superpoint); + ConvertToScreen(&point); + window->TryScrollTo(point.y - superpoint.y); + } + } } } else { _CacheFontInfo(); diff --git a/src/kits/interface/MenuWindow.cpp b/src/kits/interface/MenuWindow.cpp index b568f75c48..9523f67178 100644 --- a/src/kits/interface/MenuWindow.cpp +++ b/src/kits/interface/MenuWindow.cpp @@ -412,6 +412,17 @@ BMenuWindow::TryScrollBy(const float& step) } +bool +BMenuWindow::TryScrollTo(const float& where) +{ + if (!fMenuFrame || !fUpperScroller || !fLowerScroller) + return false; + + _ScrollBy(where - fValue); + return true; +} + + bool BMenuWindow::_Scroll(const BPoint& where) {