示例#1
0
def restore_ui_state(listbox: UITreeListBox, sessions):
    ui_state = Config().load_state()

    if SELECTED in ui_state:
        selected = ui_state[SELECTED]
        node = find_node(sessions, selected[1:])
        listbox.set_focus_to_node(node)

    if COLLAPSED in ui_state:
        collapsed = ui_state[COLLAPSED]
        for c in collapsed:
            node = find_node(sessions, c[1:])
            listbox.collapse_node(node)
示例#2
0
class RedialApplication:
    def __init__(self):
        self.sessions = Config().load_from_file()
        top_node = UIParentNode(self.sessions, key_handler=self.on_key_press)
        self.walker = urwid.TreeWalker(top_node)
        self.listbox = UITreeListBox(self.walker)
        urwid.connect_signal(self.walker, "modified",
                             lambda: on_focus_change(self.listbox))
        header = urwid.Text("Redial")
        footer = init_footer(self.listbox)

        self.view = urwid.Frame(urwid.AttrWrap(self.listbox, 'body'),
                                header=urwid.AttrWrap(header, 'head'),
                                footer=footer)

        # Set screen to 256 color mode
        screen = urwid.raw_display.Screen()
        screen.set_terminal_properties(256)
        self.loop = urwid.MainLoop(self.view, palette, screen)

        # instance attributes
        self.command = None

    def run(self):
        self.loop.run()

    def on_key_press(self, key: str, w: UITreeWidget):
        this_node = w.get_node().get_value()
        folder_node = this_node if (w.get_node().get_parent() is None or this_node.nodetype == "folder") \
            else w.get_node().get_parent().get_value()

        parent_node = None if w.get_node().get_parent(
        ) is None else w.get_node().get_parent().get_value()

        if key in 'qQ':
            self.command = EXIT_REDIAL
            raise urwid.ExitMainLoop()

        elif key == "enter":
            if isinstance(w.get_node(), UITreeNode):
                self.command = w.get_node().get_value(
                ).hostinfo.get_ssh_command()
                raise urwid.ExitMainLoop()

        elif key == "f5" and w.is_leaf:
            if package_available(package_name="mc"):
                self.command = this_node.hostinfo.get_mc_command()
                raise urwid.ExitMainLoop()
            else:
                MessageDialog(
                    "Error", "Please install mc (Midnight Commander) package"
                    " to use this feature", self.close_dialog).show(self.loop)

        elif key == "f6":
            AddFolderDialog(folder_node, Node("", "folder"),
                            self.save_and_focus).show(self.loop)

        elif key == "f7":
            AddHostDialog(folder_node, Node("", "session", HostInfo("")),
                          self.save_and_focus).show(self.loop)

        elif key == "f8":
            if this_node.nodetype == "folder":
                # TODO implement removing folder
                MessageDialog("Error", "Folders can not be removed",
                              self.close_dialog).show(self.loop)
            else:
                RemoveHostDialog(parent_node, this_node,
                                 self.save_and_focus).show(self.loop)

        elif key == "f9" and w.is_leaf:
            AddHostDialog(parent_node, this_node,
                          self.save_and_focus).show(self.loop)

        elif key in ["meta down", "ctrl down"]:
            if parent_node is None: return
            i = parent_node.children.index(this_node)
            if i == len(parent_node.children) - 1: return  # at bottom
            parent_node.children[i], parent_node.children[
                i + 1] = parent_node.children[i + 1], parent_node.children[i]

            Config.save_to_file(self.sessions)
            self.walker.set_focus(
                UIParentNode(self.sessions, key_handler=self.on_key_press))
            self.listbox.set_focus_to_node(this_node)

        elif key in ["meta up", "ctrl up"]:
            if parent_node is None: return
            i = parent_node.children.index(this_node)
            if i == 0: return  # at top
            parent_node.children[i], parent_node.children[
                i - 1] = parent_node.children[i - 1], parent_node.children[i]

            Config.save_to_file(self.sessions)
            self.walker.set_focus(
                UIParentNode(self.sessions, key_handler=self.on_key_press))
            self.listbox.set_focus_to_node(this_node)
        else:
            return key

    def save_and_focus(self, focus: Node):
        Config().save_to_file(self.sessions)
        self.walker.set_focus(
            UIParentNode(self.sessions, key_handler=self.on_key_press))
        self.listbox.set_focus_to_node(focus)
        self.loop.widget = self.view

    def close_dialog(self):
        self.loop.widget = self.view