def register_view(self, view): super(MatchMineralController, self).register_view(view) if view is not None: # MATCHES Treeview: tv = self.view["tv_matches"] setup_treeview(tv, None, reset=True, on_selection_changed=self.selection_changed) tv.append_column(new_text_column("Name", markup_col=0, xalign=0)) tv.append_column(new_text_column("Abbr.", markup_col=1, expand=False)) def get_value(column, cell, model, itr, *args): value = model.get_value(itr, column.get_col_attr("markup")) try: value = "%.5f" % value except TypeError: value = "" cell.set_property("markup", value) return tv.append_column(new_text_column("Score", markup_col=4, expand=False, data_func=get_value)) # ALL MINERALS Treeview: tv = self.view["tv_minerals"] setup_treeview(tv, None, reset=True, on_selection_changed=self.selection_changed) tv.append_column(new_text_column("Name", markup_col=0, xalign=0)) tv.append_column(new_text_column("Abbr.", markup_col=1, expand=False))
def setup_experimental_pattern_tree_view(self, store, widget): """ Creates the experimental data TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_exp_data_tv_cursor_changed, sel_mode=gtk.SELECTION_MULTIPLE) # X Column: widget.append_column( new_text_column('°2θ', text_col=store.c_x, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.experimental_pattern, 0)))) # Y Column: widget.append_column( new_text_column('Intensity', text_col=store.c_y, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.experimental_pattern, 1)))) # Other properties: self.exp_line_ctrl = LinePropertiesController( model=self.model.experimental_pattern, view=self.view.exp_line_view, parent=self)
def setup_wavelength_distribution_tree_view(self, store, widget): """ Creates the wavelength distribution TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_wld_tv_cursor_changed, sel_mode='MULTIPLE') widget.set_model(store) def data_func(col, cell, model, iter, colnr): cell.set_property("text", "%g" % model.get(iter, colnr)[0]) # X Column: widget.append_column( new_text_column( 'Wavelength (nm)', text_col=store.c_x, editable=True, data_func=(data_func, (store.c_x, )), edited_callback=(self.on_xy_data_cell_edited, (self.model.wavelength_distribution, 0)))) # Y Column: widget.append_column( new_text_column( 'Fraction', text_col=store.c_y, editable=True, data_func=(data_func, (store.c_y, )), edited_callback=(self.on_xy_data_cell_edited, (self.model.wavelength_distribution, 1))))
def setup_exclusion_ranges_tree_view(self, store, widget): """ Creates the exclusion ranges TreeView layout and behavior """ setup_treeview( widget, store, on_cursor_changed=self.on_exclusion_ranges_tv_cursor_changed, sel_mode='MULTIPLE') def data_func(col, cell, model, iter, colnr): cell.set_property("text", "%g" % model.get(iter, colnr)[0]) widget.append_column( new_text_column('From [°2θ]', text_col=store.c_x, editable=True, data_func=(data_func, (store.c_x, )), edited_callback=(self.on_xy_data_cell_edited, (self.model.exclusion_ranges, 0)), resizable=True, expand=True)) widget.append_column( new_text_column('To [°2θ]', text_col=store.c_y, editable=True, data_func=(data_func, (store.c_y, )), edited_callback=(self.on_xy_data_cell_edited, (self.model.exclusion_ranges, 1)), resizable=True, expand=True))
def setup_exclusion_ranges_tree_view(self, store, widget): """ Creates the exclusion ranges TreeView layout and behavior """ setup_treeview( widget, store, on_cursor_changed=self.on_exclusion_ranges_tv_cursor_changed, sel_mode=gtk.SELECTION_MULTIPLE) widget.append_column( new_text_column('From [°2θ]', text_col=store.c_x, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.exclusion_ranges, 0)), resizable=True, expand=True)) widget.append_column( new_text_column('To [°2θ]', text_col=store.c_y, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.exclusion_ranges, 1)), resizable=True, expand=True))
def setup_raw_pattern_tree_view(self, store, widget): """ Creates the raw pattern TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_raw_pattern_tv_cursor_changed, sel_mode=gtk.SELECTION_MULTIPLE) # X Column: widget.append_column( new_text_column(u'°2θ', text_col=store.c_x, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.raw_pattern, 0)), resizable=True, expand=True)) # Y Column: widget.append_column( new_text_column(u'Intensity', text_col=store.c_y, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.raw_pattern, 1)), resizable=True, expand=True))
def setup_calculated_pattern_tree_view(self, store, widget): """ Creates the calculated data TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_exp_data_tv_cursor_changed, sel_mode=gtk.SELECTION_NONE) store.connect('columns_changed', self.on_calc_columns_changed), self.update_calc_treeview(widget) # Other properties: self.calc_line_ctrl = LinePropertiesController(model=self.model.calculated_pattern, view=self.view.calc_line_view, parent=self)
def setup_experimental_pattern_tree_view(self, store, widget): """ Creates the experimental data TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_exp_data_tv_cursor_changed, sel_mode='MULTIPLE') store.connect('columns_changed', self.on_exp_columns_changed) self.update_exp_treeview(widget) # Other properties: self.exp_line_ctrl = LinePropertiesController(model=self.model.experimental_pattern, view=self.view.exp_line_view, parent=self)
def _reset_treeview(self, tv, model): setup_treeview(tv, model, sel_mode=gtk.SELECTION_MULTIPLE, reset=True) tv.set_model(model) # Atom column: def atom_renderer(column, cell, model, itr, xxx_todo_changeme): (obj_col, lbl_col) = xxx_todo_changeme obj = model.get_value(itr, obj_col) if lbl_col is not None: lbl = model.get_value(itr, lbl_col) if isinstance(lbl, collections.Callable): lbl = lbl(obj) cell.set_property("text", lbl) else: if hasattr(obj, "name"): cell.set_property('text', obj.name) else: cell.set_property('text', '#NA#') def adjust_combo(cell, editable, path, data=None): if editable is not None: rend = gtk.CellRendererText() editable.clear() editable.pack_start(rend) editable.set_cell_data_func(rend, atom_renderer, (0, 2)) tv.append_column( new_combo_column("Atoms", changed_callback=self.on_atom_changed, edited_callback=self.on_atom_edited, editing_started_callback=adjust_combo, xalign=0.0, model=self.model.create_prop_store(), data_func=(atom_renderer, (0, None)), text_column=0, editable=True)) # Content column: def on_float_edited(rend, path, new_text, col): itr = model.get_iter(path) try: model.set_value(itr, col, float(new_text)) except ValueError: logger.exception("Invalid value entered ('%s')!" % new_text) return True tv.append_column( new_text_column('Default contents', text_col=2, xalign=0.0, editable=True, data_func=create_float_data_func(), edited_callback=(on_float_edited, (2, ))))
def setup_treeview(self, tv): """ Sets up the treeview with columns based on the columns-tuple passed to the __init__ or set in the class definition. Subclasses can override either this method completely or provide custom column creation code on a per-column basis. To do this, create a method for e.g. column with colnr = 2: def setup_treeview_col_2(self, treeview, name, col_descr, col_index, tv_col_nr): ... If a string description of the column number was given, e.g. for the column c_name the definition should be: def setup_treeview_col_c_name(self, treeview, name, col_descr, col_index, tv_col_nr): ... The method should return True upon success or False otherwise. """ sel_mode = gtk.SELECTION_MULTIPLE if self.multi_selection else gtk.SELECTION_SINGLE # @UndefinedVariable setup_treeview(tv, self.treemodel, sel_mode=sel_mode, on_selection_changed=self.objects_tv_selection_changed) tv.set_model(self.treemodel) # reset: for col in tv.get_columns(): tv.remove_column(col) # add columns for tv_col_nr, (name, col_descr) in enumerate(self.columns): try: col_index = int(col_descr) except: col_index = getattr(self.treemodel, str(col_descr), col_descr) handled = False if hasattr(self, "setup_treeview_col_%s" % str(col_descr)): handler = getattr(self, "setup_treeview_col_%s" % str(col_descr)) if isinstance(handler, collections.Callable): handled = handler(tv, name, col_descr, col_index, tv_col_nr) # custom handler failed or not present, default text column: if not handled: tv.append_column( new_text_column(name, text_col=col_index, resizable=(tv_col_nr == 0), expand=(tv_col_nr == 0), xalign=0.0 if tv_col_nr == 0 else 0.5)) return True
def _reset_treeview(self, tv, model): setup_treeview(tv, model, sel_mode='MULTIPLE', reset=True) tv.set_model(model) # Name column: def text_renderer(column, cell, model, itr, args=None): driven_by_other = model.get_value(itr, model.c_driven_by_other) cell.set_property('editable', not driven_by_other) cell.set_property( 'style', Pango.Style.ITALIC if driven_by_other else Pango.Style.NORMAL) col = new_text_column('Name', data_func=text_renderer, editable=True, edited_callback=(self.on_item_cell_edited, (model, model.c_name)), resizable=False, text_col=model.c_name) setattr(col, "col_descr", 'Name') tv.append_column(col) # Value of the relation: float_rend = create_float_data_func() def data_renderer(column, cell, model, itr, args=None): text_renderer(column, cell, model, itr, args) float_rend(column, cell, model, itr, args) col = new_text_column('Value', data_func=data_renderer, editable=True, edited_callback=(self.on_item_cell_edited, (model, model.c_value)), resizable=False, text_col=model.c_value) setattr(col, "col_descr", 'Value') tv.append_column(col) # Up, down and edit arrows: def setup_image_button(image, colnr): col = new_pb_column(" ", resizable=False, expand=False, stock_id=image) setattr(col, "col_descr", colnr) tv.append_column(col) setup_image_button("213-up-arrow", "Up") setup_image_button("212-down-arrow", "Down") setup_image_button("030-pencil", "Edit")
def setup_calculated_pattern_tree_view(self, store, widget): """ Creates the calculated data TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_exp_data_tv_cursor_changed, sel_mode=gtk.SELECTION_NONE) store.connect('columns_changed', self.on_calc_columns_changed), self.update_calc_treeview(widget) # Other properties: self.calc_line_ctrl = LinePropertiesController( model=self.model.calculated_pattern, view=self.view.calc_line_view, parent=self)
def setup_experimental_pattern_tree_view(self, store, widget): """ Creates the experimental data TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_exp_data_tv_cursor_changed, sel_mode='MULTIPLE') store.connect('columns_changed', self.on_exp_columns_changed) self.update_exp_treeview(widget) # Other properties: self.exp_line_ctrl = LinePropertiesController( model=self.model.experimental_pattern, view=self.view.exp_line_view, parent=self)
def setup_exclusion_ranges_tree_view(self, store, widget): """ Creates the exclusion ranges TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_exclusion_ranges_tv_cursor_changed, sel_mode=gtk.SELECTION_MULTIPLE) widget.append_column(new_text_column( u'From [°2θ]', text_col=store.c_x, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.exclusion_ranges, 0)), resizable=True, expand=True)) widget.append_column(new_text_column( u'To [°2θ]', text_col=store.c_y, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.exclusion_ranges, 1)), resizable=True, expand=True))
def setup_treeview(self, tv): """ Sets up the treeview with columns based on the columns-tuple passed to the __init__ or set in the class definition. Subclasses can override either this method completely or provide custom column creation code on a per-column basis. To do this, create a method for e.g. column with colnr = 2: def setup_treeview_col_2(self, treeview, name, col_descr, col_index, tv_col_nr): ... If a string description of the column number was given, e.g. for the column c_name the definition should be: def setup_treeview_col_c_name(self, treeview, name, col_descr, col_index, tv_col_nr): ... The method should return True upon success or False otherwise. """ sel_mode = gtk.SELECTION_MULTIPLE if self.multi_selection else gtk.SELECTION_SINGLE # @UndefinedVariable setup_treeview( tv, self.treemodel, sel_mode=sel_mode, on_selection_changed=self.objects_tv_selection_changed) tv.set_model(self.treemodel) # reset: for col in tv.get_columns(): tv.remove_column(col) # add columns for tv_col_nr, (name, col_descr) in enumerate(self.columns): try: col_index = int(col_descr) except: col_index = getattr(self.treemodel, str(col_descr), col_descr) handled = False if hasattr(self, "setup_treeview_col_%s" % str(col_descr)): handler = getattr(self, "setup_treeview_col_%s" % str(col_descr)) if callable(handler): handled = handler(tv, name, col_descr, col_index, tv_col_nr) # custom handler failed or not present, default text column: if not handled: tv.append_column(new_text_column( name, text_col=col_index, resizable=(tv_col_nr == 0), expand=(tv_col_nr == 0), xalign=0.0 if tv_col_nr == 0 else 0.5)) return True
def _reset_treeview(self, tv, model): setup_treeview(tv, model, sel_mode=gtk.SELECTION_MULTIPLE, reset=True) tv.set_model(model) # Atom column: def atom_renderer(column, cell, model, itr, (obj_col, lbl_col)): obj = model.get_value(itr, obj_col) if lbl_col is not None: lbl = model.get_value(itr, lbl_col) if callable(lbl): lbl = lbl(obj) cell.set_property("text", lbl) else: if hasattr(obj, "name"): cell.set_property('text', obj.name) else: cell.set_property('text', '#NA#')
def _setup_treeview(self, tv, model): setup_treeview(tv, model, sel_mode=gtk.SELECTION_MULTIPLE, reset=True) tv.set_model(model) # Add Atom name, default z, calculated z and #: def add_text_col(title, colnr, is_float=True, editable=True): tv.append_column( new_text_column( title, data_func=create_float_data_func() if is_float else None, editable=editable, edited_callback=(self.on_item_cell_edited, (model, colnr)) if editable else None, resizable=False, text_col=colnr, ) ) add_text_col("Atom name", model.c_name, is_float=False) add_text_col("Def. Z (nm)", model.c_default_z) add_text_col("Calc. Z (nm)", model.c_z, editable=False) add_text_col("#", model.c_pn) # Add atom type column (combo box with atom types from pyxrd.project level): def atom_type_renderer(column, cell, model, itr, col=None): try: name = model.get_user_data_from_path(model.get_path(itr)).atom_type.name except: name = "#NA#" cell.set_property("text", name) return def adjust_combo(cell, editable, path, data=None): editable.set_wrap_width(10) tv.append_column( new_combo_column( "Element", data_func=(atom_type_renderer, (3,)), changed_callback=self.on_atom_type_changed, edited_callback=(self.on_atom_type_edited, (model,)), editing_started_callback=adjust_combo, model=self.atom_types_treemodel, text_column=self.atom_types_treemodel.c_name, editable=True, has_entry=True, ) )
def setup_experimental_pattern_tree_view(self, store, widget): """ Creates the experimental data TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_exp_data_tv_cursor_changed, sel_mode=gtk.SELECTION_MULTIPLE) # X Column: widget.append_column(new_text_column( u'°2θ', text_col=store.c_x, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.experimental_pattern, 0)))) # Y Column: widget.append_column(new_text_column( u'Intensity', text_col=store.c_y, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.experimental_pattern, 1)))) # Other properties: self.exp_line_ctrl = LinePropertiesController(model=self.model.experimental_pattern, view=self.view.exp_line_view, parent=self)
def _reset_treeview(self, tv, model): setup_treeview(tv, model, sel_mode='MULTIPLE', reset=True) tv.set_model(model) # Atom column: self.combo_model = self.model.create_prop_store() self.combo_model2 = Gtk.ListStore(str) for row in self.combo_model: self.combo_model2.append(row[2:3]) def atom_renderer(column, cell, model, itr, *args): obj = model.get_value(itr, 0) if hasattr(obj, "name"): cell.set_property('text', obj.name) else: cell.set_property('text', '#NA#') tv.append_column( new_combo_column("Atoms", data_func=atom_renderer, changed_callback=self.on_atom_changed, edited_callback=self.on_atom_edited, xalign=0.0, expand=False, has_entry=False, model=self.combo_model2, text_column=0, editable=True)) # Content column: def on_float_edited(rend, path, new_text, col): itr = model.get_iter(path) try: model.set_value(itr, col, float(new_text)) except ValueError: logger.exception("Invalid value entered ('%s')!" % new_text) return True tv.append_column( new_text_column('Default contents', text_col=2, xalign=0.0, editable=True, data_func=create_float_data_func(), edited_callback=(on_float_edited, (2, ))))
def _setup_treeview(self, tv, model): setup_treeview(tv, model, sel_mode=gtk.SELECTION_MULTIPLE, reset=True) tv.set_model(model) # Add Atom name, default z, calculated z and #: def add_text_col(title, colnr, is_float=True, editable=True): tv.append_column( new_text_column( title, data_func=create_float_data_func() if is_float else None, editable=editable, edited_callback=(self.on_item_cell_edited, (model, colnr)) if editable else None, resizable=False, text_col=colnr)) add_text_col('Atom name', model.c_name, is_float=False) add_text_col('Def. Z (nm)', model.c_default_z) add_text_col('Calc. Z (nm)', model.c_z, editable=False) add_text_col('#', model.c_pn) # Add atom type column (combo box with atom types from pyxrd.project level): def atom_type_renderer(column, cell, model, itr, col=None): try: name = model.get_user_data_from_path( model.get_path(itr)).atom_type.name except: name = '#NA#' cell.set_property('text', name) return def adjust_combo(cell, editable, path, data=None): editable.set_wrap_width(10) tv.append_column( new_combo_column("Element", data_func=(atom_type_renderer, (3, )), changed_callback=self.on_atom_type_changed, edited_callback=(self.on_atom_type_edited, (model, )), editing_started_callback=adjust_combo, model=self.atom_types_treemodel, text_column=self.atom_types_treemodel.c_name, editable=True, has_entry=True))
def _reset_treeview(self, tv, model): setup_treeview(tv, model, sel_mode=gtk.SELECTION_MULTIPLE, reset=True) tv.set_model(model) # Name column: def text_renderer(column, cell, model, itr, args=None): driven_by_other = model.get_value(itr, model.c_driven_by_other) cell.set_property('editable', not driven_by_other) cell.set_property('style', pango.STYLE_ITALIC if driven_by_other else pango.STYLE_NORMAL) col = new_text_column( 'Name', data_func=text_renderer, editable=True, edited_callback=(self.on_item_cell_edited, (model, model.c_name)), resizable=False, text_col=model.c_name) col.set_data("col_descr", 'Name') tv.append_column(col) # Value of the relation: float_rend = create_float_data_func() def data_renderer(column, cell, model, itr, args=None): text_renderer(column, cell, model, itr, args) float_rend(column, cell, model, itr, args) col = new_text_column( 'Value', data_func=data_renderer, editable=True, edited_callback=(self.on_item_cell_edited, (model, model.c_value)), resizable=False, text_col=model.c_value) col.set_data("col_descr", 'Value') tv.append_column(col) # Up, down and edit arrows: def setup_image_button(image, colnr): col = new_pb_column(" ", resizable=False, expand=False, stock_id=image) col.set_data("col_descr", colnr) tv.append_column(col) setup_image_button("213-up-arrow", "Up") setup_image_button("212-down-arrow", "Down") setup_image_button("030-pencil", "Edit")
def setup_raw_pattern_tree_view(self, store, widget): """ Creates the raw pattern TreeView layout and behavior """ print "CALLED!!" setup_treeview(widget, store, on_cursor_changed=self.on_raw_pattern_tv_cursor_changed, sel_mode=gtk.SELECTION_MULTIPLE) # X Column: widget.append_column(new_text_column( u'°2θ', text_col=store.c_x, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.raw_pattern, 0)), resizable=True, expand=True)) # Y Column: widget.append_column(new_text_column( u'Intensity', text_col=store.c_y, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.raw_pattern, 1)), resizable=True, expand=True))
def setup_exclusion_ranges_tree_view(self, store, widget): """ Creates the exclusion ranges TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_exclusion_ranges_tv_cursor_changed, sel_mode='MULTIPLE') def data_func(col, cell, model, iter, colnr): cell.set_property("text", "%g" % model.get(iter, colnr)[0]) widget.append_column(new_text_column( 'From [°2θ]', text_col=store.c_x, editable=True, data_func = (data_func, (store.c_x,)), edited_callback=(self.on_xy_data_cell_edited, (self.model.exclusion_ranges, 0)), resizable=True, expand=True)) widget.append_column(new_text_column( 'To [°2θ]', text_col=store.c_y, editable=True, data_func = (data_func, (store.c_y,)), edited_callback=(self.on_xy_data_cell_edited, (self.model.exclusion_ranges, 1)), resizable=True, expand=True))
def setup_wavelength_distribution_tree_view(self, store, widget): """ Creates the wavelength distribution TreeView layout and behavior """ setup_treeview(widget, store, on_cursor_changed=self.on_wld_tv_cursor_changed, sel_mode=gtk.SELECTION_MULTIPLE) # X Column: widget.append_column( new_text_column( 'Wavelength (nm)', text_col=store.c_x, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.wavelength_distribution, 0)))) # Y Column: widget.append_column( new_text_column( 'Fraction', text_col=store.c_y, editable=True, edited_callback=(self.on_xy_data_cell_edited, (self.model.wavelength_distribution, 1))))
def register_view(self, view): super(MatchMineralController, self).register_view(view) if view is not None: # MATCHES Treeview: tv = self.view['tv_matches'] setup_treeview( tv, None, reset=True, on_selection_changed=self.selection_changed, ) tv.append_column(new_text_column( "Name", markup_col=0, xalign=0, )) tv.append_column( new_text_column( "Abbr.", markup_col=1, expand=False, )) def get_value(column, cell, model, itr, *args): value = model.get_value(itr, column.get_col_attr('markup')) try: value = "%.5f" % value except TypeError: value = "" cell.set_property("markup", value) return tv.append_column( new_text_column("Score", markup_col=4, expand=False, data_func=get_value)) # ALL MINERALS Treeview: tv = self.view['tv_minerals'] setup_treeview( tv, None, reset=True, on_selection_changed=self.selection_changed, ) tv.append_column(new_text_column( "Name", markup_col=0, xalign=0, )) tv.append_column( new_text_column( "Abbr.", markup_col=1, expand=False, ))