From 4ae3e5421d4009205c273ec076bdcb5e1f21f936 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Sun, 14 Apr 2013 02:22:40 -0400 Subject: [PATCH] Fix a bug where the Deskbar menu was incorrectly sized in horizontal mode Actually, the Deskbar menu was sized correctly but the separator item was not, so, I've replaced the separator item with a new TSeparatorItem class that is derived from BSeparatorItem but does it's own drawing. This neatly avoids the bug since the TSeperatorItem doesn't need to be resized explicitly. Also, there were some instances of AddSeperatorItem (with an e) that I renamed to AddSeparatorItem (with an a). I also eliminated includes in the header which means I added them in some cpp files where they were needed. --- src/apps/deskbar/BarMenuBar.cpp | 68 ++++++++++++---- src/apps/deskbar/BarMenuBar.h | 67 +++++++++------- src/apps/deskbar/BarMenuTitle.cpp | 117 ++++++---------------------- src/apps/deskbar/BarMenuTitle.h | 2 +- src/apps/deskbar/BarView.cpp | 2 +- src/apps/deskbar/TeamMenu.cpp | 1 + src/apps/deskbar/TeamMenuItem.cpp | 1 + src/apps/deskbar/WindowMenuItem.cpp | 1 + 8 files changed, 122 insertions(+), 137 deletions(-) diff --git a/src/apps/deskbar/BarMenuBar.cpp b/src/apps/deskbar/BarMenuBar.cpp index c1873f40b7..7f3213ee55 100644 --- a/src/apps/deskbar/BarMenuBar.cpp +++ b/src/apps/deskbar/BarMenuBar.cpp @@ -37,11 +37,14 @@ All rights reserved. #include "BarMenuBar.h" #include +#include #include #include #include "icons.h" +#include "BarMenuTitle.h" +#include "BarView.h" #include "BarWindow.h" #include "DeskbarMenu.h" #include "DeskbarUtils.h" @@ -51,21 +54,62 @@ All rights reserved. const float kSepItemWidth = 5.0f; -TBarMenuBar::TBarMenuBar(TBarView* bar, BRect frame, const char* name) - : BMenuBar(frame, name, B_FOLLOW_NONE, B_ITEMS_IN_ROW, false), - fBarView(bar), + +// #pragma mark - TSeparatorItem + + +TSeparatorItem::TSeparatorItem() + : + BSeparatorItem() +{ +} + + +void +TSeparatorItem::Draw() +{ + BMenu* menu = Menu(); + if (menu == NULL) + return; + + BRect frame(Frame()); + frame.right = frame.left + kSepItemWidth; + rgb_color base = menu->LowColor(); + + menu->PushState(); + + menu->SetHighColor(tint_color(base, 1.22)); + frame.top--; + // need to expand the frame for some reason + + // stroke a darker line on the left edge + menu->StrokeLine(frame.LeftTop(), frame.LeftBottom()); + frame.left++; + + // fill in background + be_control_look->DrawButtonBackground(menu, frame, frame, base); + + menu->PopState(); +} + + +// #pragma mark - TBarMenuBar + + +TBarMenuBar::TBarMenuBar(BRect frame, const char* name, TBarView* barView) + : + BMenuBar(frame, name, B_FOLLOW_NONE, B_ITEMS_IN_ROW, false), + fBarView(barView), fAppListMenuItem(NULL), fSeparatorItem(NULL) { SetItemMargins(0.0f, 0.0f, 0.0f, 0.0f); - TDeskbarMenu* beMenu = new TDeskbarMenu(bar); + TDeskbarMenu* beMenu = new TDeskbarMenu(barView); TBarWindow::SetDeskbarMenu(beMenu); - const BBitmap* logoBitmap = AppResSet()->FindBitmap(B_MESSAGE_TYPE, - R_LeafLogoBitmap); - fDeskbarMenuItem = new TBarMenuTitle(frame.Width(), frame.Height(), - logoBitmap, beMenu); + fDeskbarMenuItem = new TBarMenuTitle(0.0f, 0.0f, + AppResSet()->FindBitmap(B_MESSAGE_TYPE, R_LeafLogoBitmap), beMenu); AddItem(fDeskbarMenuItem); } @@ -144,7 +188,7 @@ TBarMenuBar::RemoveTeamMenu() bool -TBarMenuBar::AddSeperatorItem() +TBarMenuBar::AddSeparatorItem() { if (CountItems() > 1) return false; @@ -152,9 +196,7 @@ TBarMenuBar::AddSeperatorItem() BRect frame(Frame()); delete fSeparatorItem; - fSeparatorItem = new TTeamMenuItem(kSepItemWidth, - frame.Height() - 2, false); - fSeparatorItem->SetEnabled(false); + fSeparatorItem = new TSeparatorItem(); bool added = AddItem(fSeparatorItem); @@ -189,7 +231,7 @@ TBarMenuBar::RemoveSeperatorItem() void TBarMenuBar::Draw(BRect updateRect) { - // want to skip the fancy BMenuBar drawing code. + // skip the fancy BMenuBar drawing code BMenu::Draw(updateRect); } diff --git a/src/apps/deskbar/BarMenuBar.h b/src/apps/deskbar/BarMenuBar.h index 75dfd24784..f470d38b1c 100644 --- a/src/apps/deskbar/BarMenuBar.h +++ b/src/apps/deskbar/BarMenuBar.h @@ -42,39 +42,48 @@ All rights reserved. #include - -#include "BarView.h" -#include "BarMenuTitle.h" -#include "TimeView.h" +#include -class TBarMenuBar : public BMenuBar { - public: - TBarMenuBar(TBarView* bar, BRect frame, const char* name); - virtual ~TBarMenuBar(); +class TBarMenuTitle; +class TBarView; - virtual void MouseMoved(BPoint where, uint32 code, - const BMessage* message); - virtual void Draw(BRect); +class TSeparatorItem : public BSeparatorItem { +public: + TSeparatorItem(); - void DrawBackground(BRect); - void SmartResize(float width = -1.0f, float height = -1.0f); - - bool AddTeamMenu(); - bool RemoveTeamMenu(); - - bool AddSeperatorItem(); - bool RemoveSeperatorItem(); - - void InitTrackingHook(bool (* hookfunction)(BMenu*, void*), void* state, - bool both = false); - - private: - TBarView* fBarView; - TBarMenuTitle* fDeskbarMenuItem; - TBarMenuTitle* fAppListMenuItem; - TTeamMenuItem* fSeparatorItem; + virtual void Draw(); }; +class TBarMenuBar : public BMenuBar { +public: + TBarMenuBar(BRect frame, const char* name, + TBarView* barView); + virtual ~TBarMenuBar(); -#endif /* BARMENUBAR_H */ + virtual void MouseMoved(BPoint where, uint32 code, + const BMessage* message); + virtual void Draw(BRect); + + void DrawBackground(BRect); + void SmartResize(float width = -1.0f, + float height = -1.0f); + + bool AddTeamMenu(); + bool RemoveTeamMenu(); + + bool AddSeparatorItem(); + bool RemoveSeperatorItem(); + + void InitTrackingHook( + bool (* hookfunction)(BMenu*, void*), + void* state, bool both = false); + +private: + TBarView* fBarView; + TBarMenuTitle* fDeskbarMenuItem; + TBarMenuTitle* fAppListMenuItem; + TSeparatorItem* fSeparatorItem; +}; + +#endif // BARMENUBAR_H diff --git a/src/apps/deskbar/BarMenuTitle.cpp b/src/apps/deskbar/BarMenuTitle.cpp index a20b362697..50c0d79471 100644 --- a/src/apps/deskbar/BarMenuTitle.cpp +++ b/src/apps/deskbar/BarMenuTitle.cpp @@ -82,120 +82,51 @@ TBarMenuTitle::GetContentSize(float* width, float* height) void TBarMenuTitle::Draw() { - if (be_control_look == NULL) { - BMenuItem::Draw(); + BMenu* menu = Menu(); + if (menu == NULL) return; - } - // fill background if selected - rgb_color base = Menu()->LowColor(); - BRect rect = Frame(); + BRect frame(Frame()); + rgb_color base = menu->LowColor(); - BRect windowBounds = Menu()->Window()->Bounds(); - if (rect.right > windowBounds.right) - rect.right = windowBounds.right; + menu->PushState(); + BRect windowBounds = menu->Window()->Bounds(); + if (frame.right > windowBounds.right) + frame.right = windowBounds.right; + + // fill in background if (IsSelected()) { - be_control_look->DrawMenuItemBackground(Menu(), rect, rect, base, + be_control_look->DrawMenuItemBackground(menu, frame, frame, base, BControlLook::B_ACTIVATED); - } else { - be_control_look->DrawButtonBackground(Menu(), rect, rect, base); - } + } else + be_control_look->DrawButtonBackground(menu, frame, frame, base); - // draw content + menu->MovePenTo(ContentLocation()); DrawContent(); - // make sure we restore state - Menu()->SetLowColor(base); + menu->PopState(); } void TBarMenuTitle::DrawContent() { + if (fIcon == NULL) + return; + BMenu* menu = Menu(); BRect frame(Frame()); - - if (be_control_look != NULL) { - menu->SetDrawingMode(B_OP_ALPHA); - - if (fIcon != NULL) { - BRect dstRect(fIcon->Bounds()); - dstRect.OffsetTo(frame.LeftTop()); - dstRect.OffsetBy(rintf(((frame.Width() - dstRect.Width()) / 2) - - 1.0f), rintf(((frame.Height() - dstRect.Height()) / 2) - + 2.0f)); - - menu->DrawBitmapAsync(fIcon, dstRect); - } - return; - } - - rgb_color menuColor = menu->LowColor(); - rgb_color dark = tint_color(menuColor, B_DARKEN_1_TINT); - rgb_color light = tint_color(menuColor, B_LIGHTEN_2_TINT); - - bool inExpandoMode = dynamic_cast(menu) != NULL; - - BRect bounds(menu->Window()->Bounds()); - if (bounds.right < frame.right) - frame.right = bounds.right; - - menu->SetDrawingMode(B_OP_COPY); - - if (!IsSelected() && !menu->IsRedrawAfterSticky()) { - menu->BeginLineArray(8); - menu->AddLine(frame.RightTop(), frame.LeftTop(), light); - menu->AddLine(frame.LeftBottom(), frame.RightBottom(), dark); - menu->AddLine(frame.LeftTop(), - frame.LeftBottom()+BPoint(0, inExpandoMode ? 0 : -1), light); - menu->AddLine(frame.RightBottom(), frame.RightTop(), dark); - if (inExpandoMode) { - frame.top += 1; - menu->AddLine(frame.LeftTop(), frame.RightTop() + BPoint(-1, 0), - light); - } - - menu->EndLineArray(); - - frame.InsetBy(1, 1); - menu->SetHighColor(menuColor); - menu->FillRect(frame); - if (IsSelected()) - menu->SetHighColor(ui_color(B_MENU_SELECTED_ITEM_TEXT_COLOR)); - else - menu->SetHighColor(ui_color(B_MENU_ITEM_TEXT_COLOR)); - frame.InsetBy(-1, -1); - if (inExpandoMode) - frame.top -= 1; - } - - ASSERT(IsEnabled()); - if (IsSelected() && !menu->IsRedrawAfterSticky()) { - menu->SetHighColor(tint_color(menuColor, B_HIGHLIGHT_BACKGROUND_TINT)); - menu->FillRect(frame); - - if (menu->IndexOf(this) > 0) { - menu->SetHighColor(tint_color(menuColor, B_DARKEN_4_TINT)); - menu->StrokeLine(frame.LeftTop(), frame.LeftBottom()); - } - - if (IsSelected()) - menu->SetHighColor(ui_color(B_MENU_SELECTED_ITEM_TEXT_COLOR)); - else - menu->SetHighColor(ui_color(B_MENU_ITEM_TEXT_COLOR)); - } + BRect iconRect(fIcon->Bounds()); menu->SetDrawingMode(B_OP_ALPHA); + iconRect.OffsetTo(frame.LeftTop()); - if (fIcon != NULL) { - BRect dstRect(fIcon->Bounds()); - dstRect.OffsetTo(frame.LeftTop()); - dstRect.OffsetBy(rintf(((frame.Width() - dstRect.Width()) / 2) - 1.0f), - rintf(((frame.Height() - dstRect.Height()) / 2) - 0.0f)); + float widthOffset = rintf((frame.Width() - iconRect.Width()) / 2); + float heightOffset = rintf((frame.Height() - iconRect.Height()) / 2); + iconRect.OffsetBy(widthOffset - 1.0f, heightOffset + 2.0f); - menu->DrawBitmapAsync(fIcon, dstRect); - } + menu->DrawBitmapAsync(fIcon, iconRect); } diff --git a/src/apps/deskbar/BarMenuTitle.h b/src/apps/deskbar/BarMenuTitle.h index c875c06a87..f7bcac02ec 100644 --- a/src/apps/deskbar/BarMenuTitle.h +++ b/src/apps/deskbar/BarMenuTitle.h @@ -50,7 +50,7 @@ class BMenu; class TBarMenuTitle : public BMenuItem { public: TBarMenuTitle(float width, float height, const BBitmap* icon, - BMenu* menu, bool inexpando = false); + BMenu* menu, bool expando = false); virtual ~TBarMenuTitle(); void SetContentSize(float width, float height); diff --git a/src/apps/deskbar/BarView.cpp b/src/apps/deskbar/BarView.cpp index 0c5d6ba5ab..95feb08a4a 100644 --- a/src/apps/deskbar/BarView.cpp +++ b/src/apps/deskbar/BarView.cpp @@ -395,7 +395,7 @@ TBarView::PlaceDeskbarMenu() width += 1; } else { // shows apps to the right of bemenu - fBarMenuBar->AddSeperatorItem(); + fBarMenuBar->AddSeparatorItem(); width = floorf(width) / 2 + kSepItemWidth; } loc = Bounds().LeftTop(); diff --git a/src/apps/deskbar/TeamMenu.cpp b/src/apps/deskbar/TeamMenu.cpp index 7f5a7beef5..50aa6c1bb4 100644 --- a/src/apps/deskbar/TeamMenu.cpp +++ b/src/apps/deskbar/TeamMenu.cpp @@ -44,6 +44,7 @@ All rights reserved. #include "BarApp.h" #include "BarMenuBar.h" +#include "BarView.h" #include "DeskbarUtils.h" #include "TeamMenuItem.h" diff --git a/src/apps/deskbar/TeamMenuItem.cpp b/src/apps/deskbar/TeamMenuItem.cpp index 7c393cd594..7c5d42f2ce 100644 --- a/src/apps/deskbar/TeamMenuItem.cpp +++ b/src/apps/deskbar/TeamMenuItem.cpp @@ -50,6 +50,7 @@ All rights reserved. #include "BarApp.h" #include "BarMenuBar.h" +#include "BarView.h" #include "ExpandoMenuBar.h" #include "ResourceSet.h" #include "ShowHideMenuItem.h" diff --git a/src/apps/deskbar/WindowMenuItem.cpp b/src/apps/deskbar/WindowMenuItem.cpp index 21559c581c..b6110d4f24 100644 --- a/src/apps/deskbar/WindowMenuItem.cpp +++ b/src/apps/deskbar/WindowMenuItem.cpp @@ -44,6 +44,7 @@ All rights reserved. #include "BarApp.h" #include "BarMenuBar.h" +#include "BarView.h" #include "ExpandoMenuBar.h" #include "icons.h" #include "ResourceSet.h"