From 235118c831cff2ed7d314d924d5b65b2f4cc6354 Mon Sep 17 00:00:00 2001 From: X512 Date: Sat, 7 Mar 2020 13:21:18 +0900 Subject: [PATCH] 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 (cherry picked from commit db3a94141ac2e2d7a9155279fdb95a05a105888d) Reviewed-on: https://review.haiku-os.org/c/haiku/+/2660 Reviewed-by: waddlesplash --- docs/user/interface/SeparatorItem.dox | 9 +++-- headers/os/interface/Menu.h | 1 + src/kits/interface/SeparatorItem.cpp | 49 ++++++++++++++++++--------- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/docs/user/interface/SeparatorItem.dox b/docs/user/interface/SeparatorItem.dox index 185c82d0c9..5c58dab956 100644 --- a/docs/user/interface/SeparatorItem.dox +++ b/docs/user/interface/SeparatorItem.dox @@ -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 */ diff --git a/headers/os/interface/Menu.h b/headers/os/interface/Menu.h index 2960e3e10b..3fede3d4fa 100644 --- a/headers/os/interface/Menu.h +++ b/headers/os/interface/Menu.h @@ -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); diff --git a/src/kits/interface/SeparatorItem.cpp b/src/kits/interface/SeparatorItem.cpp index ef4abf794c..a520bb3cf0 100644 --- a/src/kits/interface/SeparatorItem.cpp +++ b/src/kits/interface/SeparatorItem.cpp @@ -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); }