def __init__(self, parent, player): super().__init__(parent) self.player = player self._position_update = False tool_font = QtWidgets.QApplication.font("QToolButton") self.progress_slider = ClickableSlider(self) self.progress_slider.setOrientation(QtCore.Qt.Horizontal) self.progress_slider.setEnabled(False) self.progress_slider.setMinimumWidth(30) self.progress_slider.setSingleStep(1000) self.progress_slider.setPageStep(3000) self.progress_slider.valueChanged.connect(self.on_value_changed) self.media_name_label = ElidedLabel(self) self.media_name_label.setAlignment(QtCore.Qt.AlignCenter) self.media_name_label.setFont(tool_font) slider_container = QtWidgets.QWidget(self) hbox = QtWidgets.QHBoxLayout(slider_container) hbox.setContentsMargins(0, 0, 0, 0) self.position_label = QtWidgets.QLabel("0:00", self) self.duration_label = QtWidgets.QLabel(format_time(0), self) min_duration_width = get_text_width(self.position_label.font(), "8:88") self.position_label.setMinimumWidth(min_duration_width) self.duration_label.setMinimumWidth(min_duration_width) self.position_label.setFont(tool_font) self.duration_label.setFont(tool_font) hbox.addWidget(self.position_label) hbox.addWidget(self.progress_slider) hbox.addWidget(self.duration_label) vbox = QtWidgets.QVBoxLayout(self) vbox.setSpacing(0) vbox.addWidget(slider_container) vbox.addWidget(self.media_name_label) self.player._player.durationChanged.connect(self.on_duration_changed) self.player._player.positionChanged.connect(self.on_position_changed) self.player._player.currentMediaChanged.connect(self.on_media_changed)
class PlaybackProgressSlider(QtWidgets.QWidget): def __init__(self, parent, player): super().__init__(parent) self.player = player self._position_update = False tool_font = QtWidgets.QApplication.font("QToolButton") self.progress_slider = ClickableSlider(self) self.progress_slider.setOrientation(QtCore.Qt.Horizontal) self.progress_slider.setEnabled(False) self.progress_slider.setMinimumWidth(30) self.progress_slider.setSingleStep(1000) self.progress_slider.setPageStep(3000) self.progress_slider.valueChanged.connect(self.on_value_changed) self.media_name_label = ElidedLabel(self) self.media_name_label.setAlignment(QtCore.Qt.AlignCenter) self.media_name_label.setFont(tool_font) slider_container = QtWidgets.QWidget(self) hbox = QtWidgets.QHBoxLayout(slider_container) hbox.setContentsMargins(0, 0, 0, 0) self.position_label = QtWidgets.QLabel("0:00", self) self.duration_label = QtWidgets.QLabel(format_time(0), self) min_duration_width = get_text_width(self.position_label.font(), "8:88") self.position_label.setMinimumWidth(min_duration_width) self.duration_label.setMinimumWidth(min_duration_width) self.position_label.setFont(tool_font) self.duration_label.setFont(tool_font) hbox.addWidget(self.position_label) hbox.addWidget(self.progress_slider) hbox.addWidget(self.duration_label) vbox = QtWidgets.QVBoxLayout(self) vbox.setSpacing(0) vbox.addWidget(slider_container) vbox.addWidget(self.media_name_label) self.player._player.durationChanged.connect(self.on_duration_changed) self.player._player.positionChanged.connect(self.on_position_changed) self.player._player.currentMediaChanged.connect(self.on_media_changed) def on_duration_changed(self, duration): self.progress_slider.setMaximum(duration) self.duration_label.setText(format_time(duration)) def on_position_changed(self, position): self._position_update = True self.progress_slider.setValue(position) self._position_update = False self.position_label.setText(format_time(position, display_zero=True)) def on_media_changed(self, media): if media.isNull(): self.progress_slider.setEnabled(False) else: url = media.canonicalUrl().toString() self.media_name_label.setText(os.path.basename(url)) self.progress_slider.setEnabled(True) def on_value_changed(self, value): if not self._position_update: # Avoid circular events self.player.set_position(value)