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