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 (fItems.CountItems() > 0) {
|
||||||
if (!scroll) {
|
if (!scroll) {
|
||||||
|
if (fLayout == B_ITEMS_IN_COLUMN)
|
||||||
|
window->DetachScrollers();
|
||||||
|
|
||||||
window->ResizeTo(Bounds().Width(), Bounds().Height());
|
window->ResizeTo(Bounds().Width(), Bounds().Height());
|
||||||
} else {
|
} else {
|
||||||
BScreen screen(window);
|
BScreen screen(window);
|
||||||
|
|||||||
@@ -76,7 +76,8 @@ const int kScrollerHeight = 12;
|
|||||||
|
|
||||||
BMenuScroller::BMenuScroller(BRect frame)
|
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)
|
fEnabled(false)
|
||||||
{
|
{
|
||||||
SetViewUIColor(B_MENU_BACKGROUND_COLOR);
|
SetViewUIColor(B_MENU_BACKGROUND_COLOR);
|
||||||
@@ -298,6 +299,15 @@ BMenuWindow::AttachScrollers()
|
|||||||
fMenu->MakeFocus(true);
|
fMenu->MakeFocus(true);
|
||||||
|
|
||||||
BRect frame = Bounds();
|
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) {
|
if (fUpperScroller == NULL) {
|
||||||
fUpperScroller = new UpperScroller(
|
fUpperScroller = new UpperScroller(
|
||||||
@@ -312,14 +322,14 @@ BMenuWindow::AttachScrollers()
|
|||||||
AddChild(fLowerScroller);
|
AddChild(fLowerScroller);
|
||||||
}
|
}
|
||||||
|
|
||||||
fUpperScroller->SetEnabled(false);
|
fUpperScroller->ResizeTo(frame.right, kScrollerHeight - 1);
|
||||||
fLowerScroller->SetEnabled(true);
|
fLowerScroller->ResizeTo(frame.right, kScrollerHeight - 1);
|
||||||
|
|
||||||
fMenuFrame->ResizeBy(0, -2 * kScrollerHeight);
|
fUpperScroller->SetEnabled(fValue > 0);
|
||||||
fMenuFrame->MoveBy(0, kScrollerHeight);
|
fLowerScroller->SetEnabled(fValue < fLimit);
|
||||||
|
|
||||||
fValue = 0;
|
fMenuFrame->ResizeTo(frame.Width(), frame.Height() - 2 * kScrollerHeight);
|
||||||
fLimit = fMenu->Bounds().Height() - (frame.Height() - 2 * kScrollerHeight);
|
fMenuFrame->MoveTo(0, kScrollerHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -342,6 +352,13 @@ BMenuWindow::DetachScrollers()
|
|||||||
delete fUpperScroller;
|
delete fUpperScroller;
|
||||||
fUpperScroller = NULL;
|
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