BMenu: scroll marked item into view when menu has scrollers attached.

Signed-off-by: Axel Dörfler <axeld@pinc-software.de>
This commit is contained in:
Jessica Hamilton 2013-05-04 00:13:41 +12:00 committed by Axel Dörfler
parent 4e78098e7c
commit 4898c615d6
3 changed files with 26 additions and 0 deletions

View File

@ -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);

View File

@ -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();

View File

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