SeparatorItem: support horizontal layout

This is required for BMenuBar based toolbars.

Fixes #15785.

Change-Id: I8d108694b481e408e5c56e23a697c8e7829343dc
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2316
Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>
(cherry picked from commit db3a94141a)
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2660
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
This commit is contained in:
X512 2020-03-07 13:21:18 +09:00 committed by waddlesplash
parent 95e4519c7d
commit 235118c831
3 changed files with 40 additions and 19 deletions

View File

@ -26,10 +26,12 @@
\brief Display separator item for BMenu class.
A BSeparatorItem is used to separate groups of menu items in a BMenu.
It is drawn as a horizontal line and cannot be selected or highlighted.
It is drawn as a horizontal or vertical line depending on menu layout
and cannot be selected or highlighted.
\warning BSeparatorItems are only meant to be used with menus whose
items are arranged in a \c B_ITEMS_IN_COLUMN layout.
items are arranged in a \c B_ITEMS_IN_COLUMN or
\c B_ITEMS_IN_ROW layout.
\since BeOS R3
*/
@ -140,7 +142,8 @@
call this method yourself but you may want to override it in a derived class
to do something other than the default.
The default draws a light grey horizontal line through the middle of the item.
The default draws a light grey horizontal or vertical line through the middle
of the item.
\since BeOS R3
*/

View File

@ -172,6 +172,7 @@ public:
private:
friend class BMenuBar;
friend class BSeparatorItem;
friend class BPrivate::MenuPrivate;
friend status_t _init_interface_kit_();
friend status_t set_menu_info(menu_info* info);

View File

@ -62,16 +62,24 @@ BSeparatorItem::SetEnabled(bool enable)
void
BSeparatorItem::GetContentSize(float* _width, float* _height)
{
if (_width != NULL)
*_width = 2.0;
if (Menu() != NULL && Menu()->Layout() == B_ITEMS_IN_ROW) {
if (_width != NULL)
*_width = 2.0;
if (_height != NULL) {
BFont font(be_plain_font);
if (Menu() != NULL)
Menu()->GetFont(&font);
if (_height != NULL)
*_height = 2.0;
} else {
if (_width != NULL)
*_width = 2.0;
const float height = floorf((font.Size() * 0.8) / 2) * 2;
*_height = max_c(4, height);
if (_height != NULL) {
BFont font(be_plain_font);
if (Menu() != NULL)
Menu()->GetFont(&font);
const float height = floorf((font.Size() * 0.8) / 2) * 2;
*_height = max_c(4, height);
}
}
}
@ -87,14 +95,23 @@ BSeparatorItem::Draw()
rgb_color oldColor = menu->HighColor();
rgb_color lowColor = menu->LowColor();
const float startTop = bounds.top + (floor(bounds.Height())) / 2;
menu->SetHighColor(tint_color(lowColor, B_DARKEN_1_TINT));
menu->StrokeLine(BPoint(bounds.left + 1.0f, startTop),
BPoint(bounds.right - 1.0f, startTop));
menu->SetHighColor(tint_color(lowColor, B_LIGHTEN_2_TINT));
menu->StrokeLine(BPoint(bounds.left + 1.0f, startTop + 1.0f),
BPoint(bounds.right - 1.0f, startTop + 1.0f));
if (menu->Layout() == B_ITEMS_IN_ROW) {
const float startLeft = bounds.left + (floor(bounds.Width())) / 2;
menu->SetHighColor(tint_color(lowColor, B_DARKEN_1_TINT));
menu->StrokeLine(BPoint(startLeft, bounds.top + 1.0f),
BPoint(startLeft, bounds.bottom - 1.0f));
menu->SetHighColor(tint_color(lowColor, B_LIGHTEN_2_TINT));
menu->StrokeLine(BPoint(startLeft + 1.0f, bounds.top + 1.0f),
BPoint(startLeft + 1.0f, bounds.bottom - 1.0f));
} else {
const float startTop = bounds.top + (floor(bounds.Height())) / 2;
menu->SetHighColor(tint_color(lowColor, B_DARKEN_1_TINT));
menu->StrokeLine(BPoint(bounds.left + 1.0f, startTop),
BPoint(bounds.right - 1.0f, startTop));
menu->SetHighColor(tint_color(lowColor, B_LIGHTEN_2_TINT));
menu->StrokeLine(BPoint(bounds.left + 1.0f, startTop + 1.0f),
BPoint(bounds.right - 1.0f, startTop + 1.0f));
}
menu->SetHighColor(oldColor);
}