19b4fa889SStephan Aßmus /*
29b4fa889SStephan Aßmus * Copyright 2006, Haiku.
39b4fa889SStephan Aßmus * Distributed under the terms of the MIT License.
49b4fa889SStephan Aßmus *
59b4fa889SStephan Aßmus * Authors:
69b4fa889SStephan Aßmus * Stephan Aßmus <superstippi@gmx.de>
79b4fa889SStephan Aßmus */
89b4fa889SStephan Aßmus
99b4fa889SStephan Aßmus #include "IconView.h"
109b4fa889SStephan Aßmus
119b4fa889SStephan Aßmus #include <Bitmap.h>
129b4fa889SStephan Aßmus
139b4fa889SStephan Aßmus #include "ui_defines.h"
149b4fa889SStephan Aßmus
159b4fa889SStephan Aßmus #include "IconRenderer.h"
169b4fa889SStephan Aßmus
179b4fa889SStephan Aßmus // constructor
IconView(BRect frame,const char * name)189b4fa889SStephan Aßmus IconView::IconView(BRect frame, const char* name)
199b4fa889SStephan Aßmus : BView(frame, name, B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW),
209b4fa889SStephan Aßmus fBitmap(new BBitmap(frame.OffsetToCopy(B_ORIGIN), 0, B_RGB32)),
219b4fa889SStephan Aßmus fIcon(NULL),
229b4fa889SStephan Aßmus fRenderer(new IconRenderer(fBitmap)),
239b4fa889SStephan Aßmus fDirtyIconArea(fBitmap->Bounds()),
249b4fa889SStephan Aßmus
259b4fa889SStephan Aßmus fScale((frame.Width() + 1.0) / 64.0)
269b4fa889SStephan Aßmus {
279b4fa889SStephan Aßmus fRenderer->SetScale(fScale);
280e1ba39fSStephan Aßmus #if __HAIKU__
290e1ba39fSStephan Aßmus BSize size(frame.Width(), frame.Height());
300e1ba39fSStephan Aßmus SetExplicitMinSize(size);
310e1ba39fSStephan Aßmus SetExplicitMaxSize(size);
320e1ba39fSStephan Aßmus #endif
339b4fa889SStephan Aßmus }
349b4fa889SStephan Aßmus
359b4fa889SStephan Aßmus // destructor
~IconView()369b4fa889SStephan Aßmus IconView::~IconView()
379b4fa889SStephan Aßmus {
389b4fa889SStephan Aßmus SetIcon(NULL);
399b4fa889SStephan Aßmus delete fRenderer;
409b4fa889SStephan Aßmus delete fBitmap;
419b4fa889SStephan Aßmus }
429b4fa889SStephan Aßmus
439b4fa889SStephan Aßmus // #pragma mark -
449b4fa889SStephan Aßmus
459b4fa889SStephan Aßmus // AttachedToWindow
469b4fa889SStephan Aßmus void
AttachedToWindow()479b4fa889SStephan Aßmus IconView::AttachedToWindow()
489b4fa889SStephan Aßmus {
499b4fa889SStephan Aßmus SetViewColor(B_TRANSPARENT_COLOR);
500e1ba39fSStephan Aßmus
510e1ba39fSStephan Aßmus rgb_color lc = LowColor();
520e1ba39fSStephan Aßmus fRenderer->SetBackground(agg::rgba8(lc.red, lc.green, lc.blue, 255));
539b4fa889SStephan Aßmus }
549b4fa889SStephan Aßmus
559b4fa889SStephan Aßmus // Draw
569b4fa889SStephan Aßmus void
Draw(BRect updateRect)579b4fa889SStephan Aßmus IconView::Draw(BRect updateRect)
589b4fa889SStephan Aßmus {
599b4fa889SStephan Aßmus if (fDirtyIconArea.IsValid()) {
60*098eaec6SZardshard fRenderer->Render(fDirtyIconArea, false);
619b4fa889SStephan Aßmus fDirtyIconArea.Set(LONG_MAX, LONG_MAX, LONG_MIN, LONG_MIN);
629b4fa889SStephan Aßmus }
639b4fa889SStephan Aßmus
649b4fa889SStephan Aßmus // icon
659b4fa889SStephan Aßmus DrawBitmap(fBitmap, B_ORIGIN);
669b4fa889SStephan Aßmus }
679b4fa889SStephan Aßmus
689b4fa889SStephan Aßmus // #pragma mark -
699b4fa889SStephan Aßmus
709b4fa889SStephan Aßmus // AreaInvalidated
719b4fa889SStephan Aßmus void
AreaInvalidated(const BRect & area)729b4fa889SStephan Aßmus IconView::AreaInvalidated(const BRect& area)
739b4fa889SStephan Aßmus {
749b4fa889SStephan Aßmus BRect scaledArea(area);
759b4fa889SStephan Aßmus scaledArea.left *= fScale;
769b4fa889SStephan Aßmus scaledArea.top *= fScale;
779b4fa889SStephan Aßmus scaledArea.right *= fScale;
789b4fa889SStephan Aßmus scaledArea.bottom *= fScale;
799b4fa889SStephan Aßmus
809b4fa889SStephan Aßmus if (fDirtyIconArea.Contains(scaledArea))
819b4fa889SStephan Aßmus return;
829b4fa889SStephan Aßmus
839b4fa889SStephan Aßmus fDirtyIconArea = fDirtyIconArea | scaledArea;
849b4fa889SStephan Aßmus
859b4fa889SStephan Aßmus Invalidate(scaledArea);
869b4fa889SStephan Aßmus }
879b4fa889SStephan Aßmus
889b4fa889SStephan Aßmus
899b4fa889SStephan Aßmus // #pragma mark -
909b4fa889SStephan Aßmus
919b4fa889SStephan Aßmus // SetIcon
929b4fa889SStephan Aßmus void
SetIcon(Icon * icon)939b4fa889SStephan Aßmus IconView::SetIcon(Icon* icon)
949b4fa889SStephan Aßmus {
959b4fa889SStephan Aßmus if (fIcon == icon)
969b4fa889SStephan Aßmus return;
979b4fa889SStephan Aßmus
989b4fa889SStephan Aßmus if (fIcon)
999b4fa889SStephan Aßmus fIcon->RemoveListener(this);
1009b4fa889SStephan Aßmus
1019b4fa889SStephan Aßmus fIcon = icon;
1029b4fa889SStephan Aßmus fRenderer->SetIcon(icon);
1039b4fa889SStephan Aßmus
1049b4fa889SStephan Aßmus if (fIcon)
1059b4fa889SStephan Aßmus fIcon->AddListener(this);
1069b4fa889SStephan Aßmus }
1079b4fa889SStephan Aßmus
1080e1ba39fSStephan Aßmus // SetIconBGColor
1090e1ba39fSStephan Aßmus void
SetIconBGColor(const rgb_color & color)1100e1ba39fSStephan Aßmus IconView::SetIconBGColor(const rgb_color& color)
1110e1ba39fSStephan Aßmus {
1120e1ba39fSStephan Aßmus SetLowColor(color);
1130e1ba39fSStephan Aßmus
1140e1ba39fSStephan Aßmus fRenderer->SetBackground(
1150e1ba39fSStephan Aßmus agg::rgba8(color.red, color.green, color.blue, 255));
1160e1ba39fSStephan Aßmus
1170e1ba39fSStephan Aßmus fDirtyIconArea = fBitmap->Bounds();
1180e1ba39fSStephan Aßmus Invalidate();
1190e1ba39fSStephan Aßmus }
120