Interface Kit: fix menu resizing when scrolling is enabled
BMenuWindow::Attach/DetachScrollers can be called when scrollers are already attached/detached and it should handle this case properly. Call BMenuWindow::DetachScrollers when scrolling is not needed anymore. Fixes #8513. Change-Id: I1f70b63d75106cf33ab1f72d34e221a54b45a75e Reviewed-on: https://review.haiku-os.org/c/haiku/+/2310 Reviewed-by: Adrien Destugues <[email protected]> Reviewed-by: John Scipione <[email protected]>
This commit is contained in:
@@ -2931,6 +2931,9 @@ BMenu::_UpdateWindowViewSize(const bool &move)
|
||||
|
||||
if (fItems.CountItems() > 0) {
|
||||
if (!scroll) {
|
||||
if (fLayout == B_ITEMS_IN_COLUMN)
|
||||
window->DetachScrollers();
|
||||
|
||||
window->ResizeTo(Bounds().Width(), Bounds().Height());
|
||||
} else {
|
||||
BScreen screen(window);
|
||||
|
||||
@@ -76,7 +76,8 @@ const int kScrollerHeight = 12;
|
||||
|
||||
BMenuScroller::BMenuScroller(BRect frame)
|
||||
:
|
||||
BView(frame, "menu scroller", 0, B_WILL_DRAW | B_FRAME_EVENTS),
|
||||
BView(frame, "menu scroller", 0, B_WILL_DRAW | B_FRAME_EVENTS
|
||||
| B_FULL_UPDATE_ON_RESIZE),
|
||||
fEnabled(false)
|
||||
{
|
||||
SetViewUIColor(B_MENU_BACKGROUND_COLOR);
|
||||
@@ -298,6 +299,15 @@ BMenuWindow::AttachScrollers()
|
||||
fMenu->MakeFocus(true);
|
||||
|
||||
BRect frame = Bounds();
|
||||
float newLimit = fMenu->Bounds().Height()
|
||||
- (frame.Height() - 2 * kScrollerHeight);
|
||||
|
||||
if (!HasScrollers())
|
||||
fValue = 0;
|
||||
else if (fValue > newLimit)
|
||||
_ScrollBy(newLimit - fValue);
|
||||
|
||||
fLimit = newLimit;
|
||||
|
||||
if (fUpperScroller == NULL) {
|
||||
fUpperScroller = new UpperScroller(
|
||||
@@ -312,14 +322,14 @@ BMenuWindow::AttachScrollers()
|
||||
AddChild(fLowerScroller);
|
||||
}
|
||||
|
||||
fUpperScroller->SetEnabled(false);
|
||||
fLowerScroller->SetEnabled(true);
|
||||
fUpperScroller->ResizeTo(frame.right, kScrollerHeight - 1);
|
||||
fLowerScroller->ResizeTo(frame.right, kScrollerHeight - 1);
|
||||
|
||||
fMenuFrame->ResizeBy(0, -2 * kScrollerHeight);
|
||||
fMenuFrame->MoveBy(0, kScrollerHeight);
|
||||
fUpperScroller->SetEnabled(fValue > 0);
|
||||
fLowerScroller->SetEnabled(fValue < fLimit);
|
||||
|
||||
fValue = 0;
|
||||
fLimit = fMenu->Bounds().Height() - (frame.Height() - 2 * kScrollerHeight);
|
||||
fMenuFrame->ResizeTo(frame.Width(), frame.Height() - 2 * kScrollerHeight);
|
||||
fMenuFrame->MoveTo(0, kScrollerHeight);
|
||||
}
|
||||
|
||||
|
||||
@@ -342,6 +352,13 @@ BMenuWindow::DetachScrollers()
|
||||
delete fUpperScroller;
|
||||
fUpperScroller = NULL;
|
||||
}
|
||||
|
||||
BRect frame = Bounds();
|
||||
|
||||
if (fMenuFrame != NULL) {
|
||||
fMenuFrame->ResizeTo(frame.Width(), frame.Height());
|
||||
fMenuFrame->MoveTo(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user