Compare commits

..

No commits in common. "0d2dad9f3c148b82b745148ce64304c46d13502f" and "f3117213867e5fe1d58da359f2286563c24e6ca5" have entirely different histories.

2 changed files with 77 additions and 105 deletions

View File

@ -375,11 +375,6 @@ class PlaylistModel(QAbstractTableModel):
Return text for editing Return text for editing
""" """
# If this is a header row and we're being asked for the
# HEADER_NOTES_COLUMN, return the note value
if self.is_header_row(row) and column == HEADER_NOTES_COLUMN:
return QVariant(prd.note)
if column == Col.TITLE.value: if column == Col.TITLE.value:
return QVariant(prd.title) return QVariant(prd.title)
if column == Col.ARTIST.value: if column == Col.ARTIST.value:
@ -502,34 +497,16 @@ class PlaylistModel(QAbstractTableModel):
# There was no start of section # There was no start of section
return prd.note return prd.note
if row_prd.note.endswith(("+", "=")): if row_prd.note.endswith(("+", "=")):
# If we are playing this section, also
# calculate end time if all tracks are played.
end_time_str = ""
if (
track_sequence.now.plr_rownum
and track_sequence.now.end_time
and (
row_number
< track_sequence.now.plr_rownum
< prd.plr_rownum
)
):
section_end_time = track_sequence.now.end_time + timedelta(
milliseconds=duration
)
end_time_str = ", section end time " + section_end_time.strftime(
Config.TRACK_TIME_FORMAT
)
stripped_note = prd.note[:-1].strip() stripped_note = prd.note[:-1].strip()
if stripped_note: if stripped_note:
return ( return (
f"{stripped_note} [{count} track{'s' if count > 1 else ''}, " f"{stripped_note} [{count} track{'s' if count > 1 else ''}, "
f"{ms_to_mmss(duration)} unplayed{end_time_str}]" f"{ms_to_mmss(duration)} unplayed]"
) )
else: else:
return ( return (
f"[Subtotal: {count} track{'s' if count > 1 else ''}, " f"[Subtotal: {count} track{'s' if count > 1 else ''}, "
f"{ms_to_mmss(duration, none='none')} unplayed{end_time_str}]" f"{ms_to_mmss(duration, none='none')} unplayed]"
) )
else: else:
continue continue
@ -656,11 +633,6 @@ class PlaylistModel(QAbstractTableModel):
# Optimise: only add to map if there is a change # Optimise: only add to map if there is a change
if old_row != new_row: if old_row != new_row:
row_map[old_row] = new_row row_map[old_row] = new_row
if self.is_header_row(old_row):
# Reset column span
self.signals.span_cells_signal.emit(
old_row, HEADER_NOTES_COLUMN, 1, 1
)
# For SQLAlchemy, build a list of dictionaries that map plrid to # For SQLAlchemy, build a list of dictionaries that map plrid to
# new row number: # new row number:

View File

