better best gooder and great

This commit is contained in:
billy 2025-10-04 18:14:18 -04:00
parent 753117dacc
commit 80dd2df74b
3 changed files with 79 additions and 60 deletions

View File

@ -15,7 +15,7 @@ class EditPlaylistOptionsWindow(QDialog):
def __init__(self, playlist_id):
super(EditPlaylistOptionsWindow, self).__init__()
self.setWindowTitle("Playlist options")
# self.setMinimumSize(600, 400)
self.setMinimumSize(800, 200)
self.playlist_id = playlist_id
# self.playlist_path_prefix: str = self.config.get(
# "settings", "playlist_path_prefix"

View File

@ -82,7 +82,6 @@ class MusicTable(QTableView):
/ "config.ini"
)
_ = self.config.read(self.cfg_file)
debug(f"music table config: {self.config}")
# NOTE:
# QTableView model2 = QSortFilterProxyModel(QStandardItemModel)
@ -179,10 +178,10 @@ class MusicTable(QTableView):
def showEvent(self, a0):
# Restore scroll position
super().showEvent(a0)
# widths = []
# for _ in self.saved_column_ratios:
# widths.append('0.001')
# self.load_header_widths(widths)
widths = []
for _ in self.saved_column_ratios:
widths.append('0.001')
self.load_header_widths(widths)
QTimer.singleShot(0, lambda: self.load_header_widths(self.saved_column_ratios))
def paintEvent(self, e):
@ -261,7 +260,6 @@ class MusicTable(QTableView):
if e is None:
return
data = e.mimeData()
debug("dropEvent")
if data and data.hasUrls():
directories: list[str] = []
files: list[str] = []
@ -357,7 +355,6 @@ class MusicTable(QTableView):
return QModelIndex() # Invalid index if not found
def on_sort(self):
debug("on_sort")
self.find_current_and_selected_bits()
self.jump_to_selected_song()
self.sortSignal.emit()
@ -378,27 +375,27 @@ class MusicTable(QTableView):
pass
# https://stackoverflow.com/questions/46775438/how-to-limit-qheaderview-size-when-resizing-sections
col_count = self.model2.columnCount()
qtableview_width = self.size().width()
sum_of_cols = self.horizontal_header.length()
# debug(f'qtable_width: {qtableview_width}')
# debug(f'sum of cols: {sum_of_cols}')
if sum_of_cols != qtableview_width: # check for discrepancy
if logicalIndex < col_count: # if not the last header
next_header_size = self.horizontal_header.sectionSize(logicalIndex + 1)
if next_header_size > (sum_of_cols - qtableview_width): # if it should shrink
self.horizontal_header.resizeSection(
logicalIndex + 1,
next_header_size - (sum_of_cols - qtableview_width),
) # shrink it
else:
self.horizontal_header.resizeSection(logicalIndex, oldSize) # block the resize
# col_count = self.model2.columnCount()
# qtableview_width = self.size().width()
# sum_of_cols = self.horizontal_header.length()
# # debug(f'qtable_width: {qtableview_width}')
# # debug(f'sum of cols: {sum_of_cols}')
#
# if sum_of_cols != qtableview_width: # check for discrepancy
# if logicalIndex < col_count: # if not the last header
# next_header_size = self.horizontal_header.sectionSize(logicalIndex + 1)
# if next_header_size > (sum_of_cols - qtableview_width): # if it should shrink
# self.horizontal_header.resizeSection(
# logicalIndex + 1,
# next_header_size - (sum_of_cols - qtableview_width),
# ) # shrink it
# else:
# self.horizontal_header.resizeSection(logicalIndex, oldSize) # block the resize
def on_cell_data_changed(self, topLeft: QModelIndex, bottomRight: QModelIndex):
"""Handles updating ID3 tags when data changes in a cell"""
# if isinstance(self.model2, QStandardItemModel):
debug("on_cell_data_changed")
# debug("on_cell_data_changed")
# get the ID of the row that was edited
id_index = self.model2.index(topLeft.row(), 0)
# get the db song_id from the row
@ -408,7 +405,7 @@ class MusicTable(QTableView):
# update the ID3 information
user_input_data: str = topLeft.data()
edited_column_name: str = self.headers.db_list[topLeft.column()]
debug(f"on_cell_data_changed | edited column name: {edited_column_name}")
# debug(f"on_cell_data_changed | edited column name: {edited_column_name}")
response = set_tag(
filepath=filepath,
db_column=edited_column_name,
@ -465,7 +462,8 @@ class MusicTable(QTableView):
"""
total_table_width = self.size().width()
column_ratios = []
for i in range(self.model2.columnCount() - 1):
for i in range(self.model2.columnCount()):
# for i in range(self.model2.columnCount() - 1):
column_width = self.columnWidth(i)
ratio = column_width / total_table_width
column_ratios.append(str(round(ratio, 4)))
@ -504,7 +502,8 @@ class MusicTable(QTableView):
for ratio in column_ratios:
column_widths.append(float(ratio) * total_table_width)
if isinstance(column_widths, list):
for i in range(self.model2.columnCount() - 1):
# for i in range(self.model2.columnCount() - 1):
for i in range(self.model2.columnCount()):
self.setColumnWidth(i, int(column_widths[i]))
@ -527,7 +526,7 @@ class MusicTable(QTableView):
- Drag & Drop song(s) on tableView
- File > Open > List of song(s)
"""
debug('add_files_to_library()')
# debug('add_files_to_library()')
worker = Worker(add_files_to_database, files, None)
_ = worker.signals.signal_progress.connect(self.qapp.handle_progress) # type: ignore
_ = worker.signals.signal_result.connect(self.on_add_files_to_database_finished)
@ -579,21 +578,37 @@ class MusicTable(QTableView):
threadpool = self.qapp.threadpool # type: ignore
threadpool.start(worker)
# def delete_selected_row_indices(self):
# """
# Removes rows from the QTableView based on a list of indices
# and then reload the table
# """
# debug('delete_selected_row_indices')
# selected_indices = self.get_selected_rows()
# for index in selected_indices:
# try:
# self.model2.removeRow(index)
# except Exception as e:
# debug(f"delete_selected_row_indices() failed | {e}")
# self.model2.layoutChanged.emit() # emits a signal that the view should be updated
# # self.viewport().update()
def delete_selected_row_indices(self):
"""
Removes rows from the QTableView based on a list of indices
and then reload the table
Removes rows from the QTableView (which uses a proxy model)
by mapping selected proxy indices to the source model.
"""
debug('delete_selected_row_indices')
selected_indices = self.get_selected_rows()
self.disconnect_data_changed()
for index in selected_indices:
selected_proxy_indices = self.get_selected_rows()
selected_source_rows = [
self.proxymodel.mapToSource(self.proxymodel.index(row, 0)).row()
for row in selected_proxy_indices
]
# Delete in reverse to maintain correct indexes to delete
for source_row in sorted(selected_source_rows, reverse=True):
try:
self.model2.removeRow(index)
self.model2.removeRow(source_row)
except Exception as e:
debug(f"delete_selected_row_indices() failed | {e}")
self.connect_data_changed()
self.load_music_table(self.selected_playlist_id)
def edit_selected_files_metadata(self):
"""Opens a form with metadata from the selected audio files"""
@ -613,13 +628,15 @@ class MusicTable(QTableView):
def jump_to_current_song(self):
"""Moves screen to the currently playing song, then selects the row"""
debug("jump_to_current_song")
# get the proxy model index
debug(self.current_song_filepath)
debug(self.current_song_qmodel_index)
proxy_index = self.proxymodel.mapFromSource(self.current_song_qmodel_index)
self.scrollTo(proxy_index)
self.selectRow(proxy_index.row())
try:
proxy_index = self.proxymodel.mapFromSource(self.current_song_qmodel_index)
self.scrollTo(proxy_index)
self.selectRow(proxy_index.row())
except Exception as e:
debug(f'MusicTable.py | jump_to_current_song() | {self.current_song_filepath}')
debug(f'MusicTable.py | jump_to_current_song() | {self.current_song_qmodel_index}')
debug(f'MusicTable.py | jump_to_current_song() | Could not find current song in current table buffer - {e}')
def open_directory(self):
"""Opens the containing directory of the currently selected song, in the system file manager"""
@ -748,8 +765,8 @@ class MusicTable(QTableView):
hint: You get a `playlist_id` from the signal emitted from PlaylistsPane as a tuple (1,)
"""
self.disconnect_data_changed()
self.disconnect_layout_changed()
# self.disconnect_data_changed()
# self.disconnect_layout_changed()
self.save_scroll_position(self.current_playlist_id)
self.model2.clear()
# self.model2.setHorizontalHeaderLabels(self.headers.get_user_gui_headers())
@ -761,7 +778,6 @@ class MusicTable(QTableView):
else ""
)
params = ""
debug(f'playlist_id: {playlist_id}')
is_playlist = 0
if len(playlist_id) > 0:
self.selected_playlist_id = playlist_id[0]
@ -777,7 +793,6 @@ class MusicTable(QTableView):
# except KeyError:
# # Query for a playlist
if is_playlist:
debug('load music table a playlist')
try:
with DBA.DBAccess() as db:
query = f"SELECT id, {
@ -800,7 +815,6 @@ class MusicTable(QTableView):
return
# Query for the entire library
else:
debug('load music table a Whole Table')
try:
with DBA.DBAccess() as db:
query = f"SELECT id, {fields} FROM song"
@ -823,13 +837,14 @@ class MusicTable(QTableView):
self.populate_model(data)
self.current_playlist_id = self.selected_playlist_id
self.model2.layoutChanged.emit() # emits a signal that the view should be updated
# reloading the model destroys and makes new indexes
# so we look for the new index of the current song on load
# current_song_filepath = self.get_current_song_filepath()
# debug(f"load_music_table() | current filepath: {current_song_filepath}")
# for row in range(self.model2.rowCount()):
# real_index = self.model2.index(
# row, self.headers.user_fields.index("filepath")
# row, self.headers.db_list.index("filepath")
# )
# if real_index.data() == current_song_filepath:
# self.current_song_qmodel_index = real_index
@ -838,21 +853,22 @@ class MusicTable(QTableView):
db_filename = self.config.get("settings", "db")
self.playlistStatsSignal.emit(f"Songs: {self.model2.rowCount()} | {db_name} | {db_filename}")
self.loadMusicTableSignal.emit()
self.connect_data_changed()
self.connect_layout_changed()
# self.connect_data_changed()
# self.connect_layout_changed()
# set the current song and such
self.find_current_and_selected_bits()
self.jump_to_current_song()
# self.restore_scroll_position()
def find_current_and_selected_bits(self):
"""
When data changes in the model view, its nice to re-grab the current song.
When data changes in the model view, its nice to re-grab the current song index information
might as well get the selected song too i guess? though nothing should be selected when reloading the table data
"""
search_col_num = self.headers.db_list.index("filepath")
selected_qmodel_index = self.find_qmodel_index_by_value(self.proxymodel, search_col_num, self.selected_song_filepath)
current_qmodel_index = self.find_qmodel_index_by_value(self.proxymodel, search_col_num, self.current_song_filepath)
# Update the 2 QModelIndexes that we track
# Update the 2 proxy QModelIndexes that we track
self.set_selected_song_qmodel_index(selected_qmodel_index)
self.set_current_song_qmodel_index(current_qmodel_index)
@ -885,8 +901,8 @@ class MusicTable(QTableView):
Sorts the data in QTableView (self) by multiple columns
as defined in config.ini
"""
self.disconnect_data_changed() # not needed?
self.disconnect_layout_changed() # not needed?
# self.disconnect_data_changed() # not needed?
# self.disconnect_layout_changed() # not needed?
self.horizontal_header.sortIndicatorChanged.disconnect()
sort_orders = []
config_sort_orders: list[int] = [
@ -911,18 +927,22 @@ class MusicTable(QTableView):
# maybe not a huge deal for a small music application...?
# `len(config_sort_orders)` number of SELECTs
self.on_sort()
self.connect_data_changed() # not needed?
self.connect_layout_changed() # not needed?
# self.connect_data_changed() # not needed?
# self.connect_layout_changed() # not needed?
self.model2.layoutChanged.emit()
def save_scroll_position(self, playlist_id: int | None):
"""Save the current scroll position of the table"""
# FIXME: does not work - except i'm using jump_to_current_song as a
# stand in for scroll position features
scroll_position = self.verticalScrollBar().value()
self.playlist_scroll_positions[playlist_id] = scroll_position
debug(f'save scroll position: {playlist_id}:{scroll_position}')
def restore_scroll_position(self):
"""Set the scroll position to the given value"""
# FIXME: does not work - except i'm using jump_to_current_song as a
# stand in for scroll position features
if self.current_playlist_id in self.playlist_scroll_positions:
scroll_position = self.playlist_scroll_positions[self.current_playlist_id]
# self.restore_scroll_position(scroll_position)
@ -1081,7 +1101,7 @@ class MusicTable(QTableView):
"""Connects the layoutChanged signal from QTableView.model"""
try:
pass
# _ = self.model2.layoutChanged.connect(self.restore_scroll_position)
_ = self.model2.layoutChanged.connect(self.restore_scroll_position)
except Exception:
pass

View File

@ -99,7 +99,6 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
# widget bits
self.tableView: MusicTable
self.tableView.saved_column_ratios: list[str] = str(self.config["table"]["column_ratios"]).split(",") # type: ignore
debug(f'AAAAA - {self.tableView.saved_column_ratios}')
self.album_art_scene: QGraphicsScene = QGraphicsScene()
self.player: QMediaPlayer = MediaPlayer()
# set index on choose song