removed qt designer MusicTable widget properties, set them manually in widget constructor

This commit is contained in:
tsi-billypom 2025-03-26 10:38:36 -04:00
parent 9b5e635a6e
commit 696d0d2fb1
6 changed files with 37 additions and 58 deletions

View File

@ -17,6 +17,11 @@ install system packages
sudo apt install ffmpeg python3-pyqt5 virtualenv sudo apt install ffmpeg python3-pyqt5 virtualenv
``` ```
additional packages needed for wsl
```bash
sudo apt install gstreamer1.0-plugins-good
```
create environment create environment
```bash ```bash
cd musicpom cd musicpom
@ -51,9 +56,9 @@ config.ini db/
- ~~editable lyrics window~~ - ~~editable lyrics window~~
- ~~batch metadata changer (red highlight fields that have differing info)~~ - ~~batch metadata changer (red highlight fields that have differing info)~~
- ~~playlists~~ - ~~playlists~~
- ~~delete songs from library (del key || right-click delete)~~
- playlist autoexporting - playlist autoexporting
- fix table headers being resized and going out window bounds - fix table headers being resized and going out window bounds
- delete songs from library (del key || right-click delete)
- .wav, .ogg, .flac convertor - .wav, .ogg, .flac convertor
- FIXME: dbaccess is instantiated for every track being reorganized - FIXME: dbaccess is instantiated for every track being reorganized
- automatic "radio" based on artist or genre - automatic "radio" based on artist or genre

View File

@ -64,6 +64,7 @@ class MusicTable(QTableView):
def __init__(self, parent=None, application_window=None): def __init__(self, parent=None, application_window=None):
super().__init__(parent) super().__init__(parent)
self.application_window = application_window self.application_window = application_window
# needed a separate model to do certain actions
self.model2: QStandardItemModel = QStandardItemModel() self.model2: QStandardItemModel = QStandardItemModel()
self.setModel(self.model2) self.setModel(self.model2)
@ -108,11 +109,25 @@ class MusicTable(QTableView):
self.songChanged = None self.songChanged = None
self.selected_song_filepath = "" self.selected_song_filepath = ""
self.current_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() 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.setStretchLastSection(True)
self.horizontal_header.setSectionResizeMode(QHeaderView.Interactive) 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 # CONNECTIONS
self.clicked.connect(self.set_selected_song_filepath) self.clicked.connect(self.set_selected_song_filepath)
self.doubleClicked.connect(self.set_current_song_filepath) self.doubleClicked.connect(self.set_current_song_filepath)
@ -170,15 +185,17 @@ class MusicTable(QTableView):
elif order == 2: elif order == 2:
sort_orders.append(Qt.SortOrder.DescendingOrder) sort_orders.append(Qt.SortOrder.DescendingOrder)
# NOTE: # QTableView sorts need to happen in reverse order
# this is bad because sortByColumn calls a SELECT statement, # The primary sort column is the last column sorted.
# 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
for i in reversed(range(len(sort_orders))): for i in reversed(range(len(sort_orders))):
if sort_orders[i] is not None: if sort_orders[i] is not None:
debug(f"sorting column {i} by {sort_orders[i]}") debug(f"sorting column {i} by {sort_orders[i]}")
self.sortByColumn(i, 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_data_changed()
self.connect_layout_changed() self.connect_layout_changed()
@ -548,7 +565,8 @@ class MusicTable(QTableView):
self.playPauseSignal.emit() self.playPauseSignal.emit()
def add_files(self, files: list[str]) -> None: 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 - Drag & Drop song(s) on tableView
- File > Open > List of song(s) - File > Open > List of song(s)
""" """

View File

@ -437,7 +437,7 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
def speed_changed(self, rate: int) -> None: def speed_changed(self, rate: int) -> None:
"""Handles playback speed changes""" """Handles playback speed changes"""
self.player.setPlaybackRate(rate / 50) 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: def on_play_clicked(self) -> None:
"""Updates the Play & Pause buttons when clicked""" """Updates the Play & Pause buttons when clicked"""

14
ui.py
View File

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'ui.ui' # 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 # 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. # 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.playlistTreeView.setObjectName("playlistTreeView")
self.hLayoutMusicTable.addWidget(self.playlistTreeView) self.hLayoutMusicTable.addWidget(self.playlistTreeView)
self.tableView = MusicTable(self.centralwidget) 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.setObjectName("tableView")
self.tableView.verticalHeader().setVisible(False)
self.hLayoutMusicTable.addWidget(self.tableView) self.hLayoutMusicTable.addWidget(self.tableView)
self.hLayoutMusicTable.setStretch(0, 2) self.hLayoutMusicTable.setStretch(0, 2)
self.hLayoutMusicTable.setStretch(1, 10) self.hLayoutMusicTable.setStretch(1, 10)
@ -217,7 +208,7 @@ class Ui_MainWindow(object):
self.verticalLayout_3.setStretch(0, 20) self.verticalLayout_3.setStretch(0, 20)
MainWindow.setCentralWidget(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow) 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.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile") self.menuFile.setObjectName("menuFile")
@ -267,7 +258,6 @@ class Ui_MainWindow(object):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.artistLabel.setText(_translate("MainWindow", "artist")) self.artistLabel.setText(_translate("MainWindow", "artist"))
self.titleLabel.setText(_translate("MainWindow", "song title"))
self.albumLabel.setText(_translate("MainWindow", "album")) self.albumLabel.setText(_translate("MainWindow", "album"))
self.startTimeLabel.setText(_translate("MainWindow", "00:00")) self.startTimeLabel.setText(_translate("MainWindow", "00:00"))
self.slashLabel.setText(_translate("MainWindow", "/")) self.slashLabel.setText(_translate("MainWindow", "/"))

38
ui.ui
View File

@ -101,9 +101,6 @@
<pointsize>18</pointsize> <pointsize>18</pointsize>
</font> </font>
</property> </property>
<property name="text">
<string>song title</string>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@ -240,38 +237,7 @@
<widget class="PlaylistsPane" name="playlistTreeView"/> <widget class="PlaylistsPane" name="playlistTreeView"/>
</item> </item>
<item> <item>
<widget class="MusicTable" name="tableView"> <widget class="MusicTable" name="tableView"/>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::AnyKeyPressed|QAbstractItemView::EditKeyPressed</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
</item> </item>
</layout> </layout>
</item> </item>
@ -407,7 +373,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1152</width> <width>1152</width>
<height>41</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">

BIN
uwish.mp3 Normal file

Binary file not shown.