From b492ebdab9bf6eda281e8a7f619101f3a4d32198 Mon Sep 17 00:00:00 2001 From: Maveno Date: Sun, 29 Sep 2024 12:02:44 +0200 Subject: [PATCH] inc edit tracks --- bin/ffx/pattern_details_screen.py | 64 +++++++++++++++++++++++++++++-- bin/ffx/track_controller.py | 4 +- bin/ffx/track_details_screen.py | 48 ++++++++++++----------- 3 files changed, 87 insertions(+), 29 deletions(-) diff --git a/bin/ffx/pattern_details_screen.py b/bin/ffx/pattern_details_screen.py index 11384ba..4ed996d 100644 --- a/bin/ffx/pattern_details_screen.py +++ b/bin/ffx/pattern_details_screen.py @@ -20,6 +20,8 @@ from ffx.track_type import TrackType from ffx.track_disposition import TrackDisposition +from textual.widgets._data_table import CellDoesNotExist + # Screen[dict[int, str, int]] class PatternDetailsScreen(Screen): @@ -234,6 +236,58 @@ class PatternDetailsScreen(Screen): return str(self.query_one("#pattern_input", Input).value) + + def getSelectedAudioTrackId(self): + + if not self.pattern_obj: + return None + + try: + + # Fetch the currently selected row when 'Enter' is pressed + #selected_row_index = self.table.cursor_row + row_key, col_key = self.audioStreamsTable.coordinate_to_cell_key(self.audioStreamsTable.cursor_coordinate) + + if row_key is not None: + selected_track_data = self.audioStreamsTable.get_row(row_key) + + subIndex = int(selected_track_data[0]) + + return self.__tc.findTrack(self.pattern_obj['id'], TrackType.AUDIO, subIndex) + + else: + return None + + except CellDoesNotExist: + return None + + + def getSelectedSubtitleTrackId(self): + + if not self.pattern_obj: + return None + + try: + + # Fetch the currently selected row when 'Enter' is pressed + #selected_row_index = self.table.cursor_row + row_key, col_key = self.subtitleStreamsTable.coordinate_to_cell_key(self.subtitleStreamsTable.cursor_coordinate) + + if row_key is not None: + selected_track_data = self.subtitleStreamsTable.get_row(row_key) + + subIndex = int(selected_track_data[0]) + + return self.__tc.findTrack(self.pattern_obj['id'], TrackType.SUBTITLE, subIndex) + + else: + return None + + except CellDoesNotExist: + return None + + + # Event handler for button press def on_button_pressed(self, event: Button.Pressed) -> None: # Check if the button pressed is the one we are interested in @@ -259,19 +313,21 @@ class PatternDetailsScreen(Screen): # Save pattern when just created before adding streams if self.pattern_obj: + #self.pattern_obj + if event.button.id == "button_add_audio_stream": self.app.push_screen(TrackDetailsScreen(trackType = TrackType.AUDIO, patternId = self.pattern_obj['id'], subIndex = len(self.audioStreamsTable.rows)), self.handle_add_stream) if event.button.id == "button_edit_audio_stream": - self.app.push_screen(TrackDetailsScreen(trackType = TrackType.AUDIO, patternId = self.pattern_obj['id']), self.handle_edit_stream) + self.app.push_screen(TrackDetailsScreen(trackId = self.getSelectedAudioTrackId()), self.handle_edit_stream) if event.button.id == "button_delete_audio_stream": - self.app.push_screen(TrackDeleteScreen(trackType = TrackType.AUDIO, patternId = self.pattern_obj['id']), self.handle_delete_stream) + self.app.push_screen(TrackDeleteScreen(trackId = self.getSelectedAudioTrackId()), self.handle_delete_stream) if event.button.id == "button_add_subtitle_stream": self.app.push_screen(TrackDetailsScreen(trackType = TrackType.SUBTITLE, patternId = self.pattern_obj['id'], subIndex = len(self.subtitleStreamsTable.rows)), self.handle_add_stream) if event.button.id == "button_edit_subtitle_stream": - self.app.push_screen(TrackDetailsScreen(trackType = TrackType.SUBTITLE, patternId = self.pattern_obj['id']), self.handle_edit_stream) + self.app.push_screen(TrackDetailsScreen(trackId = self.getSelectedSubtitleTrackId()), self.handle_edit_stream) if event.button.id == "button_delete_subtitle_stream": - self.app.push_screen(TrackDeleteScreen(trackType = TrackType.SUBTITLE, patternId = self.pattern_obj['id']), self.handle_delete_stream) + self.app.push_screen(TrackDeleteScreen(trackId = self.getSelectedSubtitleTrackId()), self.handle_delete_stream) def handle_add_stream(self, trackDescriptor): diff --git a/bin/ffx/track_controller.py b/bin/ffx/track_controller.py index 4b889e3..2f69bb4 100644 --- a/bin/ffx/track_controller.py +++ b/bin/ffx/track_controller.py @@ -97,11 +97,11 @@ class TrackController(): s.close() - def findTrack(self, patternId, trackType, subIndex): + def findTrack(self, patternId, trackType : TrackType, subIndex): try: s = self.Session() - q = s.query(Track).filter(Track.pattern_id == int(patternId), Track.track_type == trackType, Track.sub_index == int(subIndex)) + q = s.query(Track).filter(Track.pattern_id == int(patternId), Track.track_type == trackType.value, Track.sub_index == int(subIndex)) if q.count(): track = q.first() diff --git a/bin/ffx/track_details_screen.py b/bin/ffx/track_details_screen.py index 8c57117..ffd1b1b 100644 --- a/bin/ffx/track_details_screen.py +++ b/bin/ffx/track_details_screen.py @@ -84,29 +84,25 @@ class TrackDetailsScreen(Screen): self.__tc = TrackController(context = self.context) self.__pc = PatternController(context = self.context) - self.track_obj = self.__tc.getTrackDescriptor(trackId) if trackId is not None else {} #TODO: Overwriting alternative values if set - - if trackType is None: + self.track_obj = self.__tc.getTrackDescriptor(trackId) if trackId is not None else {} + + if self.track_obj: + self.trackType = self.track_obj['type'] + self.subIndex = self.track_obj['sub_index'] + self.pattern_obj = self.__pc.getPatternDescriptor(self.track_obj['pattern_id']) + else: + self.trackType = trackType + self.subIndex = subIndex + self.pattern_obj = self.__pc.getPatternDescriptor(patternId) if patternId is not None else {} + + if self.trackType is None: raise click.ClickException('Track type is required to be set') - - self.trackType = trackType - self.subIndex = subIndex + if self.subIndex is None: + raise click.ClickException('Sub index for track is required to be set') - self.pattern_obj = self.__pc.getPatternDescriptor(patternId) if patternId is not None else {} + -# def loadPatterns(self, show_id): -# -# try: -# s = self.Session() -# q = s.query(Pattern).filter(Pattern.show_id == int(show_id)) -# -# return [{'id': int(p.id), 'pattern': p.pattern} for p in q.all()] -# -# except Exception as ex: -# click.ClickException(f"loadPatterns(): {repr(ex)}") -# finally: -# s.close() def on_mount(self): @@ -117,6 +113,16 @@ class TrackDetailsScreen(Screen): if self.subIndex is not None: self.query_one("#subindexlabel", Static).update(str(self.subIndex)) + for d in TrackDisposition: + dispositionIsSet = self.track_obj and d in self.track_obj['disposition_list'] + disposition = (d.label(), d.index(), dispositionIsSet) + self.query_one("#dispositions_selection_list", SelectionList).add_option(disposition) + + if self.track_obj: + self.query_one("#language_select", Select).value = self.track_obj['language'].label() + self.query_one("#title_input", Input).value = str(self.track_obj['title']) + + # if self.show_obj: # self.query_one("#showlabel", Static).update(f"{self.show_obj['id']} - {self.show_obj['name']} ({self.show_obj['year']})") @@ -147,9 +153,6 @@ class TrackDetailsScreen(Screen): languages = [l.label() for l in IsoLanguage] - dispositions = [(d.label(), d.index(), False) for d in TrackDisposition] - - yield Header() with Grid(): @@ -202,7 +205,6 @@ class TrackDetailsScreen(Screen): # 15 yield SelectionList[int]( - *dispositions, classes="five", id = "dispositions_selection_list" )