From 15ecae54cfcbfbddc1f79bf7118e1339215c879e Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Wed, 1 Nov 2023 07:49:40 +0000 Subject: [PATCH] Move MusicMusterSignals into helpers --- app/datastructures.py | 21 ------------------ app/dialogs.py | 13 ++++++----- app/helpers.py | 50 +++++++++++++++++++++++++++++-------------- app/musicmuster.py | 3 +-- app/playlistmodel.py | 2 +- app/playlists.py | 2 +- 6 files changed, 45 insertions(+), 46 deletions(-) delete mode 100644 app/datastructures.py diff --git a/app/datastructures.py b/app/datastructures.py deleted file mode 100644 index 70cffba..0000000 --- a/app/datastructures.py +++ /dev/null @@ -1,21 +0,0 @@ -from PyQt6.QtCore import pyqtSignal, QObject - -from helpers import singleton - - -@singleton -class MusicMusterSignals(QObject): - """ - Class for all MusicMuster signals. See: - - https://zetcode.com/gui/pyqt5/eventssignals/ - - https://stackoverflow.com/questions/62654525/ - emit-a-signal-from-another-class-to-main-class - and Singleton class at - https://refactoring.guru/design-patterns/singleton/python/example#example-0 - """ - - add_track_to_header_signal = pyqtSignal(int, int, int) - add_track_to_playlist_signal = pyqtSignal(int, int, int, str) - enable_escape_signal = pyqtSignal(bool) - set_next_track_signal = pyqtSignal(int, int) - span_cells_signal = pyqtSignal(int, int, int, int) diff --git a/app/dialogs.py b/app/dialogs.py index 8a515e1..3b3712b 100644 --- a/app/dialogs.py +++ b/app/dialogs.py @@ -2,9 +2,12 @@ from PyQt6.QtCore import QEvent, Qt from PyQt6.QtWidgets import QDialog, QListWidgetItem from typing import Optional -import helpers +from helpers import ( + get_relative_date, + ms_to_mmss, + MusicMusterSignals, +) -from datastructures import MusicMusterSignals from dbconfig import scoped_session from models import Settings, Tracks from ui.dlg_TrackSelect_ui import Ui_Dialog # type: ignore @@ -105,8 +108,8 @@ class TrackSelectDialog(QDialog): t = QListWidgetItem() track_text = ( f"{track.title} - {track.artist} " - f"[{helpers.ms_to_mmss(track.duration)}] " - f"({helpers.get_relative_date(last_played)})" + f"[{ms_to_mmss(track.duration)}] " + f"({get_relative_date(last_played)})" ) t.setText(track_text) t.setData(Qt.ItemDataRole.UserRole, track) @@ -161,7 +164,7 @@ class TrackSelectDialog(QDialog): last_played = last_playdate.lastplayed else: last_played = None - path_text = f"{track.path} ({helpers.get_relative_date(last_played)})" + path_text = f"{track.path} ({get_relative_date(last_played)})" self.ui.dbPath.setText(path_text) diff --git a/app/helpers.py b/app/helpers.py index fa7e214..0c9b369 100644 --- a/app/helpers.py +++ b/app/helpers.py @@ -14,11 +14,45 @@ from mutagen.flac import FLAC # type: ignore from mutagen.mp3 import MP3 # type: ignore from pydub import AudioSegment, effects from pydub.utils import mediainfo +from PyQt6.QtCore import pyqtSignal, QObject from PyQt6.QtWidgets import QMainWindow, QMessageBox # type: ignore from tinytag import TinyTag # type: ignore from typing import Any, Dict, Optional +def singleton(cls): + """ + Make a class a Singleton class (see + https://realpython.com/primer-on-python-decorators/#creating-singletons) + """ + + @functools.wraps(cls) + def wrapper_singleton(*args, **kwargs): + if not wrapper_singleton.instance: + wrapper_singleton.instance = cls(*args, **kwargs) + return wrapper_singleton.instance + + wrapper_singleton.instance = None + return wrapper_singleton + + +@singleton +class MusicMusterSignals(QObject): + """ + Class for all MusicMuster signals. See: + - https://zetcode.com/gui/pyqt5/eventssignals/ + - https://stackoverflow.com/questions/62654525/ + emit-a-signal-from-another-class-to-main-class + and Singleton class at + https://refactoring.guru/design-patterns/singleton/python/example#example-0 + """ + + add_track_to_header_signal = pyqtSignal(int, int, int) + add_track_to_playlist_signal = pyqtSignal(int, int, int, str) + enable_escape_signal = pyqtSignal(bool) + set_next_track_signal = pyqtSignal(int, int) + span_cells_signal = pyqtSignal(int, int, int, int) + def ask_yes_no(title: str, question: str, default_yes: bool = False) -> bool: """Ask question; return True for yes, False for no""" @@ -380,22 +414,6 @@ def show_warning(parent: QMainWindow, title: str, msg: str) -> None: QMessageBox.warning(parent, title, msg, buttons=QMessageBox.StandardButton.Cancel) -def singleton(cls): - """ - Make a class a Singleton class (see - https://realpython.com/primer-on-python-decorators/#creating-singletons) - """ - - @functools.wraps(cls) - def wrapper_singleton(*args, **kwargs): - if not wrapper_singleton.instance: - wrapper_singleton.instance = cls(*args, **kwargs) - return wrapper_singleton.instance - - wrapper_singleton.instance = None - return wrapper_singleton - - def trailing_silence( audio_segment: AudioSegment, silence_threshold: int = -50, diff --git a/app/musicmuster.py b/app/musicmuster.py index 0734d62..1bef710 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -69,7 +69,6 @@ import music from dialogs import TrackSelectDialog from models import Base, Carts, Playdates, PlaylistRows, Playlists, Settings, Tracks from config import Config -from datastructures import MusicMusterSignals from playlists import PlaylistTab from ui.dlg_cart_ui import Ui_DialogCartEdit # type: ignore from ui.dlg_SelectPlaylist_ui import Ui_dlgSelectPlaylist # type: ignore @@ -363,7 +362,7 @@ class Window(QMainWindow, Ui_MainWindow): self.timer10.start(10) self.timer500.start(500) self.timer1000.start(1000) - self.signals = MusicMusterSignals() + self.signals = helpers.MusicMusterSignals() self.connect_signals_slots() def about(self) -> None: diff --git a/app/playlistmodel.py b/app/playlistmodel.py index 8bc1996..f5b971b 100644 --- a/app/playlistmodel.py +++ b/app/playlistmodel.py @@ -16,10 +16,10 @@ from PyQt6.QtGui import ( ) from config import Config -from datastructures import MusicMusterSignals from dbconfig import scoped_session, Session from helpers import ( file_is_unreadable, + MusicMusterSignals, ) from log import log from models import PlaylistRows, Tracks diff --git a/app/playlists.py b/app/playlists.py index c86e5ee..5966035 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -35,7 +35,6 @@ from PyQt6.QtWidgets import ( QStyleOption, ) -from datastructures import MusicMusterSignals from dbconfig import Session, scoped_session from dialogs import TrackSelectDialog from config import Config @@ -44,6 +43,7 @@ from helpers import ( file_is_unreadable, get_relative_date, ms_to_mmss, + MusicMusterSignals, open_in_audacity, send_mail, set_track_metadata,