Let notes have times

This commit is contained in:
Keith Edmunds 2021-04-10 17:20:09 +01:00
parent 79b3071170
commit 62f6775e90
3 changed files with 83 additions and 54 deletions

View File

@ -11,7 +11,7 @@ class Config(object):
COLOUR_EVEN_PLAYLIST = "#d9d9d9" COLOUR_EVEN_PLAYLIST = "#d9d9d9"
COLOUR_NEXT_HEADER = "#fff3cd" COLOUR_NEXT_HEADER = "#fff3cd"
COLOUR_NEXT_PLAYLIST = "#ffc107" COLOUR_NEXT_PLAYLIST = "#ffc107"
COLOUR_NOTES_PLAYLIST = "#17a2b8" COLOUR_NOTES_PLAYLIST = "#668cff"
COLOUR_PREVIOUS_HEADER = "#f8d7da" COLOUR_PREVIOUS_HEADER = "#f8d7da"
COLOUR_WARNING_TIMER = "#ffc107" COLOUR_WARNING_TIMER = "#ffc107"
DBFS_FADE = -12 DBFS_FADE = -12

View File

@ -59,7 +59,7 @@ class Notes(Base):
note.note = text note.note = text
session.add(note) session.add(note)
session.commit() session.commit()
return note.id return note
@classmethod @classmethod
def update_note(cls, id, row, text): def update_note(cls, id, row, text):

View File

