class TreeDataTests(unittest.TestCase): def setUp(self): self.win = gtk.Window() self.win.set_default_size(400, 400) self.tree = ObjectTree([Column('name'), Column('age')]) self.win.add(self.tree) refresh_gui() def tearDown(self): self.win.destroy() del self.win def testGetRoot(self): root = Person('Big Kahuna', 7000) child1 = Person('Craf Kahuna', 200) child2 = Person('Sorcerer Kahuna', 150) self.tree.append(None, root) self.tree.append(root, child1) self.tree.append(root, child2) test_root = self.tree.get_root(child1) self.assertEqual(test_root, root) test_root = self.tree.get_root(child2) self.assertEqual(test_root, root) test_root = self.tree.get_root(root) self.assertEqual(test_root, root) def testGetDescendants(self): root = Person('Big Kahuna', 7000) child1 = Person('Craf Kahuna', 200) child2 = Person('Sorcerer Kahuna', 150) self.tree.append(None, root) self.tree.append(root, child1) self.tree.append(child1, child2) test_descendants = self.tree.get_descendants(root) test_descendants.sort() self.assertEqual(test_descendants, [child1, child2]) test_descendants = self.tree.get_descendants(child1) self.assertEqual(test_descendants, [child2]) test_descendants = self.tree.get_descendants(child2) self.assertEqual(test_descendants, [])
class TreeDataTests(unittest.TestCase): def setUp(self): self.win = Gtk.Window() self.win.set_default_size(400, 400) self.tree = ObjectTree([Column('name'), Column('age')]) self.win.add(self.tree) refresh_gui() def tearDown(self): self.win.destroy() del self.win def testGetRoot(self): root = Person('Big Kahuna', 7000) child1 = Person('Craf Kahuna', 200) child2 = Person('Sorcerer Kahuna', 150) self.tree.append(None, root) self.tree.append(root, child1) self.tree.append(root, child2) test_root = self.tree.get_root(child1) self.assertEqual(test_root, root) test_root = self.tree.get_root(child2) self.assertEqual(test_root, root) test_root = self.tree.get_root(root) self.assertEqual(test_root, root) def testGetDescendants(self): root = Person('Big Kahuna', 7000) child1 = Person('Craf Kahuna', 200) child2 = Person('Sorcerer Kahuna', 150) self.tree.append(None, root) self.tree.append(root, child1) self.tree.append(child1, child2) test_descendants = self.tree.get_descendants(root) self.assertTrue(child1 in test_descendants) self.assertTrue(child2 in test_descendants) test_descendants = self.tree.get_descendants(child1) self.assertEqual(test_descendants, [child2]) test_descendants = self.tree.get_descendants(child2) self.assertEqual(test_descendants, [])
class GTKProject(SlaveDelegate): """A facade of kmcos.types.Project so that pygtk can display in a TreeView. """ def __init__(self, parent, menubar): self.project_data = ObjectTree([ Column('name', use_markup=True, data_type=str, sorted=True), Column('info') ]) self.project_data.connect('row-activated', self.on_row_activated) self.model_tree = Project() self._set_treeview_hooks() self.menubar = menubar self.set_parent(parent) self.filename = '' self.undo_stack = UndoStack(self.model_tree.__repr__, self.import_file, self.project_data.select, menubar, self.meta, 'Initialization') SlaveDelegate.__init__(self, toplevel=self.project_data) def _set_treeview_hooks(self): """Fudge function to import to access function to kmcos.types.Project to kmcos.gui.GTKProject. """ self.project_data.clear() # Meta self.meta = self.project_data.append(None, self.model_tree.meta) self.model_tree.meta = self.meta # Layer List self.model_tree.add_layer = self.add_layer self.layer_list = self.project_data.append(None, self.model_tree.layer_list) self.get_layers = lambda: \ sorted(self.project_data.get_descendants(self.layer_list), key=lambda x: x.name) self.model_tree.get_layers = self.get_layers self.lattice = self.layer_list # Parameter List self.parameter_list = self.project_data.append( None, self.model_tree.parameter_list) self.add_parameter = lambda parameter: \ self.project_data.append(self.parameter_list, parameter) self.model_tree.add_parameter = self.add_parameter self.get_parameters = lambda: \ sorted(self.project_data.get_descendants(self.parameter_list), key=lambda x: x.name) self.model_tree.get_parameters = self.get_parameters # Species List self.species_list = self.project_data.append( None, self.model_tree.species_list) self.add_species = lambda species: \ self.project_data.append(self.species_list, species) self.model_tree.add_species = self.add_species self.get_speciess = lambda: \ sorted(self.project_data.get_descendants(self.species_list), key=lambda x: x.name) self.model_tree.get_speciess = self.get_speciess # Process List self.process_list = self.project_data.append( None, self.model_tree.process_list) self.add_process = lambda process:\ self.project_data.append(self.process_list, process) self.model_tree.add_process = self.add_process self.get_processes = lambda: \ sorted(self.project_data.get_descendants(self.process_list), key=lambda x: x.name) self.model_tree.get_processes = self.get_processes # Output List self.output_list = self.project_data.append( None, self.model_tree.output_list) self.add_output = lambda output:\ self.project_data.append(self.output_list, output) self.model_tree.add_output = self.add_output self.get_outputs = lambda: \ sorted(self.project_data.get_descendants(self.output_list), key=lambda x: x.name) self.model_tree.get_outputs = self.get_outputs def add_layer(self, layer): self.project_data.append(self.layer_list, layer) if len(self.get_layers()) == 1: self.set_default_layer(layer.name) self.set_substrate_layer(layer.name) return layer def set_default_species(self, species): self.model_tree.species_list.default_species = species def set_substrate_layer(self, layer): self.model_tree.layer_list.substrate_layer = layer def set_default_layer(self, layer): self.model_tree.layer_list.default_layer = layer def update(self, model): """Update the object tree.""" self.project_data.update(model) def on_row_activated(self, _tree, data): if isinstance(data, Layer): data.active = not data.active def get_name(self): """Return project name.""" if self.filename: return os.path.basename(self.filename) else: return 'Untitled' def __repr__(self): return str(self.model_tree) def import_file(self, filename): """Import XML project file into editor GUI, unfolding the object tree. """ self.filename = filename self.model_tree.import_file(filename) self.expand_all() def expand_all(self): """Expand all list of the project tree """ self.project_data.expand(self.species_list) self.project_data.expand(self.layer_list) self.project_data.expand(self.parameter_list) self.project_data.expand(self.process_list) self.project_data.expand(self.output_list) def on_key_press(self, _, event): """When the user hits the keyboard focusing the treeview this event is triggered. Right now the only supported function is to deleted the selected item """ selection = self.project_data.get_selected() if gtk.gdk.keyval_name(event.keyval) == 'Delete': if (isinstance(selection, Species) or isinstance(selection, Process) or isinstance(selection, Parameter) or isinstance(selection, Layer)): if kiwi.ui.dialogs.yesno( "Do you really want to delete '%s'?" \ % selection.name) == gtk.RESPONSE_YES: self.project_data.remove(selection) def on_project_data__selection_changed(self, _, elem): """When a new item is selected in the treeview this function loads the main area of the window with the corresponding form and data. """ slave = self.get_parent().get_slave('workarea') if slave: self.get_parent().detach_slave('workarea') if isinstance(elem, Layer): if self.meta.model_dimension in [1, 3]: self.get_parent().toast('Only 2d supported') return self.undo_stack.start_new_action('Edit Layer %s' % elem.name, elem) form = LayerEditor(elem, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, Meta): self.undo_stack.start_new_action('Edit Meta', elem) meta_form = MetaForm(self.meta, self) self.get_parent().attach_slave('workarea', meta_form) meta_form.focus_toplevel() meta_form.focus_topmost() elif isinstance(elem, OutputList): self.undo_stack.start_new_action('Edit Output', elem) form = OutputForm(self.output_list, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, Parameter): self.undo_stack.start_new_action('Edit Parameter %s' % elem.name, elem) form = ParameterForm(elem, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, Process): if self.meta.model_dimension in [1, 3]: self.get_parent().toast('Only 2d supported') return self.undo_stack.start_new_action('Edit Process %s' % elem.name, elem) form = ProcessForm(elem, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, ProcessList): if self.meta.model_dimension in [1, 3]: self.get_parent().toast('Only 2d supported') return self.undo_stack.start_new_action('Batch process editing', elem) form = BatchProcessForm(self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, Species): self.undo_stack.start_new_action('Edit species', elem) form = SpeciesForm(elem, self.project_data) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, SpeciesList): self.undo_stack.start_new_action('Edit default species', elem) form = SpeciesListForm(elem, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, LayerList): self.undo_stack.start_new_action('Edit lattice', elem) dimension = self.meta.model_dimension form = LatticeForm(elem, dimension, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() else: self.get_parent().toast('Not implemented, yet(%s).' % type(elem))
class GTKProject(SlaveDelegate): """A facade of kmos.types.Project so that pygtk can display in a TreeView. """ def __init__(self, parent, menubar): self.project_data = ObjectTree([Column('name', use_markup=True, data_type=str, sorted=True), Column('info')]) self.project_data.connect('row-activated', self.on_row_activated) self.model_tree = Project() self._set_treeview_hooks() self.menubar = menubar self.set_parent(parent) self.filename = '' self.undo_stack = UndoStack( self.model_tree.__repr__, self.import_xml_file, self.project_data.select, menubar, self.meta, 'Initialization') SlaveDelegate.__init__(self, toplevel=self.project_data) def _set_treeview_hooks(self): """Fudge function to import to access function to kmos.types.Project to kmos.gui.GTKProject. """ self.project_data.clear() # Meta self.meta = self.project_data.append(None, self.model_tree.meta) self.model_tree.meta = self.meta # Layer List self.model_tree.add_layer = self.add_layer self.layer_list = self.project_data.append(None, self.model_tree.layer_list) self.get_layers = lambda :\ sorted(self.project_data.get_descendants(self.layer_list), key=lambda x: x.name) self.model_tree.get_layers = self.get_layers self.lattice = self.layer_list # Parameter List self.parameter_list = self.project_data.append(None, self.model_tree.parameter_list) self.add_parameter = lambda parameter :\ self.project_data.append(self.parameter_list, parameter) self.model_tree.add_parameter = self.add_parameter self.get_parameters = lambda :\ sorted(self.project_data.get_descendants(self.parameter_list), key=lambda x: x.name) self.model_tree.get_parameters = self.get_parameters # Species List self.species_list = self.project_data.append(None, self.model_tree.species_list) self.add_species = lambda species :\ self.project_data.append(self.species_list, species) self.model_tree.add_species = self.add_species self.get_speciess = lambda :\ sorted(self.project_data.get_descendants(self.species_list), key=lambda x: x.name) self.model_tree.get_speciess = self.get_speciess # Process List self.process_list = self.project_data.append(None, self.model_tree.process_list) self.add_process = lambda process:\ self.project_data.append(self.process_list, process) self.model_tree.add_process = self.add_process self.get_processes = lambda :\ sorted(self.project_data.get_descendants(self.process_list), key=lambda x: x.name) self.model_tree.get_processes = self.get_processes # Output List self.output_list = self.project_data.append(None, self.model_tree.output_list) self.add_output = lambda output:\ self.project_data.append(self.output_list, output) self.model_tree.add_output = self.add_output self.get_outputs = lambda : \ sorted(self.project_data.get_descendants(self.output_list), key=lambda x: x.name) self.model_tree.get_outputs = self.get_outputs def add_layer(self, layer): self.project_data.append(self.layer_list, layer) if len(self.get_layers()) == 1 : self.set_default_layer(layer.name) self.set_substrate_layer(layer.name) def set_default_species(self, species): self.model_tree.species_list.default_species = species def set_substrate_layer(self, layer): self.model_tree.layer_list.substrate_layer = layer def set_default_layer(self, layer): self.model_tree.layer_list.default_layer = layer def update(self, model): self.project_data.update(model) def on_row_activated(self, tree, data): if isinstance(data, Layer): data.active = not data.active def get_name(self): if self.filename: return os.path.basename(self.filename) else: return 'Untitled' def __repr__(self): return str(self.model_tree) def import_xml_file(self, filename): self.model_tree.import_xml_file(filename) self.expand_all() def expand_all(self): """Expand all list of the project tree """ self.project_data.expand(self.species_list) self.project_data.expand(self.layer_list) self.project_data.expand(self.parameter_list) self.project_data.expand(self.process_list) self.project_data.expand(self.output_list) def on_key_press(self, _, event): """When the user hits the keyboard focusing the treeview this event is triggered. Right now the only supported function is to deleted the selected item """ selection = self.project_data.get_selected() if gtk.gdk.keyval_name(event.keyval) == 'Delete': if(isinstance(selection, Species) or isinstance(selection, Process) or isinstance(selection, Parameter) or isinstance(selection, Layer)): if kiwi.ui.dialogs.yesno( "Do you really want to delete '%s'?" \ % selection.name) == gtk.RESPONSE_YES: self.project_data.remove(selection) def on_project_data__selection_changed(self, _, elem): """When a new item is selected in the treeview this function loads the main area of the window with the corresponding form and data. """ slave = self.get_parent().get_slave('workarea') if slave: self.get_parent().detach_slave('workarea') if isinstance(elem, Layer): if self.meta.model_dimension in [1, 3]: self.get_parent().toast('Only 2d supported') return self.undo_stack.start_new_action('Edit Layer %s' % elem.name, elem) form = LayerEditor(elem, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, Meta): self.undo_stack.start_new_action('Edit Meta', elem) meta_form = MetaForm(self.meta, self) self.get_parent().attach_slave('workarea', meta_form) meta_form.focus_toplevel() meta_form.focus_topmost() elif isinstance(elem, OutputList): self.undo_stack.start_new_action('Edit Output', elem) form = OutputForm(self.output_list, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, Parameter): self.undo_stack.start_new_action('Edit Parameter %s' % elem.name, elem) form = ParameterForm(elem, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, Process): if self.meta.model_dimension in [1, 3]: self.get_parent().toast('Only 2d supported') return self.undo_stack.start_new_action('Edit Process %s' % elem.name, elem) form = ProcessForm(elem, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, ProcessList): if self.meta.model_dimension in [1, 3]: self.get_parent().toast('Only 2d supported') return self.undo_stack.start_new_action('Batch process editing', elem) form = BatchProcessForm(self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, Species): self.undo_stack.start_new_action('Edit species', elem) form = SpeciesForm(elem, self.project_data) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, SpeciesList): self.undo_stack.start_new_action('Edit default species', elem) form = SpeciesListForm(elem, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() elif isinstance(elem, LayerList): self.undo_stack.start_new_action('Edit lattice', elem) dimension = self.meta.model_dimension form = LatticeForm(elem, dimension, self) self.get_parent().attach_slave('workarea', form) form.focus_topmost() else: self.get_parent().toast('Not implemented, yet(%s).' % type(elem))