xref: /haiku/src/apps/icon-o-matic/generic/property/view/specific_properties/IconValueView.cpp (revision 61b0e9e3149012ccbd48a10dcbc7f83600bb4769)
164d80db6SStephan Aßmus /*
264d80db6SStephan Aßmus  * Copyright 2006, Haiku.
364d80db6SStephan Aßmus  * Distributed under the terms of the MIT License.
464d80db6SStephan Aßmus  *
564d80db6SStephan Aßmus  * Authors:
664d80db6SStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
764d80db6SStephan Aßmus  */
864d80db6SStephan Aßmus 
9e2a31283SStephan Aßmus #include "IconValueView.h"
10e2a31283SStephan Aßmus 
1164d80db6SStephan Aßmus #include <stdio.h>
1264d80db6SStephan Aßmus #include <string.h>
1364d80db6SStephan Aßmus 
1464d80db6SStephan Aßmus #include <Bitmap.h>
1564d80db6SStephan Aßmus #include <Region.h>
1664d80db6SStephan Aßmus 
1764d80db6SStephan Aßmus #include "PropertyItemView.h"
1864d80db6SStephan Aßmus 
1964d80db6SStephan Aßmus // constructor
IconValueView(IconProperty * property)2064d80db6SStephan Aßmus IconValueView::IconValueView(IconProperty* property)
21e2a31283SStephan Aßmus 	: PropertyEditorView(),
2264d80db6SStephan Aßmus 	  fProperty(property),
2364d80db6SStephan Aßmus 	  fIcon(NULL)
2464d80db6SStephan Aßmus {
2564d80db6SStephan Aßmus 	SetFlags(Flags() | B_NAVIGABLE_JUMP);
2664d80db6SStephan Aßmus }
2764d80db6SStephan Aßmus 
2864d80db6SStephan Aßmus // destructor
~IconValueView()2964d80db6SStephan Aßmus IconValueView::~IconValueView()
3064d80db6SStephan Aßmus {
3164d80db6SStephan Aßmus 	delete fIcon;
3264d80db6SStephan Aßmus }
3364d80db6SStephan Aßmus 
3464d80db6SStephan Aßmus // Draw
3564d80db6SStephan Aßmus void
Draw(BRect updateRect)3664d80db6SStephan Aßmus IconValueView::Draw(BRect updateRect)
3764d80db6SStephan Aßmus {
3864d80db6SStephan Aßmus 	BRect r;
3964d80db6SStephan Aßmus 	BRegion originalClippingRegion;
4064d80db6SStephan Aßmus 	GetClippingRegion(&originalClippingRegion);
4164d80db6SStephan Aßmus 	if (fIcon) {
4264d80db6SStephan Aßmus 		BRect b(Bounds());
4364d80db6SStephan Aßmus 		// layout icon in the center
4464d80db6SStephan Aßmus 		r = fIcon->Bounds();
4564d80db6SStephan Aßmus 		r.OffsetTo(floorf(b.left + b.Width() / 2.0 - r.Width() / 2.0),
4664d80db6SStephan Aßmus 				   floorf(b.top + b.Height() / 2.0 - r.Height() / 2.0));
4764d80db6SStephan Aßmus 		if (fIcon->ColorSpace() == B_RGBA32 || fIcon->ColorSpace() == B_RGBA32_BIG) {
4864d80db6SStephan Aßmus 			// set up transparent drawing and let
4964d80db6SStephan Aßmus 			// the base class draw the entire background
5064d80db6SStephan Aßmus 			SetHighColor(255, 255, 255, 255);
5164d80db6SStephan Aßmus 			SetDrawingMode(B_OP_ALPHA);
5264d80db6SStephan Aßmus 			SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
5364d80db6SStephan Aßmus 		} else {
5464d80db6SStephan Aßmus 			// constrain clipping region to exclude bitmap
5564d80db6SStephan Aßmus 			BRegion region = originalClippingRegion;
5664d80db6SStephan Aßmus 			region.Exclude(r);
5764d80db6SStephan Aßmus 			ConstrainClippingRegion(&region);
5864d80db6SStephan Aßmus 		}
5964d80db6SStephan Aßmus 	}
6064d80db6SStephan Aßmus 	// draw surrouing area (and possibly background for bitmap)
6164d80db6SStephan Aßmus 	PropertyEditorView::Draw(updateRect);
6264d80db6SStephan Aßmus 
6364d80db6SStephan Aßmus 	ConstrainClippingRegion(&originalClippingRegion);
6464d80db6SStephan Aßmus 	if (fIcon) {
6564d80db6SStephan Aßmus 		DrawBitmap(fIcon, r.LeftTop());
6664d80db6SStephan Aßmus 	}
6764d80db6SStephan Aßmus }
6864d80db6SStephan Aßmus 
6964d80db6SStephan Aßmus // SetEnabled
7064d80db6SStephan Aßmus void
SetEnabled(bool enabled)7164d80db6SStephan Aßmus IconValueView::SetEnabled(bool enabled)
7264d80db6SStephan Aßmus {
7364d80db6SStephan Aßmus 	// TODO: gray out icon...
7464d80db6SStephan Aßmus }
7564d80db6SStephan Aßmus 
7664d80db6SStephan Aßmus // AdoptProperty
7764d80db6SStephan Aßmus bool
AdoptProperty(Property * property)7864d80db6SStephan Aßmus IconValueView::AdoptProperty(Property* property)
7964d80db6SStephan Aßmus {
8064d80db6SStephan Aßmus 	IconProperty* p = dynamic_cast<IconProperty*>(property);
8164d80db6SStephan Aßmus 	if (p) {
8264d80db6SStephan Aßmus 		SetIcon(p->Icon(), p->Width(), p->Height(), p->Format());
8364d80db6SStephan Aßmus 		Invalidate();
8464d80db6SStephan Aßmus 
8564d80db6SStephan Aßmus 		fProperty = p;
8664d80db6SStephan Aßmus 		return true;
8764d80db6SStephan Aßmus 	}
8864d80db6SStephan Aßmus 	return false;
8964d80db6SStephan Aßmus }
9064d80db6SStephan Aßmus 
91*61b0e9e3SStephan Aßmus // GetProperty
92*61b0e9e3SStephan Aßmus Property*
GetProperty() const93*61b0e9e3SStephan Aßmus IconValueView::GetProperty() const
94*61b0e9e3SStephan Aßmus {
95*61b0e9e3SStephan Aßmus 	return fProperty;
96*61b0e9e3SStephan Aßmus }
97*61b0e9e3SStephan Aßmus 
9864d80db6SStephan Aßmus // #pragma mark -
9964d80db6SStephan Aßmus 
10064d80db6SStephan Aßmus // SetIcon
10164d80db6SStephan Aßmus status_t
SetIcon(const unsigned char * bitsFromQuickRes,uint32 width,uint32 height,color_space format)10264d80db6SStephan Aßmus IconValueView::SetIcon(const unsigned char* bitsFromQuickRes,
10364d80db6SStephan Aßmus 					   uint32 width, uint32 height, color_space format)
10464d80db6SStephan Aßmus {
10564d80db6SStephan Aßmus 	status_t status = B_BAD_VALUE;
10664d80db6SStephan Aßmus 	if (bitsFromQuickRes && width > 0 && height > 0) {
10764d80db6SStephan Aßmus 		delete fIcon;
10864d80db6SStephan Aßmus 		fIcon = new BBitmap(BRect(0.0, 0.0, width - 1.0, height - 1.0), format);
10964d80db6SStephan Aßmus 		status = fIcon ? fIcon->InitCheck() : B_ERROR;
11064d80db6SStephan Aßmus 		if (status >= B_OK) {
11164d80db6SStephan Aßmus 			// It doesn't look right to copy BitsLength() bytes, but bitmaps
11264d80db6SStephan Aßmus 			// exported from QuickRes or WonderBrush still contain their padding,
11364d80db6SStephan Aßmus 			// so it is alright.
11464d80db6SStephan Aßmus 			memcpy(fIcon->Bits(), bitsFromQuickRes, fIcon->BitsLength());
11564d80db6SStephan Aßmus 		} else {
11664d80db6SStephan Aßmus 			delete fIcon;
11764d80db6SStephan Aßmus 			fIcon = NULL;
11864d80db6SStephan Aßmus 			printf("IconValueView::SetIcon() - error allocating bitmap: %s\n", strerror(status));
11964d80db6SStephan Aßmus 		}
12064d80db6SStephan Aßmus 	}
12164d80db6SStephan Aßmus 	return status;
12264d80db6SStephan Aßmus }
12364d80db6SStephan Aßmus 
12464d80db6SStephan Aßmus 
125