diff --git a/headers/private/tracker/IconMenuItem.h b/headers/private/tracker/IconMenuItem.h index 6eee093e3b..9484918da0 100644 --- a/headers/private/tracker/IconMenuItem.h +++ b/headers/private/tracker/IconMenuItem.h @@ -69,7 +69,7 @@ class IconMenuItem : public PositionPassingMenuItem { virtual void DrawContent(); virtual void SetMarked(bool mark); - virtual void SetIcon(BBitmap* icon) { fDeviceIcon = icon; }; + virtual void SetIcon(BBitmap* icon); BBitmap* Icon() const { return fDeviceIcon; }; virtual void SetIconSize(icon_size which) { fWhich = which; }; diff --git a/src/kits/tracker/IconMenuItem.cpp b/src/kits/tracker/IconMenuItem.cpp index a3baead8d3..03dcee79dc 100644 --- a/src/kits/tracker/IconMenuItem.cpp +++ b/src/kits/tracker/IconMenuItem.cpp @@ -257,10 +257,12 @@ IconMenuItem::IconMenuItem(const char* label, BMessage* message, BBitmap* icon, icon_size which) : PositionPassingMenuItem(label, message), - fDeviceIcon(icon), + fDeviceIcon(NULL), fHeightDelta(0), fWhich(which) { + SetIcon(icon); + // IconMenuItem is used in synchronously invoked menus, make sure // we invoke with a timeout SetTimeout(kSynchMenuInvokeTimeout); @@ -505,3 +507,21 @@ IconMenuItem::SetMarked(bool mark) topLevelIconMenuItem->SetIcon(fDeviceIcon); menu->Invalidate(); } + + +void +IconMenuItem::SetIcon(BBitmap* icon) +{ + if (icon != NULL) { + if (fDeviceIcon != NULL) + delete fDeviceIcon; + + fDeviceIcon = new BBitmap(BRect(0, 0, fWhich - 1, fWhich - 1), + icon->ColorSpace()); + fDeviceIcon->SetBits(icon->Bits(), icon->BitsLength(), 0, + icon->ColorSpace()); + } else { + delete fDeviceIcon; + fDeviceIcon = NULL; + } +}