Make IconView icon_size:able. Adapt DataTranslations. Disable DataTranslation's info button on list deselection.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41248 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jonas Sundström 2011-04-13 22:56:10 +00:00
parent 2c31ec7222
commit 9b4ad591d8
4 changed files with 83 additions and 33 deletions

View File

@ -5,21 +5,28 @@
#include <Bitmap.h>
#include <Mime.h>
#include <Path.h>
#include <View.h>
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;
};

View File

@ -4,6 +4,7 @@
#include "IconView.h"
#include <new>
#include <stdio.h>
#include <string.h>
@ -12,11 +13,14 @@
#include <NodeInfo.h>
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));
}

View File

@ -19,7 +19,6 @@
#include <Application.h>
#include <Bitmap.h>
#include <Box.h>
#include <Button.h>
#include <Catalog.h>
#include <ControlLook.h>
#include <Entry.h>
@ -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;
}

View File

@ -12,6 +12,7 @@
#include <Box.h>
#include <Button.h>
#include <IconView.h>
#include <Path.h>
#include <View.h>
@ -41,6 +42,7 @@ private:
BBox* fRightBox;
BView* fConfigView;
IconView* fIconView;
BButton* fButton;
};