class NeighborShellsDialog(FieldsDialogSimple): def __init__(self): self.atom_expression = Expression() FieldsDialogSimple.__init__( self, "Neighbor shells", fields.faulty.Expression( label_text="Atom expression (atom, graph)", attribute_name="atom_expression", history_name="atom_expression", width=250, height=150, ), (("Evaluate", RESPONSE_EVALUATE), ("Select", RESPONSE_SELECT), (gtk.STOCK_SAVE, RESPONSE_SAVE), (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))) def create_dialog(self): FieldsDialogSimple.create_dialog(self) self.list_view = gtk.TreeView(self.list_store) column = gtk.TreeViewColumn("Index", gtk.CellRendererText(), text=0) column.set_sort_column_id(0) self.list_view.append_column(column) column = gtk.TreeViewColumn("Number", gtk.CellRendererText(), text=1) column.set_sort_column_id(1) self.list_view.append_column(column) column = gtk.TreeViewColumn("Atom", gtk.CellRendererText(), text=2) column.set_sort_column_id(2) self.list_view.append_column(column) column = gtk.TreeViewColumn("Value", gtk.CellRendererText(), markup=3) column.set_sort_column_id(3) self.list_view.append_column(column) for index in xrange(1, self.max_shell_size + 1): column = gtk.TreeViewColumn("Shell %i" % index, gtk.CellRendererText(), markup=index + 3) column.set_sort_column_id(index + 3) self.list_view.append_column(column) selection = self.list_view.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) selection.connect("changed", self.on_selection_changed) self.scrolled_window = gtk.ScrolledWindow() self.scrolled_window.set_shadow_type(gtk.SHADOW_IN) self.scrolled_window.set_shadow_type(gtk.SHADOW_IN) self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolled_window.set_border_width(6) self.scrolled_window.add(self.list_view) self.scrolled_window.set_size_request(400, 300) self.scrolled_window.show_all() self.dialog.vbox.pack_start(self.scrolled_window) def run(self, max_shell_size, rows, graph): self.graph = graph self.max_shell_size = max_shell_size self.list_store = gtk.ListStore(int, int, *([str] * (max_shell_size + 2))) for index, row in enumerate(rows): row += [""] * (max_shell_size - (len(row) - 4)) self.list_store.append(row) response = FieldsDialogSimple.run(self, self) self.list_view.set_model(None) for column in self.list_view.get_columns(): self.list_view.remove_column(column) del self.graph del self.max_shell_size return response def on_selection_changed(self, selection): model, paths = selection.get_selected_rows() to_select = [] for path in paths: iter = model.get_iter(path) to_select.append(self.graph.nodes[model.get_value(iter, 0) - 1]) context.application.main.select_nodes(to_select) def on_dialog_response(self, dialog, response_id): FieldsDialogSimple.on_dialog_response(self, dialog, response_id) if self.valid: self.atom_expression.variables = ("atom", "graph") self.atom_expression.compile_as("<atom_expression>") if response_id == RESPONSE_EVALUATE: self.evaluate() self.hide = False if response_id == RESPONSE_SELECT: self.select() self.hide = True elif response_id == RESPONSE_SAVE: self.save() self.hide = False def do_expressions(self): atom_values = [] try: for atom in self.graph.nodes: atom_values.append(self.atom_expression(atom, self.graph)) except: exc_type, exc_value, tb = sys.exc_info() err_msg = "".join( traceback.format_exception(exc_type, exc_value, tb)) ok_error( "An error occured while evaluating the shell and atom expressions.", err_msg, line_wrap=False) self.hide = False return None return atom_values def evaluate(self): atom_values = self.do_expressions() if atom_values is not None: for index, value in enumerate(atom_values): self.list_store[index][3] = value def select(self): atom_values = self.do_expressions() if atom_values is not None: to_select = [ atom for atom, value in zip(self.graph.nodes, atom_values) if value ] context.application.main.select_nodes(to_select) def save(self): atom_values = self.do_expressions() if atom_values is not None: filename = context.application.model.filename if filename is None: filename = "" else: filename = filename[:filename.rfind(".")] filename = ask_save_filename("Save shell data", filename) if filename is not None: if not filename.endswith(".txt"): filename += ".txt" f = file(filename, "w") for atom, value in zip(self.graph.nodes, atom_values): print >> f, atom.get_name(), value f.close()
class NeighborShellsDialog(FieldsDialogSimple): def __init__(self): self.atom_expression = Expression() FieldsDialogSimple.__init__( self, "Neighbor shells", fields.faulty.Expression( label_text="Atom expression (atom, graph)", attribute_name="atom_expression", history_name="atom_expression", width=250, height=150, ), ( ("Evaluate", RESPONSE_EVALUATE), ("Select", RESPONSE_SELECT), (gtk.STOCK_SAVE, RESPONSE_SAVE), (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) ) ) def create_dialog(self): FieldsDialogSimple.create_dialog(self) self.list_view = gtk.TreeView(self.list_store) column = gtk.TreeViewColumn("Index", gtk.CellRendererText(), text=0) column.set_sort_column_id(0) self.list_view.append_column(column) column = gtk.TreeViewColumn("Number", gtk.CellRendererText(), text=1) column.set_sort_column_id(1) self.list_view.append_column(column) column = gtk.TreeViewColumn("Atom", gtk.CellRendererText(), text=2) column.set_sort_column_id(2) self.list_view.append_column(column) column = gtk.TreeViewColumn("Value", gtk.CellRendererText(), markup=3) column.set_sort_column_id(3) self.list_view.append_column(column) for index in xrange(1, self.max_shell_size+1): column = gtk.TreeViewColumn("Shell %i" % index, gtk.CellRendererText(), markup=index+3) column.set_sort_column_id(index+3) self.list_view.append_column(column) selection = self.list_view.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) selection.connect("changed", self.on_selection_changed) self.scrolled_window = gtk.ScrolledWindow() self.scrolled_window.set_shadow_type(gtk.SHADOW_IN) self.scrolled_window.set_shadow_type(gtk.SHADOW_IN) self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolled_window.set_border_width(6) self.scrolled_window.add(self.list_view) self.scrolled_window.set_size_request(400, 300) self.scrolled_window.show_all() self.dialog.vbox.pack_start(self.scrolled_window) def run(self, max_shell_size, rows, graph): self.graph = graph self.max_shell_size = max_shell_size self.list_store = gtk.ListStore(int, int, *([str]*(max_shell_size+2))) for index, row in enumerate(rows): row += [""]*(max_shell_size-(len(row)-4)) self.list_store.append(row) response = FieldsDialogSimple.run(self, self) self.list_view.set_model(None) for column in self.list_view.get_columns(): self.list_view.remove_column(column) del self.graph del self.max_shell_size return response def on_selection_changed(self, selection): model, paths = selection.get_selected_rows() to_select = [] for path in paths: iter = model.get_iter(path) to_select.append(self.graph.nodes[model.get_value(iter, 0)-1]) context.application.main.select_nodes(to_select) def on_dialog_response(self, dialog, response_id): FieldsDialogSimple.on_dialog_response(self, dialog, response_id) if self.valid: self.atom_expression.variables = ("atom", "graph") self.atom_expression.compile_as("<atom_expression>") if response_id == RESPONSE_EVALUATE: self.evaluate() self.hide = False if response_id == RESPONSE_SELECT: self.select() self.hide = True elif response_id == RESPONSE_SAVE: self.save() self.hide = False def do_expressions(self): atom_values = [] try: for atom in self.graph.nodes: atom_values.append(self.atom_expression(atom, self.graph)) except: exc_type, exc_value, tb = sys.exc_info() err_msg = "".join(traceback.format_exception(exc_type, exc_value, tb)) ok_error( "An error occured while evaluating the shell and atom expressions.", err_msg, line_wrap=False ) self.hide = False return None return atom_values def evaluate(self): atom_values = self.do_expressions() if atom_values is not None: for index, value in enumerate(atom_values): self.list_store[index][3] = value def select(self): atom_values = self.do_expressions() if atom_values is not None: to_select = [atom for atom, value in zip(self.graph.nodes, atom_values) if value] context.application.main.select_nodes(to_select) def save(self): atom_values = self.do_expressions() if atom_values is not None: filename = context.application.model.filename if filename is None: filename = "" else: filename = filename[:filename.rfind(".")] filename = ask_save_filename("Save shell data", filename) if filename is not None: if not filename.endswith(".txt"): filename += ".txt" f = file(filename, "w") for atom, value in zip(self.graph.nodes, atom_values): print >> f, atom.get_name(), value f.close()