xref: /haiku/src/apps/mediaplayer/interface/VolumeSlider.cpp (revision 0fc56ed57bdd5d2d44f33edd17d94210704613bd)
1*0fc56ed5SStephan Aßmus /*
2*0fc56ed5SStephan Aßmus  * Copyright 2006, Haiku.
3*0fc56ed5SStephan Aßmus  * Distributed under the terms of the MIT License.
4*0fc56ed5SStephan Aßmus  *
5*0fc56ed5SStephan Aßmus  * Authors:
6*0fc56ed5SStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
7*0fc56ed5SStephan Aßmus  */
8*0fc56ed5SStephan Aßmus 
9*0fc56ed5SStephan Aßmus // NOTE: Based on my code in the BeOS interface for the VLC media player
10*0fc56ed5SStephan Aßmus // that I did during the VLC 0.4.3 - 0.4.6 times. Code not done by me
11*0fc56ed5SStephan Aßmus // removed. -Stephan Aßmus
12*0fc56ed5SStephan Aßmus 
13*0fc56ed5SStephan Aßmus #include "VolumeSlider.h"
14*0fc56ed5SStephan Aßmus 
15*0fc56ed5SStephan Aßmus #include "ButtonBitmaps.h"
16*0fc56ed5SStephan Aßmus #include "DrawingTidbits.h"
17*0fc56ed5SStephan Aßmus 
18*0fc56ed5SStephan Aßmus #include <Bitmap.h>
19*0fc56ed5SStephan Aßmus #include <Screen.h>
20*0fc56ed5SStephan Aßmus 
21*0fc56ed5SStephan Aßmus #include <stdio.h>
22*0fc56ed5SStephan Aßmus #include <string.h>
23*0fc56ed5SStephan Aßmus 
24*0fc56ed5SStephan Aßmus 
25*0fc56ed5SStephan Aßmus // slider colors are hardcoded here, because that's just
26*0fc56ed5SStephan Aßmus // what they currently are within those bitmaps
27*0fc56ed5SStephan Aßmus const rgb_color kGreen = (rgb_color){ 152, 203, 152, 255 };
28*0fc56ed5SStephan Aßmus const rgb_color kGreenShadow = (rgb_color){ 102, 152, 102, 255 };
29*0fc56ed5SStephan Aßmus const rgb_color kBackground = (rgb_color){ 216, 216, 216, 255 };
30*0fc56ed5SStephan Aßmus const rgb_color kSeekGreen = (rgb_color){ 171, 221, 161, 255 };
31*0fc56ed5SStephan Aßmus const rgb_color kSeekGreenShadow = (rgb_color){ 144, 186, 136, 255 };
32*0fc56ed5SStephan Aßmus const rgb_color kSeekRed = (rgb_color){ 255, 0, 0, 255 };
33*0fc56ed5SStephan Aßmus const rgb_color kSeekRedLight = (rgb_color){ 255, 152, 152, 255 };
34*0fc56ed5SStephan Aßmus const rgb_color kSeekRedShadow = (rgb_color){ 178, 0, 0, 255 };
35*0fc56ed5SStephan Aßmus 
36*0fc56ed5SStephan Aßmus #define DIM_LEVEL 0.4
37*0fc56ed5SStephan Aßmus 
38*0fc56ed5SStephan Aßmus // constructor
39*0fc56ed5SStephan Aßmus VolumeSlider::VolumeSlider(BRect frame, const char* name,
40*0fc56ed5SStephan Aßmus 						   int32 minValue, int32 maxValue,
41*0fc56ed5SStephan Aßmus 						   BMessage* message, BHandler* target)
42*0fc56ed5SStephan Aßmus 	: BControl(frame, name, NULL, message, B_FOLLOW_LEFT | B_FOLLOW_TOP,
43*0fc56ed5SStephan Aßmus 			   B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE),
44*0fc56ed5SStephan Aßmus 	  fLeftSideBits(NULL),
45*0fc56ed5SStephan Aßmus 	  fRightSideBits(NULL),
46*0fc56ed5SStephan Aßmus 	  fKnobBits(NULL),
47*0fc56ed5SStephan Aßmus 	  fTracking(false),
48*0fc56ed5SStephan Aßmus 	  fMuted(false),
49*0fc56ed5SStephan Aßmus 	  fMinValue(minValue),
50*0fc56ed5SStephan Aßmus 	  fMaxValue(maxValue)
51*0fc56ed5SStephan Aßmus {
52*0fc56ed5SStephan Aßmus 	SetTarget(target);
53*0fc56ed5SStephan Aßmus 
54*0fc56ed5SStephan Aßmus 	// create bitmaps
55*0fc56ed5SStephan Aßmus 	BRect r(0.0, 0.0,
56*0fc56ed5SStephan Aßmus 			kVolumeSliderBitmapWidth - 1, kVolumeSliderBitmapHeight - 1);
57*0fc56ed5SStephan Aßmus 	fLeftSideBits = new BBitmap(r, B_CMAP8);
58*0fc56ed5SStephan Aßmus 	fRightSideBits = new BBitmap(r, B_CMAP8);
59*0fc56ed5SStephan Aßmus 	r.Set(0.0, 0.0,
60*0fc56ed5SStephan Aßmus 		  kVolumeSliderKnobWidth - 1, kVolumeSliderKnobHeight - 1);
61*0fc56ed5SStephan Aßmus 	fKnobBits = new BBitmap(r, B_CMAP8);
62*0fc56ed5SStephan Aßmus 
63*0fc56ed5SStephan Aßmus 	_MakeBitmaps();
64*0fc56ed5SStephan Aßmus }
65*0fc56ed5SStephan Aßmus 
66*0fc56ed5SStephan Aßmus // destructor
67*0fc56ed5SStephan Aßmus VolumeSlider::~VolumeSlider()
68*0fc56ed5SStephan Aßmus {
69*0fc56ed5SStephan Aßmus 	delete fLeftSideBits;
70*0fc56ed5SStephan Aßmus 	delete fRightSideBits;
71*0fc56ed5SStephan Aßmus 	delete fKnobBits;
72*0fc56ed5SStephan Aßmus }
73*0fc56ed5SStephan Aßmus 
74*0fc56ed5SStephan Aßmus // AttachedToWindow
75*0fc56ed5SStephan Aßmus void
76*0fc56ed5SStephan Aßmus VolumeSlider::AttachedToWindow()
77*0fc56ed5SStephan Aßmus {
78*0fc56ed5SStephan Aßmus 	BControl::AttachedToWindow();
79*0fc56ed5SStephan Aßmus 	SetViewColor(B_TRANSPARENT_COLOR);
80*0fc56ed5SStephan Aßmus }
81*0fc56ed5SStephan Aßmus 
82*0fc56ed5SStephan Aßmus // SetValue
83*0fc56ed5SStephan Aßmus void
84*0fc56ed5SStephan Aßmus VolumeSlider::SetValue(int32 value)
85*0fc56ed5SStephan Aßmus {
86*0fc56ed5SStephan Aßmus 	if (value == Value())
87*0fc56ed5SStephan Aßmus 		return;
88*0fc56ed5SStephan Aßmus 
89*0fc56ed5SStephan Aßmus 	BControl::SetValue(value);
90*0fc56ed5SStephan Aßmus 	Invoke();
91*0fc56ed5SStephan Aßmus }
92*0fc56ed5SStephan Aßmus 
93*0fc56ed5SStephan Aßmus // SetValueNoInvoke
94*0fc56ed5SStephan Aßmus void
95*0fc56ed5SStephan Aßmus VolumeSlider::SetValueNoInvoke(int32 value)
96*0fc56ed5SStephan Aßmus {
97*0fc56ed5SStephan Aßmus 	if (value == Value())
98*0fc56ed5SStephan Aßmus 		return;
99*0fc56ed5SStephan Aßmus 
100*0fc56ed5SStephan Aßmus 	BControl::SetValue(value);
101*0fc56ed5SStephan Aßmus }
102*0fc56ed5SStephan Aßmus 
103*0fc56ed5SStephan Aßmus // SetEnabled
104*0fc56ed5SStephan Aßmus void
105*0fc56ed5SStephan Aßmus VolumeSlider::SetEnabled(bool enable)
106*0fc56ed5SStephan Aßmus {
107*0fc56ed5SStephan Aßmus 	if (enable == IsEnabled())
108*0fc56ed5SStephan Aßmus 		return;
109*0fc56ed5SStephan Aßmus 
110*0fc56ed5SStephan Aßmus 	BControl::SetEnabled(enable);
111*0fc56ed5SStephan Aßmus 
112*0fc56ed5SStephan Aßmus 	_MakeBitmaps();
113*0fc56ed5SStephan Aßmus 	Invalidate();
114*0fc56ed5SStephan Aßmus }
115*0fc56ed5SStephan Aßmus 
116*0fc56ed5SStephan Aßmus // Draw
117*0fc56ed5SStephan Aßmus void
118*0fc56ed5SStephan Aßmus VolumeSlider::Draw(BRect updateRect)
119*0fc56ed5SStephan Aßmus {
120*0fc56ed5SStephan Aßmus 	if (!IsValid()) {
121*0fc56ed5SStephan Aßmus 		fprintf(stderr, "VolumeSlider::Draw() - Error: no valid bitmaps!");
122*0fc56ed5SStephan Aßmus 		SetHighColor(255, 0, 0);
123*0fc56ed5SStephan Aßmus 		FillRect(updateRect);
124*0fc56ed5SStephan Aßmus 		return;
125*0fc56ed5SStephan Aßmus 	}
126*0fc56ed5SStephan Aßmus 
127*0fc56ed5SStephan Aßmus 	BRect r(Bounds());
128*0fc56ed5SStephan Aßmus 	float sliderSideWidth = kVolumeSliderBitmapWidth;
129*0fc56ed5SStephan Aßmus 	float sliderStart = (r.left + sliderSideWidth);
130*0fc56ed5SStephan Aßmus 	float sliderEnd = (r.right - sliderSideWidth);
131*0fc56ed5SStephan Aßmus 	float knobPos = sliderStart
132*0fc56ed5SStephan Aßmus 					+ (sliderEnd - sliderStart - 1.0) * (Value() - fMinValue)
133*0fc56ed5SStephan Aßmus 					/ (fMaxValue - fMinValue);
134*0fc56ed5SStephan Aßmus 	// draw both sides (the original from Be doesn't seem
135*0fc56ed5SStephan Aßmus 	// to make a difference for enabled/disabled state)
136*0fc56ed5SStephan Aßmus 	DrawBitmapAsync(fLeftSideBits, r.LeftTop());
137*0fc56ed5SStephan Aßmus 	DrawBitmapAsync(fRightSideBits, BPoint(sliderEnd + 1.0, r.top));
138*0fc56ed5SStephan Aßmus 	// colors for the slider area between the two bitmaps
139*0fc56ed5SStephan Aßmus 	rgb_color background = kBackground;//ui_color(B_PANEL_BACKGROUND_COLOR);
140*0fc56ed5SStephan Aßmus 	rgb_color shadow = tint_color(background, B_DARKEN_2_TINT);
141*0fc56ed5SStephan Aßmus 	rgb_color softShadow = tint_color(background, B_DARKEN_1_TINT);
142*0fc56ed5SStephan Aßmus 	rgb_color darkShadow = tint_color(background, B_DARKEN_4_TINT);
143*0fc56ed5SStephan Aßmus 	rgb_color midShadow = tint_color(background, B_DARKEN_3_TINT);
144*0fc56ed5SStephan Aßmus 	rgb_color light = tint_color(background, B_LIGHTEN_MAX_TINT);
145*0fc56ed5SStephan Aßmus 	rgb_color softLight = tint_color(background, B_LIGHTEN_1_TINT);
146*0fc56ed5SStephan Aßmus 	rgb_color green = kGreen;
147*0fc56ed5SStephan Aßmus 	rgb_color greenShadow = kGreenShadow;
148*0fc56ed5SStephan Aßmus 	rgb_color black = kBlack;
149*0fc56ed5SStephan Aßmus 	rgb_color dotGrey = midShadow;
150*0fc56ed5SStephan Aßmus 	rgb_color dotGreen = greenShadow;
151*0fc56ed5SStephan Aßmus 	// make dimmed version of colors if we're disabled
152*0fc56ed5SStephan Aßmus 	if (!IsEnabled()) {
153*0fc56ed5SStephan Aßmus 		shadow = (rgb_color){ 200, 200, 200, 255 };
154*0fc56ed5SStephan Aßmus 		softShadow = dimmed_color_cmap8(softShadow, background, DIM_LEVEL);
155*0fc56ed5SStephan Aßmus 		darkShadow = dimmed_color_cmap8(darkShadow, background, DIM_LEVEL);
156*0fc56ed5SStephan Aßmus 		midShadow = shadow;
157*0fc56ed5SStephan Aßmus 		light = dimmed_color_cmap8(light, background, DIM_LEVEL);
158*0fc56ed5SStephan Aßmus 		softLight = dimmed_color_cmap8(softLight, background, DIM_LEVEL);
159*0fc56ed5SStephan Aßmus 		green = dimmed_color_cmap8(green, background, DIM_LEVEL);
160*0fc56ed5SStephan Aßmus 		greenShadow = dimmed_color_cmap8(greenShadow, background, DIM_LEVEL);
161*0fc56ed5SStephan Aßmus 		black = dimmed_color_cmap8(black, background, DIM_LEVEL);
162*0fc56ed5SStephan Aßmus 		dotGreen = dotGrey;
163*0fc56ed5SStephan Aßmus 	} else if (fMuted) {
164*0fc56ed5SStephan Aßmus 		green = tint_color(kBackground, B_DARKEN_3_TINT);
165*0fc56ed5SStephan Aßmus 		greenShadow = tint_color(kBackground, B_DARKEN_4_TINT);
166*0fc56ed5SStephan Aßmus 		dotGreen = greenShadow;
167*0fc56ed5SStephan Aßmus 	}
168*0fc56ed5SStephan Aßmus 	// draw slider edges between bitmaps
169*0fc56ed5SStephan Aßmus 	BeginLineArray(7);
170*0fc56ed5SStephan Aßmus 		AddLine(BPoint(sliderStart, r.top),
171*0fc56ed5SStephan Aßmus 				BPoint(sliderEnd, r.top), softShadow);
172*0fc56ed5SStephan Aßmus 		AddLine(BPoint(sliderStart, r.bottom),
173*0fc56ed5SStephan Aßmus 				BPoint(sliderEnd, r.bottom), softLight);
174*0fc56ed5SStephan Aßmus 		r.InsetBy(0.0, 1.0);
175*0fc56ed5SStephan Aßmus 		AddLine(BPoint(sliderStart, r.top),
176*0fc56ed5SStephan Aßmus 				BPoint(sliderEnd, r.top), black);
177*0fc56ed5SStephan Aßmus 		AddLine(BPoint(sliderStart, r.bottom),
178*0fc56ed5SStephan Aßmus 				BPoint(sliderEnd, r.bottom), light);
179*0fc56ed5SStephan Aßmus 		r.top++;
180*0fc56ed5SStephan Aßmus 		AddLine(BPoint(sliderStart, r.top),
181*0fc56ed5SStephan Aßmus 				BPoint(knobPos, r.top), greenShadow);
182*0fc56ed5SStephan Aßmus 		AddLine(BPoint(knobPos, r.top),
183*0fc56ed5SStephan Aßmus 				BPoint(sliderEnd, r.top), midShadow);
184*0fc56ed5SStephan Aßmus 		r.top++;
185*0fc56ed5SStephan Aßmus 		AddLine(BPoint(sliderStart, r.top),
186*0fc56ed5SStephan Aßmus 				BPoint(knobPos, r.top), greenShadow);
187*0fc56ed5SStephan Aßmus 	EndLineArray();
188*0fc56ed5SStephan Aßmus 	// fill rest inside of slider
189*0fc56ed5SStephan Aßmus 	r.InsetBy(0.0, 1.0);
190*0fc56ed5SStephan Aßmus 	r.left = sliderStart;
191*0fc56ed5SStephan Aßmus 	r.right = knobPos;
192*0fc56ed5SStephan Aßmus 	SetHighColor(green);
193*0fc56ed5SStephan Aßmus 	FillRect(r, B_SOLID_HIGH);
194*0fc56ed5SStephan Aßmus 	r.left = knobPos + 1.0;
195*0fc56ed5SStephan Aßmus 	r.right = sliderEnd;
196*0fc56ed5SStephan Aßmus 	r.top -= 1.0;
197*0fc56ed5SStephan Aßmus 	SetHighColor(shadow);
198*0fc56ed5SStephan Aßmus 	FillRect(r, B_SOLID_HIGH);
199*0fc56ed5SStephan Aßmus 	// draw little dots inside
200*0fc56ed5SStephan Aßmus 	int32 dotCount = (int32)((sliderEnd - sliderStart) / 5.0);
201*0fc56ed5SStephan Aßmus 	BPoint dotPos;
202*0fc56ed5SStephan Aßmus 	dotPos.y = r.top + 4.0;
203*0fc56ed5SStephan Aßmus 	for (int32 i = 0; i < dotCount; i++) {
204*0fc56ed5SStephan Aßmus 		dotPos.x = sliderStart + i * 5.0 + 4.0;
205*0fc56ed5SStephan Aßmus 		SetHighColor(dotPos.x < knobPos ? dotGreen : dotGrey);
206*0fc56ed5SStephan Aßmus 		StrokeLine(dotPos, BPoint(dotPos.x, dotPos.y + 1.0));
207*0fc56ed5SStephan Aßmus 	}
208*0fc56ed5SStephan Aßmus 	// draw knob
209*0fc56ed5SStephan Aßmus 	r.top -= 1.0;
210*0fc56ed5SStephan Aßmus 	SetDrawingMode(B_OP_OVER); // part of knob is transparent
211*0fc56ed5SStephan Aßmus 	DrawBitmapAsync(fKnobBits, BPoint(knobPos - kVolumeSliderKnobWidth / 2, r.top));
212*0fc56ed5SStephan Aßmus }
213*0fc56ed5SStephan Aßmus 
214*0fc56ed5SStephan Aßmus // MouseDown
215*0fc56ed5SStephan Aßmus void
216*0fc56ed5SStephan Aßmus VolumeSlider::MouseDown(BPoint where)
217*0fc56ed5SStephan Aßmus {
218*0fc56ed5SStephan Aßmus 	if (Bounds().Contains(where) && IsEnabled()) {
219*0fc56ed5SStephan Aßmus 		fTracking = true;
220*0fc56ed5SStephan Aßmus 		SetValue(_ValueFor(where.x));
221*0fc56ed5SStephan Aßmus 		SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS);
222*0fc56ed5SStephan Aßmus 	}
223*0fc56ed5SStephan Aßmus }
224*0fc56ed5SStephan Aßmus 
225*0fc56ed5SStephan Aßmus // MouseMoved
226*0fc56ed5SStephan Aßmus void
227*0fc56ed5SStephan Aßmus VolumeSlider::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage)
228*0fc56ed5SStephan Aßmus {
229*0fc56ed5SStephan Aßmus 	if (fTracking)
230*0fc56ed5SStephan Aßmus 		SetValue(_ValueFor(where.x));
231*0fc56ed5SStephan Aßmus }
232*0fc56ed5SStephan Aßmus 
233*0fc56ed5SStephan Aßmus // MouseUp
234*0fc56ed5SStephan Aßmus void
235*0fc56ed5SStephan Aßmus VolumeSlider::MouseUp(BPoint where)
236*0fc56ed5SStephan Aßmus {
237*0fc56ed5SStephan Aßmus 	fTracking = false;
238*0fc56ed5SStephan Aßmus }
239*0fc56ed5SStephan Aßmus 
240*0fc56ed5SStephan Aßmus // IsValid
241*0fc56ed5SStephan Aßmus bool
242*0fc56ed5SStephan Aßmus VolumeSlider::IsValid() const
243*0fc56ed5SStephan Aßmus {
244*0fc56ed5SStephan Aßmus 	return (fLeftSideBits && fLeftSideBits->IsValid()
245*0fc56ed5SStephan Aßmus 			&& fRightSideBits && fRightSideBits->IsValid()
246*0fc56ed5SStephan Aßmus 			&& fKnobBits && fKnobBits->IsValid());
247*0fc56ed5SStephan Aßmus }
248*0fc56ed5SStephan Aßmus 
249*0fc56ed5SStephan Aßmus // SetMuted
250*0fc56ed5SStephan Aßmus void
251*0fc56ed5SStephan Aßmus VolumeSlider::SetMuted(bool mute)
252*0fc56ed5SStephan Aßmus {
253*0fc56ed5SStephan Aßmus 	if (mute == fMuted)
254*0fc56ed5SStephan Aßmus 		return;
255*0fc56ed5SStephan Aßmus 
256*0fc56ed5SStephan Aßmus 	fMuted = mute;
257*0fc56ed5SStephan Aßmus 	_MakeBitmaps();
258*0fc56ed5SStephan Aßmus 	Invalidate();
259*0fc56ed5SStephan Aßmus }
260*0fc56ed5SStephan Aßmus 
261*0fc56ed5SStephan Aßmus // _MakeBitmaps
262*0fc56ed5SStephan Aßmus void
263*0fc56ed5SStephan Aßmus VolumeSlider::_MakeBitmaps()
264*0fc56ed5SStephan Aßmus {
265*0fc56ed5SStephan Aßmus 	if (!IsValid())
266*0fc56ed5SStephan Aßmus 		return;
267*0fc56ed5SStephan Aßmus 
268*0fc56ed5SStephan Aßmus 	// left side of slider
269*0fc56ed5SStephan Aßmus 	memcpy(fLeftSideBits->Bits(), kVolumeSliderLeftBitmapBits,
270*0fc56ed5SStephan Aßmus 		   fLeftSideBits->BitsLength());
271*0fc56ed5SStephan Aßmus 	// right side of slider
272*0fc56ed5SStephan Aßmus 	memcpy(fRightSideBits->Bits(), kVolumeSliderRightBits,
273*0fc56ed5SStephan Aßmus 		   fRightSideBits->BitsLength());
274*0fc56ed5SStephan Aßmus 	// slider knob
275*0fc56ed5SStephan Aßmus 	int32 length = fKnobBits->BitsLength();
276*0fc56ed5SStephan Aßmus 	memcpy(fKnobBits->Bits(), kVolumeSliderKnobBits, length);
277*0fc56ed5SStephan Aßmus 	uint8* bits = (uint8*)fKnobBits->Bits();
278*0fc56ed5SStephan Aßmus 	// black was used in the knob to represent transparency
279*0fc56ed5SStephan Aßmus 	// use screen to get index for the "transarent" color used in the bitmap
280*0fc56ed5SStephan Aßmus 	BScreen screen(B_MAIN_SCREEN_ID);
281*0fc56ed5SStephan Aßmus 	uint8 blackIndex = screen.IndexForColor(kBlack);
282*0fc56ed5SStephan Aßmus 	// replace black index with transparent index
283*0fc56ed5SStephan Aßmus 	for (int32 i = 0; i < length; i++)
284*0fc56ed5SStephan Aßmus 		if (bits[i] == blackIndex)
285*0fc56ed5SStephan Aßmus 			bits[i] = B_TRANSPARENT_MAGIC_CMAP8;
286*0fc56ed5SStephan Aßmus 
287*0fc56ed5SStephan Aßmus 	if (!IsEnabled()) {
288*0fc56ed5SStephan Aßmus 		// make ghosted versions of the bitmaps
289*0fc56ed5SStephan Aßmus 		dim_bitmap(fLeftSideBits, kBackground, DIM_LEVEL);
290*0fc56ed5SStephan Aßmus 		dim_bitmap(fRightSideBits, kBackground, DIM_LEVEL);
291*0fc56ed5SStephan Aßmus 		dim_bitmap(fKnobBits, kBackground, DIM_LEVEL);
292*0fc56ed5SStephan Aßmus 	} else if (fMuted) {
293*0fc56ed5SStephan Aßmus 		// replace green color (and shadow) in left slider side
294*0fc56ed5SStephan Aßmus 		bits = (uint8*)fLeftSideBits->Bits();
295*0fc56ed5SStephan Aßmus 		length = fLeftSideBits->BitsLength();
296*0fc56ed5SStephan Aßmus 		uint8 greenIndex = screen.IndexForColor(kGreen);
297*0fc56ed5SStephan Aßmus 		uint8 greenShadowIndex = screen.IndexForColor(kGreenShadow);
298*0fc56ed5SStephan Aßmus 		rgb_color shadow = tint_color(kBackground, B_DARKEN_3_TINT);
299*0fc56ed5SStephan Aßmus 		rgb_color midShadow = tint_color(kBackground, B_DARKEN_4_TINT);
300*0fc56ed5SStephan Aßmus 		uint8 replaceIndex = screen.IndexForColor(shadow);
301*0fc56ed5SStephan Aßmus 		uint8 replaceShadowIndex = screen.IndexForColor(midShadow);
302*0fc56ed5SStephan Aßmus 		for (int32 i = 0; i < length; i++) {
303*0fc56ed5SStephan Aßmus 			if (bits[i] == greenIndex)
304*0fc56ed5SStephan Aßmus 				bits[i] = replaceIndex;
305*0fc56ed5SStephan Aßmus 			else if (bits[i] == greenShadowIndex)
306*0fc56ed5SStephan Aßmus 				bits[i] = replaceShadowIndex;
307*0fc56ed5SStephan Aßmus 		}
308*0fc56ed5SStephan Aßmus 	}
309*0fc56ed5SStephan Aßmus }
310*0fc56ed5SStephan Aßmus 
311*0fc56ed5SStephan Aßmus // _ValueFor
312*0fc56ed5SStephan Aßmus int32
313*0fc56ed5SStephan Aßmus VolumeSlider::_ValueFor(float xPos) const
314*0fc56ed5SStephan Aßmus {
315*0fc56ed5SStephan Aßmus 	BRect r(Bounds());
316*0fc56ed5SStephan Aßmus 	float sliderStart = (r.left + kVolumeSliderBitmapWidth);
317*0fc56ed5SStephan Aßmus 	float sliderEnd = (r.right - kVolumeSliderBitmapWidth);
318*0fc56ed5SStephan Aßmus 	int32 value = fMinValue + (int32)(((xPos - sliderStart)
319*0fc56ed5SStephan Aßmus 				  * (fMaxValue - fMinValue))
320*0fc56ed5SStephan Aßmus 				  / (sliderEnd - sliderStart - 1.0));
321*0fc56ed5SStephan Aßmus 	if (value < fMinValue)
322*0fc56ed5SStephan Aßmus 		value = fMinValue;
323*0fc56ed5SStephan Aßmus 	if (value > fMaxValue)
324*0fc56ed5SStephan Aßmus 		value = fMaxValue;
325*0fc56ed5SStephan Aßmus 	return value;
326*0fc56ed5SStephan Aßmus }
327*0fc56ed5SStephan Aßmus 
328