1313class CustomFooter (Horizontal ):
1414 """A custom footer with keyboard shortcuts and render ID."""
1515
16- FOOTER_BASE_TEXT = "ctrl+c: copy * ctrl+d: quit * ctrl+l: toggle logs"
17- FOOTER_RENDERING_TEXT = FOOTER_BASE_TEXT + " * ctrl+p: pause"
18- RENDER_PAUSING_TEXT = FOOTER_BASE_TEXT + " * pausing ..."
19- RENDER_PAUSED_TEXT = FOOTER_BASE_TEXT + " * ctrl+p: resume"
20- RENDER_FINISHED_TEXT = "enter: exit * ctrl+c: copy * ctrl+l: toggle logs"
16+ KEYBOARD_SHORTCUTS = ["ctrl+c" , "ctrl+d" , "ctrl+l" , "ctrl+p" , "enter" ]
17+
18+ KEYBOARD_SHORTCUTS_EFFECTS = {
19+ "default" : {
20+ "ctrl+c" : "copy" ,
21+ "ctrl+d" : "quit" ,
22+ "ctrl+l" : "toggle logs" ,
23+ "ctrl+p" : "pause" ,
24+ },
25+ "pausing" : {
26+ "ctrl+c" : "copy" ,
27+ "ctrl+d" : "quit" ,
28+ "ctrl+l" : "toggle logs" ,
29+ },
30+ "paused" : {
31+ "ctrl+c" : "copy" ,
32+ "ctrl+d" : "quit" ,
33+ "ctrl+l" : "toggle logs" ,
34+ "ctrl+p" : "resume" ,
35+ },
36+ "finished" : {
37+ "enter" : "exit" ,
38+ "ctrl+c" : "copy" ,
39+ "ctrl+l" : "toggle logs" ,
40+ },
41+ }
42+
43+ APPENDING_TEXT = {
44+ "pausing" : "pausing ..." ,
45+ }
2146
22- def __init__ (self , render_id : str = "" , ** kwargs ):
47+ DELIMITER = " * "
48+
49+ def __init__ (self , render_id : str = "" , use_logs_shortcut : bool = True , use_pause_shortcut : bool = True , ** kwargs ):
2350 super ().__init__ (** kwargs )
2451 self .render_id = render_id
52+ self .use_logs_shortcut = use_logs_shortcut
53+ self .use_pause_shortcut = use_pause_shortcut
54+ self .available_keyboard_shortcuts = self .KEYBOARD_SHORTCUTS [:]
55+ if not self .use_logs_shortcut :
56+ self .available_keyboard_shortcuts .remove ("ctrl+l" )
57+ if not self .use_pause_shortcut :
58+ self .available_keyboard_shortcuts .remove ("ctrl+p" )
2559
2660 def compose (self ):
27- self ._footer_text_widget = Static (self .FOOTER_RENDERING_TEXT , classes = "custom-footer-text" )
61+ footer_rendering_text = self .DELIMITER .join (
62+ [
63+ f"{ shortcut } : { effect } "
64+ for shortcut , effect in self .KEYBOARD_SHORTCUTS_EFFECTS ["default" ].items ()
65+ if shortcut in self .available_keyboard_shortcuts
66+ ]
67+ )
68+ self ._footer_text_widget = Static (footer_rendering_text , classes = "custom-footer-text" )
2869 yield self ._footer_text_widget
2970 if self .render_id :
3071 yield Static (f"render id: { self .render_id } " , classes = "custom-footer-render-id" )
@@ -33,18 +74,35 @@ def update_footer_state(self, state: Literal["rendering", "pausing", "paused", "
3374 self .remove_class ("footer-state-default" )
3475 self .remove_class ("footer-state-paused" )
3576
77+ if state in self .KEYBOARD_SHORTCUTS_EFFECTS :
78+ state_dict = self .KEYBOARD_SHORTCUTS_EFFECTS [state ]
79+ else :
80+ state_dict = self .KEYBOARD_SHORTCUTS_EFFECTS ["default" ]
81+
82+ footer_rendering_text = self .DELIMITER .join (
83+ [
84+ f"{ shortcut } : { effect } "
85+ for shortcut , effect in state_dict .items ()
86+ if shortcut in self .available_keyboard_shortcuts
87+ ]
88+ )
89+
90+ appending_text = self .APPENDING_TEXT .get (state , "" )
91+ if not appending_text .strip () == "" :
92+ footer_rendering_text = f"{ footer_rendering_text } * { appending_text } "
93+
3694 if self ._footer_text_widget is not None :
3795 if state == "rendering" :
38- self ._footer_text_widget .update (self . FOOTER_RENDERING_TEXT )
96+ self ._footer_text_widget .update (footer_rendering_text )
3997 self .add_class ("footer-state-default" )
4098 elif state == "pausing" :
41- self ._footer_text_widget .update (self . RENDER_PAUSING_TEXT )
99+ self ._footer_text_widget .update (footer_rendering_text )
42100 self .add_class ("footer-state-paused" )
43101 elif state == "paused" :
44- self ._footer_text_widget .update (self . RENDER_PAUSED_TEXT )
102+ self ._footer_text_widget .update (footer_rendering_text )
45103 self .add_class ("footer-state-paused" )
46104 elif state == "finished" :
47- self ._footer_text_widget .update (self . RENDER_FINISHED_TEXT )
105+ self ._footer_text_widget .update (footer_rendering_text )
48106 self .add_class ("footer-state-default" )
49107
50108
0 commit comments