1// Author: Michael Wilber
2// Copyright (C) Haiku, uses the MIT license
3
4
5#include "IconView.h"
6
7#include <new>
8#include <stdio.h>
9#include <string.h>
10
11#include <Entry.h>
12#include <Node.h>
13#include <NodeInfo.h>
14
15
16using std::nothrow;
17
18
19IconView::IconView(icon_size iconSize)
20	:
21	BView("IconView", B_WILL_DRAW),
22	fIconSize(iconSize),
23	fIconBitmap(new BBitmap(BRect(iconSize), B_RGBA32)),
24	fDrawIcon(false)
25{
26	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
27}
28
29
30IconView::~IconView()
31{
32	delete fIconBitmap;
33	fIconBitmap = NULL;
34}
35
36
37status_t
38IconView::SetIcon(const BPath& path, icon_size iconSize)
39{
40	fDrawIcon = false;
41
42	if (iconSize != fIconSize) {
43		BBitmap* bitmap = new BBitmap(BRect(iconSize), B_RGBA32);
44		if (bitmap == NULL)
45			return B_NO_MEMORY;
46
47		delete fIconBitmap;
48		fIconBitmap = bitmap;
49		fIconSize = iconSize;
50	}
51
52	status_t status = fIconBitmap->InitCheck();
53	if (status != B_OK)
54		return status;
55
56	BEntry entry(path.Path());
57	BNode node(&entry);
58	BNodeInfo info(&node);
59
60	status = info.GetTrackerIcon(fIconBitmap, fIconSize);
61	if (status != B_OK)
62		return status;
63
64	if (!fIconBitmap->IsValid())
65		return fIconBitmap->InitCheck();
66
67	_SetSize();
68
69	fDrawIcon = true;
70	Invalidate();
71	return B_OK;
72}
73
74
75void
76IconView::DrawIcon(bool draw)
77{
78	if (draw == fDrawIcon)
79		return;
80
81	fDrawIcon = draw;
82	Invalidate();
83}
84
85
86void
87IconView::Draw(BRect area)
88{
89	if (fDrawIcon && fIconBitmap != NULL) {
90		SetDrawingMode(B_OP_ALPHA);
91		SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
92		DrawBitmap(fIconBitmap);
93		SetDrawingMode(B_OP_COPY);
94	} else
95		BView::Draw(area);
96}
97
98
99status_t
100IconView::InitCheck() const
101{
102	if (fIconBitmap == NULL)
103		return B_NO_MEMORY;
104
105	return fIconBitmap->InitCheck();
106}
107
108
109void
110IconView::_SetSize()
111{
112	SetExplicitMinSize(BSize(fIconSize, fIconSize));
113	SetExplicitMaxSize(BSize(fIconSize, fIconSize));
114	SetExplicitPreferredSize(BSize(fIconSize, fIconSize));
115}
116