Various fixes to BMenuField behavior:
* In layout mode, using a BMenuField directly will make it behave like using a fixed size BMenuField in non-layout mode. This is open for debate, but not a change to the previous behavior. When using the Label and MenuBar- LayoutItems though, the behavior is now changed to be more what one would expect, ie the BMenuBar part is layouted across the full available width just like it happens with BTextControls. * Fixed invalidation of the BMenuBar when it auto-resizes according to picking another item, and when it is resized due to layout changes. * Fixed the problem with growing BMenuFields in file panels after changing folders the first time. The fix is not so nice, but the purpose of setting the menu item margins is to make sure it renders at the same vertical offset as the BMenuField label. The better fix would be to change the calculation of the content location or required margins in the BMenuItem code... however the BMCPrivate code needs to account for the popup indicator in the margins so I just kept the fix for the offset there as well. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29650 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
ca4463c296
commit
31852cb13e
@ -128,6 +128,7 @@ _BMCMenuBar_::AttachedToWindow()
|
||||
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;
|
||||
@ -135,6 +136,13 @@ _BMCMenuBar_::AttachedToWindow()
|
||||
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();
|
||||
@ -267,12 +275,7 @@ _BMCMenuBar_::FrameResized(float width, float height)
|
||||
{
|
||||
// we need to take care of resizing and cleaning up
|
||||
// the parent menu field
|
||||
float diff;
|
||||
if (fFixedSize)
|
||||
diff = width - fPreviousWidth;
|
||||
else
|
||||
diff = Frame().right - (fMenuField->Bounds().right - 2);
|
||||
|
||||
float diff = width - fPreviousWidth;
|
||||
fPreviousWidth = width;
|
||||
|
||||
if (Window()) {
|
||||
@ -280,7 +283,8 @@ _BMCMenuBar_::FrameResized(float width, float height)
|
||||
// clean up the dirty right border of
|
||||
// the menu field when enlarging
|
||||
BRect dirty(fMenuField->Bounds());
|
||||
dirty.left = dirty.right - diff - 2;
|
||||
dirty.right = Frame().right + 2;
|
||||
dirty.left = dirty.left - diff - 4;
|
||||
fMenuField->Invalidate(dirty);
|
||||
|
||||
// clean up the arrow part
|
||||
@ -292,7 +296,8 @@ _BMCMenuBar_::FrameResized(float width, float height)
|
||||
// clean up the dirty right line of
|
||||
// the menu field when shrinking
|
||||
BRect dirty(fMenuField->Bounds());
|
||||
dirty.left = dirty.right - 2;
|
||||
dirty.left = Frame().right - 2;
|
||||
dirty.right = dirty.left - diff + 4;
|
||||
fMenuField->Invalidate(dirty);
|
||||
|
||||
// clean up the arrow part
|
||||
@ -307,6 +312,7 @@ _BMCMenuBar_::FrameResized(float width, float height)
|
||||
// of the size of the parent menu field as well
|
||||
// NOTE: no worries about follow mode, we follow left and top
|
||||
// in autosize mode
|
||||
diff = Frame().right + 2 - fMenuField->Bounds().right;
|
||||
fMenuField->ResizeBy(diff, 0.0);
|
||||
}
|
||||
BMenuBar::FrameResized(width, height);
|
||||
|
@ -730,8 +730,12 @@ BMenuField::CreateLabelLayoutItem()
|
||||
BLayoutItem*
|
||||
BMenuField::CreateMenuBarLayoutItem()
|
||||
{
|
||||
if (!fLayoutData->menu_bar_layout_item)
|
||||
if (!fLayoutData->menu_bar_layout_item) {
|
||||
// align the menu bar in the full available space
|
||||
fMenuBar->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
|
||||
B_ALIGN_VERTICAL_UNSET));
|
||||
fLayoutData->menu_bar_layout_item = new MenuBarLayoutItem(this);
|
||||
}
|
||||
return fLayoutData->menu_bar_layout_item;
|
||||
}
|
||||
|
||||
@ -767,7 +771,7 @@ BMenuField::Perform(perform_code code, void* _data)
|
||||
BMenuField::GetHeightForWidth(data->width, &data->min, &data->max,
|
||||
&data->preferred);
|
||||
return B_OK;
|
||||
}
|
||||
}
|
||||
case PERFORM_CODE_SET_LAYOUT:
|
||||
{
|
||||
perform_data_set_layout* data = (perform_data_set_layout*)_data;
|
||||
@ -1041,9 +1045,15 @@ BMenuField::_InitMenuBar(BMenu* menu, BRect frame, bool fixedSize)
|
||||
|
||||
fMenuBar = new _BMCMenuBar_(frame, fixedSize, this);
|
||||
|
||||
// by default align the menu bar left in the available space
|
||||
fMenuBar->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT,
|
||||
B_ALIGN_VERTICAL_UNSET));
|
||||
if (fixedSize) {
|
||||
// align the menu bar left in the available space
|
||||
fMenuBar->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT,
|
||||
B_ALIGN_VERTICAL_UNSET));
|
||||
} else {
|
||||
// align the menu bar in the full available space
|
||||
fMenuBar->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
|
||||
B_ALIGN_VERTICAL_UNSET));
|
||||
}
|
||||
|
||||
AddChild(fMenuBar);
|
||||
fMenuBar->AddItem(menu);
|
||||
@ -1268,14 +1278,19 @@ BMenuField::MenuBarLayoutItem::BaseMinSize()
|
||||
BSize
|
||||
BMenuField::MenuBarLayoutItem::BaseMaxSize()
|
||||
{
|
||||
return BaseMinSize();
|
||||
BSize size(BaseMinSize());
|
||||
size.width = B_SIZE_UNLIMITED;
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
BSize
|
||||
BMenuField::MenuBarLayoutItem::BasePreferredSize()
|
||||
{
|
||||
return BaseMinSize();
|
||||
BSize size(BaseMinSize());
|
||||
// puh, no idea...
|
||||
size.width = 100;
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user