xref: /haiku/src/apps/icon-o-matic/generic/gui/popup_control/InputSlider.cpp (revision 2600324b57fa31cdea1627d584d314f2a579c4a8)
1 /*
2  * Copyright 2006, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  */
8 
9 #include "InputSlider.h"
10 
11 #include <stdio.h>
12 
13 #include <Message.h>
14 #include <MessageFilter.h>
15 
16 #include "NummericalTextView.h"
17 
18 
19 // MouseDownFilter
20 
21 class NumericInputFilter : public BMessageFilter {
22  public:
23 								NumericInputFilter(InputSlider* slider);
24 
25 	virtual	filter_result		Filter(BMessage*, BHandler** target);
26 
27  private:
28 			InputSlider*		fSlider;
29 };
30 
31 // constructor
32 NumericInputFilter::NumericInputFilter(InputSlider* slider)
33 	: BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE),
34 	  fSlider(slider)
35 {
36 }
37 
38 // Filter
39 filter_result
40 NumericInputFilter::Filter(BMessage* msg, BHandler** target)
41 {
42 	filter_result result = B_DISPATCH_MESSAGE;
43 	switch (msg->what)
44 	{
45 		case B_KEY_DOWN:
46 		case B_KEY_UP:
47 		{
48 msg->PrintToStream();
49 			const char *string;
50 			if (msg->FindString("bytes", &string) == B_OK) {
51 				while (*string != 0) {
52 					if (*string < '0' || *string > '9') {
53 
54 						if (*string != '-') {
55 							result = B_SKIP_MESSAGE;
56 						}
57 					}
58 					string++;
59 				}
60 			}
61 			break;
62 		}
63 		default:
64 			break;
65 	}
66 	/*
67 	if (fWindow) {
68 		if (BView* view = dynamic_cast<BView*>(*target)) {
69 			BPoint point;
70 			if (message->FindPoint("where", &point) == B_OK) {
71 				if (!fWindow->Frame().Contains(view->ConvertToScreen(point)))
72 					*target = fWindow;
73 			}
74 		}
75 	}*/
76 	return result;
77 }
78 
79 // constructor
80 InputSlider::InputSlider(const char* name, const char* label,
81 						 BMessage* model, BHandler* target,
82 						 int32 min, int32 max, int32 value,
83 						 const char* formatString)
84 	: PopupSlider(name, label, model, target, min, max, value, formatString),
85 	  fTextView(new NummericalTextView(BRect(0, 0 , 20, 20),
86 	  								   "input",
87 	  								   BRect(5, 5, 15, 15),
88 	  								   B_FOLLOW_NONE,
89 	  								   B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE))
90 	  //fTextViewFilter(dynamic_cast<BMessageFilter*>(new NumericInputFilter(this)))
91 {
92 	// prepare fTextView
93 	fTextView->SetWordWrap(false);
94 	fTextView->SetViewColor(255,255,255,0);
95 	fTextView->SetValue(Value());
96 	//fTextView->AddFilter(fTextViewFilter);
97 	AddChild(fTextView);
98 }
99 
100 // destructor
101 InputSlider::~InputSlider()
102 {
103 	//delete fTextViewFilter;
104 }
105 
106 // layout
107 BRect
108 InputSlider::layout(BRect frame)
109 {
110 	PopupSlider::layout(frame);
111 
112 	frame = SliderFrame();
113 
114 	frame.right -= 10.0;
115 	frame.InsetBy(2, 2);
116 
117 	fTextView->MoveTo(frame.LeftTop());
118 	fTextView->ResizeTo(frame.Width(), frame.Height());
119 
120 	BRect textRect(fTextView->Bounds());
121 	textRect.InsetBy(1, 1);
122 	fTextView->SetTextRect(textRect);
123 
124 	fTextView->SetAlignment(B_ALIGN_CENTER);
125 
126 	return Frame();
127 }
128 
129 // MouseDown
130 void
131 InputSlider::MouseDown(BPoint where)
132 {
133 	if (fTextView->Frame().Contains(where))
134 		return;
135 
136 	fTextView->MakeFocus(true);
137 
138 	if (SliderFrame().Contains(where)) {
139 		SetValue(fTextView->IntValue());
140 		PopupSlider::MouseDown(where);
141 	}
142 }
143 
144 // SetEnabled
145 void
146 InputSlider::SetEnabled(bool enable)
147 {
148 	PopupSlider::SetEnabled(enable);
149 
150 //	fTextView->SetEnabled(enable);
151 }
152 
153 // ValueChanged
154 void
155 InputSlider::ValueChanged(int32 newValue)
156 {
157 	PopupSlider::ValueChanged(newValue);
158 
159 	// change fTextView's value
160 	if (LockLooper()) {
161 		fTextView->SetValue(Value());
162 		UnlockLooper();
163 	}
164 }
165 
166 // DrawSlider
167 void
168 InputSlider::DrawSlider(BRect frame, bool enabled)
169 {
170 	rgb_color background = ui_color(B_PANEL_BACKGROUND_COLOR);
171 	rgb_color lightShadow;
172 	rgb_color midShadow;
173 	rgb_color darkShadow;
174 	rgb_color light;
175 	if (enabled) {
176 		lightShadow = tint_color(background, B_DARKEN_1_TINT);
177 		midShadow = tint_color(background, B_DARKEN_2_TINT);
178 		darkShadow = tint_color(background, B_DARKEN_4_TINT);
179 		light = tint_color(background, B_LIGHTEN_MAX_TINT);
180 	} else {
181 		lightShadow = background;
182 		midShadow = tint_color(background, B_DARKEN_1_TINT);
183 		darkShadow = tint_color(background, B_DARKEN_2_TINT);
184 		light = tint_color(background, B_LIGHTEN_1_TINT);
185 	}
186 
187 	// frame around text view
188 	BRect r(frame);
189 	BeginLineArray(16);
190 		AddLine(BPoint(r.left, r.bottom),
191 				BPoint(r.left, r.top), lightShadow);
192 		AddLine(BPoint(r.left + 1.0, r.top),
193 				BPoint(r.right, r.top), lightShadow);
194 		AddLine(BPoint(r.right, r.top + 1.0),
195 				BPoint(r.right, r.bottom), light);
196 		AddLine(BPoint(r.right - 1.0, r.bottom),
197 				BPoint(r.left + 1.0, r.bottom), light);
198 
199 		r = fTextView->Frame().InsetByCopy(-1, -1);
200 
201 		AddLine(BPoint(r.left, r.bottom),
202 				BPoint(r.left, r.top), darkShadow);
203 		AddLine(BPoint(r.left + 1.0, r.top),
204 				BPoint(r.right, r.top), darkShadow);
205 		AddLine(BPoint(r.right, r.top + 1.0),
206 				BPoint(r.right, r.bottom), background);
207 		AddLine(BPoint(r.right - 1.0, r.bottom),
208 				BPoint(r.left + 1.0, r.bottom), background);
209 
210 		r.left = r.right + 1;
211 		r.right = frame.right - 1;
212 
213 		AddLine(BPoint(r.left, r.bottom),
214 				BPoint(r.left, r.top + 1.0), midShadow);
215 		AddLine(BPoint(r.left, r.top),
216 				BPoint(r.right, r.top), darkShadow);
217 		AddLine(BPoint(r.right, r.top + 1.0),
218 				BPoint(r.right, r.bottom), midShadow);
219 		AddLine(BPoint(r.right - 1.0, r.bottom),
220 				BPoint(r.left + 1.0, r.bottom), midShadow);
221 
222 		r.InsetBy(1, 1);
223 
224 		AddLine(BPoint(r.left, r.bottom),
225 				BPoint(r.left, r.top), light);
226 		AddLine(BPoint(r.left + 1.0, r.top),
227 				BPoint(r.right, r.top), light);
228 		AddLine(BPoint(r.right, r.top + 1.0),
229 				BPoint(r.right, r.bottom), lightShadow);
230 		AddLine(BPoint(r.right - 1.0, r.bottom),
231 				BPoint(r.left + 1.0, r.bottom), lightShadow);
232 	EndLineArray();
233 
234 	r.InsetBy(1, 1);
235 	SetLowColor(background);
236 	FillRect(r, B_SOLID_LOW);
237 }
238 
239