diff --git a/headers/private/shared/IconView.h b/headers/private/shared/IconView.h index b20cdd7c0a..888eec13da 100644 --- a/headers/private/shared/IconView.h +++ b/headers/private/shared/IconView.h @@ -5,21 +5,28 @@ #include +#include #include #include class IconView : public BView { public: - IconView(const BRect& frame, const char* name, - uint32 resize, uint32 flags); + IconView(icon_size iconSize = B_LARGE_ICON); + ~IconView(); + + status_t InitCheck() const; virtual void Draw(BRect area); - - bool DrawIcon(bool draw); - bool SetIcon(const BPath& path); + + void DrawIcon(bool draw); + status_t SetIcon(const BPath& path, + icon_size iconSize = B_LARGE_ICON); private: + void _SetSize(); + + icon_size fIconSize; BBitmap* fIconBitmap; bool fDrawIcon; }; diff --git a/src/kits/shared/IconView.cpp b/src/kits/shared/IconView.cpp index d9b0319100..923f7b1fc2 100644 --- a/src/kits/shared/IconView.cpp +++ b/src/kits/shared/IconView.cpp @@ -4,6 +4,7 @@ #include "IconView.h" +#include #include #include @@ -12,11 +13,14 @@ #include -IconView::IconView(const BRect& frame, const char* name, uint32 resize, - uint32 flags) +using std::nothrow; + + +IconView::IconView(icon_size iconSize) : - BView(frame, name, resize, flags), - fIconBitmap(new BBitmap(BRect(B_LARGE_ICON), B_RGBA32)), + BView("IconView", B_WILL_DRAW), + fIconSize(iconSize), + fIconBitmap(new BBitmap(BRect(iconSize), B_RGBA32)), fDrawIcon(false) { SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); @@ -30,45 +34,82 @@ IconView::~IconView() } -bool -IconView::SetIcon(const BPath& path) +status_t +IconView::SetIcon(const BPath& path, icon_size iconSize) { fDrawIcon = false; + if (iconSize != fIconSize) { + BBitmap* bitmap = new BBitmap(BRect(iconSize), B_RGBA32); + if (bitmap == NULL) + return B_NO_MEMORY; + + delete fIconBitmap; + fIconBitmap = bitmap; + fIconSize = iconSize; + } + + status_t status = fIconBitmap->InitCheck(); + if (status != B_OK) + return status; + BEntry entry(path.Path()); BNode node(&entry); BNodeInfo info(&node); - - if (info.GetTrackerIcon(fIconBitmap) != B_OK) - return false; - + + status = info.GetTrackerIcon(fIconBitmap, fIconSize); + if (status != B_OK) + return status; + + if (!fIconBitmap->IsValid()) + return fIconBitmap->InitCheck(); + + _SetSize(); + fDrawIcon = true; Invalidate(); - return true; + return B_OK; } -bool +void IconView::DrawIcon(bool draw) { - bool prev = fDrawIcon; - fDrawIcon = draw; - if (prev != fDrawIcon) - Invalidate(); + if (draw == fDrawIcon) + return; - return prev; + fDrawIcon = draw; + Invalidate(); } void IconView::Draw(BRect area) { - SetDrawingMode(B_OP_ALPHA); - SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); - - if (fDrawIcon) + if (fDrawIcon && fIconBitmap != NULL) { + SetDrawingMode(B_OP_ALPHA); + SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); DrawBitmap(fIconBitmap); - - SetDrawingMode(B_OP_COPY); + SetDrawingMode(B_OP_COPY); + } else + BView::Draw(area); } + +status_t +IconView::InitCheck() const +{ + if (fIconBitmap == NULL) + return B_NO_MEMORY; + + return fIconBitmap->InitCheck(); +} + + +void +IconView::_SetSize() +{ + SetExplicitMinSize(BSize(fIconSize, fIconSize)); + SetExplicitMaxSize(BSize(fIconSize, fIconSize)); + SetExplicitPreferredSize(BSize(fIconSize, fIconSize)); +} diff --git a/src/preferences/datatranslations/DataTranslationsWindow.cpp b/src/preferences/datatranslations/DataTranslationsWindow.cpp index 31f7a68df1..504ee2ab60 100644 --- a/src/preferences/datatranslations/DataTranslationsWindow.cpp +++ b/src/preferences/datatranslations/DataTranslationsWindow.cpp @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -182,11 +181,10 @@ DataTranslationsWindow::_SetupViews() B_ALIGN_USE_FULL_HEIGHT)); // Add the translator icon view - fIconView = new IconView(BRect(0, 0, 31, 31), B_TRANSLATE("Icon"), - B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW | B_FRAME_EVENTS); + fIconView = new IconView(); // Add the translator info button - BButton* button = new BButton("STD", B_TRANSLATE("Info" B_UTF8_ELLIPSIS), + fButton = new BButton("info", B_TRANSLATE("Info" B_UTF8_ELLIPSIS), new BMessage(kMsgTranslatorInfo), B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE); // Populate the translators list view @@ -201,7 +199,7 @@ DataTranslationsWindow::_SetupViews() .SetInsets(0, 0, 0, 0) .Add(fRightBox, 0, 0, 3, 1) .Add(fIconView, 0, 1) - .Add(button, 2, 1); + .Add(fButton, 2, 1); fTranslatorListView->MakeFocus(); fTranslatorListView->Select(0); @@ -291,6 +289,7 @@ DataTranslationsWindow::MessageReceived(BMessage* message) if (selected < 0) { // If none selected, clear the old one fIconView->DrawIcon(false); + fButton->SetEnabled(false); fRightBox->RemoveChild(fConfigView); break; } @@ -307,6 +306,7 @@ DataTranslationsWindow::MessageReceived(BMessage* message) BPath path; _GetTranslatorInfo(item->ID(), name, info, version, path); fIconView->SetIcon(path); + fButton->SetEnabled(true); break; } diff --git a/src/preferences/datatranslations/DataTranslationsWindow.h b/src/preferences/datatranslations/DataTranslationsWindow.h index 9dc7e711d5..f823269530 100644 --- a/src/preferences/datatranslations/DataTranslationsWindow.h +++ b/src/preferences/datatranslations/DataTranslationsWindow.h @@ -12,6 +12,7 @@ #include +#include #include #include #include @@ -41,6 +42,7 @@ private: BBox* fRightBox; BView* fConfigView; IconView* fIconView; + BButton* fButton; };