Download this file

DirectSlider.cpp    79 lines (70 with data), 2.6 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
* Copyright (C) 2012
*
* This file is part of sayonara-player
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* created by Lucio Carreras,
* Sep 14, 2012
*
*/
#include <QDebug>
#include <QStyle>
#include <QEvent>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QAbstractSlider>
#include <QStyleOptionSlider>
#include "GUI/player/DirectSlider.h"
#include <cmath>
// A slider where a click sets the position to the click location
// instead of moving by a fixed amount as does the standard widget.
// http://stackoverflow.com/questions/11132597/qslider-mouse-direct-jump
static int adjustedVal(double halfHandleWidth, int pos, int sz,
int min, int max)
{
if ( pos < halfHandleWidth )
pos = halfHandleWidth;
if ( pos > sz - halfHandleWidth )
pos = sz - halfHandleWidth;
// get new dimensions accounting for slider handle width
double newWidth = (sz - halfHandleWidth) - halfHandleWidth;
double normalizedPosition = (pos - halfHandleWidth) / newWidth ;
return min + ((max-min) * normalizedPosition);
}
void DirectSlider::mousePressEvent(QMouseEvent *event)
{
QStyleOptionSlider opt;
initStyleOption(&opt);
QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt,
QStyle::SC_SliderHandle, this);
if (event->button() == Qt::LeftButton &&
sr.contains(event->pos()) == false) {
double halfHandleWidth = (0.5 * sr.width()) + 0.5; // Correct rounding
int newVal;
if (orientation() == Qt::Vertical) {
newVal = adjustedVal(halfHandleWidth,
height() - event->y(), height(),
minimum(), maximum());
} else {
newVal = adjustedVal(halfHandleWidth, event->x(), width(),
minimum(), maximum());
}
setValue(newVal);
event->accept();
} else {
QSlider::mousePressEvent(event);
}
}