diff --git a/app/config.py b/app/config.py index 1142c70..cc4e0c1 100644 --- a/app/config.py +++ b/app/config.py @@ -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 diff --git a/app/model.py b/app/model.py index e5af8e2..9472c36 100644 --- a/app/model.py +++ b/app/model.py @@ -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): diff --git a/app/playlists.py b/app/playlists.py index 806a628..d84d9cd 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -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()