| /* This file is part of the KDE project |
| Copyright (C) 2006-2008 Ricardo Villalba <rvm@escomposlinux.org> |
| |
| This library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) version 3, or any |
| later version accepted by the membership of KDE e.V. (or its |
| successor approved by the membership of KDE e.V.), Nokia Corporation |
| (or its successors, if any) and the KDE Free Qt Foundation, which shall |
| act as a proxy defined in Section 6 of version 3 of the license. |
| |
| This library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with this library. If not, see <http://www.gnu.org/licenses/>. |
| |
| */ |
| |
| #include "swiftslider_p.h" |
| |
| #include <QtGui/QMouseEvent> |
| #include <QtGui/QStyle> |
| #include <QtGui/QStyleOption> |
| |
| QT_BEGIN_NAMESPACE |
| |
| #if !defined(QT_NO_PHONON_SEEKSLIDER) && !defined(QT_NO_PHONON_VOLUMESLIDER) |
| |
| namespace Phonon |
| { |
| |
| SwiftSlider::SwiftSlider(Qt::Orientation orientation, QWidget * parent) |
| : QSlider(orientation, parent) |
| { |
| } |
| |
| SwiftSlider::~SwiftSlider() |
| { |
| } |
| |
| // Function copied from qslider.cpp |
| inline int SwiftSlider::pick(const QPoint &pt) const |
| { |
| return orientation() == Qt::Horizontal ? pt.x() : pt.y(); |
| } |
| |
| // Function copied from qslider.cpp and modified to make it compile |
| int SwiftSlider::pixelPosToRangeValue(int pos) const |
| { |
| QStyleOptionSlider opt; |
| initStyleOption(&opt); |
| QRect gr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this); |
| QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); |
| int sliderMin, sliderMax, sliderLength; |
| |
| if (orientation() == Qt::Horizontal) { |
| sliderLength = sr.width(); |
| sliderMin = gr.x(); |
| sliderMax = gr.right() - sliderLength + 1; |
| } else { |
| sliderLength = sr.height(); |
| sliderMin = gr.y(); |
| sliderMax = gr.bottom() - sliderLength + 1; |
| } |
| return QStyle::sliderValueFromPosition(minimum(), maximum(), pos - sliderMin, |
| sliderMax - sliderMin, opt.upsideDown); |
| } |
| |
| // Based on code from qslider.cpp |
| void SwiftSlider::mousePressEvent(QMouseEvent *event) |
| { |
| if (event->button() == Qt::LeftButton) { |
| QStyleOptionSlider opt; |
| initStyleOption(&opt); |
| const QRect sliderRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); |
| const QPoint center = sliderRect.center() - sliderRect.topLeft(); |
| // to take half of the slider off for the setSliderPosition call we use the center - topLeft |
| |
| if (!sliderRect.contains(event->pos())) { |
| event->accept(); |
| |
| setSliderPosition(pixelPosToRangeValue(pick(event->pos() - center))); |
| triggerAction(SliderMove); |
| setRepeatAction(SliderNoAction); |
| } else { |
| QSlider::mousePressEvent(event); |
| } |
| } else { |
| QSlider::mousePressEvent(event); |
| } |
| } |
| |
| } // namespace Phonon |
| |
| #endif //QT_NO_PHONON_VOLUMESLIDER && QT_NO_PHONON_VOLUMESLIDER |
| |
| QT_END_NAMESPACE |
| |
| #include "moc_swiftslider_p.cpp" |