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