OOPing it more: Removed gui_communication/track_control.py and the complete gui_communication directory.

This commit is contained in:
The Wobbler 2025-01-25 16:02:03 +01:00
parent 07e53ef2e7
commit cd6d37497f
9 changed files with 126 additions and 156 deletions

View file

@ -11,6 +11,7 @@ class GUI:
self.window = MainWindow(app) self.window = MainWindow(app)
self.settings = self.window.settings self.settings = self.window.settings
self.track_control = self.window.track_control
self.window.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.app.library.main_library_dock) 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): def on_settings_change(self, key, value):
self.settings.update_settings(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)

View file

@ -1 +0,0 @@
#!/usr/bin/python3

View file

@ -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()

View file

@ -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)

View file

@ -8,7 +8,6 @@ from .utils import Utils
from .player import Player from .player import Player
from .library.library import Library from .library.library import Library
from .gui import GUI from .gui import GUI
from .gui_communication.gui_communication import GUICommunication
class Wobuzz: class Wobuzz:
@ -23,7 +22,11 @@ class Wobuzz:
self.player = Player(self) self.player = Player(self)
self.library = Library(self) self.library = Library(self)
self.gui = GUI(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): def on_settings_change(self, key, value):
self.gui.on_settings_change(key, value) self.gui.on_settings_change(key, value)

View file

@ -33,7 +33,7 @@ class Player:
self.playing = True self.playing = True
self.paused = False self.paused = False
self.app.gui_communication.on_playstate_update() self.app.gui.track_control.on_playstate_update()
def track_finished(self): def track_finished(self):
if not self.current_playlist.on_last_track(): if not self.current_playlist.on_last_track():
@ -42,7 +42,7 @@ class Player:
self.play() self.play()
self.track_progress.start() 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: else:
self.stop() self.stop()
@ -54,9 +54,9 @@ class Player:
self.play() self.play()
self.track_progress.start() 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): def play_track_in_playlist(self, track_index):
self.stop() self.stop()
@ -67,14 +67,14 @@ class Player:
self.play() self.play()
self.track_progress.start() 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): def pause(self):
self.music_channel.pause() self.music_channel.pause()
self.track_progress.pause() self.track_progress.pause()
self.paused = True self.paused = True
self.app.gui_communication.on_playstate_update() self.app.gui.track_control.on_playstate_update()
def unpause(self): def unpause(self):
self.music_channel.unpause() self.music_channel.unpause()
@ -83,7 +83,7 @@ class Player:
self.playing = True self.playing = True
self.paused = False self.paused = False
self.app.gui_communication.on_playstate_update() self.app.gui.track_control.on_playstate_update()
def next_track(self): def next_track(self):
if not self.current_playlist.on_last_track(): if not self.current_playlist.on_last_track():
@ -104,7 +104,7 @@ class Player:
self.play() self.play()
self.track_progress.start() 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): def stop(self):
self.music_channel.stop() self.music_channel.stop()
@ -114,7 +114,7 @@ class Player:
self.playing = False self.playing = False
self.paused = False self.paused = False
self.app.gui_communication.on_playstate_update() self.app.gui.track_control.on_playstate_update()
def seek(self, position: int): def seek(self, position: int):
self.music_channel.stop() self.music_channel.stop()

View file

@ -24,7 +24,7 @@ class MainWindow(QMainWindow):
self.settings_action = self.edit_menu.addAction("&Settings") self.settings_action = self.edit_menu.addAction("&Settings")
self.track_control = TrackControl() self.track_control = TrackControl(app)
self.addToolBar(self.track_control) self.addToolBar(self.track_control)
self.settings = Settings(app) self.settings = Settings(app)

View file

@ -1,20 +1,23 @@
#!/usr/bin/python3 #!/usr/bin/python3
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QIcon from PyQt6.QtGui import QIcon
from PyQt6.QtWidgets import QToolBar, QLabel from PyQt6.QtWidgets import QToolBar, QLabel
from .track_progress_slider import TrackProgressSlider from .track_progress_slider import TrackProgressSlider
class TrackControl(QToolBar): class TrackControl(QToolBar):
def __init__(self, parent=None): def __init__(self, app, parent=None):
super().__init__(parent) 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) icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaSkipBackward)
self.previous_button = self.addAction(icon, "Previous") self.previous_button = self.addAction(icon, "Previous")
icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart) self.toggle_play_button = self.addAction(self.play_icon, "Play/Pause")
self.toggle_play_button = self.addAction(icon, "Play/Pause")
icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStop) icon = QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStop)
self.stop_button = self.addAction(icon, "Stop") self.stop_button = self.addAction(icon, "Stop")
@ -25,9 +28,67 @@ class TrackControl(QToolBar):
self.progress_indicator = QLabel("0:00") self.progress_indicator = QLabel("0:00")
self.addWidget(self.progress_indicator) 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.addWidget(self.track_progress_slider)
self.track_length_indicator = QLabel("0:00") self.track_length_indicator = QLabel("0:00")
self.addWidget(self.track_length_indicator) 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)

View file

@ -1,16 +1,26 @@
#!/usr/bin/python3 #!/usr/bin/python3
from PyQt6.QtCore import Qt from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtGui import QMouseEvent from PyQt6.QtGui import QMouseEvent
from PyQt6.QtWidgets import QSlider, QStyle, QStyleOptionSlider from PyQt6.QtWidgets import QSlider, QStyle, QStyleOptionSlider
PROGRESS_UPDATE_RATE = 60
PROGRESS_UPDATE_INTERVAL = 1000 // PROGRESS_UPDATE_RATE
class TrackProgressSlider(QSlider): class TrackProgressSlider(QSlider):
def __init__(self, *args, **kwargs): def __init__(self, app, parent=None):
super().__init__(*args, **kwargs) super().__init__(Qt.Orientation.Horizontal, parent)
self.app = app
self.track_control = None
self.dragged = False 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() option = QStyleOptionSlider()
style = self.style() style = self.style()
@ -19,6 +29,9 @@ class TrackProgressSlider(QSlider):
self.sliderPressed.connect(self.on_press) self.sliderPressed.connect(self.on_press)
self.sliderReleased.connect(self.on_release) self.sliderReleased.connect(self.on_release)
def post_init(self):
self.track_control = self.app.gui.track_control
def mousePressEvent(self, event: QMouseEvent): def mousePressEvent(self, event: QMouseEvent):
# we need a custom press event bc. PyQt doesn't set the slider position when clicked # we need a custom press event bc. PyQt doesn't set the slider position when clicked
if event.button() == Qt.MouseButton.LeftButton: if event.button() == Qt.MouseButton.LeftButton:
@ -44,3 +57,27 @@ class TrackProgressSlider(QSlider):
def on_release(self): def on_release(self):
self.dragged = False 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)