@@ -42,7 +42,9 @@ class Presentation:
4242 def __init__ (self , config , last_frame_next : bool = False ):
4343 self .last_frame_next = last_frame_next
4444 self .slides = config ["slides" ]
45- self .files = [reverse_video_path (path ) for path in config ["files" ]]
45+ self .files = [path for path in config ["files" ]]
46+ self .reverse = False
47+ self .reversed_slide = - 1
4648
4749 self .lastframe = []
4850
@@ -80,22 +82,34 @@ def prev(self):
8082 self .current_slide_i = max (0 , self .current_slide_i - 1 )
8183 self .rewind_slide ()
8284
83- def reserve_slide (self ):
84- pass
85+ def reverse_slide (self ):
86+ self . rewind_slide ( reverse = True )
8587
86- def rewind_slide (self ):
88+ def rewind_slide (self , reverse : bool = False ):
89+ self .reverse = reverse
8790 self .current_animation = self .current_slide ["start_animation" ]
8891 self .current_cap .set (cv2 .CAP_PROP_POS_FRAMES , 0 )
8992
90- def load_this_cap (self , cap_number ):
91- if self .caps [cap_number ] == None :
93+ def load_this_cap (self , cap_number : int ):
94+ if (
95+ self .caps [cap_number ] is None
96+ or (self .reverse and self .reversed_slide != cap_number )
97+ or (not self .reverse and self .reversed_slide == cap_number )
98+ ):
9299 # unload other caps
93100 for i in range (len (self .caps )):
94- if self .caps [i ] != None :
101+ if not self .caps [i ] is None :
95102 self .caps [i ].release ()
96103 self .caps [i ] = None
97104 # load this cap
98- self .caps [cap_number ] = cv2 .VideoCapture (self .files [cap_number ])
105+ file = self .files [cap_number ]
106+ if self .reverse :
107+ self .reversed_slide = cap_number
108+ file = "{}_reversed{}" .format (* os .path .splitext (file ))
109+ else :
110+ self .reversed_slide = - 1
111+
112+ self .caps [cap_number ] = cv2 .VideoCapture (file )
99113
100114 @property
101115 def current_slide (self ):
@@ -174,7 +188,9 @@ def __init__(self, presentations, config, start_paused=False, fullscreen=False):
174188
175189 if platform .system () == "Windows" :
176190 user32 = ctypes .windll .user32
177- self .screen_width , self .screen_height = user32 .GetSystemMetrics (0 ), user32 .GetSystemMetrics (1 )
191+ self .screen_width , self .screen_height = user32 .GetSystemMetrics (
192+ 0
193+ ), user32 .GetSystemMetrics (1 )
178194
179195 if fullscreen :
180196 cv2 .namedWindow ("Video" , cv2 .WND_PROP_FULLSCREEN )
@@ -287,6 +303,9 @@ def handle_key(self):
287303 else :
288304 self .current_presentation .prev ()
289305 self .state = State .PLAYING
306+ elif self .config .REVERSE .match (key ):
307+ self .current_presentation .reverse_slide ()
308+ self .state = State .PLAYING
290309 elif self .config .REWIND .match (key ):
291310 self .current_presentation .rewind_slide ()
292311 self .state = State .PLAYING
@@ -296,28 +315,33 @@ def quit(self):
296315 sys .exit ()
297316
298317
299- """
300318@click .command ()
301319@click .option (
302320 "--folder" ,
303321 default = FOLDER_PATH ,
304322 type = click .Path (exists = True , file_okay = False ),
305323 help = "Set slides folder." ,
306324)
307- """
308325@click .help_option ("-h" , "--help" )
309326def list_scenes (folder ):
327+ """List available scenes."""
328+
329+ for i , scene in enumerate (_list_scenes (folder ), start = 1 ):
330+ click .secho (f"{ i } : { scene } " , fg = "green" )
331+
332+
333+ def _list_scenes (folder ):
310334 scenes = []
311335
312336 for file in os .listdir (folder ):
313337 if file .endswith (".json" ):
314- scenes .append (os .path .basename (file )[:- 4 ])
338+ scenes .append (os .path .basename (file )[:- 5 ])
315339
316340 return scenes
317341
318342
319343@click .command ()
320- @click .option ( "-- scenes" , nargs = - 1 , prompt = True )
344+ @click .argument ( " scenes" , nargs = - 1 )
321345@config_path_option
322346@click .option (
323347 "--folder" ,
@@ -337,19 +361,36 @@ def present(scenes, config_path, folder, start_paused, fullscreen, last_frame_ne
337361 """Present the different scenes."""
338362
339363 if len (scenes ) == 0 :
340- print ("ICI" )
341- scene_choices = list_scenes (folder )
364+ scene_choices = _list_scenes (folder )
342365
343366 scene_choices = dict (enumerate (scene_choices , start = 1 ))
344- choices = [str (i ) for i in scene_choices .keys ()]
367+
368+ for i , scene in scene_choices .items ():
369+ click .secho (f"{ i } : { scene } " , fg = "green" )
370+
371+ click .echo ()
372+
373+ click .echo ("Choose number corresponding to desired scene/arguments." )
374+ click .echo ("(Use comma separated list for multiple entries)" )
345375
346376 def value_proc (value : str ):
347- raise ValueError ("Value:" )
348-
349- print (scene_choices )
350-
351- scenes = click .prompt ("Choose a scene" , value_proc = value_proc )
352-
377+ indices = list (map (int , value .strip ().replace (" " , "" ).split ("," )))
378+
379+ if not all (map (lambda i : 0 < i <= len (scene_choices ), indices )):
380+ raise ValueError ("Please only enter numbers displayed on the screen." )
381+
382+ return [scene_choices [i ] for i in indices ]
383+
384+ if len (scene_choices ) == 0 :
385+ raise ValueError ("No scenes were found, are you in the correct directory?" )
386+
387+ while True :
388+ try :
389+ scenes = click .prompt ("Choice(s)" , value_proc = value_proc )
390+ break
391+ except ValueError as e :
392+ click .secho (e , fg = "red" )
393+
353394 presentations = list ()
354395 for scene in scenes :
355396 config_file = os .path .join (folder , f"{ scene } .json" )
0 commit comments