from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import pyqtSignal


class ClickableSlider(QtWidgets.QSlider):
    positionClicked = pyqtSignal(int)

    def mousePressEvent(self, event):
        super(ClickableSlider, self).mousePressEvent(event)
        if event.button() == QtCore.Qt.LeftButton:
            pos = self.pixelPosToRangeValue(event.pos())
            self.setValue(pos)
            self.sliderMoved.emit(pos)

    def pixelPosToRangeValue(self, pos):
        opt = QtWidgets.QStyleOptionSlider()
        self.initStyleOption(opt)
        gr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderGroove, self)
        sr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderHandle, self)

        if self.orientation() == QtCore.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;
        pr = pos - sr.center() + sr.topLeft()
        p = pr.x() if self.orientation() == QtCore.Qt.Horizontal else pr.y()
        return QtWidgets.QStyle.sliderValueFromPosition(
            self.minimum(),
            self.maximum(),
            p - sliderMin,
            sliderMax - sliderMin,
            opt.upsideDown
        )
