WIP V3: column widths set/save works

This commit is contained in:
Keith Edmunds 2023-10-20 11:30:54 +01:00
parent dbbced7401
commit bb14b34c2e
2 changed files with 72 additions and 84 deletions

View File

@ -663,7 +663,7 @@ class Settings(Base):
except NoResultFound: except NoResultFound:
return Settings(session, name) return Settings(session, name)
def update(self, session: scoped_session, data: dict): def update(self, session: scoped_session, data: dict) -> None:
for key, value in data.items(): for key, value in data.items():
assert hasattr(self, key) assert hasattr(self, key)
setattr(self, key, value) setattr(self, key, value)

View File

@ -22,6 +22,7 @@ from PyQt6.QtWidgets import (
QAbstractItemDelegate, QAbstractItemDelegate,
QAbstractItemView, QAbstractItemView,
QApplication, QApplication,
QHeaderView,
QMenu, QMenu,
QMessageBox, QMessageBox,
QPlainTextEdit, QPlainTextEdit,
@ -44,7 +45,7 @@ from helpers import (
set_track_metadata, set_track_metadata,
) )
from log import log from log import log
from models import Playdates, Playlists, PlaylistRows, Settings, Tracks, NoteColours from models import Playlists, PlaylistRows, Settings, Tracks, NoteColours
from playlistmodel import PlaylistModel from playlistmodel import PlaylistModel
@ -144,68 +145,60 @@ class PlaylistTab(QTableView):
signals: "MusicMusterSignals", signals: "MusicMusterSignals",
) -> None: ) -> None:
super().__init__() super().__init__()
# Save passed settings
self.musicmuster = musicmuster self.musicmuster = musicmuster
self.playlist_id = playlist_id self.playlist_id = playlist_id
self.setModel(PlaylistModel(playlist_id, signals))
self.signals = signals self.signals = signals
# Set up widget # Set up widget
self.menu = QMenu()
self.setItemDelegate(EscapeDelegate(self)) self.setItemDelegate(EscapeDelegate(self))
self.setAlternatingRowColors(True) self.setAlternatingRowColors(True)
self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
self.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked) self.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked)
self.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel) self.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel)
# This dancing is to satisfy mypy
# Header row h_header = self.horizontalHeader()
# self.h_header = self.horizontalHeader() if isinstance(h_header, QHeaderView):
# for idx in [a for a in range(len(columns))]: h_header.sectionResized.connect(self.resizeRowsToContents)
# item = QTableWidgetItem()
# self.setHorizontalHeaderItem(idx, item)
# if self.h_header:
# self.h_header.setStretchLastSection(True)
# self.h_header.setMinimumSectionSize(0)
# # Set column headings sorted by idx
# self.v_header = self.verticalHeader()
# if self.v_header:
# self.v_header.setMinimumSectionSize(Config.MINIMUM_ROW_HEIGHT)
# self.setHorizontalHeaderLabels(
# [
# a.heading
# for a in list(sorted(columns.values(), key=lambda item: item.idx))
# ]
# )
self.horizontalHeader().sectionResized.connect(self.resizeRowsToContents)
# Drag and drop setup # Drag and drop setup
self.setAcceptDrops(True) self.setAcceptDrops(True)
self.viewport().setAcceptDrops(True) viewport = self.viewport()
if viewport:
viewport.setAcceptDrops(True)
self.setDragDropOverwriteMode(False) self.setDragDropOverwriteMode(False)
self.setDropIndicatorShown(True) self.setDropIndicatorShown(True)
self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove) self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove)
self.setDragEnabled(False) self.setDragEnabled(False)
# This property defines how the widget shows a context menu
self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
# This signal is emitted when the widget's contextMenuPolicy is
# Qt::CustomContextMenu, and the user has requested a context
# menu on the widget.
self.customContextMenuRequested.connect(self._context_menu)
# Call self.eventFilter() for events
self.viewport().installEventFilter(self)
self.search_text: str = "" # Prepare for context menu
self.sort_undo: List[int] = [] self.menu = QMenu()
self.edit_cell_type: Optional[int] self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.customContextMenuRequested.connect(self._context_menu)
# Connect signals # Connect signals
self.horizontalHeader().sectionResized.connect(self._column_resize) # This dancing is to satisfy mypy
h_header = self.horizontalHeader()
if isinstance(h_header, QHeaderView):
h_header.sectionResized.connect(self._column_resize)
h_header.setStretchLastSection(True)
# self.itemSelectionChanged.connect(self._select_event) # self.itemSelectionChanged.connect(self._select_event)
# self.signals.set_next_track_signal.connect(self._reset_next) # self.signals.set_next_track_signal.connect(self._reset_next)
self.signals.span_cells_signal.connect(self._span_cells) self.signals.span_cells_signal.connect(self._span_cells)
# Call self.eventFilter() for events
# self.viewport().installEventFilter(self)
# Initialise miscellaneous instance variables
self.search_text: str = ""
self.sort_undo: List[int] = []
# self.edit_cell_type: Optional[int]
# Load playlist rows # Load playlist rows
# self.populate_display(session, self.playlist_id) self.setModel(PlaylistModel(playlist_id, signals))
self._set_column_widths()
def __repr__(self) -> str: def __repr__(self) -> str:
return f"<PlaylistTab(id={self.playlist_id}>" return f"<PlaylistTab(id={self.playlist_id}>"
@ -785,9 +778,6 @@ class PlaylistTab(QTableView):
# Clear playlist # Clear playlist
self.setRowCount(0) self.setRowCount(0)
# Set widths
self._set_column_widths(session)
# Get played tracks # Get played tracks
played_rows = self._get_played_rows(session) played_rows = self._get_played_rows(session)
@ -1151,26 +1141,22 @@ class PlaylistTab(QTableView):
return start + timedelta(milliseconds=duration) return start + timedelta(milliseconds=duration)
def _column_resize(self, idx: int, _old: int, _new: int) -> None: def _column_resize(self, column_number: int, _old: int, _new: int) -> None:
"""
Called when column width changes. Save new width to database.
""" """
Called when column widths are changed.
Save column sizes to database header = self.horizontalHeader()
""" if not header:
return
# Resize rows if necessary
self.resizeRowsToContents()
with Session() as session: with Session() as session:
settings = Settings.all_as_dict(session) attr_name = f"playlist_col_{column_number}_width"
for column_name, data in columns.items(): record = Settings.get_int_settings(session, attr_name)
idx = data.idx record.f_int = self.columnWidth(column_number)
if idx == len(columns) - 1:
# Don't set width of last column as it's set to
# stretch
continue
width = self.columnWidth(idx)
attribute_name = f"playlist_{column_name}_col_width"
record = settings[attribute_name]
if record.f_int != self.columnWidth(idx):
record.update(session, {"f_int": width})
def _context_menu(self, pos): def _context_menu(self, pos):
"""Display right-click menu""" """Display right-click menu"""
@ -1894,39 +1880,41 @@ class PlaylistTab(QTableView):
else: else:
self.musicmuster.lblSumPlaytime.setText("") self.musicmuster.lblSumPlaytime.setText("")
def _set_cell_colour( # def _set_cell_colour(
self, row_number: int, column: int, colour: Optional[str] = None # self, row_number: int, column: int, colour: Optional[str] = None
) -> None: # ) -> None:
""" # """
Set or reset a cell background colour # Set or reset a cell background colour
""" # """
if colour is None: # if colour is None:
brush = QBrush() # brush = QBrush()
else: # else:
brush = QBrush(QColor(colour)) # brush = QBrush(QColor(colour))
item = self.item(row_number, column) # item = self.item(row_number, column)
if item: # if item:
item.setBackground(brush) # item.setBackground(brush)
def _set_column_widths(self, session: scoped_session) -> None: def _set_column_widths(self) -> None:
"""Column widths from settings""" """Column widths from settings"""
settings = Settings.all_as_dict(session) header = self.horizontalHeader()
if not header:
return
for column_name, data in columns.items(): # Set width of last column to zero as it's set to stretch
idx = data.idx self.setColumnWidth(header.count() - 1, 0)
if idx == len(columns) - 1:
# Set width of last column to zero as it's set to stretch # Set remaining column widths from settings
self.setColumnWidth(idx, 0) with Session() as session:
continue for column_number in range(header.count() - 1):
attr_name = f"playlist_{column_name}_col_width" attr_name = f"playlist_col_{column_number}_width"
record = settings[attr_name] record = Settings.get_int_settings(session, attr_name)
if record and record.f_int >= 0: if record.f_int is not None:
self.setColumnWidth(idx, record.f_int) self.setColumnWidth(column_number, record.f_int)
else: else:
self.setColumnWidth(idx, Config.DEFAULT_COLUMN_WIDTH) self.setColumnWidth(column_number, Config.DEFAULT_COLUMN_WIDTH)
def _set_item_text( def _set_item_text(
self, row_number: int, column: int, text: Optional[str] self, row_number: int, column: int, text: Optional[str]