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