Compare commits
4 Commits
f311721386
...
0d2dad9f3c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d2dad9f3c | ||
|
|
0f77cef37a | ||
|
|
bfc7a8508c | ||
|
|
9e9bc8b4c7 |
@ -375,6 +375,11 @@ 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:
|
||||||
@ -497,16 +502,34 @@ 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]"
|
f"{ms_to_mmss(duration)} unplayed{end_time_str}]"
|
||||||
)
|
)
|
||||||
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]"
|
f"{ms_to_mmss(duration, none='none')} unplayed{end_time_str}]"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
@ -633,6 +656,11 @@ 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:
|
||||||
|
|||||||
150
app/playlists.py
150
app/playlists.py
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user