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
SeekSlider(const char * name,BMessage * message,int32 minValue,int32 maxValue)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
~SeekSlider()410fc56ed5SStephan Aßmus SeekSlider::~SeekSlider()
420fc56ed5SStephan Aßmus {
430fc56ed5SStephan Aßmus }
440fc56ed5SStephan Aßmus
450fc56ed5SStephan Aßmus
46b000c602SStephan Aßmus status_t
Invoke(BMessage * message)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
ThumbFrame() const55341ea11eSStephan 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
DrawBar()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
DrawThumb()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
MouseDown(BPoint where)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
MouseUp(BPoint where)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
GetPreferredSize(float * _width,float * _height)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
MinSize()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
MaxSize()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
IsTracking() const1660fc56ed5SStephan 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
SetDisabledString(const char * string)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
SetSymbolScale(float scale)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