@ -37,7 +37,7 @@ class Playlist(QTableWidget):
COL_ENDTIME = 5 COL_ENDTIME = 5
COL_PATH = 6 COL_PATH = 6
NOTE_COL_SPAN = 6 NOTE_COL_SPAN = 4
NOTE_ROW_SPAN = 1 NOTE_ROW_SPAN = 1
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -149,30 +149,19 @@ class Playlist(QTableWidget):
row = self.rowCount() row = self.rowCount()
DEBUG(f"playlist.add_note(): row={row}") DEBUG(f"playlist.add_note(): row={row}")
note_id = Notes.add_note(self.playlist_id, row, text) self.add_to_playlist(Notes.add_note(self.playlist_id, row, text), row)
# TODO: this largely duplicates what's in add_to_playlist() def add_to_playlist(self, data, repaint=True, row=None):
self.insertRow(row)
item = QTableWidgetItem(str(note_id))
self.setItem(row, self.COL_INDEX, item)
item = QTableWidgetItem(text)
self.setItem(row, self.COL_NOTE, item)
self.setSpan(row, self.COL_NOTE, self.NOTE_ROW_SPAN,
self.NOTE_COL_SPAN)
self.meta_set_note(row)
self.repaint(clear_selection=False)
def add_to_playlist(self, data, repaint=True):
""" """
Add data to playlist. Data may be either a Tracks object or a Add data to playlist. Data may be either a Tracks object or a
Notes object. Notes object.
""" """
if self.selectionModel().hasSelection(): if not row:
row = self.currentRow() if self.selectionModel().hasSelection():
else: row = self.currentRow()
row = self.rowCount() else:
row = self.rowCount()
DEBUG(f"add_to_playlist(data={data}): row={row}") DEBUG(f"add_to_playlist(data={data}): row={row}")
self.insertRow(row) self.insertRow(row)
@ -195,12 +184,34 @@ class Playlist(QTableWidget):
else: else:
# This is a note # This is a note
DEBUG(f"add_to_playlist: note.id={data.id}") DEBUG(f"add_to_playlist: note.id={data.id}")
item = QTableWidgetItem(str(data.id)) note = data
# Does note end with a time?
start_time = None
try:
start_time = datetime.strptime(
note.note[-9:], " %H:%M:%S").time()
DEBUG(f"Note contains valid time={start_time}")
except ValueError:
DEBUG("Note does not contain valid time")
item = QTableWidgetItem(str(note.id))
self.setItem(row, self.COL_INDEX, item) self.setItem(row, self.COL_INDEX, item)
item = QTableWidgetItem(data.note) item = QTableWidgetItem(data.note)
self.setItem(row, self.COL_NOTE, item) self.setItem(row, self.COL_NOTE, item)
self.setSpan(row, self.COL_NOTE, self.NOTE_ROW_SPAN, self.setSpan(row, self.COL_NOTE, self.NOTE_ROW_SPAN,
self.NOTE_COL_SPAN) self.NOTE_COL_SPAN)
# Add start times or empty items, otherwise background
# colour won't be set for columns without items
if start_time:
item = QTableWidgetItem(start_time.strftime("%H:%M:%S"))
else:
item = QTableWidgetItem()
self.setItem(row, self.COL_ENDTIME, item)
item = QTableWidgetItem()
self.setItem(row, self.COL_PATH, item)
self.meta_set_note(row) self.meta_set_note(row)
if repaint: if repaint:
@ -329,7 +340,7 @@ class Playlist(QTableWidget):
except AttributeError: except AttributeError:
return "" return ""
def get_row_endtime(self, row, start): def calculate_row_endtime(self, row, start):
"Return this row's end time given its start time" "Return this row's end time given its start time"
duration = Tracks.get_duration( duration = Tracks.get_duration(
@ -509,14 +520,8 @@ class Playlist(QTableWidget):
# Update metadata # Update metadata
self.meta_set_current(self.meta_get_next()) self.meta_set_current(self.meta_get_next())
# Set track end time
current_row = self.meta_get_current()
endtime = datetime.now() + timedelta(
milliseconds=self.current_track.silence_at)
item = QTableWidgetItem(endtime.strftime("%H:%M:%S"))
self.setItem(current_row, self.COL_ENDTIME, item)
# Set up metadata for next track in playlist if there is one. # Set up metadata for next track in playlist if there is one.
current_row = self.meta_get_current()
if current_row is not None: if current_row is not None:
start = current_row + 1 start = current_row + 1
else: else:
@ -592,33 +597,53 @@ class Playlist(QTableWidget):
next = self.meta_get_next() next = self.meta_get_next()
notes = self.meta_get_notes() notes = self.meta_get_notes()
if current:
start_row = current
else:
start_row = 0
# Set colours and start times # Set colours and start times
running_end_time = None running_end_time = None
if current: for row in range(start_row, self.rowCount()):
self.set_row_colour(
current, QColor(Config.COLOUR_CURRENT_PLAYLIST)
)
try:
running_end_time = datetime.strptime(self.item(
current, self.COL_ENDTIME).text(), "%H:%M:%S")
except AttributeError:
pass
self.set_row_bold(current)
for row in range(self.rowCount()): if row == current:
if row == next: # Set end time
running_end_time = datetime.now() + timedelta(
milliseconds=self.current_track.silence_at)
item = QTableWidgetItem(running_end_time.strftime("%H:%M:%S"))
self.setItem(row, self.COL_ENDTIME, item)
# Set colour
self.set_row_colour(
current, QColor(Config.COLOUR_CURRENT_PLAYLIST)
)
# Make bold
self.set_row_bold(current)
elif row == next:
# Set end time
if running_end_time:
running_end_time = self.calculate_row_endtime(
row, running_end_time)
item = QTableWidgetItem(
running_end_time.strftime("%H:%M:%S")
)
self.setItem(row, self.COL_ENDTIME, item)
# Set colour
self.set_row_colour( self.set_row_colour(
row, QColor(Config.COLOUR_NEXT_PLAYLIST) row, QColor(Config.COLOUR_NEXT_PLAYLIST)
) )
if running_end_time: # Make bold
running_end_time = self.get_row_endtime(
row, running_end_time)
item = QTableWidgetItem(
running_end_time.strftime("%H:%M:%S"))
self.setItem(row, self.COL_ENDTIME, item)
self.set_row_bold(row) self.set_row_bold(row)
elif row in notes: elif row in notes:
# Set/reset end time
try:
running_end_time = datetime.strptime(
self.item(row, self.COL_ENDTIME).text(), "%H:%M:%S"
)
except ValueError:
DEBUG("Note does not contain valid time")
# Set colour
self.set_row_colour( self.set_row_colour(
row, QColor(Config.COLOUR_NOTES_PLAYLIST) row, QColor(Config.COLOUR_NOTES_PLAYLIST)
) )
@ -636,7 +661,7 @@ class Playlist(QTableWidget):
if self.item(row, self.COL_INDEX): if self.item(row, self.COL_INDEX):
if int(self.item(row, self.COL_INDEX).text()) > 0: if int(self.item(row, self.COL_INDEX).text()) > 0:
if running_end_time: if running_end_time:
running_end_time = self.get_row_endtime( running_end_time = self.calculate_row_endtime(
row, running_end_time) row, running_end_time)
item = QTableWidgetItem( item = QTableWidgetItem(
running_end_time.strftime("%H:%M:%S")) running_end_time.strftime("%H:%M:%S"))
@ -724,11 +749,15 @@ class Playlist(QTableWidget):
# Column widths from settings # Column widths from settings
for column in range(self.columnCount()): for column in range(self.columnCount()):
name = f"playlist_col_{str(column)}_width" # Only show column 0 in test mode
record = Settings.get_int(name) if (column == 0 and not Config.TESTMODE):
if record.f_int is not None: self.setColumnWidth(0, 0)
print("setting column width") else:
self.setColumnWidth(column, record.f_int) name = f"playlist_col_{str(column)}_width"
record = Settings.get_int(name)
if record.f_int is not None:
print("setting column width")
self.setColumnWidth(column, record.f_int)
def set_row_bold(self, row, bold=True): def set_row_bold(self, row, bold=True):
boldfont = QFont() boldfont = QFont()