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 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); 28*0e1ba39fSStephan Aßmus #if __HAIKU__ 29*0e1ba39fSStephan Aßmus BSize size(frame.Width(), frame.Height()); 30*0e1ba39fSStephan Aßmus SetExplicitMinSize(size); 31*0e1ba39fSStephan Aßmus SetExplicitMaxSize(size); 32*0e1ba39fSStephan Aßmus #endif 339b4fa889SStephan Aßmus } 349b4fa889SStephan Aßmus 359b4fa889SStephan Aßmus // destructor 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 479b4fa889SStephan Aßmus IconView::AttachedToWindow() 489b4fa889SStephan Aßmus { 499b4fa889SStephan Aßmus SetViewColor(B_TRANSPARENT_COLOR); 50*0e1ba39fSStephan Aßmus 51*0e1ba39fSStephan Aßmus rgb_color lc = LowColor(); 52*0e1ba39fSStephan 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 579b4fa889SStephan Aßmus IconView::Draw(BRect updateRect) 589b4fa889SStephan Aßmus { 599b4fa889SStephan Aßmus if (fDirtyIconArea.IsValid()) { 609b4fa889SStephan Aßmus fRenderer->Render(fDirtyIconArea); 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 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 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 108*0e1ba39fSStephan Aßmus // SetIconBGColor 109*0e1ba39fSStephan Aßmus void 110*0e1ba39fSStephan Aßmus IconView::SetIconBGColor(const rgb_color& color) 111*0e1ba39fSStephan Aßmus { 112*0e1ba39fSStephan Aßmus SetLowColor(color); 113*0e1ba39fSStephan Aßmus 114*0e1ba39fSStephan Aßmus fRenderer->SetBackground( 115*0e1ba39fSStephan Aßmus agg::rgba8(color.red, color.green, color.blue, 255)); 116*0e1ba39fSStephan Aßmus 117*0e1ba39fSStephan Aßmus fDirtyIconArea = fBitmap->Bounds(); 118*0e1ba39fSStephan Aßmus Invalidate(); 119*0e1ba39fSStephan Aßmus } 120