1f333ade3SStephan Aßmus/*
231e20891SStephan Aßmus * Copyright 2001 Werner Freytag - please read to the LICENSE file
331e20891SStephan Aßmus *
4f333ade3SStephan Aßmus * Copyright 2002-2015, Stephan A��mus <superstippi@gmx.de>
531e20891SStephan Aßmus * All rights reserved.
6f333ade3SStephan Aßmus *
731e20891SStephan Aßmus */
831e20891SStephan Aßmus
931e20891SStephan Aßmus#include <stdio.h>
1031e20891SStephan Aßmus#include <stdlib.h>
1131e20891SStephan Aßmus#include <string.h>
1231e20891SStephan Aßmus
1331e20891SStephan Aßmus#include <Application.h>
1431e20891SStephan Aßmus#include <Bitmap.h>
1531e20891SStephan Aßmus#include <Beep.h>
16f333ade3SStephan Aßmus#include <ControlLook.h>
17f333ade3SStephan Aßmus#include <GroupLayout.h>
18f333ade3SStephan Aßmus#include <LayoutBuilder.h>
1931e20891SStephan Aßmus#include <Message.h>
20f333ade3SStephan Aßmus#include <MessageRunner.h>
2131e20891SStephan Aßmus#include <RadioButton.h>
22f333ade3SStephan Aßmus#include <StringView.h>
2331e20891SStephan Aßmus#include <TextControl.h>
2431e20891SStephan Aßmus#include <Window.h>
2531e20891SStephan Aßmus
2631e20891SStephan Aßmus#include "ColorField.h"
2731e20891SStephan Aßmus#include "ColorPreview.h"
2831e20891SStephan Aßmus#include "ColorSlider.h"
2931e20891SStephan Aßmus#include "rgb_hsv.h"
3031e20891SStephan Aßmus
3131e20891SStephan Aßmus#include "ColorPickerView.h"
3231e20891SStephan Aßmus
3331e20891SStephan Aßmus
3431e20891SStephan Aßmus#define round(x) (int)(x+.5)
3531e20891SStephan Aßmus#define hexdec(str, offset) (int)(((str[offset]<60?str[offset]-48:(str[offset]|32)-87)<<4)|(str[offset+1]<60?str[offset+1]-48:(str[offset+1]|32)-87))
3631e20891SStephan Aßmus
37f333ade3SStephan Aßmus
3831e20891SStephan AßmusColorPickerView::ColorPickerView(const char* name, rgb_color color,
39f333ade3SStephan Aßmus		SelectedColorMode mode)
40f333ade3SStephan Aßmus	:
41f333ade3SStephan Aßmus	BView(name, 0),
42f333ade3SStephan Aßmus	h(0.0),
43f333ade3SStephan Aßmus	s(1.0),
44f333ade3SStephan Aßmus	v(1.0),
45f333ade3SStephan Aßmus	r((float)color.red / 255.0),
46f333ade3SStephan Aßmus	g((float)color.green / 255.0),
47f333ade3SStephan Aßmus	b((float)color.blue / 255.0),
48f333ade3SStephan Aßmus	fRequiresUpdate(false)
4931e20891SStephan Aßmus{
50fa19dd44Slooncraz	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
5131e20891SStephan Aßmus
5231e20891SStephan Aßmus	RGB_to_HSV(r, g, b, h, s, v);
5331e20891SStephan Aßmus
5431e20891SStephan Aßmus	SetColorMode(mode, false);
5531e20891SStephan Aßmus}
5631e20891SStephan Aßmus
57f333ade3SStephan Aßmus
5831e20891SStephan AßmusColorPickerView::~ColorPickerView()
5931e20891SStephan Aßmus{
6031e20891SStephan Aßmus}
6131e20891SStephan Aßmus
6231e20891SStephan Aßmus
6331e20891SStephan Aßmusvoid
6431e20891SStephan AßmusColorPickerView::AttachedToWindow()
6531e20891SStephan Aßmus{
66cc3fb1f5SJérôme Duval	rgb_color color = { (uint8)(r * 255), (uint8)(g * 255), (uint8)(b * 255),
67cc3fb1f5SJérôme Duval		255 };
6831e20891SStephan Aßmus	BView::AttachedToWindow();
6931e20891SStephan Aßmus
70f333ade3SStephan Aßmus	fColorField = new ColorField(fSelectedColorMode, *p);
7131e20891SStephan Aßmus	fColorField->SetMarkerToColor(color);
7231e20891SStephan Aßmus	fColorField->SetTarget(this);
73f333ade3SStephan Aßmus
74f333ade3SStephan Aßmus	fColorSlider = new ColorSlider(fSelectedColorMode, *p1, *p2);
7531e20891SStephan Aßmus	fColorSlider->SetMarkerToColor(color);
7631e20891SStephan Aßmus	fColorSlider->SetTarget(this);
7731e20891SStephan Aßmus
78f333ade3SStephan Aßmus	fColorPreview = new ColorPreview(color);
7931e20891SStephan Aßmus	fColorPreview->SetTarget(this);
8031e20891SStephan Aßmus
81f333ade3SStephan Aßmus	fColorField->SetExplicitMinSize(BSize(256, 256));
82f333ade3SStephan Aßmus	fColorField->SetExplicitMaxSize(
83f333ade3SStephan Aßmus		BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED));
84f333ade3SStephan Aßmus	fColorSlider->SetExplicitMaxSize(
85f333ade3SStephan Aßmus		BSize(B_SIZE_UNSET, B_SIZE_UNLIMITED));
86f333ade3SStephan Aßmus	fColorPreview->SetExplicitMinSize(BSize(B_SIZE_UNSET, 70));
871011a95aSAugustin Cavalier
88f333ade3SStephan Aßmus	const char* title[] = { "H", "S", "V", "R", "G", "B" };
8931e20891SStephan Aßmus
9031e20891SStephan Aßmus	int32 selectedRadioButton = _NumForMode(fSelectedColorMode);
9131e20891SStephan Aßmus
92f333ade3SStephan Aßmus	for (int i = 0; i < 6; i++) {
93f333ade3SStephan Aßmus		fRadioButton[i] = new BRadioButton(NULL, title[i],
94f333ade3SStephan Aßmus			new BMessage(MSG_RADIOBUTTON + i));
9531e20891SStephan Aßmus		fRadioButton[i]->SetTarget(this);
9631e20891SStephan Aßmus
9731e20891SStephan Aßmus		if (i == selectedRadioButton)
9831e20891SStephan Aßmus			fRadioButton[i]->SetValue(1);
99f333ade3SStephan Aßmus
100f333ade3SStephan Aßmus		fTextControl[i] = new BTextControl(NULL, NULL, NULL,
101f333ade3SStephan Aßmus			new BMessage(MSG_TEXTCONTROL + i));
102f333ade3SStephan Aßmus
103f333ade3SStephan Aßmus		fTextControl[i]->TextView()->SetMaxBytes(3);
104f333ade3SStephan Aßmus		for (int j = 32; j < 255; ++j) {
105f333ade3SStephan Aßmus			if (j < '0' || j > '9')
106f333ade3SStephan Aßmus				fTextControl[i]->TextView()->DisallowChar(j);
107f333ade3SStephan Aßmus		}
10831e20891SStephan Aßmus	}
10931e20891SStephan Aßmus
110f333ade3SStephan Aßmus	fHexTextControl = new BTextControl(NULL, "#", NULL,
111f333ade3SStephan Aßmus		new BMessage(MSG_HEXTEXTCONTROL));
112f333ade3SStephan Aßmus
113f333ade3SStephan Aßmus	fHexTextControl->TextView()->SetMaxBytes(6);
114f333ade3SStephan Aßmus	for (int j = 32; j < 255; ++j) {
115f333ade3SStephan Aßmus		if (!((j >= '0' && j <= '9') || (j >= 'a' && j <= 'f')
116f333ade3SStephan Aßmus			|| (j >= 'A' && j <= 'F'))) {
117f333ade3SStephan Aßmus			fHexTextControl->TextView()->DisallowChar(j);
11831e20891SStephan Aßmus		}
119f333ade3SStephan Aßmus	}
12031e20891SStephan Aßmus
121f333ade3SStephan Aßmus	const float inset = be_control_look->DefaultLabelSpacing();
122f333ade3SStephan Aßmus	BSize separatorSize(B_SIZE_UNSET, inset / 2);
123f333ade3SStephan Aßmus	BAlignment separatorAlignment(B_ALIGN_LEFT, B_ALIGN_TOP);
124f333ade3SStephan Aßmus
125f333ade3SStephan Aßmus	SetLayout(new BGroupLayout(B_HORIZONTAL));
126f333ade3SStephan Aßmus	BLayoutBuilder::Group<>(this, B_HORIZONTAL)
127f333ade3SStephan Aßmus		.AddGroup(B_HORIZONTAL, 0.0f)
128f333ade3SStephan Aßmus			.Add(fColorField)
129f333ade3SStephan Aßmus		.SetInsets(3, 3, 0, 3)
130f333ade3SStephan Aßmus		.End()
131f333ade3SStephan Aßmus		.Add(fColorSlider)
132f333ade3SStephan Aßmus		.AddGroup(B_VERTICAL)
133f333ade3SStephan Aßmus			.Add(fColorPreview)
134f333ade3SStephan Aßmus			.AddGrid(inset / 2, inset / 2)
135f333ade3SStephan Aßmus				.Add(fRadioButton[0], 0, 0)
136f333ade3SStephan Aßmus				.Add(fTextControl[0], 1, 0)
137f333ade3SStephan Aßmus				.Add(new BStringView(NULL, "��"), 2, 0)
138f333ade3SStephan Aßmus
139f333ade3SStephan Aßmus				.Add(fRadioButton[1], 0, 1)
140f333ade3SStephan Aßmus				.Add(fTextControl[1], 1, 1)
141f333ade3SStephan Aßmus				.Add(new BStringView(NULL, "%"), 2, 1)
142f333ade3SStephan Aßmus
143f333ade3SStephan Aßmus				.Add(fRadioButton[2], 0, 2)
144f333ade3SStephan Aßmus				.Add(fTextControl[2], 1, 2)
145f333ade3SStephan Aßmus				.Add(new BStringView(NULL, "%"), 2, 2)
146f333ade3SStephan Aßmus
147f333ade3SStephan Aßmus				.Add(new BSpaceLayoutItem(separatorSize, separatorSize,
148f333ade3SStephan Aßmus					separatorSize, separatorAlignment),
149f333ade3SStephan Aßmus					0, 3, 3)
150f333ade3SStephan Aßmus
151f333ade3SStephan Aßmus				.Add(fRadioButton[3], 0, 4)
152f333ade3SStephan Aßmus				.Add(fTextControl[3], 1, 4)
153f333ade3SStephan Aßmus
154f333ade3SStephan Aßmus				.Add(fRadioButton[4], 0, 5)
155f333ade3SStephan Aßmus				.Add(fTextControl[4], 1, 5)
156f333ade3SStephan Aßmus
157f333ade3SStephan Aßmus				.Add(fRadioButton[5], 0, 6)
158f333ade3SStephan Aßmus				.Add(fTextControl[5], 1, 6)
159f333ade3SStephan Aßmus
160f333ade3SStephan Aßmus				.Add(new BSpaceLayoutItem(separatorSize, separatorSize,
161f333ade3SStephan Aßmus					separatorSize, separatorAlignment),
162f333ade3SStephan Aßmus					0, 7, 3)
1631011a95aSAugustin Cavalier
164f333ade3SStephan Aßmus				.AddGroup(B_HORIZONTAL, 0.0f, 0, 8, 2)
165f333ade3SStephan Aßmus					.Add(fHexTextControl->CreateLabelLayoutItem())
166f333ade3SStephan Aßmus					.Add(fHexTextControl->CreateTextViewLayoutItem())
167f333ade3SStephan Aßmus				.End()
168f333ade3SStephan Aßmus			.End()
169f333ade3SStephan Aßmus		.SetInsets(0, 3, 3, 3)
170f333ade3SStephan Aßmus		.End()
171f333ade3SStephan Aßmus		.SetInsets(inset, inset, inset, inset)
172f333ade3SStephan Aßmus	;
173f333ade3SStephan Aßmus
174f333ade3SStephan Aßmus	// After the views are attached, configure their target
175f333ade3SStephan Aßmus	for (int i = 0; i < 6; i++) {
176f333ade3SStephan Aßmus		fRadioButton[i]->SetTarget(this);
17731e20891SStephan Aßmus		fTextControl[i]->SetTarget(this);
17831e20891SStephan Aßmus	}
17931e20891SStephan Aßmus	fHexTextControl->SetTarget(this);
180f333ade3SStephan Aßmus
18131e20891SStephan Aßmus	_UpdateTextControls();
18231e20891SStephan Aßmus}
18331e20891SStephan Aßmus
184f333ade3SStephan Aßmus
18531e20891SStephan Aßmusvoid
18631e20891SStephan AßmusColorPickerView::MessageReceived(BMessage *message)
18731e20891SStephan Aßmus{
18831e20891SStephan Aßmus	switch (message->what) {
189f333ade3SStephan Aßmus		case MSG_UPDATE_COLOR_PICKER_VIEW:
190f333ade3SStephan Aßmus			if (fRequiresUpdate)
191f333ade3SStephan Aßmus				_UpdateTextControls();
192f333ade3SStephan Aßmus			break;
19331e20891SStephan Aßmus
194f333ade3SStephan Aßmus		case MSG_COLOR_FIELD:
195f333ade3SStephan Aßmus		{
196f333ade3SStephan Aßmus			float value1, value2;
19731e20891SStephan Aßmus			value1 = message->FindFloat("value");
19831e20891SStephan Aßmus			value2 = message->FindFloat("value", 1);
19931e20891SStephan Aßmus			_UpdateColor(-1, value1, value2);
20031e20891SStephan Aßmus			fRequiresUpdate = true;
201f333ade3SStephan Aßmus			break;
202f333ade3SStephan Aßmus		}
203f333ade3SStephan Aßmus
204f333ade3SStephan Aßmus		case MSG_COLOR_SLIDER:
205f333ade3SStephan Aßmus		{
206f333ade3SStephan Aßmus			float value;
20731e20891SStephan Aßmus			message->FindFloat("value", &value);
20831e20891SStephan Aßmus			_UpdateColor(value, -1, -1);
20931e20891SStephan Aßmus			fRequiresUpdate = true;
210f333ade3SStephan Aßmus			break;
211f333ade3SStephan Aßmus		}
212f333ade3SStephan Aßmus
213f333ade3SStephan Aßmus		case MSG_COLOR_PREVIEW:
214f333ade3SStephan Aßmus		{
215f333ade3SStephan Aßmus			rgb_color* color;
216f333ade3SStephan Aßmus			ssize_t numBytes;
217f333ade3SStephan Aßmus			if (message->FindData("color", B_RGB_COLOR_TYPE,
218f333ade3SStephan Aßmus					(const void**)&color, &numBytes) == B_OK) {
21931e20891SStephan Aßmus				color->alpha = 255;
22031e20891SStephan Aßmus				SetColor(*color);
22131e20891SStephan Aßmus			}
222f333ade3SStephan Aßmus			break;
223f333ade3SStephan Aßmus		}
224f333ade3SStephan Aßmus
225f333ade3SStephan Aßmus		case MSG_RADIOBUTTON:
22631e20891SStephan Aßmus			SetColorMode(H_SELECTED);
227f333ade3SStephan Aßmus			break;
22831e20891SStephan Aßmus
229f333ade3SStephan Aßmus		case MSG_RADIOBUTTON + 1:
23031e20891SStephan Aßmus			SetColorMode(S_SELECTED);
231f333ade3SStephan Aßmus			break;
23231e20891SStephan Aßmus
233f333ade3SStephan Aßmus		case MSG_RADIOBUTTON + 2:
23431e20891SStephan Aßmus			SetColorMode(V_SELECTED);
235f333ade3SStephan Aßmus			break;
23631e20891SStephan Aßmus
237f333ade3SStephan Aßmus		case MSG_RADIOBUTTON + 3:
23831e20891SStephan Aßmus			SetColorMode(R_SELECTED);
239f333ade3SStephan Aßmus			break;
24031e20891SStephan Aßmus
241f333ade3SStephan Aßmus		case MSG_RADIOBUTTON + 4:
24231e20891SStephan Aßmus			SetColorMode(G_SELECTED);
243f333ade3SStephan Aßmus			break;
24431e20891SStephan Aßmus
245f333ade3SStephan Aßmus		case MSG_RADIOBUTTON + 5:
24631e20891SStephan Aßmus			SetColorMode(B_SELECTED);
247f333ade3SStephan Aßmus			break;
248f333ade3SStephan Aßmus
24931e20891SStephan Aßmus		case MSG_TEXTCONTROL:
25031e20891SStephan Aßmus		case MSG_TEXTCONTROL + 1:
25131e20891SStephan Aßmus		case MSG_TEXTCONTROL + 2:
25231e20891SStephan Aßmus		case MSG_TEXTCONTROL + 3:
25331e20891SStephan Aßmus		case MSG_TEXTCONTROL + 4:
254f333ade3SStephan Aßmus		case MSG_TEXTCONTROL + 5:
255f333ade3SStephan Aßmus		{
25631e20891SStephan Aßmus			int nr = message->what - MSG_TEXTCONTROL;
25731e20891SStephan Aßmus			int value = atoi(fTextControl[nr]->Text());
258f333ade3SStephan Aßmus
25931e20891SStephan Aßmus			switch (nr) {
26031e20891SStephan Aßmus				case 0: {
26131e20891SStephan Aßmus					value %= 360;
26231e20891SStephan Aßmus					h = (float)value / 60;
26331e20891SStephan Aßmus				} break;
26431e20891SStephan Aßmus
26531e20891SStephan Aßmus				case 1: {
26631e20891SStephan Aßmus					value = min_c(value, 100);
26731e20891SStephan Aßmus					s = (float)value / 100;
26831e20891SStephan Aßmus				} break;
26931e20891SStephan Aßmus
27031e20891SStephan Aßmus				case 2: {
27131e20891SStephan Aßmus					value = min_c(value, 100);
27231e20891SStephan Aßmus					v = (float)value / 100;
27331e20891SStephan Aßmus				} break;
27431e20891SStephan Aßmus
27531e20891SStephan Aßmus				case 3: {
27631e20891SStephan Aßmus					value = min_c(value, 255);
27731e20891SStephan Aßmus					r = (float)value / 255;
27831e20891SStephan Aßmus				} break;
27931e20891SStephan Aßmus
28031e20891SStephan Aßmus				case 4: {
28131e20891SStephan Aßmus					value = min_c(value, 255);
28231e20891SStephan Aßmus					g = (float)value / 255;
28331e20891SStephan Aßmus				} break;
28431e20891SStephan Aßmus
28531e20891SStephan Aßmus				case 5: {
28631e20891SStephan Aßmus					value = min_c(value, 255);
28731e20891SStephan Aßmus					b = (float)value / 255;
28831e20891SStephan Aßmus				} break;
28931e20891SStephan Aßmus			}
290f333ade3SStephan Aßmus
2911011a95aSAugustin Cavalier			if (nr < 3) { // hsv-mode
29231e20891SStephan Aßmus				HSV_to_RGB(h, s, v, r, g, b);
29331e20891SStephan Aßmus			}
29431e20891SStephan Aßmus
295cc3fb1f5SJérôme Duval			rgb_color color = { (uint8)round(r * 255), (uint8)round(g * 255),
296f333ade3SStephan Aßmus								(uint8)round(b * 255), 255 };
29731e20891SStephan Aßmus
29831e20891SStephan Aßmus			SetColor(color);
299f333ade3SStephan Aßmus			break;
300f333ade3SStephan Aßmus		}
301f333ade3SStephan Aßmus
302f333ade3SStephan Aßmus		case MSG_HEXTEXTCONTROL:
303f333ade3SStephan Aßmus		{
304f333ade3SStephan Aßmus			BString string = _HexTextControlString();
305f333ade3SStephan Aßmus			if (string.Length() == 6) {
306f333ade3SStephan Aßmus				rgb_color color = {
307f333ade3SStephan Aßmus					(uint8)hexdec(string, 0),
308f333ade3SStephan Aßmus					(uint8)hexdec(string, 2),
309cc3fb1f5SJérôme Duval					(uint8)hexdec(string, 4), 255 };
31031e20891SStephan Aßmus				SetColor(color);
31131e20891SStephan Aßmus			}
312f333ade3SStephan Aßmus			break;
313f333ade3SStephan Aßmus		}
31431e20891SStephan Aßmus
31531e20891SStephan Aßmus		default:
31631e20891SStephan Aßmus			BView::MessageReceived(message);
31731e20891SStephan Aßmus	}
31831e20891SStephan Aßmus}
31931e20891SStephan Aßmus
32031e20891SStephan Aßmus
32131e20891SStephan Aßmusvoid
322f333ade3SStephan AßmusColorPickerView::SetColorMode(SelectedColorMode mode, bool update)
32331e20891SStephan Aßmus{
32431e20891SStephan Aßmus	fSelectedColorMode = mode;
32531e20891SStephan Aßmus	switch (mode) {
32631e20891SStephan Aßmus		case R_SELECTED:
327f333ade3SStephan Aßmus			p = &r;
328f333ade3SStephan Aßmus			p1 = &g;
329f333ade3SStephan Aßmus			p2 = &b;
330f333ade3SStephan Aßmus			break;
33131e20891SStephan Aßmus
33231e20891SStephan Aßmus		case G_SELECTED:
333f333ade3SStephan Aßmus			p = &g;
334f333ade3SStephan Aßmus			p1 = &r;
335f333ade3SStephan Aßmus			p2 = &b;
336f333ade3SStephan Aßmus			break;
33731e20891SStephan Aßmus
33831e20891SStephan Aßmus		case B_SELECTED:
339f333ade3SStephan Aßmus			p = &b;
340f333ade3SStephan Aßmus			p1 = &r;
341f333ade3SStephan Aßmus			p2 = &g;
342f333ade3SStephan Aßmus			break;
34331e20891SStephan Aßmus
34431e20891SStephan Aßmus		case H_SELECTED:
345f333ade3SStephan Aßmus			p = &h;
346f333ade3SStephan Aßmus			p1 = &s;
347f333ade3SStephan Aßmus			p2 = &v;
348f333ade3SStephan Aßmus			break;
34931e20891SStephan Aßmus
35031e20891SStephan Aßmus		case S_SELECTED:
351f333ade3SStephan Aßmus			p = &s;
352f333ade3SStephan Aßmus			p1 = &h;
353f333ade3SStephan Aßmus			p2 = &v;
354f333ade3SStephan Aßmus			break;
35531e20891SStephan Aßmus
35631e20891SStephan Aßmus		case V_SELECTED:
357f333ade3SStephan Aßmus			p = &v;
358f333ade3SStephan Aßmus			p1 = &h;
359f333ade3SStephan Aßmus			p2 = &s;
360f333ade3SStephan Aßmus			break;
36131e20891SStephan Aßmus	}
362f333ade3SStephan Aßmus
363f333ade3SStephan Aßmus	if (!update)
364f333ade3SStephan Aßmus		return;
36531e20891SStephan Aßmus
36631e20891SStephan Aßmus	fColorSlider->SetModeAndValues(fSelectedColorMode, *p1, *p2);
36731e20891SStephan Aßmus	fColorField->SetModeAndValue(fSelectedColorMode, *p);
368f333ade3SStephan Aßmus
36931e20891SStephan Aßmus}
37031e20891SStephan Aßmus
37131e20891SStephan Aßmus// SetColor
37231e20891SStephan Aßmusvoid
37331e20891SStephan AßmusColorPickerView::SetColor(rgb_color color)
37431e20891SStephan Aßmus{
375f333ade3SStephan Aßmus	r = (float)color.red / 255;
376f333ade3SStephan Aßmus	g = (float)color.green / 255;
377f333ade3SStephan Aßmus	b = (float)color.blue / 255;
37831e20891SStephan Aßmus	RGB_to_HSV(r, g, b, h, s, v);
379f333ade3SStephan Aßmus
38031e20891SStephan Aßmus	fColorSlider->SetModeAndValues(fSelectedColorMode, *p1, *p2);
38131e20891SStephan Aßmus	fColorSlider->SetMarkerToColor(color);
38231e20891SStephan Aßmus
38331e20891SStephan Aßmus	fColorField->SetModeAndValue(fSelectedColorMode, *p);
38431e20891SStephan Aßmus	fColorField->SetMarkerToColor(color);
38531e20891SStephan Aßmus
38631e20891SStephan Aßmus	fColorPreview->SetColor(color);
387f333ade3SStephan Aßmus
388f333ade3SStephan Aßmus	_UpdateTextControls();
38931e20891SStephan Aßmus}
39031e20891SStephan Aßmus
391f333ade3SStephan Aßmus
39231e20891SStephan Aßmusrgb_color
39331e20891SStephan AßmusColorPickerView::Color()
39431e20891SStephan Aßmus{
395f333ade3SStephan Aßmus	if (fSelectedColorMode & (R_SELECTED | G_SELECTED | B_SELECTED))
39631e20891SStephan Aßmus		RGB_to_HSV(r, g, b, h, s, v);
39731e20891SStephan Aßmus	else
39831e20891SStephan Aßmus		HSV_to_RGB(h, s, v, r, g, b);
39931e20891SStephan Aßmus
40031e20891SStephan Aßmus	rgb_color color;
40131e20891SStephan Aßmus	color.red = (uint8)round(r * 255.0);
40231e20891SStephan Aßmus	color.green = (uint8)round(g * 255.0);
40331e20891SStephan Aßmus	color.blue = (uint8)round(b * 255.0);
40431e20891SStephan Aßmus	color.alpha = 255;
40531e20891SStephan Aßmus
40631e20891SStephan Aßmus	return color;
40731e20891SStephan Aßmus}
40831e20891SStephan Aßmus
409f333ade3SStephan Aßmus
41031e20891SStephan Aßmusint32
411f333ade3SStephan AßmusColorPickerView::_NumForMode(SelectedColorMode mode) const
41231e20891SStephan Aßmus{
41331e20891SStephan Aßmus	int32 num = -1;
41431e20891SStephan Aßmus	switch (mode) {
41531e20891SStephan Aßmus		case H_SELECTED:
41631e20891SStephan Aßmus			num = 0;
41731e20891SStephan Aßmus			break;
41831e20891SStephan Aßmus		case S_SELECTED:
41931e20891SStephan Aßmus			num = 1;
42031e20891SStephan Aßmus			break;
42131e20891SStephan Aßmus		case V_SELECTED:
42231e20891SStephan Aßmus			num = 2;
42331e20891SStephan Aßmus			break;
42431e20891SStephan Aßmus		case R_SELECTED:
42531e20891SStephan Aßmus			num = 3;
42631e20891SStephan Aßmus			break;
42731e20891SStephan Aßmus		case G_SELECTED:
42831e20891SStephan Aßmus			num = 4;
42931e20891SStephan Aßmus			break;
43031e20891SStephan Aßmus		case B_SELECTED:
43131e20891SStephan Aßmus			num = 5;
43231e20891SStephan Aßmus			break;
43331e20891SStephan Aßmus	}
43431e20891SStephan Aßmus	return num;
43531e20891SStephan Aßmus}
43631e20891SStephan Aßmus
437f333ade3SStephan Aßmus
43831e20891SStephan Aßmusvoid
43931e20891SStephan AßmusColorPickerView::_UpdateColor(float value, float value1, float value2)
44031e20891SStephan Aßmus{
441f333ade3SStephan Aßmus	if (value != -1) {
44231e20891SStephan Aßmus		fColorField->SetFixedValue(value);
44331e20891SStephan Aßmus		*p = value;
444f333ade3SStephan Aßmus	} else if (value1 != -1 && value2 != -1) {
44531e20891SStephan Aßmus		fColorSlider->SetOtherValues(value1, value2);
44631e20891SStephan Aßmus		*p1 = value1; *p2 = value2;
44731e20891SStephan Aßmus	}
44831e20891SStephan Aßmus
44931e20891SStephan Aßmus	if (fSelectedColorMode & (R_SELECTED|G_SELECTED|B_SELECTED))
45031e20891SStephan Aßmus		RGB_to_HSV(r, g, b, h, s, v);
45131e20891SStephan Aßmus	else
45231e20891SStephan Aßmus		HSV_to_RGB(h, s, v, r, g, b);
45331e20891SStephan Aßmus
454f333ade3SStephan Aßmus	rgb_color color = { (uint8)(r * 255), (uint8)(g * 255),
455f333ade3SStephan Aßmus		(uint8)(b * 255), 255 };
45631e20891SStephan Aßmus	fColorPreview->SetColor(color);
45731e20891SStephan Aßmus}
45831e20891SStephan Aßmus
459f333ade3SStephan Aßmus
46031e20891SStephan Aßmusvoid
46131e20891SStephan AßmusColorPickerView::_UpdateTextControls()
46231e20891SStephan Aßmus{
463f333ade3SStephan Aßmus	bool updateRequired = false;
464f333ade3SStephan Aßmus	updateRequired |= _SetTextControlValue(0, round(h * 60));
465f333ade3SStephan Aßmus	updateRequired |= _SetTextControlValue(1, round(s * 100));
466f333ade3SStephan Aßmus	updateRequired |= _SetTextControlValue(2, round(v * 100));
467f333ade3SStephan Aßmus	updateRequired |= _SetTextControlValue(3, round(r * 255));
468f333ade3SStephan Aßmus	updateRequired |= _SetTextControlValue(4, round(g * 255));
469f333ade3SStephan Aßmus	updateRequired |= _SetTextControlValue(5, round(b * 255));
470f333ade3SStephan Aßmus
471f333ade3SStephan Aßmus	BString hexString;
472f333ade3SStephan Aßmus	hexString.SetToFormat("%.6X",
473f333ade3SStephan Aßmus		(round(r * 255) << 16) | (round(g * 255) << 8) | round(b * 255));
474f333ade3SStephan Aßmus	updateRequired |= _SetHexTextControlString(hexString);
475f333ade3SStephan Aßmus
476f333ade3SStephan Aßmus	fRequiresUpdate = updateRequired;
477f333ade3SStephan Aßmus	if (fRequiresUpdate) {
478f333ade3SStephan Aßmus		// Couldn't set all values. Try again later.
479f333ade3SStephan Aßmus		BMessage message(MSG_UPDATE_COLOR_PICKER_VIEW);
480f333ade3SStephan Aßmus		BMessageRunner::StartSending(this, &message, 500000, 1);
481f333ade3SStephan Aßmus	}
482f333ade3SStephan Aßmus}
48331e20891SStephan Aßmus
48431e20891SStephan Aßmus
485f333ade3SStephan Aßmusint
486f333ade3SStephan AßmusColorPickerView::_TextControlValue(int32 index)
487f333ade3SStephan Aßmus{
488f333ade3SStephan Aßmus	return atoi(fTextControl[index]->Text());
489f333ade3SStephan Aßmus}
49031e20891SStephan Aßmus
49131e20891SStephan Aßmus
492f333ade3SStephan Aßmus// Returns whether the value needs to be set later, since it is currently
493f333ade3SStephan Aßmus// being edited by the user.
494f333ade3SStephan Aßmusbool
495f333ade3SStephan AßmusColorPickerView::_SetTextControlValue(int32 index, int value)
496f333ade3SStephan Aßmus{
497f333ade3SStephan Aßmus	BString text;
498f333ade3SStephan Aßmus	text << value;
499f333ade3SStephan Aßmus	return _SetText(fTextControl[index], text);
500f333ade3SStephan Aßmus}
50131e20891SStephan Aßmus
50231e20891SStephan Aßmus
503f333ade3SStephan AßmusBString
504f333ade3SStephan AßmusColorPickerView::_HexTextControlString() const
505f333ade3SStephan Aßmus{
506f333ade3SStephan Aßmus	return fHexTextControl->TextView()->Text();
507f333ade3SStephan Aßmus}
50831e20891SStephan Aßmus
50931e20891SStephan Aßmus
510f333ade3SStephan Aßmus// Returns whether the value needs to be set later, since it is currently
511f333ade3SStephan Aßmus// being edited by the user.
512f333ade3SStephan Aßmusbool
513f333ade3SStephan AßmusColorPickerView::_SetHexTextControlString(const BString& text)
514f333ade3SStephan Aßmus{
515f333ade3SStephan Aßmus	return _SetText(fHexTextControl, text);
51631e20891SStephan Aßmus}
51731e20891SStephan Aßmus
518f333ade3SStephan Aßmus
519f333ade3SStephan Aßmus// Returns whether the value needs to be set later, since it is currently
520f333ade3SStephan Aßmus// being edited by the user.
521f333ade3SStephan Aßmusbool
522f333ade3SStephan AßmusColorPickerView::_SetText(BTextControl* control, const BString& text)
52331e20891SStephan Aßmus{
524f333ade3SStephan Aßmus	if (text == control->Text())
525f333ade3SStephan Aßmus		return false;
526f333ade3SStephan Aßmus
527f333ade3SStephan Aßmus	// This textview needs updating, but don't screw with user while she is
528f333ade3SStephan Aßmus	// typing.
529f333ade3SStephan Aßmus	if (control->TextView()->IsFocus())
530f333ade3SStephan Aßmus		return true;
531f333ade3SStephan Aßmus
532f333ade3SStephan Aßmus	control->SetText(text.String());
533f333ade3SStephan Aßmus	return false;
53431e20891SStephan Aßmus}
53531e20891SStephan Aßmus