| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | 
							- #include "absolute-slider.hpp"
 
- AbsoluteSlider::AbsoluteSlider(QWidget *parent) : SliderIgnoreScroll(parent)
 
- {
 
- 	installEventFilter(this);
 
- 	setMouseTracking(true);
 
- }
 
- AbsoluteSlider::AbsoluteSlider(Qt::Orientation orientation, QWidget *parent)
 
- 	: SliderIgnoreScroll(orientation, parent)
 
- {
 
- 	installEventFilter(this);
 
- 	setMouseTracking(true);
 
- }
 
- void AbsoluteSlider::mousePressEvent(QMouseEvent *event)
 
- {
 
- 	dragging = (event->buttons() & Qt::LeftButton ||
 
- 		    event->buttons() & Qt::MiddleButton);
 
- 	if (dragging) {
 
- 		setSliderDown(true);
 
- 		setValue(posToRangeValue(event));
 
- 		emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
 
- 	}
 
- 	event->accept();
 
- }
 
- void AbsoluteSlider::mouseReleaseEvent(QMouseEvent *event)
 
- {
 
- 	dragging = false;
 
- 	setSliderDown(false);
 
- 	event->accept();
 
- }
 
- void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event)
 
- {
 
- 	int val = posToRangeValue(event);
 
- 	if (val > maximum())
 
- 		val = maximum();
 
- 	else if (val < minimum())
 
- 		val = minimum();
 
- 	emit absoluteSliderHovered(val);
 
- 	if (dragging) {
 
- 		setValue(posToRangeValue(event));
 
- 		emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
 
- 	}
 
- 	QSlider::mouseMoveEvent(event);
 
- 	event->accept();
 
- }
 
- bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event)
 
- {
 
- 	if (event->type() == QEvent::KeyPress) {
 
- 		QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
 
- 		if (keyEvent->key() == Qt::Key_Up ||
 
- 		    keyEvent->key() == Qt::Key_Down) {
 
- 			return true;
 
- 		}
 
- 	}
 
- 	if (event->type() == QEvent::Wheel)
 
- 		return true;
 
- 	return QSlider::eventFilter(obj, event);
 
- }
 
- int AbsoluteSlider::posToRangeValue(QMouseEvent *event)
 
- {
 
- 	QStyleOptionSlider opt;
 
- 	initStyleOption(&opt);
 
- 	int pos;
 
- 	int sliderMin;
 
- 	int sliderMax;
 
- 	int handleLength;
 
- 	const QRect groove = style()->subControlRect(
 
- 		QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this);
 
- 	const QRect handle = style()->subControlRect(
 
- 		QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
 
- 	if (orientation() == Qt::Horizontal) {
 
- 		pos = event->pos().x();
 
- 		handleLength = handle.width();
 
- 		sliderMin = groove.left() + (handleLength / 2);
 
- 		sliderMax = groove.right() - (handleLength / 2) + 1;
 
- 	} else {
 
- 		pos = event->pos().y();
 
- 		handleLength = handle.height();
 
- 		sliderMin = groove.top() + (handleLength / 2);
 
- 		sliderMax = groove.bottom() - (handleLength / 2) + 1;
 
- 	}
 
- 	int sliderValue = style()->sliderValueFromPosition(
 
- 		minimum(), maximum(), pos - sliderMin, sliderMax - sliderMin,
 
- 		opt.upsideDown);
 
- 	return sliderValue;
 
- }
 
 
  |