xref: /haiku/src/add-ons/screen_savers/gravity/ConfigView.cpp (revision 13581b3d2a71545960b98fefebc5225b5bf29072)
1 /*
2  * Copyright 2012-2013 Tri-Edge AI <triedgeai@gmail.com>
3  * Copyright 2014-2016 Haiku, Inc. All rights reserved.
4  *
5  * Distributed under the terms of the MIT license.
6  *
7  * Authors:
8  *		Tri-Edge AI
9  *		John Scipione, jscipione@gmail.com
10  */
11 
12 
13 #include "ConfigView.h"
14 
15 #include <LayoutBuilder.h>
16 #include <ListView.h>
17 #include <ScrollView.h>
18 #include <Slider.h>
19 #include <StringView.h>
20 #include <View.h>
21 
22 #include "ColorItem.h"
23 #include "Gravity.h"
24 #include "RainbowItem.h"
25 
26 
27 static const int32 kMsgSize = 'size';
28 static const int32 kMsgShade = 'shad';
29 
30 
31 ConfigView::ConfigView(BRect frame, Gravity* parent)
32 	:
33 	BView(frame, B_EMPTY_STRING, B_FOLLOW_ALL_SIDES, B_WILL_DRAW),
34 	fParent(parent),
35 	fTitleString(new BStringView(B_EMPTY_STRING, "OpenGL Gravity Effect")),
36 	fAuthorString(new BStringView(B_EMPTY_STRING, "by Tri-Edge AI")),
37 	fCountSlider(new BSlider(B_EMPTY_STRING, "Particle Count: ",
38 		new BMessage(kMsgSize), 0, 4, B_HORIZONTAL, B_BLOCK_THUMB,
39 		B_NAVIGABLE | B_WILL_DRAW)),
40 	fShadeString(new BStringView(B_EMPTY_STRING, "Shade: ")),
41 	fShadeList(new BListView(B_EMPTY_STRING, B_SINGLE_SELECTION_LIST,
42 		B_WILL_DRAW | B_NAVIGABLE))
43 {
44 	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
45 
46 	fShadeList->SetSelectionMessage(new BMessage(kMsgShade));
47 	fShadeList->AddItem(new ColorItem("Red", (rgb_color){ 255, 65, 54 }));
48 	fShadeList->AddItem(new ColorItem("Green", (rgb_color){ 46, 204, 64 }));
49 	fShadeList->AddItem(new ColorItem("Blue", (rgb_color){ 0, 116, 217 }));
50 	fShadeList->AddItem(new ColorItem("Orange", (rgb_color){ 255, 133, 27 }));
51 	fShadeList->AddItem(new ColorItem("Purple", (rgb_color){ 177, 13, 201 }));
52 	fShadeList->AddItem(new ColorItem("White", (rgb_color){ 255, 255, 255 }));
53 	fShadeList->AddItem(new RainbowItem("Rainbow"));
54 
55 	fShadeScroll = new BScrollView(B_EMPTY_STRING, fShadeList,
56 		B_WILL_DRAW | B_FRAME_EVENTS, false, true);
57 
58 	fCountSlider->SetHashMarks(B_HASH_MARKS_BOTTOM);
59 	fCountSlider->SetHashMarkCount(5);
60 	fCountSlider->SetLimitLabels("128", "2048");
61 	fCountSlider->SetModificationMessage(new BMessage(kMsgSize));
62 	fCountSlider->SetValue(parent->Config.ParticleCount);
63 
64 	BLayoutBuilder::Group<>(this, B_VERTICAL, B_USE_DEFAULT_SPACING)
65 		.AddGroup(B_VERTICAL, 0)
66 			.Add(fTitleString)
67 			.Add(fAuthorString)
68 			.End()
69 		.Add(fShadeString)
70 		.Add(fShadeScroll)
71 		.Add(fCountSlider)
72 		.SetInsets(B_USE_DEFAULT_SPACING)
73 		.End();
74 }
75 
76 
77 void
78 ConfigView::AllAttached()
79 {
80 	// fixup scroll bar range
81 	fShadeScroll->ScrollBar(B_VERTICAL)->SetRange(0.0f,
82 		fShadeList->ItemFrame(fShadeList->CountItems()).bottom
83 			- fShadeList->ItemFrame((int32)0).top);
84 
85 	// select the shade
86 	fShadeList->Select(fParent->Config.ShadeID);
87 }
88 
89 
90 void
91 ConfigView::AttachedToWindow()
92 {
93 	fShadeList->SetTarget(this);
94 	fCountSlider->SetTarget(this);
95 }
96 
97 
98 void
99 ConfigView::MessageReceived(BMessage* message)
100 {
101 	switch (message->what) {
102 		case kMsgSize:
103 			fParent->Config.ParticleCount = fCountSlider->Value();
104 			break;
105 
106 		case kMsgShade:
107 			fParent->Config.ShadeID = fShadeList->CurrentSelection();
108 			break;
109 
110 		default:
111 			BView::MessageReceived(message);
112 	}
113 }
114