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_NEXT_HEADER = "#fff3cd"
COLOUR_NEXT_PLAYLIST = "#ffc107"
COLOUR_NOTES_PLAYLIST = "#17a2b8"
COLOUR_NOTES_PLAYLIST = "#668cff"
COLOUR_PREVIOUS_HEADER = "#f8d7da"
COLOUR_WARNING_TIMER = "#ffc107"
DBFS_FADE = -12

View File

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

View File

@ -37,7 +37,7 @@ class Playlist(QTableWidget):
COL_ENDTIME = 5
COL_PATH = 6
NOTE_COL_SPAN = 6
NOTE_COL_SPAN = 4
NOTE_ROW_SPAN = 1
def __init__(self, *args, **kwargs):
@ -149,30 +149,19 @@ class Playlist(QTableWidget):
row = self.rowCount()
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()
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):
def add_to_playlist(self, data, repaint=True, row=None):
"""
Add data to playlist. Data may be either a Tracks object or a
Notes object.
"""
if self.selectionModel().hasSelection():
row = self.currentRow()
else:
row = self.rowCount()
if not row:
if self.selectionModel().hasSelection():
row = self.currentRow()
else:
row = self.rowCount()
DEBUG(f"add_to_playlist(data={data}): row={row}")
self.insertRow(row)
@ -195,12 +184,34 @@ class Playlist(QTableWidget):
else:
# This is a note
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)
item = QTableWidgetItem(data.note)
self.setItem(row, self.COL_NOTE, item)
self.setSpan(row, self.COL_NOTE, self.NOTE_ROW_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)
if repaint:
@ -329,7 +340,7 @@ class Playlist(QTableWidget):
except AttributeError:
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"
duration = Tracks.get_duration(
@ -509,14 +520,8 @@ class Playlist(QTableWidget):
# Update metadata
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.
current_row = self.meta_get_current()
if current_row is not None:
start = current_row + 1
else:
@ -592,33 +597,53 @@ class Playlist(QTableWidget):
next = self.meta_get_next()
notes = self.meta_get_notes()
if current:
start_row = current
else:
start_row = 0
# Set colours and start times
running_end_time = None
if current:
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(start_row, self.rowCount()):
for row in range(self.rowCount()):
if row == next:
if row == current:
# 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(
row, QColor(Config.COLOUR_NEXT_PLAYLIST)
)
if running_end_time:
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)
# Make bold
self.set_row_bold(row)
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(
row, QColor(Config.COLOUR_NOTES_PLAYLIST)
)
@ -636,7 +661,7 @@ class Playlist(QTableWidget):
if self.item(row, self.COL_INDEX):
if int(self.item(row, self.COL_INDEX).text()) > 0:
if running_end_time:
running_end_time = self.get_row_endtime(
running_end_time = self.calculate_row_endtime(
row, running_end_time)
item = QTableWidgetItem(
running_end_time.strftime("%H:%M:%S"))
@ -724,11 +749,15 @@ class Playlist(QTableWidget):
# Column widths from settings
for column in range(self.columnCount()):
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)
# Only show column 0 in test mode
if (column == 0 and not Config.TESTMODE):
self.setColumnWidth(0, 0)
else:
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):
boldfont = QFont()