From 94e66d170f3c9e07a94dc1cd3f07e4038240c3bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Wed, 25 Mar 2009 10:54:24 +0000 Subject: [PATCH] Fixed recently introduced regressions with layouted BMenuFields. When passing fixedSize=true to the private BMenuBar class, it would set the follow mode in AttachedToWindow() such that BMenu would calculate the minimum width differently. Also fixes ticket #3606. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29691 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/BMCPrivate.cpp | 97 ++++++++++++++++++------------- src/kits/interface/MenuField.cpp | 24 ++++---- 2 files changed, 72 insertions(+), 49 deletions(-) diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index dec065c623..dc7a5416a6 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006, Haiku Inc. + * Copyright 2001-2009 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -58,27 +58,31 @@ _BMCFilter_::operator=(const _BMCFilter_ &) } -_BMCMenuBar_::_BMCMenuBar_(BRect frame, bool fixedSize, BMenuField *menuField) - : BMenuBar(frame, "_mc_mb_", B_FOLLOW_LEFT | B_FOLLOW_TOP, B_ITEMS_IN_ROW, +// #pragma mark - + + +_BMCMenuBar_::_BMCMenuBar_(BRect frame, bool fixedSize, BMenuField* menuField) + : + BMenuBar(frame, "_mc_mb_", B_FOLLOW_LEFT | B_FOLLOW_TOP, B_ITEMS_IN_ROW, !fixedSize), fMenuField(menuField), fFixedSize(fixedSize), fRunner(NULL), fShowPopUpMarker(true) { - SetFlags(Flags() | B_FRAME_EVENTS); - SetBorder(B_BORDER_CONTENTS); + _Init(true); +} - float left, top, right, bottom; - GetItemMargins(&left, &top, &right, &bottom); - // give a bit more space to draw the small thumb - left -= 1; - right += 3; - SetItemMargins(left, top, right, bottom); - SetMaxContentWidth(frame.Width() - (left + right)); - - fPreviousWidth = frame.Width(); +_BMCMenuBar_::_BMCMenuBar_(bool fixedSize, BMenuField* menuField) + : + BMenuBar("_mc_mb_", B_ITEMS_IN_ROW, !fixedSize), + fMenuField(menuField), + fFixedSize(fixedSize), + fRunner(NULL), + fShowPopUpMarker(true) +{ + _Init(false); } @@ -121,33 +125,10 @@ _BMCMenuBar_::AttachedToWindow() // Don't cause the KeyMenuBar to change by being attached BMenuBar *menuBar = Window()->KeyMenuBar(); BMenuBar::AttachedToWindow(); - if (fFixedSize) - SetResizingMode(B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); Window()->SetKeyMenuBar(menuBar); - float left, top, right, bottom; - GetItemMargins(&left, &top, &right, &bottom); - -#if 0 - // TODO: Better fix would be to make BMenuItem draw text properly - // centered - font_height fontHeight; - GetFontHeight(&fontHeight); - top = ceilf((Bounds().Height() - ceilf(fontHeight.ascent) - - ceilf(fontHeight.descent)) / 2) + 1; - bottom = top - 1; -#else - // TODO: Fix content location properly. This is just a quick fix to - // make the BMenuField label and the super-item of the BMenuBar - // align vertically. - top++; - bottom--; -#endif - - if (be_control_look) - left = right = be_control_look->DefaultLabelSpacing(); - - SetItemMargins(left, top, right + fShowPopUpMarker ? 10 : 0, bottom); + if (fFixedSize && (Flags() & B_SUPPORTS_LAYOUT) == 0) + SetResizingMode(B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); } @@ -392,3 +373,41 @@ _BMCMenuBar_ { return *this; } + + +void +_BMCMenuBar_::_Init(bool setMaxContentWidth) +{ + SetFlags(Flags() | B_FRAME_EVENTS); + SetBorder(B_BORDER_CONTENTS); + + float left, top, right, bottom; + GetItemMargins(&left, &top, &right, &bottom); + +#if 0 + // TODO: Better fix would be to make BMenuItem draw text properly + // centered + font_height fontHeight; + GetFontHeight(&fontHeight); + top = ceilf((Bounds().Height() - ceilf(fontHeight.ascent) + - ceilf(fontHeight.descent)) / 2) + 1; + bottom = top - 1; +#else + // TODO: Fix content location properly. This is just a quick fix to + // make the BMenuField label and the super-item of the BMenuBar + // align vertically. + top++; + bottom--; +#endif + + if (be_control_look) + left = right = be_control_look->DefaultLabelSpacing(); + + SetItemMargins(left, top, right + fShowPopUpMarker ? 10 : 0, bottom); + + fPreviousWidth = Bounds().Width(); + + if (setMaxContentWidth) + SetMaxContentWidth(fPreviousWidth - (left + right)); +} + diff --git a/src/kits/interface/MenuField.cpp b/src/kits/interface/MenuField.cpp index 1fecbb4539..8abcbc5a64 100644 --- a/src/kits/interface/MenuField.cpp +++ b/src/kits/interface/MenuField.cpp @@ -1031,16 +1031,20 @@ BMenuField::_InitMenuBar(BMenu* menu, BRect frame, bool fixedSize) fMenu = menu; InitMenu(menu); - frame.left = _MenuBarOffset(); - frame.top = kVMargin; - frame.right -= kVMargin; - frame.bottom -= kVMargin; - - TRACE("frame(%.1f, %.1f, %.1f, %.1f) (%.2f, %.2f)\n", - frame.left, frame.top, frame.right, frame.bottom, - frame.Width(), frame.Height()); - - fMenuBar = new _BMCMenuBar_(frame, fixedSize, this); + if ((Flags() & B_SUPPORTS_LAYOUT)) { + fMenuBar = new _BMCMenuBar_(fixedSize, this); + } else { + frame.left = _MenuBarOffset(); + frame.top = kVMargin; + frame.right -= kVMargin; + frame.bottom -= kVMargin; + + TRACE("frame(%.1f, %.1f, %.1f, %.1f) (%.2f, %.2f)\n", + frame.left, frame.top, frame.right, frame.bottom, + frame.Width(), frame.Height()); + + fMenuBar = new _BMCMenuBar_(frame, fixedSize, this); + } if (fixedSize) { // align the menu bar in the full available space