diff --git a/src/app.py b/src/app.py index 25fc0be..b82b952 100644 --- a/src/app.py +++ b/src/app.py @@ -379,8 +379,13 @@ class MainWindow(QMainWindow): if self.audio_output: self.audio_output.setVolume(value / 100.0) - def _on_user_seek_frac(self, frac: int): - self.player.setPosition(int(frac * self.player.duration())) + def _on_user_seek_frac(self, value: int): + duration = self.player.duration() + if duration <= 0: + return + new_pos = int(value / 1000.0 * duration) + new_pos = max(0, min(duration - 1, new_pos)) + self.player.setPosition(new_pos) def _on_player_position(self, position: int): duration = self.player.duration() diff --git a/src/ui/player_header.py b/src/ui/player_header.py index 0fd4fe9..45aa104 100644 --- a/src/ui/player_header.py +++ b/src/ui/player_header.py @@ -1,5 +1,5 @@ from PyQt6.QtWidgets import ( - QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QLabel, QSlider, QGroupBox, QStyle, + QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QLabel, QSlider, QGroupBox, QStyle, QProxyStyle, ) from PyQt6.QtCore import Qt, pyqtSignal from PyQt6.QtGui import QPixmap, QColor @@ -11,6 +11,13 @@ def _fmt_time(ms: int) -> str: return f"{m}:{s:02d}" +class JumpStyle(QProxyStyle): + def styleHint(self, hint, opt=None, widget=None, returnData=None): + if hint == QStyle.StyleHint.SH_Slider_AbsoluteSetButtons: + return Qt.MouseButton.LeftButton.value + return super().styleHint(hint, opt, widget, returnData) + + class PlayerHeader(QGroupBox): prev_requested = pyqtSignal() play_pause_requested = pyqtSignal() @@ -54,6 +61,7 @@ class PlayerHeader(QGroupBox): self.time_label_start.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) self.position_slider = QSlider(Qt.Orientation.Horizontal) + self.position_slider.setStyle(JumpStyle(self.position_slider.style())) self.position_slider.setMinimum(0) self.position_slider.setMaximum(1000) self.position_slider.setValue(0) @@ -95,8 +103,7 @@ class PlayerHeader(QGroupBox): layout.addLayout(now_playing_layout) def _on_slider_user_action(self): - frac = self.position_slider.value() / 1000.0 - self.position_changed_by_user.emit(int(frac)) + self.position_changed_by_user.emit(self.position_slider.value()) def set_cover(self, pixmap: QPixmap = None, tooltip: str = ""): if pixmap: