xref: /haiku/src/apps/icon-o-matic/gui/IconView.cpp (revision 445d4fd926c569e7b9ae28017da86280aaecbae2)
1 /*
2  * Copyright 2006, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  */
8 
9 #include "IconView.h"
10 
11 #include <Bitmap.h>
12 
13 #include "ui_defines.h"
14 
15 #include "IconRenderer.h"
16 
17 // constructor
18 IconView::IconView(BRect frame, const char* name)
19 	: BView(frame, name, B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW),
20 	  fBitmap(new BBitmap(frame.OffsetToCopy(B_ORIGIN), 0, B_RGB32)),
21 	  fIcon(NULL),
22 	  fRenderer(new IconRenderer(fBitmap)),
23 	  fDirtyIconArea(fBitmap->Bounds()),
24 
25 	  fScale((frame.Width() + 1.0) / 64.0)
26 {
27 	fRenderer->SetScale(fScale);
28 #if __HAIKU__
29 	BSize size(frame.Width(), frame.Height());
30 	SetExplicitMinSize(size);
31 	SetExplicitMaxSize(size);
32 #endif
33 }
34 
35 // destructor
36 IconView::~IconView()
37 {
38 	SetIcon(NULL);
39 	delete fRenderer;
40 	delete fBitmap;
41 }
42 
43 // #pragma mark -
44 
45 // AttachedToWindow
46 void
47 IconView::AttachedToWindow()
48 {
49 	SetViewColor(B_TRANSPARENT_COLOR);
50 
51 	rgb_color lc = LowColor();
52 	fRenderer->SetBackground(agg::rgba8(lc.red, lc.green, lc.blue, 255));
53 }
54 
55 // Draw
56 void
57 IconView::Draw(BRect updateRect)
58 {
59 	if (fDirtyIconArea.IsValid()) {
60 		fRenderer->Render(fDirtyIconArea, false);
61 		fDirtyIconArea.Set(LONG_MAX, LONG_MAX, LONG_MIN, LONG_MIN);
62 	}
63 
64 	// icon
65 	DrawBitmap(fBitmap, B_ORIGIN);
66 }
67 
68 // #pragma mark -
69 
70 // AreaInvalidated
71 void
72 IconView::AreaInvalidated(const BRect& area)
73 {
74 	BRect scaledArea(area);
75 	scaledArea.left *= fScale;
76 	scaledArea.top *= fScale;
77 	scaledArea.right *= fScale;
78 	scaledArea.bottom *= fScale;
79 
80 	if (fDirtyIconArea.Contains(scaledArea))
81 		return;
82 
83 	fDirtyIconArea = fDirtyIconArea | scaledArea;
84 
85 	Invalidate(scaledArea);
86 }
87 
88 
89 // #pragma mark -
90 
91 // SetIcon
92 void
93 IconView::SetIcon(Icon* icon)
94 {
95 	if (fIcon == icon)
96 		return;
97 
98 	if (fIcon)
99 		fIcon->RemoveListener(this);
100 
101 	fIcon = icon;
102 	fRenderer->SetIcon(icon);
103 
104 	if (fIcon)
105 		fIcon->AddListener(this);
106 }
107 
108 // SetIconBGColor
109 void
110 IconView::SetIconBGColor(const rgb_color& color)
111 {
112 	SetLowColor(color);
113 
114 	fRenderer->SetBackground(
115 		agg::rgba8(color.red, color.green, color.blue, 255));
116 
117 	fDirtyIconArea = fBitmap->Bounds();
118 	Invalidate();
119 }
120