diff --git a/components/MusicTable.py b/components/MusicTable.py
index 8680b0f..b017d5d 100644
--- a/components/MusicTable.py
+++ b/components/MusicTable.py
@@ -105,6 +105,7 @@ class MusicTable(QTableView):
self.current_song_filepath = ""
self.horizontalHeader().setStretchLastSection(True)
self.horizontalHeader().setSectionResizeMode(QHeaderView.Interactive)
+ self.setSortingEnabled(False)
# self.horizontalHeader().setCascadingSectionResizes(True)
# CONNECTIONS
self.clicked.connect(self.set_selected_song_filepath)
@@ -132,6 +133,35 @@ class MusicTable(QTableView):
for i in range(self.model.columnCount() - 1):
self.setColumnWidth(i, int(table_view_column_widths[i]))
+ def sort_table_by_multiple_columns(self):
+ """
+ Sorts the data in QTableView (self) by multiple columns
+ as defined in config.ini
+ """
+ self.setSortingEnabled(False)
+ self.setSortingEnabled(True)
+ sort_orders = []
+ config_sort_orders: list[int] = [
+ int(x) for x in self.config["table"]["sort_orders"].split(",")
+ ]
+ print(f"config sort orders = {config_sort_orders}")
+ for order in config_sort_orders:
+ if order == 0:
+ sort_orders.append(None)
+ elif order == 1:
+ sort_orders.append(Qt.SortOrder.AscendingOrder)
+ elif order == 2:
+ sort_orders.append(Qt.SortOrder.DescendingOrder)
+
+ print(f"sort_orders = {sort_orders}")
+ for i, order in enumerate(sort_orders):
+ print(f"i = {i}, order = {order}")
+ if order is not None:
+ print(f"sorting column {i} by {order}")
+ self.sortByColumn(i, order)
+
+ self.model.layoutChanged.emit()
+
def resizeEvent(self, e: typing.Optional[QResizeEvent]) -> None:
"""Do something when the QTableView is resized"""
if e is None:
diff --git a/main.py b/main.py
index 2acc0a8..860a44d 100644
--- a/main.py
+++ b/main.py
@@ -211,6 +211,9 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
self.actionScanLibraries.triggered.connect(self.scan_libraries)
self.actionDeleteLibrary.triggered.connect(self.clear_database)
self.actionDeleteDatabase.triggered.connect(self.delete_database)
+ self.actionSortColumns.triggered.connect(
+ self.tableView.sort_table_by_multiple_columns
+ )
# QTableView
self.tableView.viewport().installEventFilter(
diff --git a/sample_config.ini b/sample_config.ini
index 4385409..c4b43e5 100644
--- a/sample_config.ini
+++ b/sample_config.ini
@@ -17,3 +17,4 @@ extensions = mp3,wav,ogg,flac
# Music table options
columns = title,artist,album,track_number,genre,codec,album_date,filepath
column_widths = 181,116,222,76,74,72,287,150
+sort_orders = None,Qt.AscendingOrder,Qt.AscendingOrder,Qt.AscendingOrder,None,None,None,None
diff --git a/ui.py b/ui.py
index 99ac7d5..b9e3067 100644
--- a/ui.py
+++ b/ui.py
@@ -181,6 +181,8 @@ class Ui_MainWindow(object):
self.actionScanLibraries.setObjectName("actionScanLibraries")
self.actionDeleteLibrary = QtWidgets.QAction(MainWindow)
self.actionDeleteLibrary.setObjectName("actionDeleteLibrary")
+ self.actionSortColumns = QtWidgets.QAction(MainWindow)
+ self.actionSortColumns.setObjectName("actionSortColumns")
self.actionOpenFiles = QtWidgets.QAction(MainWindow)
self.actionOpenFiles.setObjectName("actionOpenFiles")
self.actionDeleteDatabase = QtWidgets.QAction(MainWindow)
@@ -196,6 +198,7 @@ class Ui_MainWindow(object):
self.menuQuick_Actions.addAction(self.actionScanLibraries)
self.menuQuick_Actions.addAction(self.actionDeleteLibrary)
self.menuQuick_Actions.addAction(self.actionDeleteDatabase)
+ self.menuQuick_Actions.addAction(self.actionSortColumns)
self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuEdit.menuAction())
self.menubar.addAction(self.menuView.menuAction())
@@ -224,6 +227,7 @@ class Ui_MainWindow(object):
self.actionPreferences.setStatusTip(_translate("MainWindow", "Open preferences"))
self.actionScanLibraries.setText(_translate("MainWindow", "Scan libraries"))
self.actionDeleteLibrary.setText(_translate("MainWindow", "Delete Library"))
+ self.actionSortColumns.setText(_translate("MainWindow", "Sort Columns"))
self.actionOpenFiles.setText(_translate("MainWindow", "Open file(s)"))
self.actionDeleteDatabase.setText(_translate("MainWindow", "Delete Database"))
self.actionNewPlaylist.setText(_translate("MainWindow", "New playlist"))
diff --git a/ui.ui b/ui.ui
index 87c41a2..59a8a78 100644
--- a/ui.ui
+++ b/ui.ui
@@ -315,7 +315,8 @@
-
+
+
@@ -341,6 +342,11 @@
Delete Library
+
+
+ Sort Columns
+
+
Open file(s)
diff --git a/utils/create_blank_mp3.sh b/utils/create_blank_mp3.sh
index 942d9fc..7c6a759 100644
--- a/utils/create_blank_mp3.sh
+++ b/utils/create_blank_mp3.sh
@@ -1,2 +1,3 @@
#!/bin/bash
+# creates a 5 second long empty mp3 file
ffmpeg -f lavfi -i anullsrc=r=44100:cl=mono -t 5 -q:a 9 -acodec libmp3lame out.mp3