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