xref: /haiku/src/apps/mediaplayer/interface/SeekSlider.cpp (revision b000c602e305d40003307dcb73fbe3421b117b3d)
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