1#!/usr/bin/env python3 2 3from asciimatics.event import KeyboardEvent 4from asciimatics.widgets import Frame, Layout, FileBrowser, Widget, Label, PopUpDialog, Text, \ 5 Divider 6from asciimatics.scene import Scene 7from asciimatics.screen import Screen 8from asciimatics.exceptions import ResizeScreenError, StopApplication 9import sys 10import os 11try: 12 import magic 13except ImportError: 14 pass 15 16 17class DemoFrame(Frame): 18 def __init__(self, screen): 19 super(DemoFrame, self).__init__( 20 screen, screen.height, screen.width, has_border=False, name="My Form") 21 22 # Create the (very simple) form layout... 23 layout = Layout([1], fill_frame=True) 24 self.add_layout(layout) 25 26 # Now populate it with the widgets we want to use. 27 self._details = Text() 28 self._details.disabled = True 29 self._details.custom_colour = "field" 30 self._list = FileBrowser(Widget.FILL_FRAME, 31 os.path.abspath("."), 32 name="mc_list", 33 on_select=self.popup, 34 on_change=self.details) 35 layout.add_widget(Label("Local disk browser sample")) 36 layout.add_widget(Divider()) 37 layout.add_widget(self._list) 38 layout.add_widget(Divider()) 39 layout.add_widget(self._details) 40 layout.add_widget(Label("Press Enter to select or `q` to quit.")) 41 42 # Prepare the Frame for use. 43 self.fix() 44 45 def popup(self): 46 # Just confirm whenever the user actually selects something. 47 self._scene.add_effect( 48 PopUpDialog(self._screen, "You selected: {}".format(self._list.value), ["OK"])) 49 50 def details(self): 51 # If python magic is installed, provide a little more detail of the current file. 52 if self._list.value: 53 if os.path.isdir(self._list.value): 54 self._details.value = "Directory" 55 elif os.path.isfile(self._list.value): 56 try: 57 self._details.value = magic.from_file(self._list.value) 58 except NameError: 59 self._details.value = "File (run 'pip install python-magic' for more details)" 60 else: 61 self._details.value = "--" 62 63 def process_event(self, event): 64 # Do the key handling for this Frame. 65 if isinstance(event, KeyboardEvent): 66 if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]: 67 raise StopApplication("User quit") 68 69 # Now pass on to lower levels for normal handling of the event. 70 return super(DemoFrame, self).process_event(event) 71 72 73def demo(screen, old_scene): 74 screen.play([Scene([DemoFrame(screen)], -1)], stop_on_resize=True, start_scene=old_scene) 75 76 77last_scene = None 78while True: 79 try: 80 Screen.wrapper(demo, catch_interrupt=False, arguments=[last_scene]) 81 sys.exit(0) 82 except ResizeScreenError as e: 83 last_scene = e.scene 84