xref: /haiku/src/tests/kits/interface/look/Look.cpp (revision 1b80286772b529a3d6de3bbeb0720c62e6a32fed)
1 /*
2  * Copyright 2009, Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 #include <Application.h>
7 #include <Box.h>
8 #include <Button.h>
9 #include <ChannelSlider.h>
10 #include <CheckBox.h>
11 #include <ColorControl.h>
12 #include <ColumnListView.h>
13 #include <ControlLook.h>
14 #include <FilePanel.h>
15 #include <GridLayoutBuilder.h>
16 #include <GroupLayoutBuilder.h>
17 #include <ListView.h>
18 #include <MenuBar.h>
19 #include <MenuField.h>
20 #include <MenuItem.h>
21 #include <OptionControl.h>
22 #include <OutlineListView.h>
23 #include <PopUpMenu.h>
24 #include <RadioButton.h>
25 #include <ScrollBar.h>
26 #include <ScrollView.h>
27 #include <Slider.h>
28 #include <SpaceLayoutItem.h>
29 #include <StatusBar.h>
30 #include <StringView.h>
31 #include <TabView.h>
32 #include <TextControl.h>
33 #include <TextView.h>
34 #include <Window.h>
35 
36 
37 static const float kInset = 8.0f;
38 
39 
40 template <class ControlType>
41 void
42 add_controls(BGridLayout* layout, int32& row)
43 {
44 	ControlType* control1 = new ControlType("Enabled", NULL);
45 	ControlType* control2 = new ControlType("Disabled", NULL);
46 	control2->SetEnabled(false);
47 	ControlType* control3 = new ControlType("Enabled", NULL);
48 	control3->SetValue(B_CONTROL_ON);
49 	ControlType* control4 = new ControlType("Disabled", NULL);
50 	control4->SetValue(B_CONTROL_ON);
51 	control4->SetEnabled(false);
52 
53 	control1->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
54 	control2->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
55 	control3->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
56 	control4->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
57 
58 	layout->AddView(control1, 0, row);
59 	layout->AddView(control2, 1, row);
60 	layout->AddView(control3, 2, row);
61 	layout->AddView(control4, 3, row);
62 
63 	row++;
64 }
65 
66 
67 #define USE_LAYOUT_ITEMS 0
68 
69 
70 void
71 add_menu_fields(BGridLayout* layout, int32& row)
72 {
73 	BPopUpMenu* menu1 = new BPopUpMenu("Selection");
74 	BMenuField* control1 = new BMenuField("Enabled", menu1, NULL);
75 	BPopUpMenu* menu2 = new BPopUpMenu("Selection");
76 	BMenuField* control2 = new BMenuField("Disabled", menu2, NULL);
77 	control2->SetEnabled(false);
78 
79 #if USE_LAYOUT_ITEMS
80 	layout->AddItem(control1->CreateLabelLayoutItem(), 0, row);
81 	layout->AddItem(control1->CreateMenuBarLayoutItem(), 1, row);
82 	layout->AddItem(control2->CreateLabelLayoutItem(), 2, row);
83 	layout->AddItem(control2->CreateMenuBarLayoutItem(), 3, row);
84 #else
85 	layout->AddView(control1, 0, row, 2);
86 	layout->AddView(control2, 2, row, 2);
87 #endif
88 
89 	row++;
90 }
91 
92 
93 void
94 add_text_controls(BGridLayout* layout, int32& row)
95 {
96 	BTextControl* control1 = new BTextControl("Enabled", "Some Text", NULL);
97 	BTextControl* control2 = new BTextControl("Disabled", "More Text", NULL);
98 	control2->SetEnabled(false);
99 
100 #if USE_LAYOUT_ITEMS
101 	layout->AddItem(control1->CreateLabelLayoutItem(), 0, row);
102 	layout->AddItem(control1->CreateTextViewLayoutItem(), 1, row);
103 	layout->AddItem(control2->CreateLabelLayoutItem(), 2, row);
104 	layout->AddItem(control2->CreateTextViewLayoutItem(), 3, row);
105 #else
106 	layout->AddView(control1, 0, row, 2);
107 	layout->AddView(control2, 2, row, 2);
108 #endif
109 
110 	row++;
111 }
112 
113 
114 void
115 add_sliders(BGridLayout* layout, int32& row)
116 {
117 	BSlider* control1 = new BSlider("slider 1", "Enabled", NULL, 1, 100,
118 		B_HORIZONTAL);
119 	BSlider* control2 = new BSlider("slider 2", "Disabled", NULL, 1, 100,
120 		B_HORIZONTAL);
121 	control2->SetEnabled(false);
122 
123 	control1->SetHashMarkCount(10);
124 	control1->SetHashMarks(B_HASH_MARKS_BOTTOM);
125 	control2->SetHashMarkCount(10);
126 	control2->SetHashMarks(B_HASH_MARKS_BOTTOM);
127 
128 	layout->AddView(control1, 0, row, 2);
129 	layout->AddView(control2, 2, row, 2);
130 
131 	row++;
132 
133 	control1 = new BSlider("slider 3", "Enabled", NULL, 1, 100,
134 		B_HORIZONTAL, B_TRIANGLE_THUMB);
135 	control2 = new BSlider("slider 4", "Disabled", NULL, 1, 100,
136 		B_HORIZONTAL, B_TRIANGLE_THUMB);
137 	control2->SetEnabled(false);
138 
139 	rgb_color fillColor = (rgb_color){ 255, 115, 0, 255 };
140 
141 	control1->SetLimitLabels("Min", "Max");
142 	control1->UseFillColor(true, &fillColor);
143 	control1->SetValue(20);
144 
145 	control2->SetLimitLabels("1", "100");
146 	control2->UseFillColor(true, &fillColor);
147 	control2->SetValue(10);
148 
149 	layout->AddView(control1, 0, row, 2);
150 	layout->AddView(control2, 2, row, 2);
151 
152 	row++;
153 }
154 
155 
156 void
157 add_status_bars(BGridLayout* layout, int32& row)
158 {
159 	BBox* box = new BBox(B_FANCY_BORDER, NULL);
160 	box->SetLabel("Info");
161 
162 	BGroupLayout* boxLayout = new BGroupLayout(B_VERTICAL, kInset);
163 	boxLayout->SetInsets(kInset, kInset + box->TopBorderOffset(), kInset,
164 		kInset);
165 	box->SetLayout(boxLayout);
166 
167 	BStatusBar* statusBar = new BStatusBar("status bar", "Status",
168 		"Completed");
169 	statusBar->SetMaxValue(100);
170 	statusBar->SetTo(0);
171 	statusBar->SetBarHeight(12);
172 	boxLayout->AddView(statusBar);
173 
174 	statusBar = new BStatusBar("status bar", "Progress",
175 		"Completed");
176 	statusBar->SetMaxValue(100);
177 	statusBar->SetTo(40);
178 	statusBar->SetBarHeight(12);
179 	boxLayout->AddView(statusBar);
180 
181 	statusBar = new BStatusBar("status bar", "Lifespan of capitalism",
182 		"Completed");
183 	statusBar->SetMaxValue(100);
184 	statusBar->SetTo(100);
185 	statusBar->SetBarHeight(12);
186 	boxLayout->AddView(statusBar);
187 
188 	layout->AddView(box, 0, row, 4);
189 
190 	row++;
191 }
192 
193 
194 enum {
195 	MSG_TEST_OPEN_FILE_PANEL = 'tofp',
196 	MSG_TEST_SAVE_FILE_PANEL = 'tsfp',
197 	MSG_TOGGLE_LOOK = 'tggl'
198 };
199 
200 
201 class Window : public BWindow {
202 public:
203 	Window(BRect frame, const char* title, window_type type, uint32 flags)
204 		: BWindow(frame, title, type, flags)
205 	{
206 		fControlLook = NULL;
207 	}
208 	~Window()
209 	{
210 		if (fControlLook != NULL)
211 			be_control_look = fControlLook;
212 	}
213 
214 	virtual void MessageReceived(BMessage* message)
215 	{
216 		switch (message->what) {
217 		case MSG_TEST_OPEN_FILE_PANEL:
218 			{
219 				BFilePanel* panel = new BFilePanel();
220 				panel->Show();
221 			}
222 			break;
223 		case MSG_TEST_SAVE_FILE_PANEL:
224 			{
225 				BFilePanel* panel = new BFilePanel(B_SAVE_PANEL);
226 				panel->Show();
227 			}
228 			break;
229 		case MSG_TOGGLE_LOOK:
230 			{
231 				BControlLook* temp = fControlLook;
232 				fControlLook = be_control_look;
233 				be_control_look = temp;
234 				_InvalidateChildrenAndView(ChildAt(0));
235 			}
236 			break;
237 
238 		default:
239 			BWindow::MessageReceived(message);
240 		}
241 	}
242 
243 private:
244 	void _InvalidateChildrenAndView(BView* view)
245 	{
246 		for (int32 i = 0; BView* child = view->ChildAt(i); i++)
247 			_InvalidateChildrenAndView(child);
248 		view->Invalidate();
249 	}
250 
251 private:
252 	BControlLook* fControlLook;
253 };
254 
255 
256 int
257 main(int argc, char** argv)
258 {
259 	BApplication app("application/x-vnd.haiku-look");
260 
261 	BWindow* window = new Window(BRect(50, 50, 100, 100),
262 		"Look at these pretty controls!", B_TITLED_WINDOW,
263 		B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS
264 			| B_QUIT_ON_WINDOW_CLOSE);
265 
266 	window->SetLayout(new BGroupLayout(B_HORIZONTAL));
267 
268 	// create some controls
269 
270 	// BListView
271 	BListView* listView = new BListView();
272 	for (int32 i = 0; i < 20; i++) {
273 		BString itemLabel("List Item ");
274 		itemLabel << i + 1;
275 		listView->AddItem(new BStringItem(itemLabel.String()));
276 	}
277 	BScrollView* scrollView = new BScrollView("scroller", listView, 0,
278 		true, true);
279 	scrollView->SetExplicitMinSize(BSize(300, 140));
280 
281 	// BColumnListView
282 	BColumnListView* columnListView = new BColumnListView("clv", 0,
283 		B_FANCY_BORDER);
284 //	for (int32 i = 0; i < 20; i++) {
285 //		BString itemLabel("List Item ");
286 //		itemLabel << i + 1;
287 //		columnListView->AddItem(new BStringItem(itemLabel.String()));
288 //	}
289 
290 
291 	BGridView* controls = new BGridView(kInset, kInset);
292 	BGridLayout* layout = controls->GridLayout();
293 	controls->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED));
294 
295 	int32 row = 0;
296 	add_controls<BButton>(layout, row);
297 	add_controls<BCheckBox>(layout, row);
298 	add_controls<BRadioButton>(layout, row);
299 	add_menu_fields(layout, row);
300 	add_text_controls(layout, row);
301 	add_sliders(layout, row);
302 	add_status_bars(layout, row);
303 
304 	BColorControl* colorControl = new BColorControl(B_ORIGIN, B_CELLS_32x8,
305 		8.0f, "color control");
306 	layout->AddView(colorControl, 0, row, 4);
307 
308 	BTabView* tabView = new BTabView("tab view", B_WIDTH_FROM_WIDEST);
309 	BView* content = BGroupLayoutBuilder(B_VERTICAL, kInset)
310 		.Add(scrollView)
311 		.Add(columnListView)
312 		.Add(controls)
313 		.SetInsets(kInset, kInset, kInset, kInset);
314 
315 	content->SetName("Tab 1");
316 
317 	tabView->AddTab(content);
318 	BView* tab2 = new BView("Tab 2", 0);
319 	tab2->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
320 	tabView->AddTab(tab2);
321 	tabView->AddTab(new BView("Tab 3", 0));
322 
323 	BMenuBar* menuBar = new BMenuBar("menu bar");
324 	BMenu* menu = new BMenu("File");
325 	menu->AddItem(new BMenuItem("Test Open BFilePanel",
326 		new BMessage(MSG_TEST_OPEN_FILE_PANEL)));
327 	menu->AddItem(new BMenuItem("Test Save BFilePanel",
328 		new BMessage(MSG_TEST_SAVE_FILE_PANEL)));
329 	menu->AddItem(new BMenuItem("Click me!", NULL));
330 	menu->AddItem(new BMenuItem("Another Option", NULL));
331 	menu->AddSeparatorItem();
332 	menu->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED)));
333 	menuBar->AddItem(menu);
334 	menu = new BMenu("Edit");
335 	menu->SetEnabled(false);
336 	menu->AddItem(new BMenuItem("Cut", NULL));
337 	menu->AddItem(new BMenuItem("Copy", NULL));
338 	menu->AddSeparatorItem();
339 	menu->AddItem(new BMenuItem("Past", NULL));
340 	menuBar->AddItem(menu);
341 	menu = new BMenu("One Item");
342 	menu->AddItem(new BMenuItem("Only", NULL));
343 	menuBar->AddItem(menu);
344 	menu = new BMenu("Sub Menu");
345 	BMenu* subMenu = new BMenu("Click Me");
346 	subMenu->AddItem(new BMenuItem("Either", NULL));
347 	subMenu->AddItem(new BMenuItem("Or", NULL));
348 	subMenu->SetRadioMode(true);
349 	menu->AddItem(subMenu);
350 	menuBar->AddItem(menu);
351 
352 	BButton* okButton = new BButton("Ok", new BMessage(B_QUIT_REQUESTED));
353 
354 	window->AddChild(BGroupLayoutBuilder(B_VERTICAL)
355 		.Add(menuBar)
356 		.Add(BGroupLayoutBuilder(B_VERTICAL, kInset)
357 			.Add(tabView)
358 			.Add(BGroupLayoutBuilder(B_HORIZONTAL, kInset)
359 				.Add(new BButton("Revert", new BMessage(MSG_TOGGLE_LOOK)))
360 				.Add(BSpaceLayoutItem::CreateGlue())
361 				.Add(new BButton("Cancel", NULL))
362 				.Add(okButton)
363 			)
364 			.SetInsets(kInset, kInset, kInset, kInset)
365 		)
366 	);
367 
368 	window->SetDefaultButton(okButton);
369 
370 	window->Show();
371 	app.Run();
372 	return 0;
373 }
374 
375