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:
X512
2020-03-07 17:33:25 +00:00
committed by waddlesplash
parent 30f2ededbf
commit 9b33a309da
2 changed files with 27 additions and 7 deletions
+3
View File
@@ -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);
+24 -7
View File
@@ -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);
}
}