diff --git a/bin/ffx/pattern_details_screen.py b/bin/ffx/pattern_details_screen.py index 4ed996d..cf38e30 100644 --- a/bin/ffx/pattern_details_screen.py +++ b/bin/ffx/pattern_details_screen.py @@ -153,8 +153,8 @@ class PatternDetailsScreen(Screen): self.column_key_audio_layout = self.audioStreamsTable.add_column("Layout", width=20) self.column_key_audio_language = self.audioStreamsTable.add_column("Language", width=20) self.column_key_audio_title = self.audioStreamsTable.add_column("Title", width=30) - self.column_key_subtitle_default = self.audioStreamsTable.add_column("Default", width=10) - self.column_key_subtitle_forced = self.audioStreamsTable.add_column("Forced", width=10) + self.column_key_audio_default = self.audioStreamsTable.add_column("Default", width=10) + self.column_key_audio_forced = self.audioStreamsTable.add_column("Forced", width=10) self.audioStreamsTable.cursor_type = 'row' @@ -357,7 +357,42 @@ class PatternDetailsScreen(Screen): self.subtitleStreamsTable.add_row(*map(str, row)) - def handle_edit_stream(self): - pass - def handle_delete_stream(self): - pass + def handle_edit_stream(self, trackDescriptor): + + try: + if trackDescriptor['type'] == TrackType.AUDIO: + + row_key, col_key = self.audioStreamsTable.coordinate_to_cell_key(self.audioStreamsTable.cursor_coordinate) + + self.audioStreamsTable.update_cell(row_key, self.column_key_audio_language, trackDescriptor['language'].label()) + self.audioStreamsTable.update_cell(row_key, self.column_key_audio_title, trackDescriptor['title']) + self.audioStreamsTable.update_cell(row_key, self.column_key_audio_default, 'Yes' if TrackDisposition.DEFAULT in trackDescriptor['disposition_list'] else 'No') + self.audioStreamsTable.update_cell(row_key, self.column_key_audio_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor['disposition_list'] else 'No') + + if trackDescriptor['type'] == TrackType.SUBTITLE: + + row_key, col_key = self.subtitleStreamsTable.coordinate_to_cell_key(self.subtitleStreamsTable.cursor_coordinate) + + self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_language, trackDescriptor['language'].label()) + self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_title, trackDescriptor['title']) + self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_default, 'Yes' if TrackDisposition.DEFAULT in trackDescriptor['disposition_list'] else 'No') + self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor['disposition_list'] else 'No') + + except CellDoesNotExist: + pass + + + def handle_delete_stream(self, trackDescriptor): + + try: + if trackDescriptor['type'] == TrackType.AUDIO: + row_key, col_key = self.audioStreamsTable.coordinate_to_cell_key(self.audioStreamsTable.cursor_coordinate) + self.audioStreamsTable.remove_row(row_key) + + if trackDescriptor['type'] == TrackType.SUBTITLE: + row_key, col_key = self.subtitleStreamsTable.coordinate_to_cell_key(self.subtitleStreamsTable.cursor_coordinate) + self.subtitleStreamsTable.remove_row(row_key) + + except CellDoesNotExist: + pass + diff --git a/bin/ffx/track_controller.py b/bin/ffx/track_controller.py index 2f69bb4..c2c312b 100644 --- a/bin/ffx/track_controller.py +++ b/bin/ffx/track_controller.py @@ -35,8 +35,6 @@ class TrackController(): s.add(track) s.commit() - return True - except Exception as ex: raise click.ClickException(f"TrackController.addTrack(): {repr(ex)}") @@ -44,29 +42,32 @@ class TrackController(): s.close() -# def updateTrack(self, trackDescriptor): -# -# try: -# s = self.Session() -# q = s.query(Track).filter(Track.id == int(trackId)) -# -# if not q.count(): -# track = Track(pattern_id = int(trackDescriptor['pattern_id']), -# track_type = TrackType(trackDescriptor['type']), -# sub_index = int(trackDescriptor['sub_index']), -# language = IsoLanguage(trackDescriptor['language']), -# title = str(trackDescriptor['title']), -# disposition_flags = TrackDisposition.toFlags(trackDescriptor['disposition_list'])) -# s.add(track) -# s.commit() -# return True -# else: -# return False -# -# except Exception as ex: -# raise click.ClickException(f"TrackController.updateTrack(): {repr(ex)}") -# finally: -# s.close() + def updateTrack(self, trackId, trackDescriptor): + + try: + s = self.Session() + q = s.query(Track).filter(Track.id == int(trackId)) + + if q.count(): + + track = q.first() + + track.sub_index = int(trackDescriptor['sub_index']) + track.language = str(trackDescriptor['language'].threeLetter()) + track.title = str(trackDescriptor['title']) + track.disposition_flags = int(TrackDisposition.toFlags(trackDescriptor['disposition_list'])) + + s.commit() + + return True + + else: + return False + + except Exception as ex: + raise click.ClickException(f"TrackController.addTrack(): {repr(ex)}") + finally: + s.close() def findAllTracks(self, patternId): diff --git a/bin/ffx/track_delete_screen.py b/bin/ffx/track_delete_screen.py index e707214..24c9d11 100644 --- a/bin/ffx/track_delete_screen.py +++ b/bin/ffx/track_delete_screen.py @@ -20,9 +20,9 @@ class TrackDeleteScreen(Screen): CSS = """ Grid { - grid-size: 2; - grid-rows: 2 auto; - grid-columns: 30 330; + grid-size: 4 9; + grid-rows: 2 2 2 2 2 2 2 2 2; + grid-columns: 30 30 30 30; height: 100%; width: 100%; padding: 1; @@ -41,6 +41,12 @@ class TrackDeleteScreen(Screen): .two { column-span: 2; } + .three { + column-span: 3; + } + .four { + column-span: 4; + } .box { height: 100%; @@ -48,29 +54,26 @@ class TrackDeleteScreen(Screen): } """ - def __init__(self, trackType : TrackType, trackId = None): + def __init__(self, trackId = None): super().__init__() self.context = self.app.getContext() self.Session = self.context['database_session'] # convenience - self.__tc = TrackController(context = self.context) - # self.__pc = PatternController(context = self.context) - # self.__sc = ShowController(context = self.context) + if trackId is None: + raise click.ClickException('TrackDeleteScreen.init(): trackId is required to be set') - # self.pattern_obj = self.__pc.getPatternDescriptor(patternId) if patternId is not None else {} - # self.show_obj = self.__sc.getShowDesciptor(showId) if showId is not None else {} + self.__tc = TrackController(context = self.context) - self.trackType = trackType - self.track_obj = {} + self.track_obj = self.__tc.getTrackDescriptor(trackId) def on_mount(self): - pass - # if self.show_obj: - # self.query_one("#showlabel", Static).update(f"{self.show_obj['id']} - {self.show_obj['name']} ({self.show_obj['year']})") - # if self.pattern_obj: - # self.query_one("#patternlabel", Static).update(str(self.pattern_obj['pattern'])) + + self.query_one("#subindexlabel", Static).update(str(self.track_obj['sub_index'])) + self.query_one("#patternlabel", Static).update(str(self.track_obj['pattern_id'])) + self.query_one("#languagelabel", Static).update(str(self.track_obj['language'].label())) + self.query_one("#titlelabel", Static).update(str(str(self.track_obj['title']))) def compose(self): @@ -78,21 +81,36 @@ class TrackDeleteScreen(Screen): yield Header() with Grid(): + + #1 + yield Static(f"Are you sure to delete the following {self.track_obj['type'].label()} track?", id="toplabel", classes="four") + + #2 + yield Static("sub index") + yield Static(" ", id="subindexlabel", classes="three") + + #3 + yield Static("from pattern") + yield Static(" ", id="patternlabel", classes="three") - yield Static(f"Are you sure to delete the following {self.trackType.label()} stream?", id="toplabel", classes="two") + #4 + yield Static(" ", classes="four") -# yield Static("", classes="two") -# -# yield Static("Pattern") -# yield Static("", id="patternlabel") -# -# yield Static("", classes="two") -# -# yield Static("from show") -# yield Static("", id="showlabel") + #5 + yield Static("Language") + yield Static(" ", id="languagelabel", classes="three") - yield Static("", classes="two") + #6 + yield Static("Title") + yield Static(" ", id="titlelabel", classes="three") + #7 + yield Static(" ", classes="four") + + #8 + yield Static(" ", classes="four") + + #9 yield Button("Delete", id="delete_button") yield Button("Cancel", id="cancel_button") @@ -102,20 +120,19 @@ class TrackDeleteScreen(Screen): # Event handler for button press def on_button_pressed(self, event: Button.Pressed) -> None: -# if event.button.id == "delete_button": -# -# if self.__pc.deletePattern(self.pattern_obj['id']): -# -# screenResult = {} -# screenResult['show_id'] = self.show_obj['id'] -# screenResult['pattern'] = self.pattern_obj['pattern'] -# -# self.dismiss(screenResult) -# -# else: -# #TODO: Meldung -# self.app.pop_screen() -# + if event.button.id == "delete_button": + + trackId = self.__tc.findTrack(self.track_obj['pattern_id'], self.track_obj['type'], self.track_obj['sub_index']) + + if trackId is not None: + + if self.__tc.deleteTrack(trackId): + self.dismiss(self.track_obj) + + else: + #TODO: Meldung + self.app.pop_screen() + if event.button.id == "cancel_button": self.app.pop_screen() diff --git a/bin/ffx/track_details_screen.py b/bin/ffx/track_details_screen.py index ffd1b1b..773cfd1 100644 --- a/bin/ffx/track_details_screen.py +++ b/bin/ffx/track_details_screen.py @@ -90,10 +90,12 @@ class TrackDetailsScreen(Screen): self.trackType = self.track_obj['type'] self.subIndex = self.track_obj['sub_index'] self.pattern_obj = self.__pc.getPatternDescriptor(self.track_obj['pattern_id']) + self.track_obj['is_new'] = False else: self.trackType = trackType self.subIndex = subIndex self.pattern_obj = self.__pc.getPatternDescriptor(patternId) if patternId is not None else {} + self.track_obj['is_new'] = True if self.trackType is None: raise click.ClickException('Track type is required to be set') @@ -113,13 +115,20 @@ 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'] + + dispositionIsSet = (self.track_obj + and 'disposition_list' in self.track_obj.keys() + 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: + if 'language' in self.track_obj.keys(): self.query_one("#language_select", Select).value = self.track_obj['language'].label() + + if 'title' in self.track_obj.keys(): self.query_one("#title_input", Input).value = str(self.track_obj['title']) @@ -158,7 +167,7 @@ class TrackDetailsScreen(Screen): with Grid(): # 1 - yield Static(f"Edit {self.trackType.label()} stream" if self.track_obj else f"New {self.trackType.label()} stream", id="toplabel", classes="five") + yield Static(f"New {self.trackType.label()} stream" if self.track_obj['is_new'] else f"Edit {self.trackType.label()} stream", id="toplabel", classes="five") # 2 yield Static("for pattern") @@ -249,11 +258,22 @@ class TrackDetailsScreen(Screen): trackDescriptor = self.getTrackDescriptorFromInput() - if self.__tc.addTrack(trackDescriptor): #! + + if self.track_obj['is_new']: + + self.__tc.addTrack(trackDescriptor) self.dismiss(trackDescriptor) + else: - #TODO: Meldung - self.app.pop_screen() + + trackId = self.__tc.findTrack(self.track_obj['pattern_id'], self.track_obj['type'], self.track_obj['sub_index']) + + if self.__tc.updateTrack(trackId, trackDescriptor): + self.dismiss(trackDescriptor) + + else: + self.app.pop_screen() + if event.button.id == "cancel_button": self.app.pop_screen()