1/* This file is part of the KDE project
2 Copyright (C) 2006-2008 Ricardo Villalba <rvm@escomposlinux.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) version 3, or any
8 later version accepted by the membership of KDE e.V. (or its
9 successor approved by the membership of KDE e.V.), Nokia Corporation
10 (or its successors, if any) and the KDE Free Qt Foundation, which shall
11 act as a proxy defined in Section 6 of version 3 of the license.
12
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library. If not, see <http://www.gnu.org/licenses/>.
20
21*/
22
23#include "swiftslider_p.h"
24
25#include <QMouseEvent>
26#include <QStyle>
27#include <QStyleOption>
28
29#if !defined(QT_NO_PHONON_SEEKSLIDER) && !defined(QT_NO_PHONON_VOLUMESLIDER)
30
31namespace Phonon
32{
33
34SwiftSlider::SwiftSlider(Qt::Orientation orientation, QWidget * parent)
35 : QSlider(orientation, parent)
36 , m_wheelTimer(this)
37{
38 m_wheelTimer.setInterval(100);
39 m_wheelTimer.setSingleShot(true);
40 connect(sender: &m_wheelTimer, SIGNAL(timeout()), receiver: this, SIGNAL(scrollEnd()));
41}
42
43SwiftSlider::~SwiftSlider()
44{
45}
46
47// Function copied from qslider.cpp
48inline int SwiftSlider::pick(const QPoint &pt) const
49{
50 return orientation() == Qt::Horizontal ? pt.x() : pt.y();
51}
52
53// Function copied from qslider.cpp and modified to make it compile
54int SwiftSlider::pixelPosToRangeValue(int pos) const
55{
56 QStyleOptionSlider opt;
57 initStyleOption(option: &opt);
58 QRect gr = style()->subControlRect(cc: QStyle::CC_Slider, opt: &opt, sc: QStyle::SC_SliderGroove, widget: this);
59 QRect sr = style()->subControlRect(cc: QStyle::CC_Slider, opt: &opt, sc: QStyle::SC_SliderHandle, widget: this);
60 int sliderMin, sliderMax, sliderLength;
61
62 if (orientation() == Qt::Horizontal) {
63 sliderLength = sr.width();
64 sliderMin = gr.x();
65 sliderMax = gr.right() - sliderLength + 1;
66 } else {
67 sliderLength = sr.height();
68 sliderMin = gr.y();
69 sliderMax = gr.bottom() - sliderLength + 1;
70 }
71 return QStyle::sliderValueFromPosition(min: minimum(), max: maximum(), pos: pos - sliderMin,
72 space: sliderMax - sliderMin, upsideDown: opt.upsideDown);
73}
74
75// Based on code from qslider.cpp
76void SwiftSlider::mousePressEvent(QMouseEvent *event)
77{
78 if (event->button() == Qt::LeftButton) {
79 QStyleOptionSlider opt;
80 initStyleOption(option: &opt);
81 const QRect sliderRect = style()->subControlRect(cc: QStyle::CC_Slider, opt: &opt, sc: QStyle::SC_SliderHandle, widget: this);
82 const QPoint center = sliderRect.center() - sliderRect.topLeft();
83 // to take half of the slider off for the setSliderPosition call we use the center - topLeft
84
85 if (!sliderRect.contains(p: event->pos())) {
86 event->accept();
87
88 setSliderPosition(pixelPosToRangeValue(pos: pick(pt: event->pos() - center)));
89 triggerAction(action: SliderMove);
90 setRepeatAction(action: SliderNoAction);
91 } else {
92 QSlider::mousePressEvent(ev: event);
93 }
94 } else {
95 QSlider::mousePressEvent(ev: event);
96 }
97}
98
99void SwiftSlider::wheelEvent(QWheelEvent *event)
100{
101 m_wheelTimer.start();
102 QSlider::wheelEvent(e: event);
103}
104
105} // namespace Phonon
106
107#endif //QT_NO_PHONON_VOLUMESLIDER && QT_NO_PHONON_VOLUMESLIDER
108
109#include "moc_swiftslider_p.cpp"
110

source code of phonon/phonon/swiftslider.cpp