def on_find_peaks_clicked(self, widget): def after_cb(threshold): self.model.auto_add_peaks(threshold) sel_model = ThresholdSelector(parent=self.model) sel_view = DetectPeaksView(parent=self.view) sel_ctrl = ThresholdController(model=sel_model, view=sel_view, parent=self, callback=after_cb) #@UnusedVariable show_threshold_plot = DialogFactory.get_progress_dialog( action=sel_model.update_threshold_plot_data, complete_callback=lambda *a, **k: sel_view.present(), gui_message="Finding peaks {progress:.0f}%...", toplevel=self.view.get_top_widget() ) if len(self.model.markers) > 0: def on_accept(dialog): self.model.clear_markers() show_threshold_plot() def on_reject(dialog): show_threshold_plot() DialogFactory.get_confirmation_dialog( "Do you want to clear the current markers for this pattern?", parent=self.view.get_top_widget() ).run(on_accept, on_reject) else: show_threshold_plot()
def load_components(self, filename): old_comps = self.get_selected_objects() if old_comps: num_oc = len(old_comps) new_comps = list() for comp in Component.load_components(filename, parent=self.model): comp.resolve_json_references() new_comps.append(comp) num_nc = len(new_comps) if num_oc != num_nc: DialogFactory.get_information_dialog( "The number of components to import must equal the number of selected components!" ).run() return else: self.select_object(None) logger.info("Importing components...") # replace component(s): for old_comp, new_comp in zip(old_comps, new_comps): i = self.model.components.index(old_comp) self.model.components[i] = new_comp else: DialogFactory.get_information_dialog( "No components selected to replace!" ).run()
def remove_backgrounds(self, specimens): """ Opens the 'remove background' dialog for the given specimens, raises a ValueError error if (one of) the specimens is not part of this project. """ def on_automated(dialog): for specimen in specimens: if not specimen in self.model.specimens: raise ValueError("Specimen `%s` is not part of this Project!" % specimen) else: specimen.experimental_pattern.bg_type = 0 # Linear see settings specimen.experimental_pattern.find_bg_position() specimen.experimental_pattern.remove_background() specimen.experimental_pattern.clear_bg_variables() def on_not_automated(dialog): for specimen in specimens: if not specimen in self.model.specimens: raise ValueError("Specimen `%s` is not part of this Project!" % specimen) else: bg_view = BackgroundView(parent=self.parent.view) BackgroundController(model=specimen.experimental_pattern, view=bg_view, parent=self) bg_view.present() # Ask user if he/she wants automation: DialogFactory.get_confirmation_dialog( "Do you want to perform an automated linear background subtraction?", parent=self.parent.view.get_top_widget() ).run(on_automated, on_not_automated)
def on_find_peaks_clicked(self, widget): def after_cb(threshold): self.model.auto_add_peaks(threshold) sel_model = ThresholdSelector(parent=self.model) sel_view = DetectPeaksView(parent=self.view) sel_ctrl = ThresholdController(model=sel_model, view=sel_view, parent=self, callback=after_cb) #@UnusedVariable sel_model.update_threshold_plot_data() if len(self.model.markers) > 0: def on_accept(dialog): self.model.clear_markers() sel_view.present() def on_reject(dialog): sel_view.present() DialogFactory.get_confirmation_dialog( "Do you want to clear the current markers for this pattern?", parent=self.view.get_top_widget()).run(on_accept, on_reject) else: sel_view.present()
def on_import_exclusion_ranges_clicked(self, widget, data=None): def on_confirm(dialog): def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occured when trying to parse %s:\n\n<i>" % os.path.basename( filename) message += "{}</i>\n\n" message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler( message, parent=self.view.get_toplevel(), reraise=False): self.model.exclusion_ranges.load_data(parser, filename, clear=True) DialogFactory.get_load_dialog( title="Import exclusion ranges", parent=self.view.get_top_widget(), filters=exc_parsers.get_import_file_filters()).run(on_accept) DialogFactory.get_confirmation_dialog( "Importing exclusion ranges will erase all current data.\nAre you sure you want to continue?", parent=self.view.get_top_widget()).run(on_confirm)
def remove_backgrounds(self, specimens): """ Opens the 'remove background' dialog for the given specimens, raises a ValueError error if (one of) the specimens is not part of this project. """ def on_automated(dialog): for specimen in specimens: if not specimen in self.model.specimens: raise ValueError, "Specimen `%s` is not part of this Project!" % specimen else: specimen.experimental_pattern.bg_type = 0 # Linear see settings specimen.experimental_pattern.find_bg_position() specimen.experimental_pattern.remove_background() specimen.experimental_pattern.clear_bg_variables() def on_not_automated(dialog): for specimen in specimens: if not specimen in self.model.specimens: raise ValueError, "Specimen `%s` is not part of this Project!" % specimen else: bg_view = BackgroundView(parent=self.parent.view) BackgroundController(model=specimen.experimental_pattern, view=bg_view, parent=self) bg_view.present() # Ask user if he/she wants automation: DialogFactory.get_confirmation_dialog( "Do you want to perform an automated linear background subtraction?", parent=self.parent.view.get_top_widget()).run( on_automated, on_not_automated)
def on_save_object_clicked(self, event): def on_accept(dialog): Marker.save_as_csv(dialog.filename, self.get_selected_objects()) DialogFactory.get_save_dialog( "Export markers", parent=self.view.get_top_widget(), filters=self.file_filters ).run(on_accept)
def on_save_object_clicked(self, event): def on_accept(dialog): Marker.save_as_csv(dialog.filename, self.get_selected_objects()) DialogFactory.get_save_dialog("Export markers", parent=self.view.get_top_widget(), filters=self.file_filters).run(on_accept)
def load_components(self, filename): old_comps = self.get_selected_objects() if old_comps: num_oc = len(old_comps) new_comps = list() for comp in Component.load_components(filename, parent=self.model): comp.resolve_json_references() new_comps.append(comp) num_nc = len(new_comps) if num_oc != num_nc: DialogFactory.get_information_dialog( "The number of components to import must equal the number of selected components!" ).run() return else: self.select_object(None) logger.info("Importing components...") # replace component(s): for old_comp, new_comp in zip(old_comps, new_comps): i = self.model.components.index(old_comp) self.model.components[i] = new_comp else: DialogFactory.get_information_dialog( "No components selected to replace!" ).run()
def on_import_wavelength_distribution_clicked(self, widget, data=None): def on_confirm(dialog): def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to parse %s:\n\n<i>" % os.path.basename( filename) message += "{}</i>\n\n" message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler( message, parent=self.view.get_toplevel(), reraise=False): self.model.wavelength_distribution.load_data(parser, filename, clear=True) DialogFactory.get_load_dialog( title="Import wavelength distribution", parent=self.view.get_top_widget(), filters=wld_parsers.get_import_file_filters(), current_folder=settings.DATA_REG.get_directory_path( "DEFAULT_WL_DISTR")).run(on_accept) DialogFactory.get_confirmation_dialog( "Importing a wavelength distribution will erase all current data.\nAre you sure you want to continue?", parent=self.view.get_top_widget()).run(on_confirm)
def on_find_peaks_clicked(self, widget): def after_cb(threshold): self.model.auto_add_peaks(threshold) sel_model = ThresholdSelector(parent=self.model) sel_view = DetectPeaksView(parent=self.view) sel_ctrl = ThresholdController(model=sel_model, view=sel_view, parent=self, callback=after_cb) #@UnusedVariable show_threshold_plot = DialogFactory.get_progress_dialog( action=sel_model.update_threshold_plot_data, complete_callback=lambda *a, **k: sel_view.present(), gui_message="Finding peaks {progress:.0f}%...", toplevel=self.view.get_top_widget()) if len(self.model.markers) > 0: def on_accept(dialog): self.model.clear_markers() show_threshold_plot() def on_reject(dialog): show_threshold_plot() DialogFactory.get_confirmation_dialog( "Do you want to clear the current markers for this pattern?", parent=self.view.get_top_widget()).run(on_accept, on_reject) else: show_threshold_plot()
def on_load_object_clicked(self, event): def on_accept(dialog): self.load_components(dialog.filename) DialogFactory.get_load_dialog( "Import components", parent=self.view.get_toplevel(), filters=self.file_filters ).run(on_accept) return True
def import_layer(dialog): def on_accept(dialog): del self.treemodel_data[:] # clears the list Atom.get_from_csv(dialog.filename, self.treemodel_data.append, self.model) DialogFactory.get_load_dialog( "Import atoms", parent=self.view.get_toplevel(), filters=self.file_filters ).run(on_accept)
def on_load_object_clicked(self, event): def on_accept(dialog): self.load_components(dialog.filename) DialogFactory.get_load_dialog( "Import components", parent=self.view.get_toplevel(), filters=self.file_filters ).run(on_accept) return True
def on_btn_import_experimental_data_clicked(self, widget, data=None): def on_confirm(dialog): self.on_replace_experimental_data() DialogFactory.get_confirmation_dialog( "Importing a new experimental file will erase all current data.\nAre you sure you want to continue?", parent=self.view.get_top_widget() ).run(on_confirm) return True
def on_btn_import_raw_pattern_clicked(self, widget, data=None): def on_confirm(dialog): self.on_replace_raw_pattern() DialogFactory.get_confirmation_dialog( "Importing a new experimental file will erase all current data.\nAre you sure you want to continue?", parent=self.view.get_toplevel()).run(on_confirm) return True
def save(self, parent=None, current_name="graph", size="auto", num_specimens=1, offset=0.75): """ Displays a save dialog to export an image from the current plot. """ # Parse arguments: width, height = 0, 0 if size == "auto": descr, width, height, dpi = settings.OUTPUT_PRESETS[0] else: width, height, dpi = list(map(float, size.replace("@", "x").split("x"))) # Load gui: builder = Gtk.Builder() builder.add_from_file(resource_filename("pyxrd.specimen", "glade/save_graph_size.glade")) # FIXME move this to this namespace!! size_expander = builder.get_object("size_expander") cmb_presets = builder.get_object("cmb_presets") # Setup combo with presets: cmb_store = Gtk.ListStore(str, int, int, float) for row in settings.OUTPUT_PRESETS: cmb_store.append(row) cmb_presets.clear() cmb_presets.set_model(cmb_store) cell = Gtk.CellRendererText() cmb_presets.pack_start(cell, True) cmb_presets.add_attribute(cell, 'text', 0) def on_cmb_changed(cmb, *args): itr = cmb.get_active_iter() w, h, d = cmb_store.get(itr, 1, 2, 3) entry_w.set_text(str(w)) entry_h.set_text(str(h)) entry_dpi.set_text(str(d)) cmb_presets.connect('changed', on_cmb_changed) # Setup input boxes: entry_w = builder.get_object("entry_width") entry_h = builder.get_object("entry_height") entry_dpi = builder.get_object("entry_dpi") entry_w.set_text(str(width)) entry_h.set_text(str(height)) entry_dpi.set_text(str(dpi)) # What to do when the user wants to save this: def on_accept(dialog): # Get the width, height & dpi width = float(entry_w.get_text()) height = float(entry_h.get_text()) dpi = float(entry_dpi.get_text()) i_width, i_height = width / dpi, height / dpi # Save it all right! self.save_figure(dialog.filename, dpi, i_width, i_height) # Ask the user where, how and if he wants to save: DialogFactory.get_save_dialog( "Save Graph", parent=parent, filters=self.file_filters, current_name=current_name, extra_widget=size_expander ).run(on_accept)
def on_save_object_clicked(self, event): def on_accept(dialog): logger.info("Exporting components...") Component.save_components(self.get_selected_objects(), filename=dialog.filename) DialogFactory.get_save_dialog( "Export components", parent=self.view.get_toplevel(), filters=self.file_filters ).run(on_accept) return True
def on_load_object_clicked(self, event): def on_accept(dialog): logger.info("Importing phases...") self.load_phases(dialog.filename, parser=dialog.parser) DialogFactory.get_load_dialog( "Import phase", parent=self.view.get_top_widget(), filters=phase_parsers.get_import_file_filters() ).run(on_accept) return True
def on_save_object_clicked(self, event): def on_accept(dialog): logger.info("Exporting phases...") Phase.save_phases(self.get_selected_objects(), filename=dialog.filename) DialogFactory.get_save_dialog( "Export phase", parent=self.view.get_top_widget(), filters=phase_parsers.get_export_file_filters() ).run(on_accept) return True
def on_load_object_clicked(self, event): def on_accept(dialog): with self._multi_operation_context(): for marker in Marker.get_from_csv(dialog.filename, self.model): self.model.markers.append(marker) DialogFactory.get_load_dialog( "Import markers", parent=self.view.get_top_widget(), filters=self.file_filters ).run(on_accept)
def on_load_object_clicked(self, event): def on_accept(dialog): with self._multi_operation_context(): for marker in Marker.get_from_csv(dialog.filename, self.model): self.model.markers.append(marker) DialogFactory.get_load_dialog("Import markers", parent=self.view.get_top_widget(), filters=self.file_filters).run(on_accept)
def on_save_object_clicked(self, event): def on_accept(dialog): logger.info("Exporting components...") Component.save_components(self.get_selected_objects(), filename=dialog.filename) DialogFactory.get_save_dialog( "Export components", parent=self.view.get_toplevel(), filters=self.file_filters ).run(on_accept) return True
def on_load_object_clicked(self, event): def on_accept(dialog): logger.info("Importing phases...") self.load_phases(dialog.filename, parser=dialog.parser) DialogFactory.get_load_dialog( "Import phase", parent=self.view.get_top_widget(), filters=phase_parsers.get_import_file_filters()).run(on_accept) return True
def on_btn_export_gonio_clicked(self, widget, *args): def on_accept(dialog): dialog.parser.write(self.model, dialog.filename) self.generate_import_combo() DialogFactory.get_save_dialog( title="Select the goniometer setup file to save to", filters=goniometer_parsers.get_export_file_filters(), current_folder=settings.DATA_REG.get_directory_path( "DEFAULT_GONIOS"), parent=self.view.parent.get_top_widget()).run(on_accept)
def on_save_object_clicked(self, widget, user_data=None): def on_accept(save_dialog): Atom.save_as_csv(save_dialog.filename, self.get_all_objects()) current_name = "%s%s" % ( self.model.name.lower(), self.treemodel_property_name.replace("data", "").lower() ) DialogFactory.get_save_dialog( "Export atoms", parent=self.view.get_toplevel(), current_name=current_name, filters=self.file_filters, ).run(on_accept)
def on_composition_clicked(self, widget, *args): comp = "The composition of the specimens in this mixture:\n\n\n" comp += "<span font-family=\"monospace\">" # get the composition matrix (first columns contains strings with elements, others are specimen compositions) import re for row in self.model.get_composition_matrix(): comp += "%s %s\n" % (re.sub(r'(\d+)', r'<sub>\1</sub>', row[0]), " ".join(row[1:])) comp += "</span>" DialogFactory.get_information_dialog( comp, parent=self.view.get_toplevel() ).run()
def on_composition_clicked(self, widget, *args): comp = "The composition of the specimens in this mixture:\n\n\n" comp += "<span font-family=\"monospace\">" # get the composition matrix (first columns contains strings with elements, others are specimen compositions) import re for row in self.model.get_composition_matrix(): comp += "%s %s\n" % (re.sub(r'(\d+)', r'<sub>\1</sub>', row[0]), " ".join(row[1:])) comp += "</span>" DialogFactory.get_information_dialog( comp, parent=self.view.get_toplevel()).run()
def on_save_object_clicked(self, event): def on_accept(dialog): logger.info("Exporting phases...") Phase.save_phases(self.get_selected_objects(), filename=dialog.filename) DialogFactory.get_save_dialog( "Export phase", parent=self.view.get_top_widget(), filters=phase_parsers.get_export_file_filters()).run(on_accept) return True
def _export_data(self, line): def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to save to '%s'." % os.path.basename(filename) with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False): line.save_data(parser, filename, **self.model.get_export_meta_data()) ext_less_fname = os.path.splitext(self.model.name)[0] DialogFactory.get_save_dialog( "Select file for export", parent=self.view.get_top_widget(), filters=xrd_parsers.get_export_file_filters(), current_name=ext_less_fname ).run(on_accept)
def on_accept(dialog): filename = dialog.filename parser = dialog.parser try: line.save_data(parser, filename, **self.model.get_export_meta_data()) except Exception: message = "An unexpected error has occured when trying to save to '%s'." % os.path.basename( filename) DialogFactory.get_information_dialog( message=message, parent=self.view.get_toplevel()).run() raise
def on_accept(dialog): filename = dialog.filename parser = dialog.parser try: self.model.raw_pattern.load_data(parser, filename, clear=True) except Exception: message = "An unexpected error has occured when trying to parse '%s'.\n" % os.path.basename( filename) message += "This is most likely caused by an invalid or unsupported file format." DialogFactory.get_information_dialog( message=message, parent=self.view.get_toplevel()).run() raise
def on_replace_experimental_data(self, *args, **kwargs): def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to parse '%s'.\n" % os.path.basename(filename) message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False): self.model.experimental_pattern.load_data(parser, filename, clear=True) DialogFactory.get_load_dialog( "Open XRD file for import", parent=self.view.get_top_widget(), filters=xrd_parsers.get_import_file_filters() ).run(on_accept) return True
def on_export_exclusion_ranges_clicked(self, widget, data=None): def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to save '%s'.\n" % os.path.basename(filename) message += "Contact the developer about this!" with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False): header = "%s %s" % (self.model.name, self.model.sample_name) self.model.exclusion_ranges.save_data(parser, filename, header=header) DialogFactory.get_save_dialog( "Select file for exclusion ranges export", parent=self.view.get_top_widget(), filters=exc_parsers.get_export_file_filters() ).run(on_accept)
def on_load_object_clicked(self, widget, user_data=None): def import_layer(dialog): def on_accept(dialog): del self.treemodel_data[:] # clears the list Atom.get_from_csv(dialog.filename, self.treemodel_data.append, self.model) DialogFactory.get_load_dialog( "Import atoms", parent=self.view.get_toplevel(), filters=self.file_filters ).run(on_accept) DialogFactory.get_confirmation_dialog( message="Are you sure?\nImporting a layer file will clear the current list of atoms!", parent=self.view.get_toplevel() ).run(import_layer)
def on_confirm(dialog): def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occured when trying to parse %s:\n\n<i>" % os.path.basename(filename) message += "{}</i>\n\n" message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False): self.model.exclusion_ranges.load_data(parser, filename, clear=True) DialogFactory.get_load_dialog( title="Import exclusion ranges", parent=self.view.get_top_widget(), filters=exc_parsers.get_import_file_filters() ).run(on_accept)
def delete_selected_specimens(self): """ Asks the user for confirmation and if positive deletes all the selected specimens. Does nothing when no specimens are selected. """ selection = self.get_selected_objects() if selection is not None and len(selection) >= 1: def delete_objects(dialog): for obj in selection: if obj is not None: self.model.specimens.remove(obj) DialogFactory.get_confirmation_dialog( message='Deleting a specimen is irreversible!\nAre You sure you want to continue?', parent=self.view.get_top_widget() ).run(delete_objects)
def on_pattern_file_set(self, dialog): # TODO # This should allow more flexibility: # Patterns should be allowed to not have the exact same shape, # add an x-shift variable to align them filename = dialog.filename parser = dialog.parser data_objects = None message = "An unexpected error has occurred when trying to parse %s:\n\n<i>" % os.path.basename( filename) message += "{}</i>\n\n" message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler( message, parent=self.view.get_toplevel(), reraise=False): # Parse the pattern file data_objects = parser.parse(filename) pattern = data_objects[0].data bg_pattern_x = pattern[:, 0].copy() bg_pattern_y = pattern[:, 1].copy() del pattern # Interpolate/Extrapolate where needed to match data shape and range from scipy.interpolate import interp1d f = interp1d(bg_pattern_x, bg_pattern_y, bounds_error=False, fill_value=0) bg_xnew = self.model.data_x bg_ynew = f(bg_xnew) self.model.bg_pattern = bg_ynew
def accept_wrapper(self, *args, **kwargs): if self.model.check_for_changes(): return DialogFactory.get_confirmation_dialog( confirm_msg, parent=self.view.get_top_widget() ).run(lambda d: on_accept(self, *args, **kwargs), on_reject) else: return on_accept(self, *args, **kwargs)
def on_cmb_import_gonio_changed(self, combobox, *args): model = combobox.get_model() itr = combobox.get_active_iter() if itr: # first column is the name, second column the path and third column # a flag indicating if this can be selected path = model.get_value(itr, 1) if path: def on_accept(dialog): self.model.reset_from_file(path) DialogFactory.get_confirmation_dialog( "Are you sure?\nYou will loose the current settings!", parent=self.view.get_toplevel()).run(on_accept) combobox.set_active(-1) # deselect
def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to parse '%s'.\n" % os.path.basename(filename) message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False): self.model.experimental_pattern.load_data(parser, filename, clear=True)
def register_view(self, view): super(BackgroundController, self).register_view(view) view.set_file_dialog( DialogFactory.get_load_dialog(title="Open XRD file for import", parent=view.get_top_widget()), self.on_pattern_file_set) view.select_bg_view(self.model.get_bg_type_lbl().lower())
def accept_wrapper(self, *args, **kwargs): if self.model.current_project and self.model.current_project.needs_saving: return DialogFactory.get_confirmation_dialog( confirm_msg, parent=self.view.get_top_widget() ).run(lambda d: on_accept(self, *args, **kwargs), on_reject) else: return on_accept(self, *args, **kwargs)
def on_pattern_file_set(self, button, dialog): # TODO # This should allow more flexibility: # Patterns should be allowed to not have the exact same shape, # add an x-shift variable to align them filename = dialog.filename parser = dialog.parser data_objects = None message = "An unexpected error has occurred when trying to parse %s:\n\n<i>" % os.path.basename(filename) message += "{}</i>\n\n" message += "This is most likely caused by an invalid or unsupported file format." with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=settings.DEBUG): # Parse the pattern file data_objects = parser.parse(filename) pattern = data_objects[0].data bg_pattern_x = pattern[:, 0].copy() bg_pattern_y = pattern[:, 1].copy() del pattern # Interpolate/Extrapolate where needed to match data shape and range from scipy.interpolate import interp1d f = interp1d( bg_pattern_x, bg_pattern_y, bounds_error=False, fill_value=0 ) bg_xnew = self.model.data_x bg_ynew = f(bg_xnew) self.model.bg_pattern = bg_ynew
def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to save '%s'.\n" % os.path.basename(filename) message += "Contact the developer about this!" with DialogFactory.error_dialog_handler(message, parent=self.view.get_toplevel(), reraise=False): header = "%s %s" % (self.model.name, self.model.sample_name) self.model.exclusion_ranges.save_data(parser, filename, header=header)
def _export_data(self, line): def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to save to '%s'." % os.path.basename( filename) with DialogFactory.error_dialog_handler( message, parent=self.view.get_toplevel(), reraise=False): line.save_data(parser, filename, **self.model.get_export_meta_data()) ext_less_fname = os.path.splitext(self.model.name)[0] DialogFactory.get_save_dialog( "Select file for export", parent=self.view.get_top_widget(), filters=xrd_parsers.get_export_file_filters(), current_name=ext_less_fname).run(on_accept)
def parse_x_pos(x_pos, event): # Clear the eye dropper controller self.edc.enabled = False self.edc.disconnect() del self.edc # Get experimental data at the sampled point exp_y = self.model.current_specimen.experimental_pattern.get_y_at_x(x_pos) message = "Sampled point:\n" message += "\tExperimental data:\t( %.4f , %.4f )\n" % (x_pos, exp_y) # Get calculated data if applicable if self.model.current_project.layout_mode == "FULL": calc_y = self.model.current_specimen.calculated_pattern.get_y_at_x(x_pos) message += "\tCalculated data:\t\t( %.4f , %.4f )" % (x_pos, calc_y) # Display message dialog DialogFactory.get_information_dialog( message, parent=self.view.get_toplevel() ).run()
def on_accept(dialog): # Try to load the project: with DialogFactory.error_dialog_handler( "An error has occurred:\n<i>{0}</i>\n Your project was not loaded!", parent=self.view.get_toplevel(), reraise=False): self.model.current_project = dialog.parser.parse(dialog.filename) self.model.current_project.parent = self.model # Update the title self.update_title()
def on_accept(dialog): filename = dialog.filename parser = dialog.parser message = "An unexpected error has occurred when trying to save to '%s'." % os.path.basename( filename) with DialogFactory.error_dialog_handler( message, parent=self.view.get_toplevel(), reraise=False): line.save_data(parser, filename, **self.model.get_export_meta_data())
def on_del_object_clicked(self, event, del_callback=None, callback=None): tv = self.view.treeview selection = tv.get_selection() if selection.count_selected_rows() >= 1: def delete_objects(dialog): with self._multi_operation_context(): for obj in self.get_selected_objects(): if callable(del_callback): del_callback(obj) else: self.treemodel_data.remove(obj) if callable(callback): callback(obj) self.edit_object(None) parent = self.view.get_top_widget() if not isinstance(parent, Gtk.Window): # @UndefinedVariable parent = None DialogFactory.get_confirmation_dialog( message=self.delete_msg, parent=parent ).run(delete_objects)
def on_accept(dialog): # Try to load the project: with DialogFactory.error_dialog_handler( "An error has occurred:\n<i>{0}</i>\n Your project was not loaded!", parent=self.view.get_toplevel(), title="Parsing error", reraise=False): self.model.current_project = dialog.parser.parse(dialog.filename) self.model.current_project.parent = self.model self.model.update_project_last_save_hash() # Update the title self.update_title()
def register_view(self, view): super(BackgroundController, self).register_view(view) view.set_file_dialog( DialogFactory.get_load_dialog( title="Open XRD file for import", parent=view.get_top_widget(), filters=self.file_filters ), self.on_pattern_file_set ) view.select_bg_view(self.model.get_bg_type_lbl().lower())
def test_get_file_dialog(self): kwargs = get_file_chooser_kwags() dialog = DialogFactory.get_file_dialog(**kwargs) self.assertEqual(dialog.get_action(), kwargs["action"], "Action attribute is not set correctly") self.assertEqual(dialog.get_title(), kwargs["title"], "Title attribute is not set correctly") self.assertEqual(dialog.get_parent(), kwargs["parent"], "Parent window is not set correctly") self.assertEqual(dialog.get_current_name(), kwargs["current_name"], "Current name attribute is not set correctly") self.assertEqual(dialog.get_current_folder(), kwargs["current_folder"], "Current folder attribute is not set correctly") self.assertEqual(dialog.get_extra_widget(), kwargs["extra_widget"], "Extra widget attribute is not set correctly") self.assertEqual(dialog.filters, kwargs["filters"], "Filters attribute is not set correctly") self.assertEqual(dialog.get_select_multiple(), kwargs["multiple"], "Multiple attribute is not set correctly") self.assertEqual(dialog.get_do_overwrite_confirmation(), kwargs["confirm_overwrite"], "Confirm overwrite attribute is not set correctly")
def import_atomtypes_dialog(self): """ Creates & returns the 'import atom types' dialog """ if self._import_atomtypes_dialog is None: # Default location of the database: current_folder = dirname(settings.DATA_REG.get_file_path("ATOM_SCAT_FACTORS")) # Create the dialog once, and re-use self._import_atomtypes_dialog = DialogFactory.get_load_dialog( title="Import atom types", current_folder=current_folder, persist=True, multiple=False, filters=self.file_filters, parent=self.view.get_top_widget() ) return self._import_atomtypes_dialog