rework descriptors raw

click-textual
Maveno 1 year ago
parent 1c9f67e47a
commit 7d7e43c6f0

@ -11,6 +11,7 @@ from ffx.iso_language import IsoLanguage
from ffx.track_disposition import TrackDisposition
from ffx.track_descriptor import TrackDescriptor
import click
class Track(Base):
"""
@ -145,26 +146,6 @@ class Track(Base):
return None
# def getDescriptor(self):
#
# descriptor = {}
# descriptor['id'] = int(self.id)
# descriptor['pattern_id'] = int(self.pattern_id)
# descriptor['type'] = TrackType(self.track_type)
# descriptor['sub_index'] = int(self.sub_index)
#
# descriptor['language'] = IsoLanguage.findThreeLetter(self.language)
# descriptor['title'] = str(self.title)
#
# descriptor['disposition_list'] = TrackDisposition.toList(self.disposition_flags)
#
# descriptor['tags'] = {}
# for t in self.track_tags:
# descriptor['tags'][str(t.key)] = str(t.value)
#
# return descriptor
def getId(self):
return int(self.id)
@ -172,7 +153,7 @@ class Track(Base):
return int(self.pattern_id)
def getType(self):
return TrackType(self.track_type)
return TrackType.fromIndex(self.track_type)
def getSubIndex(self):
return int(self.sub_index)
@ -189,4 +170,4 @@ class Track(Base):
return TrackDisposition.toSet(self.disposition_flags)
def getTags(self):
return {str(k.value):str(v.value) for (k,v) in self.track_tags}
return {str(t.key):str(t.value) for t in self.track_tags}

@ -79,7 +79,10 @@ class PatternController():
s.close()
def getPattern(self, patternId):
def getPattern(self, patternId : int):
if type(patternId) is not int:
raise ValueError(f"PatternController.getPattern(): Argument patternId is required to be of type int")
try:
s = self.Session()

@ -19,6 +19,7 @@ from .track_delete_screen import TrackDeleteScreen
from ffx.track_type import TrackType
from ffx.track_disposition import TrackDisposition
from ffx.track_descriptor import TrackDescriptor
from textual.widgets._data_table import CellDoesNotExist
@ -79,7 +80,7 @@ class PatternDetailsScreen(Screen):
self.__sc = ShowController(context = self.context)
self.__tc = TrackController(context = self.context)
self.__pattern = self.__pc.getPattern(patternId)
self.__pattern = self.__pc.getPattern(patternId) if patternId is not None else None
self.show_obj = self.__sc.getShowDesciptor(showId) if showId is not None else {}
@ -107,6 +108,8 @@ class PatternDetailsScreen(Screen):
self.audioStreamsTable.clear()
if self.__pattern is not None:
audioTracks = self.__tc.findAudioTracks(self.__pattern.getId())
for at in audioTracks:
@ -126,6 +129,8 @@ class PatternDetailsScreen(Screen):
self.subtitleStreamsTable.clear()
if self.__pattern is not None:
subtitleTracks = self.__tc.findSubtitleTracks(self.__pattern.getId())
for st in subtitleTracks:
@ -249,7 +254,7 @@ class PatternDetailsScreen(Screen):
def getSelectedAudioTrack(self):
def getSelectedAudioTrackDescriptor(self):
if not self.__pattern:
return None
@ -265,7 +270,18 @@ class PatternDetailsScreen(Screen):
subIndex = int(selected_track_data[0])
return self.__tc.findTrack(self.__pattern.getId(), TrackType.AUDIO, subIndex)
audioTrack = self.__tc.findTrack(self.__pattern.getId(), TrackType.AUDIO, subIndex)
kwargs = {}
kwargs[TrackDescriptor.PATTERN_ID_KEY] = self.__pattern.getId()
kwargs[TrackDescriptor.SUB_INDEX_KEY] = subIndex
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioTrack.getDispositionSet()
kwargs[TrackDescriptor.TAGS_KEY] = audioTrack.getTags()
return TrackDescriptor(**kwargs)
else:
return None
@ -274,7 +290,7 @@ class PatternDetailsScreen(Screen):
return None
def getSelectedSubtitleTrack(self):
def getSelectedSubtitleTrackDescriptor(self):
if not self.__pattern is None:
return None
@ -290,7 +306,18 @@ class PatternDetailsScreen(Screen):
subIndex = int(selected_track_data[0])
return self.__tc.findTrack(self.__pattern.getId(), TrackType.SUBTITLE, subIndex)
subtitleTrack = self.__tc.findTrack(self.__pattern.getId(), TrackType.SUBTITLE, subIndex)
kwargs = {}
kwargs[TrackDescriptor.PATTERN_ID_KEY] = self.__pattern.getId()
kwargs[TrackDescriptor.SUB_INDEX_KEY] = subIndex
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleTrack.getDispositionSet()
kwargs[TrackDescriptor.TAGS_KEY] = subtitleTrack.getTags()
return TrackDescriptor(**kwargs)
else:
return None
@ -333,27 +360,26 @@ class PatternDetailsScreen(Screen):
# Save pattern when just created before adding streams
if self.__pattern is not None:
#self.pattern_obj
if event.button.id == "button_add_audio_stream":
self.app.push_screen(TrackDetailsScreen(trackType = TrackType.AUDIO, patternId = self.__pattern.getId(), subIndex = len(self.audioStreamsTable.rows)), self.handle_add_track)
selectedAudioTrack = self.getSelectedAudioTrack()
selectedAudioTrack = self.getSelectedAudioTrackDescriptor()
if selectedAudioTrack is not None:
if event.button.id == "button_edit_audio_stream":
self.app.push_screen(TrackDetailsScreen(track = selectedAudioTrack), self.handle_edit_track)
self.app.push_screen(TrackDetailsScreen(trackDescriptor = selectedAudioTrack), self.handle_edit_track)
if event.button.id == "button_delete_audio_stream":
self.app.push_screen(TrackDeleteScreen(trackI= selectedAudioTrack), self.handle_delete_track)
self.app.push_screen(TrackDeleteScreen(trackDescriptor = selectedAudioTrack), self.handle_delete_track)
if event.button.id == "button_add_subtitle_stream":
self.app.push_screen(TrackDetailsScreen(trackType = TrackType.SUBTITLE, patternId = self.__pattern.getId(), subIndex = len(self.subtitleStreamsTable.rows)), self.handle_add_track)
selectedSubtitleTrack = self.getSelectedSubtitleTrack()
selectedSubtitleTrack = self.getSelectedSubtitleTrackDescriptor()
if selectedSubtitleTrack is not None:
if event.button.id == "button_edit_subtitle_stream":
self.app.push_screen(TrackDetailsScreen(track = selectedSubtitleTrack), self.handle_edit_track)
self.app.push_screen(TrackDetailsScreen(trackDescriptor = selectedSubtitleTrack), self.handle_edit_track)
if event.button.id == "button_delete_subtitle_stream":
self.app.push_screen(TrackDeleteScreen(track = selectedSubtitleTrack), self.handle_delete_track)
self.app.push_screen(TrackDeleteScreen(trackDescriptor = selectedSubtitleTrack), self.handle_delete_track)
if event.button.id == "patternbutton":
@ -398,38 +424,38 @@ class PatternDetailsScreen(Screen):
self.subtitleStreamsTable.add_row(*map(str, row))
def handle_edit_track(self, trackDescriptor):
def handle_edit_track(self, trackDescriptor : TrackDescriptor):
try:
if trackDescriptor['type'] == TrackType.AUDIO:
if trackDescriptor.getType() == 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')
self.audioStreamsTable.update_cell(row_key, self.column_key_audio_language, trackDescriptor.getLanguage().label())
self.audioStreamsTable.update_cell(row_key, self.column_key_audio_title, trackDescriptor.getTitle())
self.audioStreamsTable.update_cell(row_key, self.column_key_audio_default, 'Yes' if TrackDisposition.DEFAULT in trackDescriptor.getDispositionSet() else 'No')
self.audioStreamsTable.update_cell(row_key, self.column_key_audio_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor.getDispositionSet() else 'No')
if trackDescriptor['type'] == TrackType.SUBTITLE:
if trackDescriptor.getType() == 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')
self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_language, trackDescriptor.getLanguage().label())
self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_title, trackDescriptor.getTitle())
self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_default, 'Yes' if TrackDisposition.DEFAULT in trackDescriptor.getDispositionSet() else 'No')
self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor.getDispositionSet() else 'No')
except CellDoesNotExist:
pass
def handle_delete_track(self, trackDescriptor):
def handle_delete_track(self, trackDescriptor : TrackDescriptor):
try:
if trackDescriptor['type'] == TrackType.AUDIO:
if trackDescriptor.getType() == TrackType.AUDIO:
self.updateAudioTracks()
if trackDescriptor['type'] == TrackType.SUBTITLE:
if trackDescriptor.getType() == TrackType.SUBTITLE:
self.updateSubtitleTracks()
except CellDoesNotExist:

@ -126,11 +126,11 @@ class TrackController():
s.close()
def findTrack(self, patternId, trackType : TrackType, subIndex):
def findTrack(self, patternId : int, trackType : TrackType, subIndex : int):
try:
s = self.Session()
q = s.query(Track).filter(Track.pattern_id == int(patternId), Track.track_type == trackType.value, Track.sub_index == int(subIndex))
q = s.query(Track).filter(Track.pattern_id == int(patternId), Track.track_type == trackType.index(), Track.sub_index == int(subIndex))
if q.count():
#track = q.first()
@ -144,26 +144,6 @@ class TrackController():
finally:
s.close()
# def getTrackDescriptor(self, trackId):
#
# try:
# s = self.Session()
# q = s.query(Track).filter(Track.id == int(trackId))
#
# if q.count():
# track = q.first()
# #return self.getTrackDict(track)
# return track.getDescriptor()
# else:
# return {}
#
# except Exception as ex:
# raise click.ClickException(f"TrackController.getTrackDescriptor(): {repr(ex)}")
# finally:
# s.close()
def deleteTrack(self, trackId):
try:
s = self.Session()
@ -171,15 +151,15 @@ class TrackController():
if q.count():
trackDescriptor = self.getTrackDict(q.first())
#trackDescriptor = self.getTrackDict(q.first())
track = 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)
q_siblings = s.query(Track).filter(Track.pattern_id == track.getPatternId(), Track.track_type == track.getType().index()).order_by(Track.sub_index)
subIndex = 0
for track in q_siblings.all():
if track.sub_index == trackDescriptor['sub_index']:
if track.sub_index == track.getSubIndex():
s.delete(track)
else:
track.sub_index = subIndex

@ -7,6 +7,7 @@ from textual.widgets import Header, Footer, Placeholder, Label, ListView, ListIt
from textual.containers import Grid, Horizontal
from ffx.model.pattern import Pattern
from ffx.track_descriptor import TrackDescriptor
# from .show_controller import ShowController
# from .pattern_controller import PatternController
@ -54,26 +55,26 @@ class TrackDeleteScreen(Screen):
}
"""
def __init__(self, trackId = None):
def __init__(self, trackDescriptor : TrackDescriptor):
super().__init__()
self.context = self.app.getContext()
self.Session = self.context['database']['session'] # convenience
if trackId is None:
raise click.ClickException('TrackDeleteScreen.init(): trackId is required to be set')
if type(trackDescriptor) is not TrackDescriptor:
raise click.ClickException('TrackDeleteScreen.init(): trackDescriptor is required to be of type TrackDescriptor')
self.__tc = TrackController(context = self.context)
self.track_obj = self.__tc.getTrackDescriptor(trackId)
self.__trackDescriptor = trackDescriptor
def on_mount(self):
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'])))
self.query_one("#subindexlabel", Static).update(str(self.__trackDescriptor.getSubIndex()))
self.query_one("#patternlabel", Static).update(str(self.__trackDescriptor.getPatternId()))
self.query_one("#languagelabel", Static).update(str(self.__trackDescriptor.getLanguage().label()))
self.query_one("#titlelabel", Static).update(str(str(self.__trackDescriptor.getTitle())))
def compose(self):
@ -83,7 +84,7 @@ class TrackDeleteScreen(Screen):
with Grid():
#1
yield Static(f"Are you sure to delete the following {self.track_obj['type'].label()} track?", id="toplabel", classes="four")
yield Static(f"Are you sure to delete the following {self.__trackDescriptor.getType().label()} track?", id="toplabel", classes="four")
#2
yield Static("sub index")
@ -122,12 +123,15 @@ class TrackDeleteScreen(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'])
track = self.__tc.findTrack(self.__trackDescriptor.getPatternId(), self.__trackDescriptor.getType(), self.__trackDescriptor.getSubIndex())
if trackId is not None:
if track is None:
raise click.ClickException(f"Track is none: patternId={self.__trackDescriptor.getPatternId()} type={self.__trackDescriptor.getType()} subIndex={self.__trackDescriptor.getSubIndex()}")
if self.__tc.deleteTrack(trackId):
self.dismiss(self.track_obj)
if track is not None:
if self.__tc.deleteTrack(track.getId()):
self.dismiss(self.__trackDescriptor)
else:
#TODO: Meldung

@ -151,7 +151,7 @@ class TrackDescriptor():
if 'language' in self.__trackTags.keys():
return IsoLanguage.findThreeLetter(self.__trackTags['language'])
else:
return IsoLanguage.UNKNOWN
return IsoLanguage.UNDEFINED
def getTitle(self):
if 'title' in self.__trackTags.keys():

@ -116,27 +116,6 @@ class TrackDetailsScreen(Screen):
self.__trackDescriptor = trackDescriptor
self.__pattern = self.__pc.getPattern(self.__trackDescriptor.getPatternId())
# self.__trackDescriptor = trackDescriptor
# self.__trackType = 0
# self.__subIndex = 0
# self.__patternDescriptor = 0
# 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'])
# 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')
# if self.subIndex is None:
# raise click.ClickException('Sub index for track is required to be set')
def on_mount(self):
@ -148,7 +127,6 @@ class TrackDetailsScreen(Screen):
self.query_one("#subindexlabel", Static).update(str(self.__subIndex))
if self.__trackDescriptor is not None:
for d in TrackDisposition:
@ -158,16 +136,11 @@ class TrackDetailsScreen(Screen):
dispositionOption = (d.label(), d.index(), dispositionIsSet)
self.query_one("#dispositions_selection_list", SelectionList).add_option(dispositionOption)
if self.__trackDescriptor is not None:
self.query_one("#language_select", Select).value = self.__trackDescriptor.getLanguage().label()
self.query_one("#title_input", Input).value = self.__trackDescriptor.getTitle()
# 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'])
def compose(self):
@ -267,7 +240,16 @@ class TrackDetailsScreen(Screen):
kwargs[TrackDescriptor.SUB_INDEX_KEY] = self.__subIndex
kwargs[TrackDescriptor.TRACK_TYPE_KEY] = self.__trackType
kwargs[TrackDescriptor.TAGS_KEY] = {}
trackTags = {}
language = self.query_one("#language_select", Select).value
# raise click.ClickException(f"language={language}")
if language:
trackTags['language'] = IsoLanguage.find(language).threeLetter()
title = self.query_one("#title_input", Input).value
if title:
trackTags['title'] = title
kwargs[TrackDescriptor.TAGS_KEY] = trackTags
dispositionFlags = sum([2**f for f in self.query_one("#dispositions_selection_list", SelectionList).selected])
kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = TrackDisposition.toSet(dispositionFlags)
@ -294,10 +276,6 @@ class TrackDetailsScreen(Screen):
else:
trackList = []
# descriptorList = [d for d in (self.__tc.getTrackDescriptor(t) for t in trackList)
# if d['type'] == self.__trackType
# and d['sub_index'] != self.__subIndex]
siblingTrackList = [t for t in trackList if t.getType() == self.__trackType and t.getSubIndex() != self.__subIndex]
numDefaultTracks = len([t for t in siblingTrackList if TrackDisposition.DEFAULT in t.getDispositionSet()])

Loading…
Cancel
Save