def initThumbs(self) -> None: framesize = self.parent.videoService.framesize() thumbsize = QSize( VideoService.config.thumbnails['TIMELINE'].height() * (framesize.width() / framesize.height()), VideoService.config.thumbnails['TIMELINE'].height()) positions, frametimes = [], [] thumbs = int( math.ceil( (self.rect().width() - (self.offset * 2)) / thumbsize.width())) for pos in range(thumbs): val = QStyle.sliderValueFromPosition( self.minimum(), self.maximum(), (thumbsize.width() * pos) - self.offset, self.rect().width() - (self.offset * 2)) positions.append(val) positions[0] = 1000 [ frametimes.append( self.parent.delta2QTime(msec).toString(self.parent.timeformat)) for msec in positions ] class ThumbWorker(QObject): completed = pyqtSignal(list) def __init__(self, settings: QSettings, media: str, times: list, size: QSize): super(ThumbWorker, self).__init__() self.settings = settings self.media = media self.times = times self.size = size @pyqtSlot() def generate(self): frames = list() [ frames.append( VideoService.captureFrame(self.settings, self.media, frame, self.size)) for frame in self.times ] self.completed.emit(frames) self.thumbsThread = QThread(self) self.thumbsWorker = ThumbWorker(self.parent.settings, self.parent.currentMedia, frametimes, thumbsize) self.thumbsWorker.moveToThread(self.thumbsThread) self.thumbsThread.started.connect(self.parent.sliderWidget.setLoader) self.thumbsThread.started.connect(self.thumbsWorker.generate) self.thumbsThread.finished.connect(self.thumbsThread.deleteLater, Qt.DirectConnection) self.thumbsWorker.completed.connect(self.buildTimeline) self.thumbsWorker.completed.connect(self.thumbsWorker.deleteLater, Qt.DirectConnection) self.thumbsWorker.completed.connect(self.thumbsThread.quit, Qt.DirectConnection) self.thumbsThread.start()
def eventFilter(self, obj: QObject, event: QEvent) -> bool: if event.type() == QEvent.MouseButtonRelease: if self.parentWidget().mediaAvailable: self.setValue( QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width())) self.parentWidget().setPosition(self.sliderPosition()) return super(VideoSlider, self).eventFilter(obj, event)
def eventFilter(self, obj: QObject, event: QMouseEvent) -> bool: if event.type() == QEvent.MouseButtonRelease and event.button() == Qt.LeftButton: if self.parent.mediaAvailable and self.isEnabled(): newpos = QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x() - self.offset, self.width() - (self.offset * 2)) self.setValue(newpos) self.parent.setPosition(newpos) self.parent.parent.mousePressEvent(event) return super(VideoSlider, self).eventFilter(obj, event)
def mouseReleaseEvent(self, event): if self.rect().contains(event.pos()): value = QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()) self.setValue(value) else: self.close() event.accept()
def paintEvent(self, event: QPaintEvent) -> None: painter = QStylePainter(self) opt = QStyleOptionSlider() self.initStyleOption(opt) font = painter.font() font.setPixelSize(10) painter.setFont(font) if self.tickPosition() != QSlider.NoTicks: x = 8 for i in range(self.minimum(), self.width(), 8): if i % 5 == 0: h = 18 w = 1 z = 13 else: h = 8 w = 1 z = 23 tickcolor = '#8F8F8F' if self.theme == 'dark' else '#444' pen = QPen(QColor(tickcolor)) pen.setWidthF(w) painter.setPen(pen) if self.tickPosition() in (QSlider.TicksBothSides, QSlider.TicksAbove): y = self.rect().top() + z painter.drawLine(x, y, x, y + h) if self.tickPosition() in (QSlider.TicksBothSides, QSlider.TicksBelow): y = self.rect().bottom() - z painter.drawLine(x, y, x, y - h) if self.parent.mediaAvailable and i % 15 == 0: painter.setPen(Qt.white if self.theme == 'dark' else Qt.black) timecode = QStyle.sliderValueFromPosition( self.minimum(), self.maximum(), x - self.offset, self.width() - (self.offset * 2)) timecode = self.parent.delta2QTime(timecode).toString( self.parent.runtimeformat) painter.drawText(x + 6, y + 6, timecode) if x + 30 > self.width(): break x += 15 opt.subControls = QStyle.SC_SliderGroove painter.drawComplexControl(QStyle.CC_Slider, opt) for rect in self._regions: rect.setY(int((self.height() - self._regionHeight) / 2) - 8) rect.setHeight(self._regionHeight) if self._regions.index(rect) == self._regionSelected: brushcolor = QColor(150, 190, 78, 185) else: brushcolor = QColor(237, 242, 255, 185) painter.setBrush(brushcolor) painter.setPen(QColor(255, 255, 255, 170)) painter.drawRect(rect) opt.subControls = QStyle.SC_SliderHandle painter.drawComplexControl(QStyle.CC_Slider, opt)
def eventFilter(self, obj: QObject, event: QEvent): if event.type() == QEvent.MouseButtonRelease: if self.parentWidget().mediaPlayer.isVideoAvailable( ) or self.parentWidget().mediaPlayer.isAudioAvailable(): self.setValue( QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width())) self.parentWidget().mediaPlayer.setPosition( self.sliderPosition()) return QWidget.eventFilter(self, obj, event)
def eventFilter(self, obj: QObject, event: QEvent) -> bool: if event.type() == QEvent.MouseButtonRelease and isinstance( obj, VideoSlider): if obj.objectName() == 'VideoSlider' and ( self.mediaPlayer.isVideoAvailable() or self.mediaPlayer.isAudioAvailable()): obj.setValue( QStyle.sliderValueFromPosition(obj.minimum(), obj.maximum(), event.x(), obj.width())) self.mediaPlayer.setPosition(obj.sliderPosition()) return QWidget.eventFilter(self, obj, event)
def mousePressEvent(self, event): self.setValue( QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width())) # our code relies on `sliderMoved` in order to only trigger on user # input and not when we change the slider's value from the code (we # update the slider's value every frame as we progress along the # replay). Since the user *has* initiated this movement, emit # `sliderMoved` to let our code know. # TODO This should probably be done via a custom qsignal # (userChangedValue) instead of re-purposing an existing one that wasn't # meant for that purpose. self.sliderMoved.emit(self.value())
def _pixelPos2Value(self, pos): opt = QtWidgets.QStyleOptionSlider() self.initStyleOption(opt) gr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self) if self.orientation() == QtCore.Qt.Horizontal: min, max = gr.x(), gr.right() else: min, max = gr.y(), gr.bottom() return QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), pos - min, max - min, opt.upsideDown)
def pixel_pos_to_range_value(self, pos): opt = QStyleOptionSlider() self.initStyleOption(opt) gr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self) sr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderHandle, self) if self.orientation() == Qt.Horizontal: slider_length = sr.width() slider_min = gr.x() slider_max = gr.right() - slider_length + 1 else: slider_length = sr.height() slider_min = gr.y() slider_max = gr.bottom() - slider_length + 1 pr = pos - sr.center() + sr.topLeft() p = pr.x() if self.orientation() == Qt.Horizontal else pr.y() return QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), p - slider_min, slider_max - slider_min, opt.upsideDown)
def pixelPosToRangeValue(self, pos): opt = QStyleOptionSlider() self.initStyleOption(opt) gr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self) sr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderHandle, self) if self.orientation() == QtCore.Qt.Horizontal: slider_length = sr.width() slider_min = gr.x() slider_max = gr.right() - slider_length + 1 else: slider_length = sr.height() slider_min = gr.y() slider_max = gr.bottom() - slider_length + 1 return QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), pos - slider_min, slider_max - slider_min, opt.upsideDown)
def pixelPosToRangeValue(self, pos): option = QStyleOptionSlider() self.initStyleOption(option) gr = self.style().subControlRect(QStyle.CC_Slider, option, QStyle.SC_SliderGroove, self) sr = self.style().subControlRect(QStyle.CC_Slider, option, QStyle.SC_SliderHandle, self) if self.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(self.minimum(), self.maximum(), pos - sliderMin, sliderMax - sliderMin, option.upsideDown)
def initThumbs(self) -> None: step = QStyle.sliderValueFromPosition( self.minimum(), self.maximum(), VideoService.ThumbSize.TIMELINE.value.width(), self.width() - self.offset) index = list(range(self.minimum(), self.maximum(), step)) frametimes = list() for msec in index: frametimes.append( self.parent.delta2QTime(msec).toString(self.parent.timeformat)) class ThumbWorker(QObject): completed = pyqtSignal(list) def __init__(self, media: str, frames: list): super(ThumbWorker, self).__init__() self.media = media self.frames = frames def generate(self): thumbs = list() for frame in self.frames: thumbs.append( VideoService.capture(self.media, frame, VideoService.ThumbSize.TIMELINE)) self.completed.emit(thumbs) self.thumbsThread = QThread(self) self.thumbsWorker = ThumbWorker(self.parent.currentMedia, frametimes) self.thumbsWorker.moveToThread(self.thumbsThread) self.thumbsThread.started.connect(self.parent.sliderWidget.setLoader) self.thumbsThread.started.connect(self.thumbsWorker.generate) self.thumbsThread.finished.connect(self.thumbsThread.deleteLater, Qt.DirectConnection) self.thumbsWorker.completed.connect(self.buildTimeline) self.thumbsWorker.completed.connect(self.thumbsWorker.deleteLater, Qt.DirectConnection) self.thumbsWorker.completed.connect(self.thumbsThread.quit, Qt.DirectConnection) self.thumbsThread.start()
def pixel_post_to_range_value(self, pos): """Get value of MousePress coordinates""" opt = QStyleOptionSlider() # parameters needed for drawing a slider self.initStyleOption(opt) # Set Styling parameters from opt gr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self) # groove sr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderHandle, self) # handle if self.orientation() == Qt.Horizontal: slider_length = sr.width() # handle width slider_min = gr.x() # groove start coor (x) slider_max = gr.right() - slider_length + 1 # groove max coor (x) else: slider_length = sr.height() # handle height slider_min = gr.y() # groove start coor (y) slider_max = gr.bottom() - slider_length + 1 # groove max coor (y) pr = (pos - sr.center()) + sr.topLeft() # New Handle center coor p = pr.x() if self.orientation() == Qt.Horizontal else pr.y() return QStyle.sliderValueFromPosition( self.minimum(), self.maximum(), p - slider_min, slider_max - slider_min, opt.upsideDown) # return new Handle pos
def mousePressEvent(self, ev): """ Jump to click position """ self.setValue( QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), ev.x(), self.width()))
def mouseMoveEvent(self, ev): """ Jump to pointer position while moving """ self.setValue( QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), ev.x(), self.width()))
def mouseMoveEvent(self, event): self.setValue(QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()))
def mouseMoveEvent(self, ev): """ Jump to pointer position while moving """ self.setValue(QStyle.sliderValueFromPosition( self.minimum(), self.maximum(), ev.x(), self.width()) )
def mousePressEvent(self, event): if event.buttons() == Qt.LeftButton: ui.mediaPlayer.setPosition( QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()))
def mouseMoveEvent(self, event): if event.buttons() == Qt.LeftButton: self.setValue( QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()))
def mousePressEvent(self, event): progress = QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()) self.setValue(progress) self.should_change_video_position.emit(float(progress) / 1000.0)
def mouseMoveEvent(self, event): self.setValue( QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width())) self.sliderMoved.emit((event.x() / self.width()) * self.maximum())
def mousePressEvent(self, ev): """ Jump to click position """ value = QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), ev.y(), self.height(), True) self.setValue(value) self.change_volume(value)
def mousePressEvent(self, event): self.setValue(QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width())) self.sliderMoved.emit((event.x() / self.width()) * self.maximum())
def mousePressEvent(self, event): progress = QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()) self.setValue(progress) self.should_change_video_position.emit(float(progress) / 1000.0)
def mouseMoveEvent(self, ev): """ Jump to pointer position while moving """ value = QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), ev.y(), self.height(), True) self.setValue(value) self.change_volume(value)
def mousePressEvent(self, event): #Jump to click position pos = QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()) self.setValue(pos) self.mediaP.setPosition(pos)
def mouseMoveEvent(self, event): #Jump to pointer position while moving pos = QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()) self.setValue(pos) self.mediaP.setPosition(pos)
def mousePressEvent(self, ev): """ Jump to click position """ self.setValue(QStyle.sliderValueFromPosition( self.minimum(), self.maximum(), ev.x(), self.width()) )