10fc56ed5SStephan Aßmus /* 2b000c602SStephan Aßmus * Copyright 2006-2010 Stephan Aßmus <superstippi@gmx.de> 39282400fSStephan Aßmus * All rights reserved. Distributed under the terms of the MIT License. 40fc56ed5SStephan Aßmus */ 50fc56ed5SStephan Aßmus 60fc56ed5SStephan Aßmus 70fc56ed5SStephan Aßmus #include "SeekSlider.h" 80fc56ed5SStephan Aßmus 90fc56ed5SStephan Aßmus #include <stdio.h> 100fc56ed5SStephan Aßmus #include <string.h> 110fc56ed5SStephan Aßmus 12b000c602SStephan Aßmus #include <ControlLook.h> 13b000c602SStephan Aßmus #include <Region.h> 14b000c602SStephan Aßmus #include <Shape.h> 15b000c602SStephan Aßmus 160fc56ed5SStephan Aßmus 17*fd5c3422SStephan Aßmus static const rgb_color kThumbRed = (rgb_color){ 255, 52, 52, 255 }; 180fc56ed5SStephan Aßmus 190fc56ed5SStephan Aßmus 20b000c602SStephan Aßmus SeekSlider::SeekSlider(const char* name, BMessage* message, int32 minValue, 21b000c602SStephan Aßmus int32 maxValue) 22e663610eSStephan Aßmus : 23b000c602SStephan Aßmus BSlider(name, NULL, NULL, minValue, maxValue, B_HORIZONTAL, 24b000c602SStephan Aßmus B_TRIANGLE_THUMB), 25e663610eSStephan Aßmus fTracking(false), 26e663610eSStephan Aßmus fLastTrackTime(0), 27*fd5c3422SStephan Aßmus fDisabledString(""), 28341ea11eSStephan Aßmus fScale(0.0f) 290fc56ed5SStephan Aßmus { 300fc56ed5SStephan Aßmus BFont font(be_plain_font); 310fc56ed5SStephan Aßmus font.SetSize(9.0); 320fc56ed5SStephan Aßmus SetFont(&font); 33341ea11eSStephan Aßmus SetSymbolScale(1.0); 34b000c602SStephan Aßmus rgb_color fillColor = tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 35b000c602SStephan Aßmus B_DARKEN_3_TINT); 36b000c602SStephan Aßmus UseFillColor(true, &fillColor); 37b000c602SStephan Aßmus SetModificationMessage(message); 380fc56ed5SStephan Aßmus } 390fc56ed5SStephan Aßmus 400fc56ed5SStephan Aßmus 410fc56ed5SStephan Aßmus SeekSlider::~SeekSlider() 420fc56ed5SStephan Aßmus { 430fc56ed5SStephan Aßmus } 440fc56ed5SStephan Aßmus 450fc56ed5SStephan Aßmus 46b000c602SStephan Aßmus status_t 47b000c602SStephan Aßmus SeekSlider::Invoke(BMessage* message) 480fc56ed5SStephan Aßmus { 49b000c602SStephan Aßmus fLastTrackTime = system_time(); 50b000c602SStephan Aßmus return BSlider::Invoke(message); 510fc56ed5SStephan Aßmus } 520fc56ed5SStephan Aßmus 530fc56ed5SStephan Aßmus 54341ea11eSStephan Aßmus BRect 55341ea11eSStephan Aßmus SeekSlider::ThumbFrame() const 56341ea11eSStephan Aßmus { 57341ea11eSStephan Aßmus BRect frame = BSlider::ThumbFrame(); 58341ea11eSStephan Aßmus 59341ea11eSStephan Aßmus float center = (frame.left + frame.right) / 2.0f; 60341ea11eSStephan Aßmus float height = ceilf(frame.Height() * fScale); 61341ea11eSStephan Aßmus float width = ceilf(frame.Width() * fScale); 62341ea11eSStephan Aßmus 63341ea11eSStephan Aßmus frame.left = floorf(center - width / 2) + 1; 64341ea11eSStephan Aßmus frame.right = frame.left + width; 65341ea11eSStephan Aßmus frame.bottom = frame.top + height; 66341ea11eSStephan Aßmus 67341ea11eSStephan Aßmus return frame; 68341ea11eSStephan Aßmus } 69341ea11eSStephan Aßmus 70341ea11eSStephan Aßmus 710fc56ed5SStephan Aßmus void 72b000c602SStephan Aßmus SeekSlider::DrawBar() 730fc56ed5SStephan Aßmus { 74b000c602SStephan Aßmus BSlider::DrawBar(); 75b000c602SStephan Aßmus if (IsEnabled()) 760fc56ed5SStephan Aßmus return; 770fc56ed5SStephan Aßmus 78b000c602SStephan Aßmus BRect r(BarFrame()); 79b000c602SStephan Aßmus font_height fh; 80b000c602SStephan Aßmus GetFontHeight(&fh); 81b000c602SStephan Aßmus float width = ceilf(StringWidth(fDisabledString.String())); 82b000c602SStephan Aßmus BPoint textPos; 83b000c602SStephan Aßmus textPos.x = r.left + (r.Width() - width) / 2.0; 84b000c602SStephan Aßmus textPos.y = (r.top + r.bottom - ceilf(fh.ascent + fh.descent)) / 2.0 85b000c602SStephan Aßmus + ceilf(fh.ascent); 860fc56ed5SStephan Aßmus 87b000c602SStephan Aßmus SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 88b000c602SStephan Aßmus B_DARKEN_3_TINT)); 89b000c602SStephan Aßmus SetDrawingMode(B_OP_OVER); 90b000c602SStephan Aßmus DrawString(fDisabledString.String(), textPos); 910fc56ed5SStephan Aßmus } 920fc56ed5SStephan Aßmus 930fc56ed5SStephan Aßmus 940fc56ed5SStephan Aßmus void 95b000c602SStephan Aßmus SeekSlider::DrawThumb() 960fc56ed5SStephan Aßmus { 97b000c602SStephan Aßmus if (!IsEnabled()) 98b000c602SStephan Aßmus return; 990fc56ed5SStephan Aßmus 100b000c602SStephan Aßmus BRect frame = ThumbFrame(); 101b000c602SStephan Aßmus be_control_look->DrawSliderTriangle(this, frame, frame, kThumbRed, 0, 102b000c602SStephan Aßmus B_HORIZONTAL); 1030fc56ed5SStephan Aßmus } 1040fc56ed5SStephan Aßmus 1050fc56ed5SStephan Aßmus 1060fc56ed5SStephan Aßmus void 1070fc56ed5SStephan Aßmus SeekSlider::MouseDown(BPoint where) 1080fc56ed5SStephan Aßmus { 109b000c602SStephan Aßmus if (IsEnabled()) 1100fc56ed5SStephan Aßmus fTracking = true; 111b000c602SStephan Aßmus BSlider::MouseDown(where); 1120fc56ed5SStephan Aßmus } 1130fc56ed5SStephan Aßmus 1140fc56ed5SStephan Aßmus 1150fc56ed5SStephan Aßmus void 1160fc56ed5SStephan Aßmus SeekSlider::MouseUp(BPoint where) 1170fc56ed5SStephan Aßmus { 1180fc56ed5SStephan Aßmus fTracking = false; 119b000c602SStephan Aßmus BSlider::MouseUp(where); 1200fc56ed5SStephan Aßmus } 1210fc56ed5SStephan Aßmus 1220fc56ed5SStephan Aßmus 1230fc56ed5SStephan Aßmus void 124b000c602SStephan Aßmus SeekSlider::GetPreferredSize(float* _width, float* _height) 1259282400fSStephan Aßmus { 126b000c602SStephan Aßmus BSlider::GetPreferredSize(_width, _height); 127b000c602SStephan Aßmus if (_width != NULL) { 128b000c602SStephan Aßmus float minWidth = 15.0 + StringWidth(fDisabledString.String()) + 15.0; 129b000c602SStephan Aßmus *_width = max_c(*_width, minWidth); 1309282400fSStephan Aßmus } 131341ea11eSStephan Aßmus if (_height != NULL) { 132341ea11eSStephan Aßmus BRect unscaledThumbFrame = BSlider::ThumbFrame(); 133341ea11eSStephan Aßmus BRect scaledThumbFrame = ThumbFrame(); 134341ea11eSStephan Aßmus *_height += scaledThumbFrame.Height() - unscaledThumbFrame.Height(); 135341ea11eSStephan Aßmus } 136341ea11eSStephan Aßmus } 137341ea11eSStephan Aßmus 138341ea11eSStephan Aßmus 139341ea11eSStephan Aßmus BSize 140341ea11eSStephan Aßmus SeekSlider::MinSize() 141341ea11eSStephan Aßmus { 142341ea11eSStephan Aßmus BSize size = BSlider::MinSize(); 143341ea11eSStephan Aßmus 144341ea11eSStephan Aßmus BRect unscaledThumbFrame = BSlider::ThumbFrame(); 145341ea11eSStephan Aßmus BRect scaledThumbFrame = ThumbFrame(); 146341ea11eSStephan Aßmus size.height += scaledThumbFrame.Height() - unscaledThumbFrame.Height(); 147341ea11eSStephan Aßmus 148341ea11eSStephan Aßmus return size; 149341ea11eSStephan Aßmus } 150341ea11eSStephan Aßmus 151341ea11eSStephan Aßmus 152341ea11eSStephan Aßmus BSize 153341ea11eSStephan Aßmus SeekSlider::MaxSize() 154341ea11eSStephan Aßmus { 155341ea11eSStephan Aßmus BSize size = BSlider::MaxSize(); 156341ea11eSStephan Aßmus 157341ea11eSStephan Aßmus BRect unscaledThumbFrame = BSlider::ThumbFrame(); 158341ea11eSStephan Aßmus BRect scaledThumbFrame = ThumbFrame(); 159341ea11eSStephan Aßmus size.height += scaledThumbFrame.Height() - unscaledThumbFrame.Height(); 160341ea11eSStephan Aßmus 161341ea11eSStephan Aßmus return size; 1628e9973a0SStephan Aßmus } 1638e9973a0SStephan Aßmus 1648e9973a0SStephan Aßmus 1650fc56ed5SStephan Aßmus bool 1660fc56ed5SStephan Aßmus SeekSlider::IsTracking() const 1670fc56ed5SStephan Aßmus { 1680fc56ed5SStephan Aßmus if (fTracking) 1690fc56ed5SStephan Aßmus return true; 1700fc56ed5SStephan Aßmus return system_time() - fLastTrackTime < 250000; 1710fc56ed5SStephan Aßmus } 1720fc56ed5SStephan Aßmus 1730fc56ed5SStephan Aßmus 174e663610eSStephan Aßmus void 175e663610eSStephan Aßmus SeekSlider::SetDisabledString(const char* string) 176e663610eSStephan Aßmus { 177e663610eSStephan Aßmus if (string == NULL) 178*fd5c3422SStephan Aßmus string = ""; 179e663610eSStephan Aßmus 180e663610eSStephan Aßmus if (fDisabledString == string) 181e663610eSStephan Aßmus return; 182e663610eSStephan Aßmus 183e663610eSStephan Aßmus fDisabledString = string; 184e663610eSStephan Aßmus 185e663610eSStephan Aßmus if (!IsEnabled()) 186e663610eSStephan Aßmus Invalidate(); 187e663610eSStephan Aßmus } 188e663610eSStephan Aßmus 189e663610eSStephan Aßmus 190341ea11eSStephan Aßmus void 191341ea11eSStephan Aßmus SeekSlider::SetSymbolScale(float scale) 192341ea11eSStephan Aßmus { 193341ea11eSStephan Aßmus if (scale == fScale) 194341ea11eSStephan Aßmus return; 195341ea11eSStephan Aßmus 196341ea11eSStephan Aßmus fScale = scale; 197341ea11eSStephan Aßmus SetBarThickness(fScale * 15.0); 198341ea11eSStephan Aßmus InvalidateLayout(); 199341ea11eSStephan Aßmus } 200341ea11eSStephan Aßmus 201341ea11eSStephan Aßmus 202