xref: /haiku/src/apps/mediaplayer/interface/SeekSlider.cpp (revision 5bb671cc0e16622a06fbeb4ec231605ceba7ed51)
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 
17fd5c3422SStephan 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),
27fd5c3422SStephan Aßmus 	fDisabledString(""),
28341ea11eSStephan Aßmus 	fScale(0.0f)
290fc56ed5SStephan Aßmus {
300fc56ed5SStephan Aßmus 	BFont font(be_plain_font);
31*5bb671ccSAugustin Cavalier 	font.SetSize(font.Size() * 0.75f);
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)
178fd5c3422SStephan 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