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) {