1/*
2 * Copyright 2007-2014 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Stephan A��mus, superstippi@gmx.de
7 */
8
9
10#include "SpiderView.h"
11
12#include <Catalog.h>
13#include <ColorMenuItem.h>
14#include <ControlLook.h>
15#include <MenuField.h>
16#include <Message.h>
17#include <PopUpMenu.h>
18#include <Slider.h>
19#include <StringView.h>
20
21#include "SpiderSaver.h"
22
23
24#undef B_TRANSLATION_CONTEXT
25#define B_TRANSLATION_CONTEXT "SpiderView"
26
27
28static const uint32 kMsgQueueNumber		= 'qunm';
29static const uint32 kMsgPolyNumber		= 'plnm';
30static const uint32 kMsgQueueDepth		= 'qudp';
31static const uint32 kMsgColor			= 'colr';
32
33
34//	#pragma - SpiderView
35
36
37SpiderView::SpiderView(BRect frame, SpiderSaver* saver, uint32 queueNumber,
38	uint32 maxPolyPoints, uint32 maxQueueDepth, uint32 color)
39	:
40	BView(frame, "spider view", B_FOLLOW_NONE, B_WILL_DRAW | B_PULSE_NEEDED),
41	fSaver(saver)
42{
43	SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
44
45	frame.OffsetTo(0.0, 0.0);
46	frame.InsetBy(10.0, 5.0);
47
48	float viewHeight = floorf(frame.Height() / 5.0);
49
50	// title stuff
51	font_height fh;
52	be_bold_font->GetHeight(&fh);
53	float fontHeight = fh.ascent + fh.descent + 5.0;
54	frame.bottom = frame.top + fontHeight;
55	BStringView* title = new BStringView(frame, B_EMPTY_STRING,
56		B_TRANSLATE("Spider by stippi"));
57	title->SetFont(be_bold_font);
58	AddChild(title);
59
60	be_plain_font->GetHeight(&fh);
61	fontHeight = fh.ascent + fh.descent + 5.0;
62	frame.top = frame.bottom;
63	frame.bottom = frame.top + fontHeight;
64	title = new BStringView(frame, B_EMPTY_STRING,
65		B_TRANSLATE("for  bonefish"));
66	BFont font(be_plain_font);
67	font.SetShear(110.0);
68	title->SetFont(&font);
69	title->SetAlignment(B_ALIGN_CENTER);
70	AddChild(title);
71
72	// controls
73	frame.top = 10.0f;
74	frame.bottom = frame.top + viewHeight;
75
76	// queue slider
77	frame.OffsetBy(0.0f, viewHeight);
78	fQueueNumberSlider = new BSlider(frame, "queue number",
79		B_TRANSLATE("Max. polygon count"), new BMessage(kMsgQueueNumber),
80		1, MAX_QUEUE_NUMBER);
81	fQueueNumberSlider->SetHashMarks(B_HASH_MARKS_BOTTOM);
82	fQueueNumberSlider->SetHashMarkCount((MAX_QUEUE_NUMBER - 1) / 2 + 1);
83	fQueueNumberSlider->SetValue(queueNumber);
84	AddChild(fQueueNumberSlider);
85
86	// poly sliders
87	frame.OffsetBy(0.0f, viewHeight);
88	fPolyNumberSlider = new BSlider(frame, "poly points",
89		B_TRANSLATE("Max. points per polygon"), new BMessage(kMsgPolyNumber),
90		MIN_POLY_POINTS, MAX_POLY_POINTS);
91	fPolyNumberSlider->SetHashMarks(B_HASH_MARKS_BOTTOM);
92	fPolyNumberSlider->SetHashMarkCount(MAX_POLY_POINTS - MIN_POLY_POINTS + 1);
93	fPolyNumberSlider->SetValue(maxPolyPoints);
94	AddChild(fPolyNumberSlider);
95
96	// queue depth slider
97	frame.OffsetBy(0.0f, viewHeight);
98	fQueueDepthSlider = new BSlider(frame, "queue depth",
99		B_TRANSLATE("Trail depth"), new BMessage(kMsgQueueDepth),
100		MIN_QUEUE_DEPTH, MAX_QUEUE_DEPTH);
101	fQueueDepthSlider->SetHashMarks(B_HASH_MARKS_BOTTOM);
102	fQueueDepthSlider->SetHashMarkCount(
103		(MAX_QUEUE_DEPTH - MIN_QUEUE_DEPTH) / 4 + 1);
104	fQueueDepthSlider->SetValue(maxQueueDepth);
105	AddChild(fQueueDepthSlider);
106
107	// color menu field
108	BPopUpMenu* menu = new BPopUpMenu(B_TRANSLATE("Color"));
109	BColorMenuItem* item;
110	BMessage* message;
111
112	// red
113	message = new BMessage(kMsgColor);
114	message->AddInt32("color", RED);
115	item = new BColorMenuItem(B_TRANSLATE("Red"), message,
116		(rgb_color){ 255, 65, 54 });
117	item->SetMarked(color == RED);
118	menu->AddItem(item);
119
120	// green
121	message = new BMessage(kMsgColor);
122	message->AddInt32("color", GREEN);
123	item = new BColorMenuItem(B_TRANSLATE("Green"), message,
124		(rgb_color){ 46, 204, 64 });
125	item->SetMarked(color == GREEN);
126	menu->AddItem(item);
127
128	// blue
129	message = new BMessage(kMsgColor);
130	message->AddInt32("color", BLUE);
131	item = new BColorMenuItem(B_TRANSLATE("Blue"), message,
132		(rgb_color){ 0, 116, 217 });
133	item->SetMarked(color == BLUE);
134	menu->AddItem(item);
135
136	// yellow
137	message = new BMessage(kMsgColor);
138	message->AddInt32("color", YELLOW);
139	item = new BColorMenuItem(B_TRANSLATE("Yellow"), message,
140		(rgb_color){ 255, 220, 0 });
141	item->SetMarked(color == YELLOW);
142	menu->AddItem(item);
143
144	// purple
145	message = new BMessage(kMsgColor);
146	message->AddInt32("color", PURPLE);
147	item = new BColorMenuItem(B_TRANSLATE("Purple"), message,
148		(rgb_color){ 177, 13, 201 });
149	item->SetMarked(color == PURPLE);
150	menu->AddItem(item);
151
152	// cyan
153	message = new BMessage(kMsgColor);
154	message->AddInt32("color", CYAN);
155	item = new BColorMenuItem(B_TRANSLATE("Cyan"), message,
156		(rgb_color){ 127, 219, 255 });
157	item->SetMarked(color == CYAN);
158	menu->AddItem(item);
159
160	// gray
161	message = new BMessage(kMsgColor);
162	message->AddInt32("color", GRAY);
163	item = new BColorMenuItem(B_TRANSLATE("Gray"), message,
164		(rgb_color){ 170, 170, 170 });
165	item->SetMarked(color == GRAY);
166	menu->AddItem(item);
167
168	frame.OffsetBy(0.0f, viewHeight);
169	fColorMenuField = new BMenuField( frame, "color", B_TRANSLATE("Color"),
170		menu);
171	fColorMenuField->SetDivider(fColorMenuField->StringWidth(
172		B_TRANSLATE("Color")) + be_control_look->DefaultItemSpacing());
173	AddChild(fColorMenuField);
174}
175
176
177SpiderView::~SpiderView()
178{
179}
180
181
182void
183SpiderView::AttachedToWindow()
184{
185	fQueueNumberSlider->SetTarget(this);
186	fPolyNumberSlider->SetTarget(this);
187	fQueueDepthSlider->SetTarget(this);
188	fColorMenuField->Menu()->SetTargetForItems(this);
189}
190
191
192void
193SpiderView::MessageReceived(BMessage* message)
194{
195	switch (message->what) {
196		case kMsgQueueNumber:
197			fSaver->SetQueueNumber(fQueueNumberSlider->Value());
198			break;
199
200		case kMsgPolyNumber:
201			fSaver->SetPolyPoints(fPolyNumberSlider->Value());
202			break;
203
204		case kMsgQueueDepth:
205			fSaver->SetQueueDepth(fQueueDepthSlider->Value());
206			break;
207
208		case kMsgColor: {
209			uint32 color;
210			if (message->FindInt32("color", (int32*)&color) == B_OK)
211				fSaver->SetColor(color);
212
213			break;
214		}
215
216		default:
217			BView::MessageReceived(message);
218	}
219}
220