diff --git a/README.md b/README.md index 6a323d6..f24f445 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,11 @@ install system packages sudo apt install ffmpeg python3-pyqt5 virtualenv ``` +additional packages needed for wsl +```bash +sudo apt install gstreamer1.0-plugins-good +``` + create environment ```bash cd musicpom @@ -51,9 +56,9 @@ config.ini db/ - ~~editable lyrics window~~ - ~~batch metadata changer (red highlight fields that have differing info)~~ - ~~playlists~~ +- ~~delete songs from library (del key || right-click delete)~~ - playlist autoexporting - fix table headers being resized and going out window bounds -- delete songs from library (del key || right-click delete) - .wav, .ogg, .flac convertor - FIXME: dbaccess is instantiated for every track being reorganized - automatic "radio" based on artist or genre diff --git a/components/MusicTable.py b/components/MusicTable.py index 328a988..85b9597 100644 --- a/components/MusicTable.py +++ b/components/MusicTable.py @@ -64,6 +64,7 @@ class MusicTable(QTableView): def __init__(self, parent=None, application_window=None): super().__init__(parent) self.application_window = application_window + # needed a separate model to do certain actions self.model2: QStandardItemModel = QStandardItemModel() self.setModel(self.model2) @@ -108,11 +109,25 @@ class MusicTable(QTableView): self.songChanged = None self.selected_song_filepath = "" self.current_song_filepath = "" + self.current_item = None # track where cursor was last + + # Properties + self.setSortingEnabled(False) + self.setAcceptDrops(True) + self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + self.setEditTriggers(QAbstractItemView.EditTrigger.EditKeyPressed) + self.setAlternatingRowColors(True) + self.setSelectionMode(QAbstractItemView.ExtendedSelection) + self.setSelectionBehavior(QAbstractItemView.SelectRows) + self.setSortingEnabled(True) self.horizontal_header: QHeaderView = self.horizontalHeader() - assert self.horizontal_header is not None + assert self.horizontal_header is not None # i hate look at linting errors self.horizontal_header.setStretchLastSection(True) self.horizontal_header.setSectionResizeMode(QHeaderView.Interactive) - self.setSortingEnabled(False) + self.vertical_header: QHeaderView = self.verticalHeader() + assert self.vertical_header is not None + self.vertical_header.setVisible(False) + # CONNECTIONS self.clicked.connect(self.set_selected_song_filepath) self.doubleClicked.connect(self.set_current_song_filepath) @@ -170,15 +185,17 @@ class MusicTable(QTableView): elif order == 2: sort_orders.append(Qt.SortOrder.DescendingOrder) - # NOTE: - # this is bad because sortByColumn calls a SELECT statement, - # and will do this for as many sorts that are needed - # maybe not a huge deal for a small music application... - # `len(config_sort_orders)` number of SELECTs + # QTableView sorts need to happen in reverse order + # The primary sort column is the last column sorted. for i in reversed(range(len(sort_orders))): if sort_orders[i] is not None: debug(f"sorting column {i} by {sort_orders[i]}") self.sortByColumn(i, sort_orders[i]) + # WARNING: + # sortByColumn calls a SELECT statement, + # and will do this for as many sorts that are needed + # maybe not a huge deal for a small music application... + # `len(config_sort_orders)` number of SELECTs self.connect_data_changed() self.connect_layout_changed() @@ -548,7 +565,8 @@ class MusicTable(QTableView): self.playPauseSignal.emit() def add_files(self, files: list[str]) -> None: - """Spawns a worker thread - adds a list of filepaths to the library + """ + Spawns a worker thread - adds a list of filepaths to the library - Drag & Drop song(s) on tableView - File > Open > List of song(s) """ diff --git a/main.py b/main.py index a088c8e..69bfaab 100644 --- a/main.py +++ b/main.py @@ -437,7 +437,7 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow): def speed_changed(self, rate: int) -> None: """Handles playback speed changes""" self.player.setPlaybackRate(rate / 50) - self.speedLabel.setText(str(round(rate / 50, 2))) + self.speedLabel.setText("{:.2f}".format(rate / 50)) def on_play_clicked(self) -> None: """Updates the Play & Pause buttons when clicked""" diff --git a/ui.py b/ui.py index b8bec99..490675b 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.10 +# Created by: PyQt5 UI code generator 5.15.11 # # 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. @@ -143,16 +143,7 @@ class Ui_MainWindow(object): self.playlistTreeView.setObjectName("playlistTreeView") self.hLayoutMusicTable.addWidget(self.playlistTreeView) self.tableView = MusicTable(self.centralwidget) - self.tableView.setMaximumSize(QtCore.QSize(16777215, 16777215)) - self.tableView.setAcceptDrops(True) - self.tableView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.tableView.setEditTriggers(QtWidgets.QAbstractItemView.AnyKeyPressed|QtWidgets.QAbstractItemView.EditKeyPressed) - self.tableView.setAlternatingRowColors(True) - self.tableView.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) - self.tableView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) - self.tableView.setSortingEnabled(True) self.tableView.setObjectName("tableView") - self.tableView.verticalHeader().setVisible(False) self.hLayoutMusicTable.addWidget(self.tableView) self.hLayoutMusicTable.setStretch(0, 2) self.hLayoutMusicTable.setStretch(1, 10) @@ -217,7 +208,7 @@ class Ui_MainWindow(object): self.verticalLayout_3.setStretch(0, 20) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 1152, 41)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1152, 21)) self.menubar.setObjectName("menubar") self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile.setObjectName("menuFile") @@ -267,7 +258,6 @@ class Ui_MainWindow(object): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.artistLabel.setText(_translate("MainWindow", "artist")) - self.titleLabel.setText(_translate("MainWindow", "song title")) self.albumLabel.setText(_translate("MainWindow", "album")) self.startTimeLabel.setText(_translate("MainWindow", "00:00")) self.slashLabel.setText(_translate("MainWindow", "/")) diff --git a/ui.ui b/ui.ui index 8aee79c..400cd41 100644 --- a/ui.ui +++ b/ui.ui @@ -101,9 +101,6 @@ 18 - - song title - @@ -240,38 +237,7 @@ - - - - 16777215 - 16777215 - - - - true - - - Qt::ScrollBarAlwaysOff - - - QAbstractItemView::AnyKeyPressed|QAbstractItemView::EditKeyPressed - - - true - - - QAbstractItemView::ExtendedSelection - - - QAbstractItemView::SelectRows - - - true - - - false - - + @@ -407,7 +373,7 @@ 0 0 1152 - 41 + 21 diff --git a/uwish.mp3 b/uwish.mp3 new file mode 100644 index 0000000..e34258b Binary files /dev/null and b/uwish.mp3 differ