From 74dfbe30d794b8c923e6275c9e2290fafc6360f5 Mon Sep 17 00:00:00 2001 From: Maveno Date: Sun, 29 Sep 2024 16:13:14 +0200 Subject: [PATCH] Fix delete tracks --- bin/ffx/pattern_details_screen.py | 90 ++++++++++++++++++------------- bin/ffx/track_controller.py | 30 ++++++++--- bin/ffx/track_details_screen.py | 76 ++++++++++++++------------ 3 files changed, 118 insertions(+), 78 deletions(-) diff --git a/bin/ffx/pattern_details_screen.py b/bin/ffx/pattern_details_screen.py index cf38e30..1f3289a 100644 --- a/bin/ffx/pattern_details_screen.py +++ b/bin/ffx/pattern_details_screen.py @@ -102,47 +102,60 @@ class PatternDetailsScreen(Screen): s.close() - def on_mount(self): + def updateAudioTracks(self): - if self.pattern_obj: - self.query_one("#pattern_input", Input).value = str(self.pattern_obj['pattern']) + self.audioStreamsTable.clear() - if self.show_obj: - self.query_one("#showlabel", Static).update(f"{self.show_obj['id']} - {self.show_obj['name']} ({self.show_obj['year']})") + trackIds = self.__tc.findAllTracks(self.pattern_obj['id']) - - if self.pattern_obj: + for audioTrackId in trackIds['audio']: - trackIds = self.__tc.findAllTracks(self.pattern_obj['id']) + ad = self.__tc.getTrackDescriptor(audioTrackId) + dispoList = ad['disposition_list'] - for audioTrackId in trackIds['audio']: + row = (ad['sub_index'], + " ", + ad['language'].label(), + ad['title'], + 'Yes' if TrackDisposition.DEFAULT in dispoList else 'No', + 'Yes' if TrackDisposition.FORCED in dispoList else 'No') + + self.audioStreamsTable.add_row(*map(str, row)) + + def updateSubtitleTracks(self): - ad = self.__tc.getTrackDescriptor(audioTrackId) - dispoList = ad['disposition_list'] + self.audioStreamsTable.clear() - row = (ad['sub_index'], - " ", - ad['language'].label(), - ad['title'], - 'Yes' if TrackDisposition.DEFAULT in dispoList else 'No', - 'Yes' if TrackDisposition.FORCED in dispoList else 'No') + trackIds = self.__tc.findAllTracks(self.pattern_obj['id']) - self.audioStreamsTable.add_row(*map(str, row)) + for audioTrackId in trackIds['audio']: + + ad = self.__tc.getTrackDescriptor(audioTrackId) + dispoList = ad['disposition_list'] + + row = (ad['sub_index'], + " ", + ad['language'].label(), + ad['title'], + 'Yes' if TrackDisposition.DEFAULT in dispoList else 'No', + 'Yes' if TrackDisposition.FORCED in dispoList else 'No') + + self.audioStreamsTable.add_row(*map(str, row)) - for subtitleTrackId in trackIds['subtitle']: - sd = self.__tc.getTrackDescriptor(subtitleTrackId) - dispoList = sd['disposition_list'] + def on_mount(self): + + if self.pattern_obj: + self.query_one("#pattern_input", Input).value = str(self.pattern_obj['pattern']) - row = (sd['sub_index'], - " ", - sd['language'].label(), - sd['title'], - 'Yes' if TrackDisposition.DEFAULT in dispoList else 'No', - 'Yes' if TrackDisposition.FORCED in dispoList else 'No') + if self.show_obj: + self.query_one("#showlabel", Static).update(f"{self.show_obj['id']} - {self.show_obj['name']} ({self.show_obj['year']})") - self.subtitleStreamsTable.add_row(*map(str, row)) + if self.pattern_obj: + + self.updateAudioTracks() + self.updateSubtitleTracks() def compose(self): @@ -319,15 +332,21 @@ class PatternDetailsScreen(Screen): 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(trackId = self.getSelectedAudioTrackId()), self.handle_edit_stream) - if event.button.id == "button_delete_audio_stream": - self.app.push_screen(TrackDeleteScreen(trackId = self.getSelectedAudioTrackId()), self.handle_delete_stream) + + selectedAudioTrackId = self.getSelectedAudioTrackId() + if selectedAudioTrackId is not None: + if event.button.id == "button_delete_audio_stream": + self.app.push_screen(TrackDeleteScreen(trackId = selectedAudioTrackId), 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(trackId = self.getSelectedSubtitleTrackId()), self.handle_edit_stream) - if event.button.id == "button_delete_subtitle_stream": - self.app.push_screen(TrackDeleteScreen(trackId = self.getSelectedSubtitleTrackId()), self.handle_delete_stream) + + selectedSubtitleTrackId = self.getSelectedSubtitleTrackId() + if selectedSubtitleTrackId is not None: + if event.button.id == "button_delete_subtitle_stream": + self.app.push_screen(TrackDeleteScreen(trackId = selectedSubtitleTrackId), self.handle_delete_stream) def handle_add_stream(self, trackDescriptor): @@ -386,13 +405,10 @@ class PatternDetailsScreen(Screen): 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) + self.updateAudioTracks() 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) + self.updateSubtitleTracks() except CellDoesNotExist: pass - diff --git a/bin/ffx/track_controller.py b/bin/ffx/track_controller.py index c2c312b..5626351 100644 --- a/bin/ffx/track_controller.py +++ b/bin/ffx/track_controller.py @@ -7,6 +7,8 @@ from .track_type import TrackType from .track_disposition import TrackDisposition from .iso_language import IsoLanguage +from .track_type import TrackType + class TrackController(): @@ -76,17 +78,17 @@ class TrackController(): s = self.Session() trackDescriptors = {} - trackDescriptors['audio'] = [] - trackDescriptors['subtitle'] = [] + trackDescriptors[TrackType.AUDIO.label()] = [] + trackDescriptors[TrackType.SUBTITLE.label()] = [] q_audio = s.query(Track).filter(Track.pattern_id == int(patternId), Track.track_type == TrackType.AUDIO.value) for audioTrack in q_audio.all(): - trackDescriptors['audio'].append(audioTrack.id) + trackDescriptors[TrackType.AUDIO.label()].append(audioTrack.id) q_subtitle = s.query(Track).filter(Track.pattern_id == int(patternId), Track.track_type == TrackType.SUBTITLE.value) for subtitleTrack in q_subtitle.all(): - trackDescriptors['subtitle'].append(subtitleTrack.id) + trackDescriptors[TrackType.SUBTITLE.label()].append(subtitleTrack.id) return trackDescriptors @@ -152,15 +154,27 @@ class TrackController(): if q.count(): - #DAFUQ: https://stackoverflow.com/a/19245058 - # q.delete() - pattern = q.first() - s.delete(pattern) + trackDescriptor = self.getTrackDict(q.first()) + + + q_siblings = s.query(Track).filter(Track.pattern_id == int(trackDescriptor['pattern_id']), Track.track_type == trackDescriptor['type'].value).order_by(Track.sub_index) + + subIndex = 0 + for track in q_siblings.all(): + + if track.sub_index == trackDescriptor['sub_index']: + s.delete(track) + else: + track.sub_index = subIndex + subIndex += 1 s.commit() return True + + return False + except Exception as ex: raise click.ClickException(f"TrackController.deleteTrack(): {repr(ex)}") finally: diff --git a/bin/ffx/track_details_screen.py b/bin/ffx/track_details_screen.py index 773cfd1..45149b2 100644 --- a/bin/ffx/track_details_screen.py +++ b/bin/ffx/track_details_screen.py @@ -26,9 +26,9 @@ class TrackDetailsScreen(Screen): CSS = """ Grid { - grid-size: 5 18; - grid-rows: 2 2 2 2 2 3 2 2 2 2 2 6 2 2 6 2 2 2; - grid-columns: 25 25 25 25 25; + grid-size: 5 20; + grid-rows: 2 2 2 2 2 3 2 2 2 2 2 6 2 2 6 2 2 2 2 6; + grid-columns: 25 25 25 25 225; height: 100%; width: 100%; padding: 1; @@ -102,16 +102,13 @@ class TrackDetailsScreen(Screen): if self.subIndex is None: raise click.ClickException('Sub index for track is required to be set') - - - - def on_mount(self): if self.pattern_obj: self.query_one("#patternlabel", Static).update(str(self.pattern_obj['pattern'])) + if self.subIndex is not None: self.query_one("#subindexlabel", Static).update(str(self.subIndex)) @@ -132,22 +129,6 @@ class TrackDetailsScreen(Screen): 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']})") - - # for pattern in self.loadPatterns(int(self.show_obj['id'])): - # row = (pattern['pattern'],) - # self.patternTable.add_row(*map(str, row)) - - -# for subIndex in range(3): -# -# row4 = (str(subIndex),str(subIndex),str(subIndex),str(subIndex),) -# self.audioStreamsTable.add_row(*map(str, row4)) -# -# row5 = (str(subIndex),str(subIndex),str(subIndex),str(subIndex),str(subIndex),) -# self.subtitleStreamsTable.add_row(*map(str, row5)) - def compose(self): @@ -227,7 +208,14 @@ class TrackDetailsScreen(Screen): yield Button("Save", id="save_button") yield Button("Cancel", id="cancel_button") - yield Footer() + # 19 + yield Static(" ", classes="five") + + # 20 + yield Static(" ", classes="five", id="messagestatic") + + + yield Footer(id="footer") def getTrackDescriptorFromInput(self): @@ -259,23 +247,45 @@ class TrackDetailsScreen(Screen): trackDescriptor = self.getTrackDescriptorFromInput() - if self.track_obj['is_new']: + # Check for multiple default/forced disposition flags + + trackIdList = self.__tc.findAllTracks(self.pattern_obj['id'])[self.trackType.label()] - self.__tc.addTrack(trackDescriptor) - self.dismiss(trackDescriptor) + descriptorList = [d for d in (self.__tc.getTrackDescriptor(t) for t in trackIdList) + if d['type'] == self.trackType + and d['sub_index'] != self.subIndex] + + numDefaultTracks = [d for d in descriptorList if TrackDisposition.DEFAULT in d['disposition_list']] + numForcedTracks = [d for d in descriptorList if TrackDisposition.FORCED in d['disposition_list']] + + doubleDefaultOrForced = ((TrackDisposition.DEFAULT in trackDescriptor['disposition_list'] and numDefaultTracks) + or (TrackDisposition.FORCED in trackDescriptor['disposition_list'] and numForcedTracks)) + + + if doubleDefaultOrForced: + + self.query_one("#messagestatic", Static).update("Cannot add another stream with disposition flag 'debug' or 'forced' set") + else: - 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.query_one("#messagestatic", Static).update(" ") + + if self.track_obj['is_new']: + + self.__tc.addTrack(trackDescriptor) self.dismiss(trackDescriptor) else: - self.app.pop_screen() + trackId = self.__tc.findTrack(self.pattern_obj['id'], self.trackType, self.subIndex) + + if self.__tc.updateTrack(trackId, trackDescriptor): + self.dismiss(trackDescriptor) - if event.button.id == "cancel_button": - self.app.pop_screen() + else: + self.app.pop_screen() + if event.button.id == "cancel_button": + self.app.pop_screen()