1 //=============================================================================
2 //  Awl
3 //  Audio Widget Library
4 //
5 //  Copyright (C) 2002-2006 by Werner Schweer and others
6 //
7 //  This program is free software; you can redistribute it and/or modify
8 //  it under the terms of the GNU General Public License version 2.
9 //
10 //  This program is distributed in the hope that it will be useful,
11 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //  GNU General Public License for more details.
14 //
15 //  You should have received a copy of the GNU General Public License
16 //  along with this program; if not, write to the Free Software
17 //  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 //=============================================================================
19 
20 #include "fastlog.h"
21 #include "aslider.h"
22 
23 namespace Awl {
24 
25 //---------------------------------------------------------
26 //   AbstractSlider
27 //---------------------------------------------------------
28 
AbstractSlider(QWidget * parent)29 AbstractSlider::AbstractSlider(QWidget* parent)
30    : QWidget(parent), _scaleColor(Qt::darkGray), _scaleValueColor(QColor(0x2456aa))
31       {
32       __id         = 0;
33       _value      = 0.5;
34       _minValue   = 0.0;
35       _maxValue   = 1.0;
36       _lineStep   = 0.1;
37       _pageStep   = 0.2;
38       _center     = false;
39       _enableMouseWheel = true;
40       _invert     = false;
41       _scaleWidth = 4;
42       _log        = false;
43       _useActualValue = false;
44       _dclickValue1 = 0.0;
45       _dclickValue2 = 0.0;
46       setFocusPolicy(Qt::StrongFocus);
47       }
48 
49 //---------------------------------------------------------
50 //   setEnabled
51 //---------------------------------------------------------
52 
setEnabled(bool val)53 void AbstractSlider::setEnabled(bool val)
54       {
55       QWidget::setEnabled(val);
56       update();
57       }
58 
59 //---------------------------------------------------------
60 //   setEnableMouseWheel
61 //---------------------------------------------------------
62 
setEnableMouseWheel(bool enabled)63 void AbstractSlider::setEnableMouseWheel(bool enabled)
64       {
65             _enableMouseWheel = enabled;
66       }
67 
68 //---------------------------------------------------------
69 //   setCenter
70 //!   If the center flag is set, a notch is drawn to
71 //!   show the center position.
72 //---------------------------------------------------------
73 
setCenter(bool val)74 void AbstractSlider::setCenter(bool val)
75       {
76       if (val != _center) {
77             _center = val;
78             update();
79             }
80       }
81 
82 //!--------------------------------------------------------
83 //   setScaleWidth
84 //---------------------------------------------------------
85 
setScaleWidth(int val)86 void AbstractSlider::setScaleWidth(int val)
87       {
88       if (val != _scaleWidth) {
89             _scaleWidth = val;
90             update();
91             }
92       }
93 
94 //---------------------------------------------------------
95 //   setScaleColor
96 //---------------------------------------------------------
97 
setScaleColor(const QColor & c)98 void AbstractSlider::setScaleColor(const QColor& c)
99       {
100       if (c != _scaleColor) {
101             _scaleColor = c;
102             update();
103             }
104       }
105 
106 //---------------------------------------------------------
107 //   setScaleValueColor
108 //---------------------------------------------------------
109 
setScaleValueColor(const QColor & c)110 void AbstractSlider::setScaleValueColor(const QColor& c)
111       {
112       if (c != _scaleValueColor) {
113             _scaleValueColor = c;
114             update();
115             }
116       }
117 
118 //---------------------------------------------------------
119 //   wheelEvent
120 //---------------------------------------------------------
121 
wheelEvent(QWheelEvent * ev)122 void AbstractSlider::wheelEvent(QWheelEvent* ev)
123       {
124       if (!_enableMouseWheel)
125             return;
126 
127       int div = 50;
128       if (ev->modifiers() & Qt::ShiftModifier)
129             div = 15;
130       _value += (ev->angleDelta().y() * lineStep()) / div;
131       if (_value < _minValue)
132             _value = _minValue;
133       else if (_value > _maxValue)
134             _value = _maxValue;
135       valueChange();
136       }
137 
138 //---------------------------------------------------------
139 //   keyPressEvent
140 //---------------------------------------------------------
141 
keyPressEvent(QKeyEvent * ev)142 void AbstractSlider::keyPressEvent(QKeyEvent* ev)
143       {
144       double oval = _value;
145 
146       switch (ev->key()) {
147             case Qt::Key_Home:      _value = _minValue; break;
148             case Qt::Key_End:       _value = _maxValue; break;
149             case Qt::Key_Up:
150             case Qt::Key_Left:      _value += lineStep(); break;
151             case Qt::Key_Down:
152             case Qt::Key_Right:     _value -= lineStep(); break;
153             case Qt::Key_PageDown:  _value -= pageStep(); break;
154             case Qt::Key_PageUp:    _value += pageStep(); break;
155             case Qt::Key_Delete:
156             case Qt::Key_Backspace: _value = ev->modifiers() & Qt::ShiftModifier ? dclickValue2() : dclickValue1(); break;
157             default:
158                   break;
159             }
160       if (_value < _minValue)
161             _value = _minValue;
162       else if (_value > _maxValue)
163             _value = _maxValue;
164       if (oval != _value)
165             valueChange();
166       }
167 
168 //---------------------------------------------------------
169 //   mouseDoubleClickEvent
170 //---------------------------------------------------------
171 
mouseDoubleClickEvent(QMouseEvent * ev)172 void AbstractSlider::mouseDoubleClickEvent(QMouseEvent* ev)
173       {
174       if (ev->button() == Qt::RightButton)
175             _value = _dclickValue2;
176       else
177             _value = _dclickValue1;
178       valueChange();
179       }
180 
181 //---------------------------------------------------------
182 //   setValue
183 //---------------------------------------------------------
184 
setValue(double val)185 void AbstractSlider::setValue(double val)
186       {
187       double oldValue = _value;
188 
189       if (_log) {
190             if (val == 0.0f)
191                   _value = _minValue;
192             else {
193                   _value = fast_log10(val) * 20.0f;
194                   if (_value < _minValue)
195                         _value = _minValue;
196                   }
197             }
198       else
199             _value = val;
200 
201       if (oldValue != _value)
202             emit valueChanged(val, __id);
203 
204       update();
205       }
206 
207 //---------------------------------------------------------
208 //   valueChange
209 //---------------------------------------------------------
210 
valueChange()211 void AbstractSlider::valueChange()
212       {
213       emit valueChanged(value(), __id);
214       update();
215       }
216 
217 //---------------------------------------------------------
218 //   value
219 //---------------------------------------------------------
220 
value() const221 double AbstractSlider::value() const
222       {
223       return _log ? pow(10.0, _value*0.05f) : _value;
224       }
225 
226 //---------------------------------------------------------
227 //   userValue (between 0 and 100)
228 //---------------------------------------------------------
229 
userValue() const230 QString AbstractSlider::userValue() const
231       {
232       double result;
233       if (_useActualValue)
234             result = value();
235       else
236             result = (_value - minValue())/ ((maxValue() - minValue())/100);
237 
238       return QString::number(result, 'f', 2);
239       }
240 
241 //---------------------------------------------------------
242 //   minLogValue
243 //---------------------------------------------------------
244 
245 //double AbstractSlider::minValue() const {
246 //  return _log ? pow(10.0, _minValue*0.05f) : _minValue;
247 //}
248 
249 //---------------------------------------------------------
250 //   setMinLogValue
251 //---------------------------------------------------------
252 
setMinLogValue(double val)253 void AbstractSlider::setMinLogValue(double val)
254       {
255       if (_log) {
256             if (val == 0.0f)
257                   _minValue = -100;
258             else
259                   _minValue = fast_log10(val) * 20.0f;
260             }
261       else
262             _minValue = val;
263       }
264 
265 //---------------------------------------------------------
266 //   maxLogValue
267 //---------------------------------------------------------
268 
269 //double AbstractSlider::maxValue() const {
270 //  return _log ? pow(10.0, _maxValue*0.05f) : _maxValue;
271 //}
272 
273 //---------------------------------------------------------
274 //   setMaxLogValue
275 //---------------------------------------------------------
276 
setMaxLogValue(double val)277 void AbstractSlider::setMaxLogValue(double val)
278       {
279       if (_log) {
280             _maxValue = fast_log10(val) * 20.0f;
281             }
282       else
283             _maxValue = val;
284       }
285 
286 #if 0
287 //---------------------------------------------------------
288 //   init
289 //---------------------------------------------------------
290 
291 void AbstractSlider::init(const SyntiParameter& f)
292       {
293       _minValue = f.min();
294       _maxValue = f.max();
295       _value    = f.fval();
296       _lineStep   = (_maxValue - _minValue) * 0.1;
297       _pageStep   = _lineStep * 2.0;
298       }
299 #endif
300 
AccessibleAbstractSlider(AbstractSlider * s)301 AccessibleAbstractSlider::AccessibleAbstractSlider(AbstractSlider* s) : QAccessibleWidget(s)
302       {
303       slider = s;
304       }
305 
role() const306 QAccessible::Role AccessibleAbstractSlider::role() const
307       {
308       return QAccessible::Slider;
309       }
310 
text(QAccessible::Text t) const311 QString AccessibleAbstractSlider::text(QAccessible::Text t) const
312       {
313       switch (t) {
314             case QAccessible::Name:
315                   return slider->accessibleName();
316             case QAccessible::Value:
317                   return slider->userValue();
318             case QAccessible::Description:
319                   return slider->accessibleDescription();
320             default:
321                   return QString();
322             }
323       // Eliminate "unreachable code"
324       // return QString();
325       }
326 
valueChanged(double,int)327 void AccessibleAbstractSlider::valueChanged(double, int)
328       {
329       QAccessibleValueChangeEvent ev(slider, slider->userValue());
330       QAccessible::updateAccessibility(&ev);
331       }
332 
AbstractSliderFactory(const QString &,QObject * object)333 QAccessibleInterface* AccessibleAbstractSlider::AbstractSliderFactory(const QString& /*classname*/, QObject *object)
334       {
335       QAccessibleInterface *iface = 0;
336       if (object && object->isWidgetType() && object->inherits("Awl::AbstractSlider")){
337             AbstractSlider* slider = static_cast<AbstractSlider*>(object);
338             AccessibleAbstractSlider* acc = new AccessibleAbstractSlider(slider);
339             QObject::connect(slider, SIGNAL(valueChanged(double,int)), acc, SLOT(valueChanged(double,int)));
340             iface = static_cast<QAccessibleInterface*>(acc);
341             }
342 
343       return iface;
344       }
345 }
346