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 <[email protected]>
This commit is contained in:
X512
2020-05-10 15:45:27 +00:00
committed by waddlesplash
parent 3ef1314981
commit db3a94141a
3 changed files with 40 additions and 19 deletions
+6 -3
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
*/
+1
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);
+18 -1
View File
@@ -62,6 +62,13 @@ BSeparatorItem::SetEnabled(bool enable)
void
BSeparatorItem::GetContentSize(float* _width, float* _height)
{
if (Menu() != NULL && Menu()->Layout() == B_ITEMS_IN_ROW) {
if (_width != NULL)
*_width = 2.0;
if (_height != NULL)
*_height = 2.0;
} else {
if (_width != NULL)
*_width = 2.0;
@@ -74,6 +81,7 @@ BSeparatorItem::GetContentSize(float* _width, float* _height)
*_height = max_c(4, height);
}
}
}
void
@@ -87,6 +95,15 @@ BSeparatorItem::Draw()
rgb_color oldColor = menu->HighColor();
rgb_color lowColor = menu->LowColor();
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),
@@ -94,7 +111,7 @@ BSeparatorItem::Draw()
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);
}