10fc56ed5SStephan Aßmus /* 2*b000c602SStephan 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 // NOTE: Based on my code in the BeOS interface for the VLC media player 79282400fSStephan Aßmus // that I did during the VLC 0.4.3 - 0.4.6 times. Code not written by me 80fc56ed5SStephan Aßmus // removed. -Stephan Aßmus 90fc56ed5SStephan Aßmus 100fc56ed5SStephan Aßmus #include "SeekSlider.h" 110fc56ed5SStephan Aßmus 120fc56ed5SStephan Aßmus #include <stdio.h> 130fc56ed5SStephan Aßmus #include <string.h> 140fc56ed5SStephan Aßmus 15*b000c602SStephan Aßmus #include <ControlLook.h> 16*b000c602SStephan Aßmus #include <Region.h> 17*b000c602SStephan Aßmus #include <Shape.h> 18*b000c602SStephan Aßmus 190fc56ed5SStephan Aßmus #include "DrawingTidbits.h" 200fc56ed5SStephan Aßmus 210fc56ed5SStephan Aßmus 22*b000c602SStephan Aßmus const rgb_color kThumbRed = (rgb_color){ 255, 52, 52, 255 }; 230fc56ed5SStephan Aßmus 240fc56ed5SStephan Aßmus const char* kDisabledSeekMessage = "Drop files to play"; 250fc56ed5SStephan Aßmus 260fc56ed5SStephan Aßmus 27*b000c602SStephan Aßmus SeekSlider::SeekSlider(const char* name, BMessage* message, int32 minValue, 28*b000c602SStephan Aßmus int32 maxValue) 29e663610eSStephan Aßmus : 30*b000c602SStephan Aßmus BSlider(name, NULL, NULL, minValue, maxValue, B_HORIZONTAL, 31*b000c602SStephan Aßmus B_TRIANGLE_THUMB), 32e663610eSStephan Aßmus fTracking(false), 33e663610eSStephan Aßmus fLastTrackTime(0), 34e663610eSStephan Aßmus fDisabledString(kDisabledSeekMessage) 350fc56ed5SStephan Aßmus { 360fc56ed5SStephan Aßmus BFont font(be_plain_font); 370fc56ed5SStephan Aßmus font.SetSize(9.0); 380fc56ed5SStephan Aßmus SetFont(&font); 39*b000c602SStephan Aßmus SetBarThickness(15.0); 40*b000c602SStephan Aßmus rgb_color fillColor = tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 41*b000c602SStephan Aßmus B_DARKEN_3_TINT); 42*b000c602SStephan Aßmus UseFillColor(true, &fillColor); 43*b000c602SStephan Aßmus SetModificationMessage(message); 440fc56ed5SStephan Aßmus } 450fc56ed5SStephan Aßmus 460fc56ed5SStephan Aßmus 470fc56ed5SStephan Aßmus SeekSlider::~SeekSlider() 480fc56ed5SStephan Aßmus { 490fc56ed5SStephan Aßmus } 500fc56ed5SStephan Aßmus 510fc56ed5SStephan Aßmus 52*b000c602SStephan Aßmus status_t 53*b000c602SStephan Aßmus SeekSlider::Invoke(BMessage* message) 540fc56ed5SStephan Aßmus { 55*b000c602SStephan Aßmus fLastTrackTime = system_time(); 56*b000c602SStephan Aßmus return BSlider::Invoke(message); 570fc56ed5SStephan Aßmus } 580fc56ed5SStephan Aßmus 590fc56ed5SStephan Aßmus 600fc56ed5SStephan Aßmus void 61*b000c602SStephan Aßmus SeekSlider::DrawBar() 620fc56ed5SStephan Aßmus { 63*b000c602SStephan Aßmus BSlider::DrawBar(); 64*b000c602SStephan Aßmus if (IsEnabled()) 650fc56ed5SStephan Aßmus return; 660fc56ed5SStephan Aßmus 67*b000c602SStephan Aßmus BRect r(BarFrame()); 68*b000c602SStephan Aßmus font_height fh; 69*b000c602SStephan Aßmus GetFontHeight(&fh); 70*b000c602SStephan Aßmus float width = ceilf(StringWidth(fDisabledString.String())); 71*b000c602SStephan Aßmus BPoint textPos; 72*b000c602SStephan Aßmus textPos.x = r.left + (r.Width() - width) / 2.0; 73*b000c602SStephan Aßmus textPos.y = (r.top + r.bottom - ceilf(fh.ascent + fh.descent)) / 2.0 74*b000c602SStephan Aßmus + ceilf(fh.ascent); 750fc56ed5SStephan Aßmus 76*b000c602SStephan Aßmus SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 77*b000c602SStephan Aßmus B_DARKEN_3_TINT)); 78*b000c602SStephan Aßmus SetDrawingMode(B_OP_OVER); 79*b000c602SStephan Aßmus DrawString(fDisabledString.String(), textPos); 800fc56ed5SStephan Aßmus } 810fc56ed5SStephan Aßmus 820fc56ed5SStephan Aßmus 830fc56ed5SStephan Aßmus void 84*b000c602SStephan Aßmus SeekSlider::DrawThumb() 850fc56ed5SStephan Aßmus { 86*b000c602SStephan Aßmus if (!IsEnabled()) 87*b000c602SStephan Aßmus return; 880fc56ed5SStephan Aßmus 89*b000c602SStephan Aßmus BRect frame = ThumbFrame(); 90*b000c602SStephan Aßmus be_control_look->DrawSliderTriangle(this, frame, frame, kThumbRed, 0, 91*b000c602SStephan Aßmus B_HORIZONTAL); 920fc56ed5SStephan Aßmus } 930fc56ed5SStephan Aßmus 940fc56ed5SStephan Aßmus 950fc56ed5SStephan Aßmus void 960fc56ed5SStephan Aßmus SeekSlider::MouseDown(BPoint where) 970fc56ed5SStephan Aßmus { 98*b000c602SStephan Aßmus if (IsEnabled()) 990fc56ed5SStephan Aßmus fTracking = true; 100*b000c602SStephan Aßmus BSlider::MouseDown(where); 1010fc56ed5SStephan Aßmus } 1020fc56ed5SStephan Aßmus 1030fc56ed5SStephan Aßmus 1040fc56ed5SStephan Aßmus void 1050fc56ed5SStephan Aßmus SeekSlider::MouseUp(BPoint where) 1060fc56ed5SStephan Aßmus { 1070fc56ed5SStephan Aßmus fTracking = false; 108*b000c602SStephan Aßmus BSlider::MouseUp(where); 1090fc56ed5SStephan Aßmus } 1100fc56ed5SStephan Aßmus 1110fc56ed5SStephan Aßmus 1120fc56ed5SStephan Aßmus void 113*b000c602SStephan Aßmus SeekSlider::GetPreferredSize(float* _width, float* _height) 1149282400fSStephan Aßmus { 115*b000c602SStephan Aßmus BSlider::GetPreferredSize(_width, _height); 116*b000c602SStephan Aßmus if (_width != NULL) { 117*b000c602SStephan Aßmus float minWidth = 15.0 + StringWidth(fDisabledString.String()) + 15.0; 118*b000c602SStephan Aßmus *_width = max_c(*_width, minWidth); 1199282400fSStephan Aßmus } 1208e9973a0SStephan Aßmus } 1218e9973a0SStephan Aßmus 1228e9973a0SStephan Aßmus 1230fc56ed5SStephan Aßmus bool 1240fc56ed5SStephan Aßmus SeekSlider::IsTracking() const 1250fc56ed5SStephan Aßmus { 1260fc56ed5SStephan Aßmus if (fTracking) 1270fc56ed5SStephan Aßmus return true; 1280fc56ed5SStephan Aßmus return system_time() - fLastTrackTime < 250000; 1290fc56ed5SStephan Aßmus } 1300fc56ed5SStephan Aßmus 1310fc56ed5SStephan Aßmus 132e663610eSStephan Aßmus void 133e663610eSStephan Aßmus SeekSlider::SetDisabledString(const char* string) 134e663610eSStephan Aßmus { 135e663610eSStephan Aßmus if (string == NULL) 136e663610eSStephan Aßmus string = kDisabledSeekMessage; 137e663610eSStephan Aßmus 138e663610eSStephan Aßmus if (fDisabledString == string) 139e663610eSStephan Aßmus return; 140e663610eSStephan Aßmus 141e663610eSStephan Aßmus fDisabledString = string; 142e663610eSStephan Aßmus 143e663610eSStephan Aßmus if (!IsEnabled()) 144e663610eSStephan Aßmus Invalidate(); 145e663610eSStephan Aßmus } 146e663610eSStephan Aßmus 147e663610eSStephan Aßmus 148