From cd6d37497f5626758128ccb72f6767e90f9d6efb Mon Sep 17 00:00:00 2001 From: EKNr1 Date: Sat, 25 Jan 2025 16:02:03 +0100 Subject: [PATCH] OOPing it more: Removed gui_communication/track_control.py and the complete gui_communication directory. --- wobuzz/gui.py | 5 + wobuzz/gui_communication/__init__.py | 1 - wobuzz/gui_communication/gui_communication.py | 22 ---- wobuzz/gui_communication/track_control.py | 113 ------------------ wobuzz/main.py | 7 +- wobuzz/player/player.py | 18 +-- wobuzz/ui/main_window.py | 2 +- wobuzz/ui/track_control.py | 71 ++++++++++- wobuzz/ui/track_progress_slider.py | 43 ++++++- 9 files changed, 126 insertions(+), 156 deletions(-) delete mode 100644 wobuzz/gui_communication/__init__.py delete mode 100644 wobuzz/gui_communication/gui_communication.py delete mode 100644 wobuzz/gui_communication/track_control.py diff --git a/wobuzz/gui.py b/wobuzz/gui.py index 70500b1..e787724 100644 --- a/wobuzz/gui.py +++ b/wobuzz/gui.py @@ -11,6 +11,7 @@ class GUI: self.window = MainWindow(app) self.settings = self.window.settings + self.track_control = self.window.track_control self.window.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.app.library.main_library_dock) @@ -37,3 +38,7 @@ class GUI: def on_settings_change(self, key, value): self.settings.update_settings(key, value) + def on_track_change(self, previous_track, track): + self.track_control.on_track_change(previous_track, track) + self.app.library.on_track_change(previous_track, track) + diff --git a/wobuzz/gui_communication/__init__.py b/wobuzz/gui_communication/__init__.py deleted file mode 100644 index a93a4bf..0000000 --- a/wobuzz/gui_communication/__init__.py +++ /dev/null @@ -1 +0,0 @@ -#!/usr/bin/python3 diff --git a/wobuzz/gui_communication/gui_communication.py b/wobuzz/gui_communication/gui_communication.py deleted file mode 100644 index dd92456..0000000 --- a/wobuzz/gui_communication/gui_communication.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python3 - -from .track_control import TrackControl - - -class GUICommunication: - """ - Class handling events that are a bit more complex. - """ - - def __init__(self, app): - self.app = app - - self.track_control = TrackControl(self.app) - - def on_track_change(self, previous_track=None, track=None): - self.track_control.on_track_change(previous_track, track) - self.app.library.on_track_change(previous_track, track) - - def on_playstate_update(self): - self.track_control.on_playstate_update() - diff --git a/wobuzz/gui_communication/track_control.py b/wobuzz/gui_communication/track_control.py deleted file mode 100644 index ccfc04c..0000000 --- a/wobuzz/gui_communication/track_control.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/python3 - -from PyQt6.QtCore import QTimer -from PyQt6.QtGui import QIcon - -PROGRESS_UPDATE_RATE = 60 -PROGRESS_UPDATE_INTERVAL = 1000 // PROGRESS_UPDATE_RATE - - -class TrackControl: - """ - Handles events for the track_control widget. - """ - - def __init__(self, app): - self.app = app - self.track_control = self.app.gui.window.track_control - self.track_progress_slider = self.track_control.track_progress_slider - - self.play_icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart) - self.pause_icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause) - - self.progress_update_timer = QTimer() - self.progress_update_timer.timeout.connect(self.update_progress) - self.progress_update_timer.start(PROGRESS_UPDATE_INTERVAL) - - self.connect() - - self.on_track_change(None, None) - - def connect(self): - self.track_control.previous_button.triggered.connect(self.previous_track) - self.track_control.toggle_play_button.triggered.connect(self.toggle_playing) - self.track_control.stop_button.triggered.connect(self.stop) - self.track_control.next_button.triggered.connect(self.next_track) - - self.track_control.track_progress_slider.sliderReleased.connect(self.on_slider_release) - - def previous_track(self): - if self.app.player.current_playlist.has_tracks(): - self.app.player.previous_track() - - def stop(self): - if self.app.player.current_playlist.has_tracks(): - self.app.player.stop() - - def next_track(self): - if self.app.player.current_playlist.has_tracks(): - self.app.player.next_track() - - def on_slider_release(self): - if self.app.player.current_playlist.has_tracks(): - self.app.player.seek(self.track_control.track_progress_slider.value()) - - def on_track_change(self, previous_track, track): - if self.app.player.playing: - duration = 0 - - if track: - duration = track.duration - - self.track_control.track_progress_slider.setRange( - 0, - duration - ) - - self.track_control.track_length_indicator.setText(self.app.utils.format_time(duration)) - - self.update_progress() - - def update_progress(self): - if not self.track_progress_slider.dragged: - if self.app.player.playing: - remaining = self.app.player.track_progress.timer.remainingTime() - - if remaining == -1: - remaining = self.app.player.track_progress.remaining_time - - track_duration = self.app.player.current_playlist.current_track.duration - - progress = track_duration - remaining - - self.track_control.progress_indicator.setText(self.app.utils.format_time(progress)) - - self.track_control.track_progress_slider.setValue(progress) - - else: - self.track_control.progress_indicator.setText(self.app.utils.format_time(0)) - - self.track_control.track_progress_slider.setValue(0) - - def toggle_playing(self): - if self.app.player.playing and self.app.player.paused: # paused - self.app.player.unpause() - - elif self.app.player.playing: # playing - self.app.player.pause() - - elif self.app.player.current_playlist.has_tracks(): # stopped but tracks in the current playlist - self.app.player.start_playing() - - def on_playstate_update(self): - if self.app.player.playing: - if self.app.player.paused: - self.track_control.toggle_play_button.setIcon(self.play_icon) - - else: - self.track_control.toggle_play_button.setIcon(self.pause_icon) - - else: - self.track_control.toggle_play_button.setIcon(self.play_icon) - - diff --git a/wobuzz/main.py b/wobuzz/main.py index e14c8a8..0a7cfe8 100644 --- a/wobuzz/main.py +++ b/wobuzz/main.py @@ -8,7 +8,6 @@ from .utils import Utils from .player import Player from .library.library import Library from .gui import GUI -from .gui_communication.gui_communication import GUICommunication class Wobuzz: @@ -23,7 +22,11 @@ class Wobuzz: self.player = Player(self) self.library = Library(self) self.gui = GUI(self) - self.gui_communication = GUICommunication(self) + + self.post_init() + + def post_init(self): + self.gui.track_control.track_progress_slider.post_init() def on_settings_change(self, key, value): self.gui.on_settings_change(key, value) diff --git a/wobuzz/player/player.py b/wobuzz/player/player.py index 7a437a3..76db833 100644 --- a/wobuzz/player/player.py +++ b/wobuzz/player/player.py @@ -33,7 +33,7 @@ class Player: self.playing = True self.paused = False - self.app.gui_communication.on_playstate_update() + self.app.gui.track_control.on_playstate_update() def track_finished(self): if not self.current_playlist.on_last_track(): @@ -42,7 +42,7 @@ class Player: self.play() self.track_progress.start() - self.app.gui_communication.on_track_change(previous_track, self.current_playlist.current_track) + self.app.gui.on_track_change(previous_track, self.current_playlist.current_track) else: self.stop() @@ -54,9 +54,9 @@ class Player: self.play() self.track_progress.start() - self.app.gui_communication.on_track_change(None, self.current_playlist.current_track) + self.app.gui.on_track_change(None, self.current_playlist.current_track) - self.app.gui_communication.on_playstate_update() + self.app.gui.track_control.on_playstate_update() def play_track_in_playlist(self, track_index): self.stop() @@ -67,14 +67,14 @@ class Player: self.play() self.track_progress.start() - self.app.gui_communication.on_track_change(previous_track, self.current_playlist.current_track) + self.app.gui.on_track_change(previous_track, self.current_playlist.current_track) def pause(self): self.music_channel.pause() self.track_progress.pause() self.paused = True - self.app.gui_communication.on_playstate_update() + self.app.gui.track_control.on_playstate_update() def unpause(self): self.music_channel.unpause() @@ -83,7 +83,7 @@ class Player: self.playing = True self.paused = False - self.app.gui_communication.on_playstate_update() + self.app.gui.track_control.on_playstate_update() def next_track(self): if not self.current_playlist.on_last_track(): @@ -104,7 +104,7 @@ class Player: self.play() self.track_progress.start() - self.app.gui_communication.on_track_change(last_track, self.current_playlist.current_track) + self.app.gui.on_track_change(last_track, self.current_playlist.current_track) def stop(self): self.music_channel.stop() @@ -114,7 +114,7 @@ class Player: self.playing = False self.paused = False - self.app.gui_communication.on_playstate_update() + self.app.gui.track_control.on_playstate_update() def seek(self, position: int): self.music_channel.stop() diff --git a/wobuzz/ui/main_window.py b/wobuzz/ui/main_window.py index f86dba2..f8aa7ac 100644 --- a/wobuzz/ui/main_window.py +++ b/wobuzz/ui/main_window.py @@ -24,7 +24,7 @@ class MainWindow(QMainWindow): self.settings_action = self.edit_menu.addAction("&Settings") - self.track_control = TrackControl() + self.track_control = TrackControl(app) self.addToolBar(self.track_control) self.settings = Settings(app) diff --git a/wobuzz/ui/track_control.py b/wobuzz/ui/track_control.py index ca885ae..b30032b 100644 --- a/wobuzz/ui/track_control.py +++ b/wobuzz/ui/track_control.py @@ -1,20 +1,23 @@ #!/usr/bin/python3 -from PyQt6.QtCore import Qt from PyQt6.QtGui import QIcon from PyQt6.QtWidgets import QToolBar, QLabel from .track_progress_slider import TrackProgressSlider class TrackControl(QToolBar): - def __init__(self, parent=None): + def __init__(self, app, parent=None): super().__init__(parent) + self.app = app + + self.play_icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart) + self.pause_icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackPause) + icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaSkipBackward) self.previous_button = self.addAction(icon, "Previous") - icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart) - self.toggle_play_button = self.addAction(icon, "Play/Pause") + self.toggle_play_button = self.addAction(self.play_icon, "Play/Pause") icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStop) self.stop_button = self.addAction(icon, "Stop") @@ -25,9 +28,67 @@ class TrackControl(QToolBar): self.progress_indicator = QLabel("0:00") self.addWidget(self.progress_indicator) - self.track_progress_slider = TrackProgressSlider(Qt.Orientation.Horizontal, self) + self.track_progress_slider = TrackProgressSlider(app, self) self.addWidget(self.track_progress_slider) self.track_length_indicator = QLabel("0:00") self.addWidget(self.track_length_indicator) + self.connect() + self.on_track_change(None, None) + + def connect(self): + self.previous_button.triggered.connect(self.previous_track) + self.toggle_play_button.triggered.connect(self.toggle_playing) + self.stop_button.triggered.connect(self.stop) + self.next_button.triggered.connect(self.next_track) + + def previous_track(self): + if self.app.player.current_playlist.has_tracks(): + self.app.player.previous_track() + + def stop(self): + if self.app.player.current_playlist.has_tracks(): + self.app.player.stop() + + def next_track(self): + if self.app.player.current_playlist.has_tracks(): + self.app.player.next_track() + + def on_track_change(self, previous_track, track): + if self.app.player.playing: + duration = 0 + + if track: + duration = track.duration + + self.track_progress_slider.setRange( + 0, + duration + ) + + self.track_length_indicator.setText(self.app.utils.format_time(duration)) + + self.track_progress_slider.update_progress() + + def toggle_playing(self): + if self.app.player.playing and self.app.player.paused: # paused + self.app.player.unpause() + + elif self.app.player.playing: # playing + self.app.player.pause() + + elif self.app.player.current_playlist.has_tracks(): # stopped but tracks in the current playlist + self.app.player.start_playing() + + def on_playstate_update(self): + if self.app.player.playing: + if self.app.player.paused: + self.toggle_play_button.setIcon(self.play_icon) + + else: + self.toggle_play_button.setIcon(self.pause_icon) + + else: + self.toggle_play_button.setIcon(self.play_icon) + diff --git a/wobuzz/ui/track_progress_slider.py b/wobuzz/ui/track_progress_slider.py index d82f407..bc476d0 100644 --- a/wobuzz/ui/track_progress_slider.py +++ b/wobuzz/ui/track_progress_slider.py @@ -1,16 +1,26 @@ #!/usr/bin/python3 -from PyQt6.QtCore import Qt +from PyQt6.QtCore import Qt, QTimer from PyQt6.QtGui import QMouseEvent from PyQt6.QtWidgets import QSlider, QStyle, QStyleOptionSlider +PROGRESS_UPDATE_RATE = 60 +PROGRESS_UPDATE_INTERVAL = 1000 // PROGRESS_UPDATE_RATE + class TrackProgressSlider(QSlider): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, app, parent=None): + super().__init__(Qt.Orientation.Horizontal, parent) + + self.app = app + self.track_control = None self.dragged = False + self.progress_update_timer = QTimer() + self.progress_update_timer.timeout.connect(self.update_progress) + self.progress_update_timer.start(PROGRESS_UPDATE_INTERVAL) + option = QStyleOptionSlider() style = self.style() @@ -19,6 +29,9 @@ class TrackProgressSlider(QSlider): self.sliderPressed.connect(self.on_press) self.sliderReleased.connect(self.on_release) + def post_init(self): + self.track_control = self.app.gui.track_control + def mousePressEvent(self, event: QMouseEvent): # we need a custom press event bc. PyQt doesn't set the slider position when clicked if event.button() == Qt.MouseButton.LeftButton: @@ -44,3 +57,27 @@ class TrackProgressSlider(QSlider): def on_release(self): self.dragged = False + if self.app.player.current_playlist.has_tracks(): + self.app.player.seek(self.value()) + + def update_progress(self): + if not self.dragged: + if self.app.player.playing: + remaining = self.app.player.track_progress.timer.remainingTime() + + if remaining == -1: + remaining = self.app.player.track_progress.remaining_time + + track_duration = self.app.player.current_playlist.current_track.duration + + progress = track_duration - remaining + + self.track_control.progress_indicator.setText(self.app.utils.format_time(progress)) + + self.track_control.track_progress_slider.setValue(progress) + + else: + self.track_control.progress_indicator.setText(self.app.utils.format_time(0)) + + self.track_control.track_progress_slider.setValue(0) +