def __init__(self, filename): super(AstApp, self).__init__() self.ast_file = filename self.ast = ASTObserver() self.selected = None
class AstApp(App): def __init__(self, filename): super(AstApp, self).__init__() self.ast_file = filename self.ast = ASTObserver() self.selected = None def build(self): root = Builder.load_string(root_kv.format(self.ast_file)) st = root.ids.source_text self.ast.bind(source=st.setter('text')) st.bind(text=self.ast.setter('source')) self.ast.bind(on_generate=lambda _, tree: buildtreeview(tree, root.ids.treeview)) self.ast.bind(on_generate=lambda *_: setattr(self, 'output', self.ast.compile())) self.ast.bind(on_compile=lambda _, output: setattr(root.ids.output_text, 'text', output)) self.ast.bind(on_compile=self.save_outfile) self.ast.bind(on_tree_changed=self.refresh) Clock.schedule_once(self.load) root.ids.treeview.bind(selected_node=self.update_selection) root.ids.btn_movedown.bind(on_press=lambda *_: self.move_node(1)) root.ids.btn_moveup.bind(on_press=lambda *_: self.move_node(-1)) root.ids.btn_addprop.bind(on_press=self.add_property) root.ids.btn_removenode.bind(on_press=self.remove_node) return root def refresh(self, *_): self.selected = None buildtreeview(self.ast.tree, self.root.ids.treeview) self.ast.compile() def move_node(self, dir): if self.selected: tree = self.selected.tree_node if tree.parent: parent = tree.parent count = parent.getChildCount() if count > 1: index = tree.childIndex destindex = index + dir if destindex < 0: destindex = count - 1 elif destindex >= count: destindex = 0 self.ast.shift_node(tree, destindex) def add_property(self, *_): if self.selected: try: key = 'prop' value = "'val'" self.ast.widget_add_property(self.selected.tree_node, key, value) except ValueError, e: print str(e)