Deskbar: Scale cut-off leaf icon in horizontal mode

Fixes #8505 restoring the aesthetic integrity of the cut-off leaf.

Add vertically & horizontally centered, whole vector icon to rdef.

Reformat BarMenuTitle.h rename header guard from BARMENUTITLEH to
BAR_MENU_TITLE_H.

Created TDeskbarMenuTitle subclass which deals with Deskbar menu
item stuff like getting the icon from vector data and pushing the
leaf down a few pixels to cut off the leaf (maintaining its aesthetic
integrity).

Made TBarMenuTitle methods virtual. Remove unused expando constructor
parameter and private variable.

Add a TODO to scale the bitmap if we can't find any vector icon data.
With non-vector bitmap it behaves same as before this commit in
horizontal mode.

Adjust kMinimumTrayWidth to restore Deskbar's minimum width to its
classic value since days of yore, 143px. This, perhaps not coincidently,
is exactly the amount fit 7 replicant icons. Update constants in the
code to reflect this reality. Adjustable width coming soon.

replace dynamic_cast<TBarApp*>(be_app) with a static_cast in 1 place.
This commit is contained in:
John Scipione
2017-01-08 02:39:39 -08:00
parent 3d870da3cb
commit 066137eb05
12 changed files with 186 additions and 54 deletions
-1
View File
@@ -66,7 +66,6 @@ All rights reserved.
#include "Switcher.h" #include "Switcher.h"
#include "Utilities.h" #include "Utilities.h"
#include "icons.h"
#include "tracker_private.h" #include "tracker_private.h"
+6 -2
View File
@@ -43,6 +43,7 @@ All rights reserved.
#include "icons.h" #include "icons.h"
#include "BarApp.h"
#include "BarMenuTitle.h" #include "BarMenuTitle.h"
#include "BarView.h" #include "BarView.h"
#include "BarWindow.h" #include "BarWindow.h"
@@ -108,8 +109,9 @@ TBarMenuBar::TBarMenuBar(BRect frame, const char* name, TBarView* barView)
TDeskbarMenu* beMenu = new TDeskbarMenu(barView); TDeskbarMenu* beMenu = new TDeskbarMenu(barView);
TBarWindow::SetDeskbarMenu(beMenu); TBarWindow::SetDeskbarMenu(beMenu);
fDeskbarMenuItem = new TBarMenuTitle(0.0f, 0.0f, fDeskbarMenuItem = new TDeskbarMenuTitle(frame.Width(), frame.Height(),
AppResSet()->FindBitmap(B_MESSAGE_TYPE, R_LeafLogoBitmap), beMenu); NULL, beMenu);
fDeskbarMenuItem->FetchIcon();
AddItem(fDeskbarMenuItem); AddItem(fDeskbarMenuItem);
} }
@@ -141,6 +143,8 @@ TBarMenuBar::SmartResize(float width, float height)
fAppListMenuItem->SetContentSize(width / count, height); fAppListMenuItem->SetContentSize(width / count, height);
} }
fDeskbarMenuItem->FetchIcon();
InvalidateLayout(); InvalidateLayout();
} }
+6 -2
View File
@@ -47,6 +47,7 @@ All rights reserved.
class TBarMenuTitle; class TBarMenuTitle;
class TBarView; class TBarView;
class TDeskbarMenuTitle;
class TSeparatorItem : public BSeparatorItem { class TSeparatorItem : public BSeparatorItem {
public: public:
@@ -63,9 +64,10 @@ public:
virtual void MouseMoved(BPoint where, uint32 code, virtual void MouseMoved(BPoint where, uint32 code,
const BMessage* message); const BMessage* message);
virtual void Draw(BRect);
virtual void Draw(BRect);
void DrawBackground(BRect); void DrawBackground(BRect);
void SmartResize(float width = -1.0f, void SmartResize(float width = -1.0f,
float height = -1.0f); float height = -1.0f);
@@ -79,9 +81,11 @@ public:
bool (* hookfunction)(BMenu*, void*), bool (* hookfunction)(BMenu*, void*),
void* state, bool both = false); void* state, bool both = false);
TDeskbarMenuTitle* DeskbarMenuTitle() { return fDeskbarMenuItem; };
private: private:
TBarView* fBarView; TBarView* fBarView;
TBarMenuTitle* fDeskbarMenuItem; TDeskbarMenuTitle* fDeskbarMenuItem;
TBarMenuTitle* fAppListMenuItem; TBarMenuTitle* fAppListMenuItem;
TSeparatorItem* fSeparatorItem; TSeparatorItem* fSeparatorItem;
}; };
+103 -3
View File
@@ -36,22 +36,28 @@ All rights reserved.
#include "BarMenuTitle.h" #include "BarMenuTitle.h"
#include <algorithm>
#include <Bitmap.h> #include <Bitmap.h>
#include <ControlLook.h> #include <ControlLook.h>
#include <Debug.h> #include <Debug.h>
#include <IconUtils.h>
#include "BarApp.h" #include "BarApp.h"
#include "BarView.h" #include "BarView.h"
#include "BarWindow.h" #include "BarWindow.h"
#include "ResourceSet.h"
#include "StatusView.h"
#include "icons.h"
TBarMenuTitle::TBarMenuTitle(float width, float height, const BBitmap* icon, TBarMenuTitle::TBarMenuTitle(float width, float height, const BBitmap* icon,
BMenu* menu, bool expando) BMenu* menu)
: :
BMenuItem(menu, new BMessage(B_REFS_RECEIVED)), BMenuItem(menu, new BMessage(B_REFS_RECEIVED)),
fWidth(width), fWidth(width),
fHeight(height), fHeight(height),
fInExpando(expando),
fIcon(icon) fIcon(icon)
{ {
} }
@@ -123,7 +129,7 @@ TBarMenuTitle::DrawContent()
float widthOffset = rintf((frame.Width() - iconRect.Width()) / 2); float widthOffset = rintf((frame.Width() - iconRect.Width()) / 2);
float heightOffset = rintf((frame.Height() - iconRect.Height()) / 2); float heightOffset = rintf((frame.Height() - iconRect.Height()) / 2);
iconRect.OffsetBy(widthOffset - 1.0f, heightOffset + 2.0f); iconRect.OffsetBy(widthOffset - 1, heightOffset - 1);
menu->DrawBitmapAsync(fIcon, iconRect); menu->DrawBitmapAsync(fIcon, iconRect);
} }
@@ -144,3 +150,97 @@ TBarMenuTitle::Invoke(BMessage* message)
return BMenuItem::Invoke(message); return BMenuItem::Invoke(message);
} }
void
TBarMenuTitle::SetIcon(const BBitmap* icon)
{
delete fIcon;
fIcon = icon;
}
// #pragma mark - TDeskbarMenuTitle
const int32 kIconSizeCutoff = 48;
// icon size to stop increasing logo width in horizontal mode
TDeskbarMenuTitle::TDeskbarMenuTitle(float width, float height,
const BBitmap* icon, BMenu* menu)
:
TBarMenuTitle(width, height, icon, menu),
fVectorIconData(NULL),
fVectorIconSize(0)
{
}
void
TDeskbarMenuTitle::DrawContent()
{
if (fIcon == NULL)
return;
BMenu* menu = Menu();
BRect frame(Frame());
BRect iconRect(fIcon->Bounds());
menu->SetDrawingMode(B_OP_ALPHA);
iconRect.OffsetTo(frame.LeftTop());
float widthOffset = rintf((frame.Width() - iconRect.Width()) / 2);
float heightOffset = rintf((frame.Height() - iconRect.Height()) / 2);
// move bitmap down a few pixels so leaf gets cut off
heightOffset += 3;
iconRect.OffsetBy(widthOffset - 1, heightOffset - 1);
menu->DrawBitmapAsync(fIcon, iconRect);
}
const BBitmap*
TDeskbarMenuTitle::FetchIcon()
{
if (fVectorIconData == NULL || fVectorIconSize == 0) {
// haven't fetched vector icon data yet, fetch it
fVectorIconData = (const uint8*)AppResSet()->FindResource(
B_VECTOR_ICON_TYPE, R_LeafLogoVector, &fVectorIconSize);
}
float width = CalcIconWidth();
BBitmap* icon = new BBitmap(BRect(0, 0, width - 1, width - 1),
B_RGBA32);
if (fVectorIconData != NULL && fVectorIconSize > 0
&& BIconUtils::GetVectorIcon(fVectorIconData, fVectorIconSize, icon)
== B_OK) {
// rasterized vector icon into a bitmap
fIcon = icon;
} else {
// fetched bitmap instead
fIcon = AppResSet()->FindBitmap(B_MESSAGE_TYPE, R_LeafLogoBitmap);
// TODO: scale the bitmap into icon
delete icon;
}
return fIcon;
}
float
TDeskbarMenuTitle::CalcIconWidth()
{
TBarApp* barApp = static_cast<TBarApp*>(be_app);
bool isVertical = barApp->BarView()->Vertical();
bool hasBitmapIcon = fVectorIconData == NULL;
float m = 3;
float x = (isVertical || hasBitmapIcon) ? kMinimumIconSize
: std::min(barApp->IconSize(), kIconSizeCutoff);
float b = kMinimumIconSize;
return m * x + b;
}
+34 -16
View File
@@ -32,8 +32,8 @@ brand product names are registered trademarks or trademarks of their respective
holders. holders.
All rights reserved. All rights reserved.
*/ */
#ifndef BARMENUTITLE_H #ifndef BAR_MENU_TITLE_H
#define BARMENUTITLE_H #define BAR_MENU_TITLE_H
// //
@@ -47,27 +47,45 @@ All rights reserved.
class BBitmap; class BBitmap;
class BMenu; class BMenu;
class TBarMenuTitle : public BMenuItem { class TBarMenuTitle : public BMenuItem {
public: public:
TBarMenuTitle(float width, float height, const BBitmap* icon, TBarMenuTitle(float width, float height,
BMenu* menu, bool expando = false); const BBitmap* icon, BMenu* menu);
virtual ~TBarMenuTitle(); virtual ~TBarMenuTitle();
void SetContentSize(float width, float height); virtual void SetContentSize(float width, float height);
void Draw(); virtual void Draw();
status_t Invoke(BMessage* message); virtual status_t Invoke(BMessage* message);
const BBitmap* Icon() { return fIcon; };
virtual void SetIcon(const BBitmap* icon);
protected: protected:
void DrawContent(); virtual void DrawContent();
void GetContentSize(float* width, float* height); virtual void GetContentSize(float* width, float* height);
private: float fWidth;
float fWidth; float fHeight;
float fHeight; const BBitmap* fIcon;
bool fInExpando;
const BBitmap* fIcon;
}; };
#endif // BARMENUTITLE_H class TDeskbarMenuTitle : public TBarMenuTitle {
public:
TDeskbarMenuTitle(float width, float height,
const BBitmap* icon, BMenu* menu);
virtual void DrawContent();
const BBitmap* FetchIcon();
float CalcIconWidth();
private:
const uint8* fVectorIconData;
size_t fVectorIconSize;
};
#endif // BAR_MENU_TITLE_H
+4 -1
View File
@@ -49,6 +49,7 @@ All rights reserved.
#include "icons.h" #include "icons.h"
#include "BarApp.h" #include "BarApp.h"
#include "BarMenuBar.h" #include "BarMenuBar.h"
#include "BarMenuTitle.h"
#include "BarWindow.h" #include "BarWindow.h"
#include "DeskbarMenu.h" #include "DeskbarMenu.h"
#include "DeskbarUtils.h" #include "DeskbarUtils.h"
@@ -394,8 +395,10 @@ TBarView::PlaceDeskbarMenu()
width += 1; width += 1;
} else { } else {
// shows apps to the right of bemenu // shows apps to the right of bemenu
width = fBarMenuBar->DeskbarMenuTitle()->CalcIconWidth()
+ kMinimumIconSize;
fBarMenuBar->AddSeparatorItem(); fBarMenuBar->AddSeparatorItem();
width = floorf(width) / 2 + kSepItemWidth; width += kSepItemWidth;
} }
loc = Bounds().LeftTop(); loc = Bounds().LeftTop();
} else { } else {
+11 -13
View File
@@ -55,6 +55,7 @@ All rights reserved.
#include "icons.h" #include "icons.h"
#include "BarApp.h" #include "BarApp.h"
#include "BarMenuBar.h"
#include "BarMenuTitle.h" #include "BarMenuTitle.h"
#include "BarView.h" #include "BarView.h"
#include "BarWindow.h" #include "BarWindow.h"
@@ -95,7 +96,6 @@ TExpandoMenuBar::TExpandoMenuBar(TBarView* barView, bool vertical)
fVertical(vertical), fVertical(vertical),
fOverflow(false), fOverflow(false),
fFirstBuild(true), fFirstBuild(true),
fDeskbarMenuWidth(kMinMenuItemWidth),
fPreviousDragTargetItem(NULL), fPreviousDragTargetItem(NULL),
fLastMousedOverItem(NULL), fLastMousedOverItem(NULL),
fLastClickedItem(NULL) fLastClickedItem(NULL)
@@ -103,13 +103,6 @@ TExpandoMenuBar::TExpandoMenuBar(TBarView* barView, bool vertical)
SetItemMargins(0.0f, 0.0f, 0.0f, 0.0f); SetItemMargins(0.0f, 0.0f, 0.0f, 0.0f);
SetFont(be_plain_font); SetFont(be_plain_font);
SetMaxItemWidth(); SetMaxItemWidth();
// top or bottom mode, add deskbar menu and sep for menubar tracking
// consistency
const BBitmap* logoBitmap = AppResSet()->FindBitmap(B_MESSAGE_TYPE,
R_LeafLogoBitmap);
if (logoBitmap != NULL)
fDeskbarMenuWidth = logoBitmap->Bounds().Width() + 16;
} }
@@ -369,7 +362,7 @@ TExpandoMenuBar::MouseMoved(BPoint where, uint32 code, const BMessage* message)
break; break;
} }
if (!dynamic_cast<TBarApp*>(be_app)->Settings()->hideLabels) { if (!static_cast<TBarApp*>(be_app)->Settings()->hideLabels) {
// item has a visible label, set tool tip if truncated // item has a visible label, set tool tip if truncated
fLastMousedOverItem = menuItem; fLastMousedOverItem = menuItem;
if (strcasecmp(item->TruncatedLabel(), item->Label()) > 0) { if (strcasecmp(item->TruncatedLabel(), item->Label()) > 0) {
@@ -741,8 +734,11 @@ TExpandoMenuBar::CheckItemSizes(int32 delta)
bool drawLabels = !static_cast<TBarApp*>(be_app)->Settings()->hideLabels; bool drawLabels = !static_cast<TBarApp*>(be_app)->Settings()->hideLabels;
float deskbarMenuWidth
= fBarView->BarMenuBar()->DeskbarMenuTitle()->CalcIconWidth();
float maxWidth = fBarView->DragRegion()->Frame().left float maxWidth = fBarView->DragRegion()->Frame().left
- fDeskbarMenuWidth - kSepItemWidth; - deskbarMenuWidth - kSepItemWidth;
int32 iconSize = static_cast<TBarApp*>(be_app)->IconSize(); int32 iconSize = static_cast<TBarApp*>(be_app)->IconSize();
float iconOnlyWidth = kIconPadding + iconSize + kIconPadding; float iconOnlyWidth = kIconPadding + iconSize + kIconPadding;
float minItemWidth = drawLabels float minItemWidth = drawLabels
@@ -751,7 +747,7 @@ TExpandoMenuBar::CheckItemSizes(int32 delta)
float maxItemWidth = drawLabels float maxItemWidth = drawLabels
? gMinimumWindowWidth + iconSize - kMinimumIconSize ? gMinimumWindowWidth + iconSize - kMinimumIconSize
: iconOnlyWidth; : iconOnlyWidth;
float menuWidth = maxItemWidth * CountItems() + fDeskbarMenuWidth float menuWidth = maxItemWidth * CountItems() + deskbarMenuWidth
+ kSepItemWidth; + kSepItemWidth;
bool reset = false; bool reset = false;
@@ -881,10 +877,12 @@ TExpandoMenuBar::CheckForSizeOverrun()
float minItemWidth = !static_cast<TBarApp*>(be_app)->Settings()->hideLabels float minItemWidth = !static_cast<TBarApp*>(be_app)->Settings()->hideLabels
? iconOnlyWidth + kMinMenuItemWidth ? iconOnlyWidth + kMinMenuItemWidth
: iconOnlyWidth - kIconPadding; : iconOnlyWidth - kIconPadding;
float menuWidth = minItemWidth * CountItems() + fDeskbarMenuWidth float deskbarMenuWidth
= fBarView->BarMenuBar()->DeskbarMenuTitle()->CalcIconWidth();
float menuWidth = minItemWidth * CountItems() + deskbarMenuWidth
+ kSepItemWidth; + kSepItemWidth;
float maxWidth = fBarView->DragRegion()->Frame().left float maxWidth = fBarView->DragRegion()->Frame().left
- fDeskbarMenuWidth - kSepItemWidth; - deskbarMenuWidth - kSepItemWidth;
return menuWidth > maxWidth; return menuWidth > maxWidth;
} }
-1
View File
@@ -116,7 +116,6 @@ private:
bool fOverflow : 1; bool fOverflow : 1;
bool fFirstBuild : 1; bool fFirstBuild : 1;
float fDeskbarMenuWidth;
TTeamMenuItem* fPreviousDragTargetItem; TTeamMenuItem* fPreviousDragTargetItem;
BMenuItem* fLastMousedOverItem; BMenuItem* fLastMousedOverItem;
BMenuItem* fLastClickedItem; BMenuItem* fLastClickedItem;
+3 -8
View File
@@ -69,6 +69,8 @@ All rights reserved.
#include "icons.h" #include "icons.h"
#include "BarApp.h" #include "BarApp.h"
#include "BarMenuBar.h"
#include "BarMenuTitle.h"
#include "DeskbarUtils.h" #include "DeskbarUtils.h"
#include "ResourceSet.h" #include "ResourceSet.h"
#include "StatusViewShelf.h" #include "StatusViewShelf.h"
@@ -138,15 +140,8 @@ TReplicantTray::TReplicantTray(TBarView* parent, bool vertical)
fMinimumTrayWidth(kMinimumTrayWidth), fMinimumTrayWidth(kMinimumTrayWidth),
fAlignmentSupport(false) fAlignmentSupport(false)
{ {
// init the minimum window width according to the logo.
const BBitmap* logoBitmap = AppResSet()->FindBitmap(B_MESSAGE_TYPE,
R_LeafLogoBitmap);
if (logoBitmap != NULL) {
gMinimumWindowWidth = std::max(gMinimumWindowWidth,
2 * (logoBitmap->Bounds().Width() + 8));
}
gMinimumWindowWidth = std::max(gMinimumWindowWidth, gMinimumWindowWidth = std::max(gMinimumWindowWidth,
be_plain_font->StringWidth("WWWWWWWWW") + 20); be_plain_font->StringWidth("WWWWWWWWW") + 20);
if (vertical) if (vertical)
fMinimumTrayWidth = gMinimumWindowWidth - kGutter - kDragRegionWidth; fMinimumTrayWidth = gMinimumWindowWidth - kGutter - kDragRegionWidth;
+5 -7
View File
@@ -48,17 +48,15 @@ All rights reserved.
const float kMaxReplicantHeight = 16.0f; const float kMaxReplicantHeight = 16.0f;
const float kMaxReplicantWidth = 16.0f; const float kMaxReplicantWidth = 16.0f;
const int32 kMinimumReplicantCount = 6; const int32 kMinimumReplicantCount = 7;
const int32 kIconGap = 2; const int32 kIconGap = 2;
const int32 kGutter = 1; const int32 kGutter = 1;
const int32 kDragRegionWidth = 6; const int32 kDragRegionWidth = 6;
// 1 pixel for left gutter // space for replicant tray with gap on each side (7 items)
// space for replicant tray (6 items) // minus 6 pixel drag region
// 6 pixel drag region const float kMinimumTrayWidth = kMinimumReplicantCount
const float kMinimumTrayWidth = kIconGap * (kIconGap + kMaxReplicantWidth + kIconGap) - kDragRegionWidth;
+ (kMinimumReplicantCount * kIconGap)
+ (kMinimumReplicantCount * kMaxReplicantWidth) + kGutter;
const float kMinimumTrayHeight = kGutter + kMaxReplicantHeight + kGutter; const float kMinimumTrayHeight = kGutter + kMaxReplicantHeight + kGutter;
extern float gMinimumWindowWidth; extern float gMinimumWindowWidth;
+1
View File
@@ -1,5 +1,6 @@
enum { enum {
R_LeafLogoBitmap = 14, R_LeafLogoBitmap = 14,
R_LeafLogoVector = 15,
R_LargeNewGroupIcon = 16, R_LargeNewGroupIcon = 16,
R_SmallNewGroupIcon = 17, R_SmallNewGroupIcon = 17,
R_TeamIcon = 18, R_TeamIcon = 18,
+13
View File
@@ -192,6 +192,19 @@ resource(R_LeafLogoBitmap) archive(, 0x00000000) BBitmap {
} }
}; };
resource(R_LeafLogoVector) #'VICN' array {
$"6E6369660102010602407715BE05F73AC66F3D61964A3C0A4C40170000AAFFFF"
$"00337F010216B9CBCB3DB9CBCB3DBC63CDC0C1BACE05BF13CE7BC14B63C0EACC"
$"FAC116CD4DC3DFCEAEC644CBE0C55BCC8FC5F4CB9FC4F0CB0CC592CBD1C5BFCB"
$"29C704CB1CC646CB1DC77DCAACC8A0C9CEC831CA54C929C92BCA66C78FC9D7C8"
$"4ACA0BC757C9D5C6DEC9F8C725CA29C6F4CAD1C6FCCA7EC6FECB42C624CC6EC5"
$"62CBF6C59CCA78C4B2C625C52AC7F6C4CAC58AC5B0C55DC77DC58EC65EC4FBC6"
$"FCC509C57DC4D0C65CC3C1C5E4C14FC703C283C671C0D8C73BBF09C852BFB3C8"
$"10BEB8C8CCBE3DC9B2BE74C943BE3AC94BBE32C87BBE2AC8E5BBFFC8D4B96CCA"
$"A7BACBC96BB67CCAA9B337C8EFB331C964B337C8EFB328CA02B328CA02B328CA"
$"02B9CDCB3EB6D2CB6AB9CDCB3E010A000100202009"
};
resource(R_LargeNewGroupIcon) archive(, 0x00000000) BBitmap { resource(R_LargeNewGroupIcon) archive(, 0x00000000) BBitmap {
"_frame" = rect { 0.0, 0.0, 31.0, 31.0 }, "_frame" = rect { 0.0, 0.0, 31.0, 31.0 },
"_cspace" = 4, "_cspace" = 4,