diff --git a/components/AudioVisualizer.py b/components/AudioVisualizer.py index 568b579..77a47a4 100644 --- a/components/AudioVisualizer.py +++ b/components/AudioVisualizer.py @@ -44,7 +44,7 @@ class AudioVisualizer(QtWidgets.QWidget): # Graphics plot # Make sure PlotWidget doesn't exceed album art height # Adjust to leave room for playback controls - self.PlotWidget.setFixedHeight(225) + self.PlotWidget.setFixedHeight(250) # x range self.PlotWidget.setXRange( 0, self.get_x_resolution(), padding=0 diff --git a/components/DebugWindow.py b/components/DebugWindow.py index 2110ff8..f3ec7f5 100644 --- a/components/DebugWindow.py +++ b/components/DebugWindow.py @@ -1,13 +1,15 @@ from collections.abc import Iterable from PyQt5.QtWidgets import ( + QAbstractScrollArea, QDialog, + QHeaderView, QPlainTextEdit, QTableWidget, QTableWidgetItem, QVBoxLayout, ) from pprint import pformat -from logging import debug +from logging import debug, error class DebugWindow(QDialog): @@ -27,29 +29,33 @@ class DebugWindow(QDialog): if isinstance(self.data, str): self.input_field = QPlainTextEdit(pformat(self.data)) layout.addWidget(self.input_field) - elif isinstance(self.data, list): - table = QTableWidget() - table.setRowCount(len(data)) - table.setColumnCount(len(data[0])) - for ri, row_data in enumerate(data): - for ci, item in enumerate(row_data): - table.setItem(ri, ci, QTableWidgetItem(str(item))) - layout.addWidget(table) - elif isinstance(self.data, dict): - # FIXME: i wanna grow....woah - try: - table = QTableWidget() - rows = max(len(value) for value in data.keys()) - table.setRowCount(rows) - table.setColumnCount(len(data)) - table.setHorizontalHeaderLabels(data.keys()) - for ci, (key, values) in enumerate(data.items()): - for ri, value in enumerate(values): - table.setItem(ri, ci, QTableWidgetItem(str(value))) + else: + table: QTableWidget = QTableWidget() + table.setSizeAdjustPolicy(QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) + table.horizontalHeader().setStretchLastSection(True) + table.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive) + if isinstance(self.data, list): + # big ol column + table.setRowCount(len(data)) + table.setColumnCount(1) + for i, item in enumerate(self.data): + table.setItem(i, 0, QTableWidgetItem(str(item))) layout.addWidget(table) - except Exception as e: - data = str(self.data) - self.input_field = QPlainTextEdit(pformat(data + "\n\n" + str(e))) - layout.addWidget(self.input_field) + elif isinstance(self.data, dict): + try: + # | TIT2 | title goes here | + # | TDRC | 2025-05-05 | + table.setRowCount(len(data.keys())) + table.setColumnCount(2) + table.setHorizontalHeaderLabels(['Tag', 'Value']) + for i, (k, v) in enumerate(data.items()): + table.setItem(i, 0, QTableWidgetItem(str(k))) + table.setItem(i, 1, QTableWidgetItem(str(v))) + layout.addWidget(table) + except Exception as e: + data = str(self.data) + self.input_field = QPlainTextEdit(pformat(data + "\n\n" + str(e))) + layout.addWidget(self.input_field) + error(f'Tried to load self.data as dict but could not. {e}') self.setLayout(layout) diff --git a/components/MusicTable.py b/components/MusicTable.py index d905062..368b6cb 100644 --- a/components/MusicTable.py +++ b/components/MusicTable.py @@ -221,7 +221,7 @@ class MusicTable(QTableView): menu.addAction(open_containing_folder_action) # view id3 tags (debug) view_id3_tags_debug = QAction("View ID3 tags (debug)", self) - view_id3_tags_debug.triggered.connect(self.show_id3_tags_debug_menu) + view_id3_tags_debug.triggered.connect(self.view_id3_tags_debug_menu) menu.addAction(view_id3_tags_debug) # delete song delete_action = QAction("Delete", self) @@ -292,7 +292,7 @@ class MusicTable(QTableView): if key == Qt.Key.Key_Space: self.toggle_play_pause() - elif key == Qt.Key.Key_Right: + if key == Qt.Key.Key_Right: index = self.currentIndex() new_index = self.model2.index(index.row(), index.column() + 1) if new_index.isValid(): @@ -565,7 +565,7 @@ class MusicTable(QTableView): path = "/".join(filepath) Popen(["xdg-open", path]) - def show_id3_tags_debug_menu(self): + def view_id3_tags_debug_menu(self): """Shows ID3 tags for a specific .mp3 file""" if self.get_selected_song_filepath() is not None: window = DebugWindow(dict(self.get_selected_song_metadata())) diff --git a/main.py b/main.py index 5df7fd5..9b1d700 100644 --- a/main.py +++ b/main.py @@ -248,8 +248,8 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow): ## CONNECTIONS # tableView - self.tableView.doubleClicked.connect(self.play_audio_file) - self.tableView.enterKey.connect(self.play_audio_file) + # self.tableView.doubleClicked.connect(self.play_audio_file) + # self.tableView.enterKey.connect(self.play_audio_file) self.tableView.playSignal.connect(self.play_audio_file) self.tableView.playPauseSignal.connect( self.on_play_clicked @@ -419,7 +419,7 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow): Start playback of `tableView.current_song_filepath` & moves playback slider """ if not filepath: - filepath = self.tableView.set_current_song_filepath() + filepath = self.tableView.get_current_song_filepath() # get metadata metadata = get_id3_tags(filepath)[0] # read the file diff --git a/ui.py b/ui.py index bbc717d..9157209 100644 --- a/ui.py +++ b/ui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'ui.ui' # -# Created by: PyQt5 UI code generator 5.15.11 +# Created by: PyQt5 UI code generator 5.15.10 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. @@ -45,15 +45,50 @@ class Ui_MainWindow(object): self.vLayoutSongDetails.setObjectName("vLayoutSongDetails") self.hLayoutHead.addLayout(self.vLayoutSongDetails) self.vLayoutPlaybackVisuals = QtWidgets.QVBoxLayout() - self.vLayoutPlaybackVisuals.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize) self.vLayoutPlaybackVisuals.setObjectName("vLayoutPlaybackVisuals") - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize) - self.horizontalLayout.setObjectName("horizontalLayout") + self.PlotWidget = PlotWidget(self.centralwidget) + self.PlotWidget.setObjectName("PlotWidget") + self.vLayoutPlaybackVisuals.addWidget(self.PlotWidget) + self.hLayoutHead.addLayout(self.vLayoutPlaybackVisuals) + self.hLayoutHead.setStretch(0, 1) + self.hLayoutHead.setStretch(2, 6) + self.verticalLayout.addLayout(self.hLayoutHead) + self.hLayoutMusicTable = QtWidgets.QHBoxLayout() + self.hLayoutMusicTable.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize) + self.hLayoutMusicTable.setContentsMargins(0, -1, 0, -1) + self.hLayoutMusicTable.setObjectName("hLayoutMusicTable") + self.playlistTreeView = PlaylistsPane(self.centralwidget) + self.playlistTreeView.setObjectName("playlistTreeView") + self.hLayoutMusicTable.addWidget(self.playlistTreeView) + self.tableView = MusicTable(self.centralwidget) + self.tableView.setObjectName("tableView") + self.hLayoutMusicTable.addWidget(self.tableView) + self.hLayoutMusicTable.setStretch(0, 2) + self.hLayoutMusicTable.setStretch(1, 10) + self.verticalLayout.addLayout(self.hLayoutMusicTable) + self.hLayoutCurrentSongDetails = QtWidgets.QHBoxLayout() + self.hLayoutCurrentSongDetails.setSpacing(6) + self.hLayoutCurrentSongDetails.setObjectName("hLayoutCurrentSongDetails") + self.hLayoutSongDetails = QtWidgets.QHBoxLayout() + self.hLayoutSongDetails.setObjectName("hLayoutSongDetails") + self.artistLabel = QtWidgets.QLabel(self.centralwidget) + self.artistLabel.setObjectName("artistLabel") + self.hLayoutSongDetails.addWidget(self.artistLabel) + self.titleLabel = QtWidgets.QLabel(self.centralwidget) + self.titleLabel.setObjectName("titleLabel") + self.hLayoutSongDetails.addWidget(self.titleLabel) + self.albumLabel = QtWidgets.QLabel(self.centralwidget) + self.albumLabel.setObjectName("albumLabel") + self.hLayoutSongDetails.addWidget(self.albumLabel) + self.hLayoutCurrentSongDetails.addLayout(self.hLayoutSongDetails) + self.verticalLayout.addLayout(self.hLayoutCurrentSongDetails) + self.hLayoutPlayback = QtWidgets.QHBoxLayout() + self.hLayoutPlayback.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize) + self.hLayoutPlayback.setObjectName("hLayoutPlayback") self.playbackSlider = QtWidgets.QSlider(self.centralwidget) self.playbackSlider.setOrientation(QtCore.Qt.Horizontal) self.playbackSlider.setObjectName("playbackSlider") - self.horizontalLayout.addWidget(self.playbackSlider) + self.hLayoutPlayback.addWidget(self.playbackSlider) self.timeHorizontalLayout2 = QtWidgets.QHBoxLayout() self.timeHorizontalLayout2.setObjectName("timeHorizontalLayout2") self.startTimeLabel = QtWidgets.QLabel(self.centralwidget) @@ -79,56 +114,26 @@ class Ui_MainWindow(object): self.endTimeLabel.setFont(font) self.endTimeLabel.setObjectName("endTimeLabel") self.timeHorizontalLayout2.addWidget(self.endTimeLabel) - self.horizontalLayout.addLayout(self.timeHorizontalLayout2) - self.speedSlider = QtWidgets.QSlider(self.centralwidget) - self.speedSlider.setMinimum(0) - self.speedSlider.setMaximum(100) - self.speedSlider.setSingleStep(1) - self.speedSlider.setProperty("value", 50) - self.speedSlider.setOrientation(QtCore.Qt.Horizontal) - self.speedSlider.setInvertedAppearance(False) - self.speedSlider.setTickPosition(QtWidgets.QSlider.TicksAbove) - self.speedSlider.setObjectName("speedSlider") - self.horizontalLayout.addWidget(self.speedSlider) - self.speedLabel = QtWidgets.QLabel(self.centralwidget) - font = QtGui.QFont() - font.setFamily("Monospace") - self.speedLabel.setFont(font) - self.speedLabel.setObjectName("speedLabel") - self.horizontalLayout.addWidget(self.speedLabel) - self.horizontalLayout.setStretch(0, 4) - self.horizontalLayout.setStretch(2, 4) - self.horizontalLayout.setStretch(3, 1) - self.vLayoutPlaybackVisuals.addLayout(self.horizontalLayout) - self.PlotWidget = PlotWidget(self.centralwidget) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Maximum) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.PlotWidget.sizePolicy().hasHeightForWidth()) - self.PlotWidget.setSizePolicy(sizePolicy) - self.PlotWidget.setMaximumSize(QtCore.QSize(16777215, 150)) - self.PlotWidget.setObjectName("PlotWidget") - self.vLayoutPlaybackVisuals.addWidget(self.PlotWidget) - self.hLayoutHead.addLayout(self.vLayoutPlaybackVisuals) - self.hLayoutHead.setStretch(0, 1) - self.hLayoutHead.setStretch(2, 6) - self.verticalLayout.addLayout(self.hLayoutHead) - self.hLayoutMusicTable = QtWidgets.QHBoxLayout() - self.hLayoutMusicTable.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize) - self.hLayoutMusicTable.setContentsMargins(0, -1, 0, -1) - self.hLayoutMusicTable.setObjectName("hLayoutMusicTable") - self.playlistTreeView = PlaylistsPane(self.centralwidget) - self.playlistTreeView.setObjectName("playlistTreeView") - self.hLayoutMusicTable.addWidget(self.playlistTreeView) - self.tableView = MusicTable(self.centralwidget) - self.tableView.setObjectName("tableView") - self.hLayoutMusicTable.addWidget(self.tableView) - self.hLayoutMusicTable.setStretch(0, 2) - self.hLayoutMusicTable.setStretch(1, 10) - self.verticalLayout.addLayout(self.hLayoutMusicTable) + self.hLayoutPlayback.addLayout(self.timeHorizontalLayout2) + self.hLayoutPlayback.setStretch(0, 4) + self.verticalLayout.addLayout(self.hLayoutPlayback) self.hLayoutControls = QtWidgets.QHBoxLayout() self.hLayoutControls.setSpacing(6) self.hLayoutControls.setObjectName("hLayoutControls") + self.hLayoutVolume = QtWidgets.QHBoxLayout() + self.hLayoutVolume.setObjectName("hLayoutVolume") + self.volumeLabel = QtWidgets.QLabel(self.centralwidget) + self.volumeLabel.setObjectName("volumeLabel") + self.hLayoutVolume.addWidget(self.volumeLabel) + self.volumeSlider = QtWidgets.QSlider(self.centralwidget) + self.volumeSlider.setMinimum(-1) + self.volumeSlider.setMaximum(101) + self.volumeSlider.setProperty("value", 50) + self.volumeSlider.setOrientation(QtCore.Qt.Horizontal) + self.volumeSlider.setTickPosition(QtWidgets.QSlider.TicksAbove) + self.volumeSlider.setObjectName("volumeSlider") + self.hLayoutVolume.addWidget(self.volumeSlider) + self.hLayoutControls.addLayout(self.hLayoutVolume) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.hLayoutControls.addItem(spacerItem) self.previousButton = QtWidgets.QPushButton(self.centralwidget) @@ -151,57 +156,36 @@ class Ui_MainWindow(object): self.hLayoutControls.addWidget(self.nextButton) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.hLayoutControls.addItem(spacerItem1) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.speedSlider = QtWidgets.QSlider(self.centralwidget) + self.speedSlider.setMinimum(0) + self.speedSlider.setMaximum(100) + self.speedSlider.setSingleStep(1) + self.speedSlider.setProperty("value", 50) + self.speedSlider.setOrientation(QtCore.Qt.Horizontal) + self.speedSlider.setInvertedAppearance(False) + self.speedSlider.setTickPosition(QtWidgets.QSlider.TicksAbove) + self.speedSlider.setObjectName("speedSlider") + self.horizontalLayout_2.addWidget(self.speedSlider) + self.speedLabel = QtWidgets.QLabel(self.centralwidget) + font = QtGui.QFont() + font.setFamily("Monospace") + self.speedLabel.setFont(font) + self.speedLabel.setObjectName("speedLabel") + self.horizontalLayout_2.addWidget(self.speedLabel) + self.hLayoutControls.addLayout(self.horizontalLayout_2) self.hLayoutControls.setStretch(0, 1) - self.hLayoutControls.setStretch(1, 2) - self.hLayoutControls.setStretch(2, 2) - self.hLayoutControls.setStretch(3, 2) + self.hLayoutControls.setStretch(2, 1) + self.hLayoutControls.setStretch(3, 1) self.hLayoutControls.setStretch(4, 1) + self.hLayoutControls.setStretch(6, 1) self.verticalLayout.addLayout(self.hLayoutControls) - self.hLayoutControls2 = QtWidgets.QHBoxLayout() - self.hLayoutControls2.setSpacing(6) - self.hLayoutControls2.setObjectName("hLayoutControls2") - self.hLayoutVolume = QtWidgets.QHBoxLayout() - self.hLayoutVolume.setObjectName("hLayoutVolume") - self.volumeLabel = QtWidgets.QLabel(self.centralwidget) - self.volumeLabel.setObjectName("volumeLabel") - self.hLayoutVolume.addWidget(self.volumeLabel) - self.volumeSlider = QtWidgets.QSlider(self.centralwidget) - self.volumeSlider.setMinimum(-1) - self.volumeSlider.setMaximum(101) - self.volumeSlider.setProperty("value", 50) - self.volumeSlider.setOrientation(QtCore.Qt.Horizontal) - self.volumeSlider.setTickPosition(QtWidgets.QSlider.TicksAbove) - self.volumeSlider.setObjectName("volumeSlider") - self.hLayoutVolume.addWidget(self.volumeSlider) - self.hLayoutControls2.addLayout(self.hLayoutVolume) - spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.hLayoutControls2.addItem(spacerItem2) - self.hLayoutSongDetails = QtWidgets.QHBoxLayout() - self.hLayoutSongDetails.setObjectName("hLayoutSongDetails") - self.artistLabel = QtWidgets.QLabel(self.centralwidget) - self.artistLabel.setObjectName("artistLabel") - self.hLayoutSongDetails.addWidget(self.artistLabel) - self.titleLabel = QtWidgets.QLabel(self.centralwidget) - self.titleLabel.setObjectName("titleLabel") - self.hLayoutSongDetails.addWidget(self.titleLabel) - self.albumLabel = QtWidgets.QLabel(self.centralwidget) - self.albumLabel.setObjectName("albumLabel") - self.hLayoutSongDetails.addWidget(self.albumLabel) - self.hLayoutControls2.addLayout(self.hLayoutSongDetails) - spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.hLayoutControls2.addItem(spacerItem3) - self.pushButton = QtWidgets.QPushButton(self.centralwidget) - self.pushButton.setObjectName("pushButton") - self.hLayoutControls2.addWidget(self.pushButton) - self.hLayoutControls2.setStretch(0, 1) - self.hLayoutControls2.setStretch(2, 5) - self.hLayoutControls2.setStretch(4, 1) - self.verticalLayout.addLayout(self.hLayoutControls2) self.verticalLayout_3.addLayout(self.verticalLayout) self.verticalLayout_3.setStretch(0, 20) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 1152, 21)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1152, 24)) self.menubar.setObjectName("menubar") self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile.setObjectName("menuFile") @@ -253,9 +237,8 @@ class Ui_MainWindow(object): self.startTimeLabel.setText(_translate("MainWindow", "00:00")) self.slashLabel.setText(_translate("MainWindow", "/")) self.endTimeLabel.setText(_translate("MainWindow", "00:00")) - self.speedLabel.setText(_translate("MainWindow", "1.00")) self.volumeLabel.setText(_translate("MainWindow", "50")) - self.pushButton.setText(_translate("MainWindow", "nothing")) + self.speedLabel.setText(_translate("MainWindow", "1.00")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuEdit.setTitle(_translate("MainWindow", "Edit")) self.menuView.setTitle(_translate("MainWindow", "View")) diff --git a/ui.ui b/ui.ui index 07cc826..625aec1 100644 --- a/ui.ui +++ b/ui.ui @@ -19,7 +19,7 @@ - + 6 @@ -65,120 +65,8 @@ - - QLayout::SetMaximumSize - - - - QLayout::SetMaximumSize - - - - - Qt::Horizontal - - - - - - - - - - Monospace - false - - - - 00:00 - - - - - - - - Monospace - false - - - - / - - - - - - - - Monospace - 75 - false - true - - - - 00:00 - - - - - - - - - 0 - - - 100 - - - 1 - - - 50 - - - Qt::Horizontal - - - false - - - QSlider::TicksAbove - - - - - - - - Monospace - - - - 1.00 - - - - - - - - - - 0 - 0 - - - - - 16777215 - 150 - - - + @@ -204,67 +92,86 @@ - + 6 - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 28 - - - - - - - - - 28 - - - - - - - - - 28 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - + + + + + + + + + + + - + + + QLayout::SetMaximumSize + + + + + Qt::Horizontal + + + + + + + + + + Monospace + false + + + + 00:00 + + + + + + + + Monospace + false + + + + / + + + + + + + + Monospace + 75 + false + true + + + + 00:00 + + + + + + + + + 6 @@ -312,17 +219,31 @@ - - - - - - - - - - - + + + + 28 + + + + + + + + + 28 + + + + + + + + + 28 + + + @@ -338,11 +259,45 @@ - - - nothing - - + + + + + 0 + + + 100 + + + 1 + + + 50 + + + Qt::Horizontal + + + false + + + QSlider::TicksAbove + + + + + + + + Monospace + + + + 1.00 + + + + @@ -356,7 +311,7 @@ 0 0 1152 - 21 + 24