@ -55,7 +55,7 @@ if TYPE_CHECKING:
from musicmuster import Window from musicmuster import Window
from playlistmodel import PlaylistModel from playlistmodel import PlaylistModel
# HEADER_NOTES_COLUMN = 2 HEADER_NOTES_COLUMN = 2
class EscapeDelegate(QStyledItemDelegate): class EscapeDelegate(QStyledItemDelegate):
@ -1369,18 +1369,18 @@ class PlaylistTab(QTableView):
return self._get_row_userdata(row_number, self.ROW_LAST_PLAYED) return self._get_row_userdata(row_number, self.ROW_LAST_PLAYED)
# def _get_row_note(self, row_number: int) -> str: def _get_row_note(self, row_number: int) -> str:
# """return note on this row_number or null string if none""" """Return note on this row_number or null string if none"""
# track_id = self._get_row_track_id(row_number) track_id = self._get_row_track_id(row_number)
# if track_id: if track_id:
# item_note = self.item(row_number, row_notes) item_note = self.item(row_number, ROW_NOTES)
# else: else:
# item_note = self.item(row_number, header_notes_column) item_note = self.item(row_number, HEADER_NOTES_COLUMN)
# if not item_note: if not item_note:
# return "" return ""
# return item_note.text() return item_note.text()
def _get_row_path(self, row_number: int) -> str: def _get_row_path(self, row_number: int) -> str:
""" """
@ -1678,47 +1678,47 @@ class PlaylistTab(QTableView):
return None return None
# def _remove_track(self, row_number: int) -> None: def _remove_track(self, row_number: int) -> None:
# """Remove track from row, making it a section header""" """Remove track from row, making it a section header"""
# # Get confirmation # Get confirmation
# if not ask_yes_no( if not ask_yes_no(
# "Remove music", "Really remove the music track from this row?" "Remove music", "Really remove the music track from this row?"
# ): ):
# return return
# # Update playlist_rows record # Update playlist_rows record
# with Session() as session: with Session() as session:
# plr = self._get_row_plr(session, row_number) plr = self._get_row_plr(session, row_number)
# if not plr: if not plr:
# return return
# plr.track_id = None plr.track_id = None
# # We can't have null text # We can't have null text
# if not plr.note: if not plr.note:
# plr.note = Config.TEXT_NO_TRACK_NO_NOTE plr.note = Config.TEXT_NO_TRACK_NO_NOTE
# session.flush() session.flush()
# # Clear track text items # Clear track text items
# for i in range(2, len(columns)): for i in range(2, len(columns)):
# _ = self._set_item_text(row_number, i, "") _ = self._set_item_text(row_number, i, "")
# # Remove row duration # Remove row duration
# self._set_row_duration(row_number, 0) self._set_row_duration(row_number, 0)
# # Remove row start gap # Remove row start gap
# self._set_row_start_gap(row_number, None) self._set_row_start_gap(row_number, None)
# # Remote track_id from row # Remote track_id from row
# _ = self._set_row_userdata(row_number, self.ROW_TRACK_ID, 0) _ = self._set_row_userdata(row_number, self.ROW_TRACK_ID, 0)
# # Span the rows # Span the rows
# self.setSpan(row_number, HEADER_NOTES_COLUMN, 1, len(columns) - 1) self.setSpan(row_number, HEADER_NOTES_COLUMN, 1, len(columns) - 1)
# # Set note text in correct column for section head # Set note text in correct column for section head
# self._set_row_header_text(session, row_number, plr.note) self._set_row_header_text(session, row_number, plr.note)
# self.clear_selection() self.clear_selection()
# # Save playlist to ensure correct detection of new header # Save playlist to ensure correct detection of new header
# # row # row
# self.save_playlist(session) self.save_playlist(session)
# # Set track start/end times after track list is populated # Set track start/end times after track list is populated
# self._update_start_end_times(session) self._update_start_end_times(session)
def _reorder_rows(self, source_row_numbers: List[int]) -> None: def _reorder_rows(self, source_row_numbers: List[int]) -> None:
""" """
@ -2107,38 +2107,38 @@ class PlaylistTab(QTableView):
return self._set_item_text(row_number, END_TIME, time_str) return self._set_item_text(row_number, END_TIME, time_str)
# def _set_row_header_text( def _set_row_header_text(
# self, session: scoped_session, row_number: int, text: str self, session: scoped_session, row_number: int, text: str
# ) -> None: ) -> None:
# """ """
# Set header text and row colour Set header text and row colour
# """ """
# # Sanity check: this should be a header row and thus not have a # Sanity check: this should be a header row and thus not have a
# # track associate # track associate
# if self._get_row_track_id(row_number): if self._get_row_track_id(row_number):
# if os.environ["MM_ENV"] == "PRODUCTION": if os.environ["MM_ENV"] == "PRODUCTION":
# send_mail( send_mail(
# Config.ERRORS_TO, Config.ERRORS_TO,
# Config.ERRORS_FROM, Config.ERRORS_FROM,
# "playlists:_set_row_header_text() called on track row", "playlists:_set_row_header_text() called on track row",
# stackprinter.format(), stackprinter.format(),
# ) )
# print( print(
# f"playists:_set_row_header_text() called on track row ({row_number=}, {text=}" f"playists:_set_row_header_text() called on track row ({row_number=}, {text=}"
# ) )
# # stackprinter.show(add_summary=True, style="darkbg") # stackprinter.show(add_summary=True, style="darkbg")
# return return
# # Set text # Set text
# _ = self._set_item_text(row_number, HEADER_NOTES_COLUMN, text) _ = self._set_item_text(row_number, HEADER_NOTES_COLUMN, text)
# # Set colour # Set colour
# note_colour = NoteColours.get_colour(session, text) note_colour = NoteColours.get_colour(session, text)
# if not note_colour: if not note_colour:
# note_colour = Config.COLOUR_NOTES_PLAYLIST note_colour = Config.COLOUR_NOTES_PLAYLIST
# self._set_row_colour(row_number, note_colour) self._set_row_colour(row_number, note_colour)
def _set_row_last_played_time( def _set_row_last_played_time(
self, row_number: int, last_played: datetime self, row_number: int, last_played: datetime