xref: /haiku/src/apps/icon-o-matic/gui/IconView.cpp (revision 098eaec6305ae804d3eb6c8e6c6aad790fb4cfb1)
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