@ -8,6 +8,7 @@ from textual.containers import Grid
from ffx . model . show import Show
from ffx . model . pattern import Pattern
from ffx . model . track import Track
from . pattern_controller import PatternController
from . show_controller import ShowController
@ -30,8 +31,8 @@ class PatternDetailsScreen(Screen):
CSS = """
Grid {
grid - size : 5 12 ;
grid - rows : 2 2 2 2 2 6 2 2 6 2 2 2;
grid - size : 5 9 ;
grid - rows : 2 2 2 2 2 6 2 2 2;
grid - columns : 25 25 25 25 25 ;
height : 100 % ;
width : 100 % ;
@ -68,6 +69,10 @@ class PatternDetailsScreen(Screen):
height : 100 % ;
border : solid green ;
}
#tracks_table {
row - span : 4 ;
}
"""
def __init__ ( self , patternId = None , showId = None ) :
@ -105,47 +110,38 @@ class PatternDetailsScreen(Screen):
s . close ( )
def update Audio Tracks( self ) :
def update Tracks( self ) :
self . audioStream sTable. clear ( )
self . track sTable. clear ( )
if self . __pattern is not None :
audioT racks = self . __tc . find Audio Tracks( self . __pattern . getId ( ) )
t racks = self . __tc . find Tracks( self . __pattern . getId ( ) )
for at in audioTracks :
typeCounter = { }
dispoSet = at . getDispositionSet ( )
for tr in tracks :
row = ( at . getSubIndex ( ) ,
" " ,
at . getLanguage ( ) . label ( ) ,
at . getTitle ( ) ,
' Yes ' if TrackDisposition . DEFAULT in dispoSet else ' No ' ,
' Yes ' if TrackDisposition . FORCED in dispoSet else ' No ' )
td : TrackDescriptor = tr . getDescriptor ( )
self . audioStreamsTable . add_row ( * map ( str , row ) )
def updateSubtitleTracks ( self ) :
self . subtitleStreamsTable . clear ( )
if self . __pattern is not None :
trackType = td . getType ( )
if not trackType in typeCounter . keys ( ) :
typeCounter [ trackType ] = 0
subtitleTracks = self . __tc . findSubtitleTracks ( self . __pattern . getId ( ) )
dispoSet = td . getDispositionSet ( )
for st in subtitleTracks :
dispoSet = st . getDispositionSet ( )
row = ( st . getSubIndex ( ) ,
row = ( td . getIndex ( ) ,
trackType . label ( ) ,
typeCounter [ trackType ] ,
" " ,
s t. getLanguage ( ) . label ( ) ,
s t. getTitle ( ) ,
td . getLanguage ( ) . label ( ) ,
td . getTitle ( ) ,
' Yes ' if TrackDisposition . DEFAULT in dispoSet else ' No ' ,
' Yes ' if TrackDisposition . FORCED in dispoSet else ' No ' )
self . subtitleStreamsTable . add_row ( * map ( str , row ) )
self . tracksTable . add_row ( * map ( str , row ) )
typeCounter [ trackType ] + = 1
def on_mount ( self ) :
@ -157,38 +153,25 @@ class PatternDetailsScreen(Screen):
self . query_one ( " #pattern_input " , Input ) . value = str ( self . __pattern . getPattern ( ) )
self . updateAudioTracks ( )
self . updateSubtitleTracks ( )
self . updateTracks ( )
def compose ( self ) :
self . audioStreamsTable = DataTable ( classes = " five " )
self . tracksTable = DataTable ( id = " tracks_table " , classes = " five " )
# Define the columns with headers
self . column_key_audio_subid = self . audioStreamsTable . add_column ( " Subindex " , width = 20 )
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_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 '
self . column_key_track_index = self . tracksTable . add_column ( " Index " , width = 5 )
self . column_key_track_type = self . tracksTable . add_column ( " Type " , width = 10 )
self . column_key_track_sub_index = self . tracksTable . add_column ( " Subindex " , width = 5 )
self . column_key_track_layout = self . tracksTable . add_column ( " Layout " , width = 10 )
self . column_key_track_language = self . tracksTable . add_column ( " Language " , width = 15 )
self . column_key_track_title = self . tracksTable . add_column ( " Title " , width = 48 )
self . column_key_track_default = self . tracksTable . add_column ( " Default " , width = 8 )
self . column_key_track_forced = self . tracksTable . add_column ( " Forced " , width = 8 )
self . tracksTable . cursor_type = ' row '
self . subtitleStreamsTable = DataTable ( classes = " five " )
# Define the columns with headers
self . column_key_subtitle_subid = self . subtitleStreamsTable . add_column ( " Subindex " , width = 20 )
self . column_key_subtitle_spacer = self . subtitleStreamsTable . add_column ( " " , width = 20 )
self . column_key_subtitle_language = self . subtitleStreamsTable . add_column ( " Language " , width = 20 )
self . column_key_subtitle_title = self . subtitleStreamsTable . add_column ( " Title " , width = 30 )
self . column_key_subtitle_default = self . subtitleStreamsTable . add_column ( " Default " , width = 10 )
self . column_key_subtitle_forced = self . subtitleStreamsTable . add_column ( " Forced " , width = 10 )
self . subtitleStreamsTable . cursor_type = ' row '
yield Header ( )
with Grid ( ) :
@ -200,7 +183,7 @@ class PatternDetailsScreen(Screen):
# 2
yield Static ( " from show " )
yield Static ( " " , id = " showlabel " , classes = " three " )
yield Button ( " Substitute pattern " , id = " pattern button" )
yield Button ( " Substitute pattern " , id = " pattern _ button" )
# 3
yield Static ( " " , classes = " five " )
@ -208,42 +191,27 @@ class PatternDetailsScreen(Screen):
yield Static ( " " , classes = " five " )
# 5
yield Static ( " Audio s treams" )
yield Static ( " S treams" )
yield Static ( " " )
if self . __pattern is not None :
yield Button ( " Add " , id = " button_add_ audio_stream " )
yield Button ( " Edit " , id = " button_edit_ audio_stream " )
yield Button ( " Delete " , id = " button_delete_ audio_stream " )
yield Button ( " Add " , id = " button_add_ track " )
yield Button ( " Edit " , id = " button_edit_ track " )
yield Button ( " Delete " , id = " button_delete_ track " )
else :
yield Static ( " " )
yield Static ( " " )
yield Static ( " " )
# 6
yield self . audioStream sTable
yield self . track sTable
# 7
yield Static ( " " , classes = " five " )
# 8
yield Static ( " Subtitle streams " )
yield Static ( " " )
if self . __pattern is not None :
yield Button ( " Add " , id = " button_add_subtitle_stream " )
yield Button ( " Edit " , id = " button_edit_subtitle_stream " )
yield Button ( " Delete " , id = " button_delete_subtitle_stream " )
else :
yield Static ( " " )
yield Static ( " " )
yield Static ( " " )
# 9
yield self . subtitleStreamsTable
# 10
yield Static ( " " , classes = " five " )
# 11
# 9
yield Button ( " Save " , id = " save_button " )
yield Button ( " Cancel " , id = " cancel_button " )
@ -255,7 +223,7 @@ class PatternDetailsScreen(Screen):
def getSelected Audio TrackDescriptor( self ) :
def getSelected TrackDescriptor( self ) :
if not self . __pattern :
return None
@ -264,14 +232,15 @@ class PatternDetailsScreen(Screen):
# 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 . audioStream sTable. cursor_coordinate )
row_key , col_key = self . tracksTable. coordinate_to_cell_key ( self . track sTable. cursor_coordinate )
if row_key is not None :
selected_track_data = self . audioStream sTable. get_row ( row_key )
selected_track_data = self . track sTable. get_row ( row_key )
subIndex = int ( selected_track_data [ 0 ] )
trackIndex = int ( selected_track_data [ 0 ] )
trackSubIndex = int ( selected_track_data [ 2 ] )
return self . __tc . find Track( self . __pattern . getId ( ) , TrackType. AUDIO , sub Index) . getDescriptor ( )
return self . __tc . get Track( self . __pattern . getId ( ) , track Index) . getDescriptor ( subIndex = trackSubIndex )
else :
return None
@ -280,32 +249,6 @@ class PatternDetailsScreen(Screen):
return None
def getSelectedSubtitleTrackDescriptor ( self ) - > TrackDescriptor :
if not self . __pattern is None :
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 . getId ( ) , TrackType . SUBTITLE , subIndex ) . getDescriptor ( )
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
@ -327,14 +270,6 @@ class PatternDetailsScreen(Screen):
patternId = self . __pc . addPattern ( patternDescriptor )
if patternId is not None :
# Add dummy video track
kwargs = { }
kwargs [ TrackDescriptor . INDEX_KEY ] = 0
kwargs [ TrackDescriptor . SUB_INDEX_KEY ] = 0
kwargs [ TrackDescriptor . PATTERN_ID_KEY ] = patternId
kwargs [ TrackDescriptor . TRACK_TYPE_KEY ] = TrackType . VIDEO
self . __tc . addTrack ( TrackDescriptor ( * * kwargs ) )
self . dismiss ( patternDescriptor )
else :
#TODO: Meldung
@ -349,36 +284,19 @@ class PatternDetailsScreen(Screen):
# Save pattern when just created before adding streams
if self . __pattern is not None :
numVideoStreams = len ( self . __pattern . getMediaDescriptor ( ) . getVideoTracks ( ) )
numAudioStreams = len ( self . audioStreamsTable . rows )
numSubtitleStreams = len ( self . subtitleStreamsTable . rows )
addedTrackIndex = numVideoStreams + numAudioStreams + numSubtitleStreams
numTracks = len ( self . tracksTable . rows )
#NOTE: Track index
if event . button . id == " button_add_track " :
self . app . push_screen ( TrackDetailsScreen ( patternId = self . __pattern . getId ( ) , index = numTracks ) , self . handle_add_track )
if event . button . id == " button_add_audio_stream " :
self . app . push_screen ( TrackDetailsScreen ( trackType = TrackType . AUDIO , patternId = self . __pattern . getId ( ) , index = addedTrackIndex , subIndex = numAudioStreams ) , self . handle_add_track )
selectedTrack = self . getSelectedTrackDescriptor ( )
if selectedTrack is not None :
if event . button . id == " button_edit_track " :
self . app . push_screen ( TrackDetailsScreen ( trackDescriptor = selectedTrack ) , self . handle_edit_track )
if event . button . id == " button_delete_track " :
self . app . push_screen ( TrackDeleteScreen ( trackDescriptor = selectedTrack ) , self . handle_delete_track )
selectedAudioTrack = self . getSelectedAudioTrackDescriptor ( )
if selectedAudioTrack is not None :
if event . button . id == " button_edit_audio_stream " :
self . app . push_screen ( TrackDetailsScreen ( trackDescriptor = selectedAudioTrack ) , self . handle_edit_track )
if event . button . id == " button_delete_audio_stream " :
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 ( ) , index = addedTrackIndex , subIndex = numSubtitleStreams ) , self . handle_add_track )
selectedSubtitleTrack = self . getSelectedSubtitleTrackDescriptor ( )
if selectedSubtitleTrack is not None :
if event . button . id == " button_edit_subtitle_stream " :
self . app . push_screen ( TrackDetailsScreen ( trackDescriptor = selectedSubtitleTrack ) , self . handle_edit_track )
if event . button . id == " button_delete_subtitle_stream " :
self . app . push_screen ( TrackDeleteScreen ( trackDescriptor = selectedSubtitleTrack ) , self . handle_delete_track )
if event . button . id == " patternbutton " :
if event . button . id == " pattern_button " :
INDICATOR_PATTERN = ' ([sS][0-9]+[eE][0-9]+) '
@ -390,70 +308,41 @@ class PatternDetailsScreen(Screen):
self . query_one ( " #pattern_input " , Input ) . value = pattern . replace ( patternMatch . group ( 1 ) , INDICATOR_PATTERN )
def handle_add_track ( self , trackDescriptor ) :
def handle_add_track ( self , trackDescriptor : TrackDescriptor ) :
dispoSet = trackDescriptor . getDispositionSet ( )
trackType = trackDescriptor . getType ( )
index = trackDescriptor . getIndex ( )
subIndex = trackDescriptor . getSubIndex ( )
language = trackDescriptor . getLanguage ( )
title = trackDescriptor . getTitle ( )
if trackType == TrackType . AUDIO :
row = ( subIndex ,
" " ,
language . label ( ) ,
title ,
' Yes ' if TrackDisposition . DEFAULT in dispoSet else ' No ' ,
' Yes ' if TrackDisposition . FORCED in dispoSet else ' No ' )
row = ( index ,
trackType . label ( ) ,
subIndex ,
" " ,
language . label ( ) ,
title ,
' Yes ' if TrackDisposition . DEFAULT in dispoSet else ' No ' ,
' Yes ' if TrackDisposition . FORCED in dispoSet else ' No ' )
self . audioStreamsTable . add_row ( * map ( str , row ) )
if trackType == TrackType . SUBTITLE :
row = ( subIndex ,
" " ,
language . label ( ) ,
title ,
' Yes ' if TrackDisposition . DEFAULT in dispoSet else ' No ' ,
' Yes ' if TrackDisposition . FORCED in dispoSet else ' No ' )
self . subtitleStreamsTable . add_row ( * map ( str , row ) )
self . tracksTable . add_row ( * map ( str , row ) )
def handle_edit_track ( self , trackDescriptor : TrackDescriptor ) :
try :
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 . 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 ' )
row_key , col_key = self . tracksTable . coordinate_to_cell_key ( self . tracksTable . cursor_coordinate )
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 . 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 ' )
self . tracksTable . update_cell ( row_key , self . column_key_track_language , trackDescriptor . getLanguage ( ) . label ( ) )
self . tracksTable . update_cell ( row_key , self . column_key_track_title , trackDescriptor . getTitle ( ) )
self . tracksTable . update_cell ( row_key , self . column_key_track_default , ' Yes ' if TrackDisposition . DEFAULT in trackDescriptor . getDispositionSet ( ) else ' No ' )
self . tracksTable . update_cell ( row_key , self . column_key_track_forced , ' Yes ' if TrackDisposition . FORCED in trackDescriptor . getDispositionSet ( ) else ' No ' )
except CellDoesNotExist :
pass
def handle_delete_track ( self , trackDescriptor : TrackDescriptor ) :
try :
if trackDescriptor . getType ( ) == TrackType . AUDIO :
self . updateAudioTracks ( )
if trackDescriptor . getType ( ) == TrackType . SUBTITLE :
self . updateSubtitleTracks ( )
except CellDoesNotExist :
pass
self . updateTracks ( )