From 72930605db892bff478abbea3dc3b6b578490c23 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sun, 29 Dec 2024 14:32:32 +0000 Subject: [PATCH] Implement File|New to create from template (possibly empty) --- app/config.py | 1 + app/musicmuster.py | 140 ++++++++++++----- app/ui/main_window.ui | 17 ++- app/ui/main_window_ui.py | 319 ++++++++++----------------------------- 4 files changed, 191 insertions(+), 286 deletions(-) diff --git a/app/config.py b/app/config.py index 11c2f16..725a459 100644 --- a/app/config.py +++ b/app/config.py @@ -84,6 +84,7 @@ class Config(object): MILLISECOND_SIGFIGS = 0 MINIMUM_FUZZYMATCH = 60.0 MINIMUM_ROW_HEIGHT = 30 + NO_TEMPLATE_NAME = "None" NOTE_TIME_FORMAT = "%H:%M" OBS_HOST = "localhost" OBS_PASSWORD = "auster" diff --git a/app/musicmuster.py b/app/musicmuster.py index 760abae..8cc75a1 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # Standard library imports -from dataclasses import dataclass, field from slugify import slugify # type: ignore from typing import List, Optional import argparse @@ -29,14 +28,18 @@ from PyQt6.QtGui import ( ) from PyQt6.QtWidgets import ( QApplication, + QComboBox, QDialog, QFileDialog, + QHBoxLayout, QInputDialog, QLabel, QLineEdit, QListWidgetItem, QMainWindow, QMessageBox, + QPushButton, + QVBoxLayout, QWidget, ) @@ -84,7 +87,7 @@ class Current: base_model: PlaylistModel proxy_model: PlaylistProxyModel playlist_id: int = 0 - selected_rows: list[int] = field(default_factory=list) + selected_rows: list[int] = [] def __repr__(self): return ( @@ -250,6 +253,61 @@ class SelectPlaylistDialog(QDialog): self.accept() +class TemplateSelectorDialog(QDialog): + """ + Class to manage user selection of template + """ + + def __init__(self, templates: list[tuple[str, int]]) -> None: + super().__init__() + self.templates = templates + self.selected_id = None + + self.init_ui() + + def init_ui(self): + # Create label + label = QLabel("Select template:") + + # Create combo box + self.combo_box = QComboBox() + for text, id_ in self.templates: + self.combo_box.addItem(text, id_) + + # Create buttons + ok_button = QPushButton("OK") + cancel_button = QPushButton("Cancel") + + # Connect buttons + ok_button.clicked.connect(self.ok_clicked) + cancel_button.clicked.connect(self.cancel_clicked) + + # Layout setup + top_layout = QHBoxLayout() + top_layout.addWidget(label) + top_layout.addWidget(self.combo_box) + + bottom_layout = QHBoxLayout() + bottom_layout.addStretch() + bottom_layout.addWidget(ok_button) + bottom_layout.addWidget(cancel_button) + + main_layout = QVBoxLayout() + main_layout.addLayout(top_layout) + main_layout.addLayout(bottom_layout) + + self.setLayout(main_layout) + self.setWindowTitle("Template Selector") + + def ok_clicked(self): + self.selected_id = self.combo_box.currentData() + self.accept() + + def cancel_clicked(self): + self.selected_id = -1 + self.reject() + + class Window(QMainWindow, Ui_MainWindow): def __init__( self, parent: Optional[QWidget] = None, *args: list, **kwargs: dict @@ -459,8 +517,8 @@ class Window(QMainWindow, Ui_MainWindow): self.actionMark_for_moving.triggered.connect(self.mark_rows_for_moving) self.actionMoveSelected.triggered.connect(self.move_selected) self.actionMoveUnplayed.triggered.connect(self.move_unplayed) - self.actionNew_from_template.triggered.connect(self.new_from_template) - self.actionNewPlaylist.triggered.connect(self.create_and_show_playlist) + self.actionManage_templates.triggered.connect(self.manage_templates) + self.actionNewPlaylist.triggered.connect(self.new_playlist) self.actionOpenPlaylist.triggered.connect(self.open_playlist) self.actionPaste.triggered.connect(self.paste_rows) self.actionPlay_next.triggered.connect(self.play_next) @@ -514,36 +572,20 @@ class Window(QMainWindow, Ui_MainWindow): self.signals.search_songfacts_signal.connect(self.open_songfacts_browser) self.signals.search_wikipedia_signal.connect(self.open_wikipedia_browser) - def create_playlist( - self, session: Session, playlist_name: Optional[str] = None - ) -> Optional[Playlists]: + def create_playlist(self, session: Session, playlist_name: str) -> Optional[Playlists]: """Create new playlist""" log.debug(f"create_playlist({playlist_name=}") - playlist_name = self.solicit_playlist_name(session) - if not playlist_name: - return None playlist = Playlists(session, playlist_name) if playlist: - playlist.mark_open() - session.commit() return playlist else: - log.error("Failed to create playlist") + log.error(f"Failed to create playlist, {playlist_name=}") return None - def create_and_show_playlist(self) -> None: - """Create new playlist and display it""" - - with db.Session() as session: - playlist = self.create_playlist(session) - if playlist: - self.create_playlist_tab(playlist) - session.commit() - def create_playlist_tab(self, playlist: Playlists) -> int: """ Take the passed proxy model, create a playlist tab and @@ -911,31 +953,47 @@ class Window(QMainWindow, Ui_MainWindow): self.move_playlist_rows(unplayed_rows) self.disable_selection_timing = False - def new_from_template(self) -> None: - """Create new playlist from template""" + def new_playlist(self) -> None: + """ + Create new playlist, optionally from template + """ + + # Build a list of (template-name, playlist-id) tuples starting + # with the "no template" entry + template_list: list[tuple[str, int]] = [] + template_list.append((Config.NO_TEMPLATE_NAME, 0)) with db.Session() as session: - templates = Playlists.get_all_templates(session) - dlg = SelectPlaylistDialog(self, playlists=templates, session=session) - dlg.exec() - template = dlg.playlist - if template: - playlist_name = self.solicit_playlist_name(session) - if not playlist_name: - log.error("Template has no name") - return + for template in Playlists.get_all_templates(session): + template_list.append((template.name, template.id)) + + dlg = TemplateSelectorDialog(template_list) + if not dlg.exec(): + return # User cancelled + template_id = dlg.selected_id + + # Get a name for this new playlist + playlist_name = self.solicit_playlist_name(session) + if not playlist_name: + return + + # If template_id == 0, user doesn't want a template + if template_id == 0: + playlist = self.create_playlist(session, playlist_name) + else: playlist = Playlists.create_playlist_from_template( session, template, playlist_name ) - if playlist: - playlist.mark_open() - # Need to ensure that the new playlist is committed to - # the database before it is opened by the model. - session.commit() - self.create_playlist_tab(playlist) - else: - log.error("Playlist failed to create") + if playlist: + playlist.mark_open() + # Need to ensure that the new playlist is committed to + # the database before it is opened by the model. + session.commit() + idx = self.create_playlist_tab(playlist) + self.tabPlaylist.setCurrentIndex(idx) + else: + log.error("Playlist failed to create") def open_playlist(self) -> None: """Open existing playlist""" diff --git a/app/ui/main_window.ui b/app/ui/main_window.ui index e163844..a6dc827 100644 --- a/app/ui/main_window.ui +++ b/app/ui/main_window.ui @@ -997,14 +997,11 @@ padding-left: 8px; - + - - - @@ -1022,9 +1019,17 @@ padding-left: 8px; + + + Help + + + + + @@ -1299,9 +1304,9 @@ padding-left: 8px; Save as template... - + - New from template... + Manage templates... diff --git a/app/ui/main_window_ui.py b/app/ui/main_window_ui.py index 2427ed9..ddeace6 100644 --- a/app/ui/main_window_ui.py +++ b/app/ui/main_window_ui.py @@ -15,11 +15,7 @@ class Ui_MainWindow(object): MainWindow.resize(1280, 857) MainWindow.setMinimumSize(QtCore.QSize(1280, 0)) icon = QtGui.QIcon() - icon.addPixmap( - QtGui.QPixmap(":/icons/musicmuster"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon.addPixmap(QtGui.QPixmap(":/icons/musicmuster"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) MainWindow.setWindowIcon(icon) MainWindow.setStyleSheet("") self.centralwidget = QtWidgets.QWidget(parent=MainWindow) @@ -31,62 +27,39 @@ class Ui_MainWindow(object): self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") self.previous_track_2 = QtWidgets.QLabel(parent=self.centralwidget) - sizePolicy = QtWidgets.QSizePolicy( - QtWidgets.QSizePolicy.Policy.Preferred, - QtWidgets.QSizePolicy.Policy.Preferred, - ) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.previous_track_2.sizePolicy().hasHeightForWidth() - ) + sizePolicy.setHeightForWidth(self.previous_track_2.sizePolicy().hasHeightForWidth()) self.previous_track_2.setSizePolicy(sizePolicy) self.previous_track_2.setMaximumSize(QtCore.QSize(230, 16777215)) font = QtGui.QFont() font.setFamily("Sans") font.setPointSize(20) self.previous_track_2.setFont(font) - self.previous_track_2.setStyleSheet( - "background-color: #f8d7da;\n" "border: 1px solid rgb(85, 87, 83);" - ) - self.previous_track_2.setAlignment( - QtCore.Qt.AlignmentFlag.AlignRight - | QtCore.Qt.AlignmentFlag.AlignTrailing - | QtCore.Qt.AlignmentFlag.AlignVCenter - ) + self.previous_track_2.setStyleSheet("background-color: #f8d7da;\n" +"border: 1px solid rgb(85, 87, 83);") + self.previous_track_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter) self.previous_track_2.setObjectName("previous_track_2") self.verticalLayout_3.addWidget(self.previous_track_2) self.current_track_2 = QtWidgets.QLabel(parent=self.centralwidget) - sizePolicy = QtWidgets.QSizePolicy( - QtWidgets.QSizePolicy.Policy.Preferred, - QtWidgets.QSizePolicy.Policy.Preferred, - ) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.current_track_2.sizePolicy().hasHeightForWidth() - ) + sizePolicy.setHeightForWidth(self.current_track_2.sizePolicy().hasHeightForWidth()) self.current_track_2.setSizePolicy(sizePolicy) self.current_track_2.setMaximumSize(QtCore.QSize(230, 16777215)) font = QtGui.QFont() font.setFamily("Sans") font.setPointSize(20) self.current_track_2.setFont(font) - self.current_track_2.setStyleSheet( - "background-color: #d4edda;\n" "border: 1px solid rgb(85, 87, 83);" - ) - self.current_track_2.setAlignment( - QtCore.Qt.AlignmentFlag.AlignRight - | QtCore.Qt.AlignmentFlag.AlignTrailing - | QtCore.Qt.AlignmentFlag.AlignVCenter - ) + self.current_track_2.setStyleSheet("background-color: #d4edda;\n" +"border: 1px solid rgb(85, 87, 83);") + self.current_track_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter) self.current_track_2.setObjectName("current_track_2") self.verticalLayout_3.addWidget(self.current_track_2) self.next_track_2 = QtWidgets.QLabel(parent=self.centralwidget) - sizePolicy = QtWidgets.QSizePolicy( - QtWidgets.QSizePolicy.Policy.Preferred, - QtWidgets.QSizePolicy.Policy.Preferred, - ) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.next_track_2.sizePolicy().hasHeightForWidth()) @@ -96,29 +69,19 @@ class Ui_MainWindow(object): font.setFamily("Sans") font.setPointSize(20) self.next_track_2.setFont(font) - self.next_track_2.setStyleSheet( - "background-color: #fff3cd;\n" "border: 1px solid rgb(85, 87, 83);" - ) - self.next_track_2.setAlignment( - QtCore.Qt.AlignmentFlag.AlignRight - | QtCore.Qt.AlignmentFlag.AlignTrailing - | QtCore.Qt.AlignmentFlag.AlignVCenter - ) + self.next_track_2.setStyleSheet("background-color: #fff3cd;\n" +"border: 1px solid rgb(85, 87, 83);") + self.next_track_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter) self.next_track_2.setObjectName("next_track_2") self.verticalLayout_3.addWidget(self.next_track_2) self.horizontalLayout_3.addLayout(self.verticalLayout_3) self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.hdrPreviousTrack = QtWidgets.QLabel(parent=self.centralwidget) - sizePolicy = QtWidgets.QSizePolicy( - QtWidgets.QSizePolicy.Policy.Preferred, - QtWidgets.QSizePolicy.Policy.Preferred, - ) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.hdrPreviousTrack.sizePolicy().hasHeightForWidth() - ) + sizePolicy.setHeightForWidth(self.hdrPreviousTrack.sizePolicy().hasHeightForWidth()) self.hdrPreviousTrack.setSizePolicy(sizePolicy) self.hdrPreviousTrack.setMinimumSize(QtCore.QSize(0, 0)) self.hdrPreviousTrack.setMaximumSize(QtCore.QSize(16777215, 16777215)) @@ -126,43 +89,32 @@ class Ui_MainWindow(object): font.setFamily("Sans") font.setPointSize(20) self.hdrPreviousTrack.setFont(font) - self.hdrPreviousTrack.setStyleSheet( - "background-color: #f8d7da;\n" "border: 1px solid rgb(85, 87, 83);" - ) + self.hdrPreviousTrack.setStyleSheet("background-color: #f8d7da;\n" +"border: 1px solid rgb(85, 87, 83);") self.hdrPreviousTrack.setText("") self.hdrPreviousTrack.setWordWrap(False) self.hdrPreviousTrack.setObjectName("hdrPreviousTrack") self.verticalLayout.addWidget(self.hdrPreviousTrack) self.hdrCurrentTrack = QtWidgets.QPushButton(parent=self.centralwidget) - sizePolicy = QtWidgets.QSizePolicy( - QtWidgets.QSizePolicy.Policy.Preferred, - QtWidgets.QSizePolicy.Policy.Preferred, - ) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.hdrCurrentTrack.sizePolicy().hasHeightForWidth() - ) + sizePolicy.setHeightForWidth(self.hdrCurrentTrack.sizePolicy().hasHeightForWidth()) self.hdrCurrentTrack.setSizePolicy(sizePolicy) font = QtGui.QFont() font.setPointSize(20) self.hdrCurrentTrack.setFont(font) - self.hdrCurrentTrack.setStyleSheet( - "background-color: #d4edda;\n" - "border: 1px solid rgb(85, 87, 83);\n" - "text-align: left;\n" - "padding-left: 8px;\n" - "" - ) + self.hdrCurrentTrack.setStyleSheet("background-color: #d4edda;\n" +"border: 1px solid rgb(85, 87, 83);\n" +"text-align: left;\n" +"padding-left: 8px;\n" +"") self.hdrCurrentTrack.setText("") self.hdrCurrentTrack.setFlat(True) self.hdrCurrentTrack.setObjectName("hdrCurrentTrack") self.verticalLayout.addWidget(self.hdrCurrentTrack) self.hdrNextTrack = QtWidgets.QPushButton(parent=self.centralwidget) - sizePolicy = QtWidgets.QSizePolicy( - QtWidgets.QSizePolicy.Policy.Preferred, - QtWidgets.QSizePolicy.Policy.Preferred, - ) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.hdrNextTrack.sizePolicy().hasHeightForWidth()) @@ -170,12 +122,10 @@ class Ui_MainWindow(object): font = QtGui.QFont() font.setPointSize(20) self.hdrNextTrack.setFont(font) - self.hdrNextTrack.setStyleSheet( - "background-color: #fff3cd;\n" - "border: 1px solid rgb(85, 87, 83);\n" - "text-align: left;\n" - "padding-left: 8px;" - ) + self.hdrNextTrack.setStyleSheet("background-color: #fff3cd;\n" +"border: 1px solid rgb(85, 87, 83);\n" +"text-align: left;\n" +"padding-left: 8px;") self.hdrNextTrack.setText("") self.hdrNextTrack.setFlat(True) self.hdrNextTrack.setObjectName("hdrNextTrack") @@ -222,12 +172,7 @@ class Ui_MainWindow(object): self.cartsWidget.setObjectName("cartsWidget") self.horizontalLayout_Carts = QtWidgets.QHBoxLayout(self.cartsWidget) self.horizontalLayout_Carts.setObjectName("horizontalLayout_Carts") - spacerItem = QtWidgets.QSpacerItem( - 40, - 20, - QtWidgets.QSizePolicy.Policy.Expanding, - QtWidgets.QSizePolicy.Policy.Minimum, - ) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.horizontalLayout_Carts.addItem(spacerItem) self.gridLayout_4.addWidget(self.cartsWidget, 2, 0, 1, 1) self.frame_6 = QtWidgets.QFrame(parent=self.centralwidget) @@ -272,11 +217,7 @@ class Ui_MainWindow(object): self.btnPreview = QtWidgets.QPushButton(parent=self.FadeStopInfoFrame) self.btnPreview.setMinimumSize(QtCore.QSize(132, 41)) icon1 = QtGui.QIcon() - icon1.addPixmap( - QtGui.QPixmap(":/icons/headphones"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon1.addPixmap(QtGui.QPixmap(":/icons/headphones"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.btnPreview.setIcon(icon1) self.btnPreview.setIconSize(QtCore.QSize(30, 30)) self.btnPreview.setCheckable(True) @@ -298,16 +239,8 @@ class Ui_MainWindow(object): self.btnPreviewArm.setMaximumSize(QtCore.QSize(44, 23)) self.btnPreviewArm.setText("") icon2 = QtGui.QIcon() - icon2.addPixmap( - QtGui.QPixmap(":/icons/record-button.png"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) - icon2.addPixmap( - QtGui.QPixmap(":/icons/record-red-button.png"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.On, - ) + icon2.addPixmap(QtGui.QPixmap(":/icons/record-button.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon2.addPixmap(QtGui.QPixmap(":/icons/record-red-button.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.On) self.btnPreviewArm.setIcon(icon2) self.btnPreviewArm.setCheckable(True) self.btnPreviewArm.setObjectName("btnPreviewArm") @@ -328,16 +261,8 @@ class Ui_MainWindow(object): self.btnPreviewMark.setMaximumSize(QtCore.QSize(44, 23)) self.btnPreviewMark.setText("") icon3 = QtGui.QIcon() - icon3.addPixmap( - QtGui.QPixmap(":/icons/star.png"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.On, - ) - icon3.addPixmap( - QtGui.QPixmap(":/icons/star_empty.png"), - QtGui.QIcon.Mode.Disabled, - QtGui.QIcon.State.Off, - ) + icon3.addPixmap(QtGui.QPixmap(":/icons/star.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.On) + icon3.addPixmap(QtGui.QPixmap(":/icons/star_empty.png"), QtGui.QIcon.Mode.Disabled, QtGui.QIcon.State.Off) self.btnPreviewMark.setIcon(icon3) self.btnPreviewMark.setObjectName("btnPreviewMark") self.btnPreviewFwd = QtWidgets.QPushButton(parent=self.groupBoxIntroControls) @@ -438,15 +363,10 @@ class Ui_MainWindow(object): self.verticalLayout_7.addWidget(self.label_silent_timer) self.horizontalLayout.addWidget(self.frame_silent) self.widgetFadeVolume = PlotWidget(parent=self.InfoFooterFrame) - sizePolicy = QtWidgets.QSizePolicy( - QtWidgets.QSizePolicy.Policy.Preferred, - QtWidgets.QSizePolicy.Policy.Preferred, - ) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.widgetFadeVolume.sizePolicy().hasHeightForWidth() - ) + sizePolicy.setHeightForWidth(self.widgetFadeVolume.sizePolicy().hasHeightForWidth()) self.widgetFadeVolume.setSizePolicy(sizePolicy) self.widgetFadeVolume.setMinimumSize(QtCore.QSize(0, 0)) self.widgetFadeVolume.setObjectName("widgetFadeVolume") @@ -463,11 +383,7 @@ class Ui_MainWindow(object): self.btnFade.setMinimumSize(QtCore.QSize(132, 32)) self.btnFade.setMaximumSize(QtCore.QSize(164, 16777215)) icon4 = QtGui.QIcon() - icon4.addPixmap( - QtGui.QPixmap(":/icons/fade"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon4.addPixmap(QtGui.QPixmap(":/icons/fade"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.btnFade.setIcon(icon4) self.btnFade.setIconSize(QtCore.QSize(30, 30)) self.btnFade.setObjectName("btnFade") @@ -475,11 +391,7 @@ class Ui_MainWindow(object): self.btnStop = QtWidgets.QPushButton(parent=self.frame) self.btnStop.setMinimumSize(QtCore.QSize(0, 36)) icon5 = QtGui.QIcon() - icon5.addPixmap( - QtGui.QPixmap(":/icons/stopsign"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon5.addPixmap(QtGui.QPixmap(":/icons/stopsign"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.btnStop.setIcon(icon5) self.btnStop.setObjectName("btnStop") self.verticalLayout_5.addWidget(self.btnStop) @@ -495,6 +407,8 @@ class Ui_MainWindow(object): self.menuPlaylist.setObjectName("menuPlaylist") self.menuSearc_h = QtWidgets.QMenu(parent=self.menubar) self.menuSearc_h.setObjectName("menuSearc_h") + self.menuHelp = QtWidgets.QMenu(parent=self.menubar) + self.menuHelp.setObjectName("menuHelp") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) self.statusbar.setEnabled(True) @@ -503,71 +417,39 @@ class Ui_MainWindow(object): MainWindow.setStatusBar(self.statusbar) self.actionPlay_next = QtGui.QAction(parent=MainWindow) icon6 = QtGui.QIcon() - icon6.addPixmap( - QtGui.QPixmap("app/ui/../../../../../../.designer/backup/icon-play.png"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon6.addPixmap(QtGui.QPixmap("app/ui/../../../../../../.designer/backup/icon-play.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.actionPlay_next.setIcon(icon6) self.actionPlay_next.setObjectName("actionPlay_next") self.actionSkipToNext = QtGui.QAction(parent=MainWindow) icon7 = QtGui.QIcon() - icon7.addPixmap( - QtGui.QPixmap(":/icons/next"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon7.addPixmap(QtGui.QPixmap(":/icons/next"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.actionSkipToNext.setIcon(icon7) self.actionSkipToNext.setObjectName("actionSkipToNext") self.actionInsertTrack = QtGui.QAction(parent=MainWindow) icon8 = QtGui.QIcon() - icon8.addPixmap( - QtGui.QPixmap( - "app/ui/../../../../../../.designer/backup/icon_search_database.png" - ), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon8.addPixmap(QtGui.QPixmap("app/ui/../../../../../../.designer/backup/icon_search_database.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.actionInsertTrack.setIcon(icon8) self.actionInsertTrack.setObjectName("actionInsertTrack") self.actionAdd_file = QtGui.QAction(parent=MainWindow) icon9 = QtGui.QIcon() - icon9.addPixmap( - QtGui.QPixmap( - "app/ui/../../../../../../.designer/backup/icon_open_file.png" - ), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon9.addPixmap(QtGui.QPixmap("app/ui/../../../../../../.designer/backup/icon_open_file.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.actionAdd_file.setIcon(icon9) self.actionAdd_file.setObjectName("actionAdd_file") self.actionFade = QtGui.QAction(parent=MainWindow) icon10 = QtGui.QIcon() - icon10.addPixmap( - QtGui.QPixmap("app/ui/../../../../../../.designer/backup/icon-fade.png"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon10.addPixmap(QtGui.QPixmap("app/ui/../../../../../../.designer/backup/icon-fade.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.actionFade.setIcon(icon10) self.actionFade.setObjectName("actionFade") self.actionStop = QtGui.QAction(parent=MainWindow) icon11 = QtGui.QIcon() - icon11.addPixmap( - QtGui.QPixmap(":/icons/stop"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon11.addPixmap(QtGui.QPixmap(":/icons/stop"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.actionStop.setIcon(icon11) self.actionStop.setObjectName("actionStop") self.action_Clear_selection = QtGui.QAction(parent=MainWindow) self.action_Clear_selection.setObjectName("action_Clear_selection") self.action_Resume_previous = QtGui.QAction(parent=MainWindow) icon12 = QtGui.QIcon() - icon12.addPixmap( - QtGui.QPixmap(":/icons/previous"), - QtGui.QIcon.Mode.Normal, - QtGui.QIcon.State.Off, - ) + icon12.addPixmap(QtGui.QPixmap(":/icons/previous"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.action_Resume_previous.setIcon(icon12) self.action_Resume_previous.setObjectName("action_Resume_previous") self.actionE_xit = QtGui.QAction(parent=MainWindow) @@ -614,9 +496,7 @@ class Ui_MainWindow(object): self.actionImport = QtGui.QAction(parent=MainWindow) self.actionImport.setObjectName("actionImport") self.actionDownload_CSV_of_played_tracks = QtGui.QAction(parent=MainWindow) - self.actionDownload_CSV_of_played_tracks.setObjectName( - "actionDownload_CSV_of_played_tracks" - ) + self.actionDownload_CSV_of_played_tracks.setObjectName("actionDownload_CSV_of_played_tracks") self.actionSearch = QtGui.QAction(parent=MainWindow) self.actionSearch.setObjectName("actionSearch") self.actionInsertSectionHeader = QtGui.QAction(parent=MainWindow) @@ -631,8 +511,8 @@ class Ui_MainWindow(object): self.action_About.setObjectName("action_About") self.actionSave_as_template = QtGui.QAction(parent=MainWindow) self.actionSave_as_template.setObjectName("actionSave_as_template") - self.actionNew_from_template = QtGui.QAction(parent=MainWindow) - self.actionNew_from_template.setObjectName("actionNew_from_template") + self.actionManage_templates = QtGui.QAction(parent=MainWindow) + self.actionManage_templates.setObjectName("actionManage_templates") self.actionDebug = QtGui.QAction(parent=MainWindow) self.actionDebug.setObjectName("actionDebug") self.actionAdd_cart = QtGui.QAction(parent=MainWindow) @@ -644,13 +524,9 @@ class Ui_MainWindow(object): self.actionResume = QtGui.QAction(parent=MainWindow) self.actionResume.setObjectName("actionResume") self.actionSearch_title_in_Wikipedia = QtGui.QAction(parent=MainWindow) - self.actionSearch_title_in_Wikipedia.setObjectName( - "actionSearch_title_in_Wikipedia" - ) + self.actionSearch_title_in_Wikipedia.setObjectName("actionSearch_title_in_Wikipedia") self.actionSearch_title_in_Songfacts = QtGui.QAction(parent=MainWindow) - self.actionSearch_title_in_Songfacts.setObjectName( - "actionSearch_title_in_Songfacts" - ) + self.actionSearch_title_in_Songfacts.setObjectName("actionSearch_title_in_Songfacts") self.actionSelect_duplicate_rows = QtGui.QAction(parent=MainWindow) self.actionSelect_duplicate_rows.setObjectName("actionSelect_duplicate_rows") self.actionReplace_files = QtGui.QAction(parent=MainWindow) @@ -678,14 +554,11 @@ class Ui_MainWindow(object): self.menuPlaylist.addAction(self.actionRenamePlaylist) self.menuPlaylist.addAction(self.actionDeletePlaylist) self.menuPlaylist.addSeparator() - self.menuPlaylist.addAction(self.actionNew_from_template) self.menuPlaylist.addAction(self.actionSave_as_template) + self.menuPlaylist.addAction(self.actionManage_templates) self.menuPlaylist.addSeparator() self.menuPlaylist.addAction(self.actionReplace_files) self.menuPlaylist.addSeparator() - self.menuPlaylist.addAction(self.actionDebug) - self.menuPlaylist.addAction(self.action_About) - self.menuPlaylist.addSeparator() self.menuPlaylist.addAction(self.actionE_xit) self.menuSearc_h.addAction(self.actionSetNext) self.menuSearc_h.addAction(self.actionPlay_next) @@ -697,14 +570,17 @@ class Ui_MainWindow(object): self.menuSearc_h.addAction(self.actionSearch) self.menuSearc_h.addAction(self.actionSearch_title_in_Wikipedia) self.menuSearc_h.addAction(self.actionSearch_title_in_Songfacts) + self.menuHelp.addAction(self.action_About) + self.menuHelp.addAction(self.actionDebug) self.menubar.addAction(self.menuPlaylist.menuAction()) self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuSearc_h.menuAction()) + self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) self.tabPlaylist.setCurrentIndex(-1) self.tabInfolist.setCurrentIndex(-1) - self.actionE_xit.triggered.connect(MainWindow.close) # type: ignore + self.actionE_xit.triggered.connect(MainWindow.close) # type: ignore QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): @@ -733,6 +609,7 @@ class Ui_MainWindow(object): self.menuFile.setTitle(_translate("MainWindow", "&Playlist")) self.menuPlaylist.setTitle(_translate("MainWindow", "&File")) self.menuSearc_h.setTitle(_translate("MainWindow", "&Music")) + self.menuHelp.setTitle(_translate("MainWindow", "Help")) self.actionPlay_next.setText(_translate("MainWindow", "&Play next")) self.actionPlay_next.setShortcut(_translate("MainWindow", "Return")) self.actionSkipToNext.setText(_translate("MainWindow", "Skip to &next")) @@ -745,58 +622,38 @@ class Ui_MainWindow(object): self.actionFade.setShortcut(_translate("MainWindow", "Ctrl+Z")) self.actionStop.setText(_translate("MainWindow", "S&top")) self.actionStop.setShortcut(_translate("MainWindow", "Ctrl+Alt+S")) - self.action_Clear_selection.setText( - _translate("MainWindow", "Clear &selection") - ) + self.action_Clear_selection.setText(_translate("MainWindow", "Clear &selection")) self.action_Clear_selection.setShortcut(_translate("MainWindow", "Esc")) - self.action_Resume_previous.setText( - _translate("MainWindow", "&Resume previous") - ) + self.action_Resume_previous.setText(_translate("MainWindow", "&Resume previous")) self.actionE_xit.setText(_translate("MainWindow", "E&xit")) self.actionTest.setText(_translate("MainWindow", "&Test")) self.actionOpenPlaylist.setText(_translate("MainWindow", "O&pen...")) self.actionNewPlaylist.setText(_translate("MainWindow", "&New...")) self.actionTestFunction.setText(_translate("MainWindow", "&Test function")) - self.actionSkipToFade.setText( - _translate("MainWindow", "&Skip to start of fade") - ) + self.actionSkipToFade.setText(_translate("MainWindow", "&Skip to start of fade")) self.actionSkipToEnd.setText(_translate("MainWindow", "Skip to &end of track")) self.actionClosePlaylist.setText(_translate("MainWindow", "&Close")) self.actionRenamePlaylist.setText(_translate("MainWindow", "&Rename...")) self.actionDeletePlaylist.setText(_translate("MainWindow", "Dele&te...")) - self.actionMoveSelected.setText( - _translate("MainWindow", "Mo&ve selected tracks to...") - ) + self.actionMoveSelected.setText(_translate("MainWindow", "Mo&ve selected tracks to...")) self.actionExport_playlist.setText(_translate("MainWindow", "E&xport...")) self.actionSetNext.setText(_translate("MainWindow", "Set &next")) self.actionSetNext.setShortcut(_translate("MainWindow", "Ctrl+N")) - self.actionSelect_next_track.setText( - _translate("MainWindow", "Select next track") - ) + self.actionSelect_next_track.setText(_translate("MainWindow", "Select next track")) self.actionSelect_next_track.setShortcut(_translate("MainWindow", "J")) - self.actionSelect_previous_track.setText( - _translate("MainWindow", "Select previous track") - ) + self.actionSelect_previous_track.setText(_translate("MainWindow", "Select previous track")) self.actionSelect_previous_track.setShortcut(_translate("MainWindow", "K")) - self.actionSelect_played_tracks.setText( - _translate("MainWindow", "Select played tracks") - ) - self.actionMoveUnplayed.setText( - _translate("MainWindow", "Move &unplayed tracks to...") - ) + self.actionSelect_played_tracks.setText(_translate("MainWindow", "Select played tracks")) + self.actionMoveUnplayed.setText(_translate("MainWindow", "Move &unplayed tracks to...")) self.actionAdd_note.setText(_translate("MainWindow", "Add note...")) self.actionAdd_note.setShortcut(_translate("MainWindow", "Ctrl+T")) self.actionEnable_controls.setText(_translate("MainWindow", "Enable controls")) self.actionImport.setText(_translate("MainWindow", "Import track...")) self.actionImport.setShortcut(_translate("MainWindow", "Ctrl+Shift+I")) - self.actionDownload_CSV_of_played_tracks.setText( - _translate("MainWindow", "Download CSV of played tracks...") - ) + self.actionDownload_CSV_of_played_tracks.setText(_translate("MainWindow", "Download CSV of played tracks...")) self.actionSearch.setText(_translate("MainWindow", "Search...")) self.actionSearch.setShortcut(_translate("MainWindow", "/")) - self.actionInsertSectionHeader.setText( - _translate("MainWindow", "Insert §ion header...") - ) + self.actionInsertSectionHeader.setText(_translate("MainWindow", "Insert §ion header...")) self.actionInsertSectionHeader.setShortcut(_translate("MainWindow", "Ctrl+H")) self.actionRemove.setText(_translate("MainWindow", "&Remove track")) self.actionFind_next.setText(_translate("MainWindow", "Find next")) @@ -804,12 +661,8 @@ class Ui_MainWindow(object): self.actionFind_previous.setText(_translate("MainWindow", "Find previous")) self.actionFind_previous.setShortcut(_translate("MainWindow", "P")) self.action_About.setText(_translate("MainWindow", "&About")) - self.actionSave_as_template.setText( - _translate("MainWindow", "Save as template...") - ) - self.actionNew_from_template.setText( - _translate("MainWindow", "New from template...") - ) + self.actionSave_as_template.setText(_translate("MainWindow", "Save as template...")) + self.actionManage_templates.setText(_translate("MainWindow", "Manage templates...")) self.actionDebug.setText(_translate("MainWindow", "Debug")) self.actionAdd_cart.setText(_translate("MainWindow", "Edit cart &1...")) self.actionMark_for_moving.setText(_translate("MainWindow", "Mark for moving")) @@ -818,23 +671,11 @@ class Ui_MainWindow(object): self.actionPaste.setShortcut(_translate("MainWindow", "Ctrl+V")) self.actionResume.setText(_translate("MainWindow", "Resume")) self.actionResume.setShortcut(_translate("MainWindow", "Ctrl+R")) - self.actionSearch_title_in_Wikipedia.setText( - _translate("MainWindow", "Search title in Wikipedia") - ) - self.actionSearch_title_in_Wikipedia.setShortcut( - _translate("MainWindow", "Ctrl+W") - ) - self.actionSearch_title_in_Songfacts.setText( - _translate("MainWindow", "Search title in Songfacts") - ) - self.actionSearch_title_in_Songfacts.setShortcut( - _translate("MainWindow", "Ctrl+S") - ) - self.actionSelect_duplicate_rows.setText( - _translate("MainWindow", "Select duplicate rows...") - ) + self.actionSearch_title_in_Wikipedia.setText(_translate("MainWindow", "Search title in Wikipedia")) + self.actionSearch_title_in_Wikipedia.setShortcut(_translate("MainWindow", "Ctrl+W")) + self.actionSearch_title_in_Songfacts.setText(_translate("MainWindow", "Search title in Songfacts")) + self.actionSearch_title_in_Songfacts.setShortcut(_translate("MainWindow", "Ctrl+S")) + self.actionSelect_duplicate_rows.setText(_translate("MainWindow", "Select duplicate rows...")) self.actionReplace_files.setText(_translate("MainWindow", "Import files...")) - - -from infotabs import InfoTabs # type: ignore -from pyqtgraph import PlotWidget # type: ignore +from infotabs import InfoTabs +from pyqtgraph import PlotWidget