def on_export_as_txt(self, _action, *_args): """Export currently viewed stuff as txt.""" spectrumIDs = self.view.get_active_spectra() if len(spectrumIDs) != 1: logger.warning("txt export only supports single spectra") return False dialog = Gtk.FileChooserDialog( "Export as txt...", self.win, Gtk.FileChooserAction.SAVE, ("_Cancel", Gtk.ResponseType.CANCEL, "_Save", Gtk.ResponseType.OK), ) dialog.set_current_folder(__config__.get("io", "export_dir")) pfile = __config__.get("io", "project_file") if pfile != "None": bname = "{}_data.txt".format(os.path.basename(pfile).split(".")[0]) else: bname = "Untitled.txt" dialog.set_current_name(bname) dialog.set_do_overwrite_confirmation(True) dialog.add_filter(SimpleFileFilter(".txt", ["*.txt"])) response = dialog.run() if response == Gtk.ResponseType.OK: fname = dialog.get_filename() fileio.export_txt(self.dh, spectrumIDs[0], fname) __config__.set("io", "export_dir", fname) dialog.destroy() return True logger.debug("abort file export") dialog.destroy() return False
def __init__(self): logger.debug("instantiating main window...") super().__init__() self.app = None self.builder = None self.view = None self.statusbar_id = None xsize = int(__config__.get("window", "xsize")) ysize = int(__config__.get("window", "ysize")) xpos = int(__config__.get("window", "xpos")) ypos = int(__config__.get("window", "ypos")) self.set_default_size(xsize, ysize) self.move(xpos, ypos) self.handlers = { "on_spectrum_view_search_entry_changed": self.on_search_spectrum_view, "on_spectrum_view_search_combo_changed": self.on_search_spectrum_view, "on_spectrum_view_button_press_event": self.on_spectrum_view_clicked, "on_peak_view_row_activated": self.on_peak_view_row_activated, "on_region_chooser_combo_changed": self.on_region_chooser_changed } actions = { "about": self.on_about, "show-selected-spectra": self.on_show_selected_spectra, "show-atomlib": self.on_show_atomlib, "center-plot": self.on_center_plot, "pan-plot": self.on_pan_plot, "zoom-plot": self.on_zoom_plot, "view-logfile": self.on_view_logfile, "edit-colors": self.on_edit_colors } for name, callback in actions.items(): simple = Gio.SimpleAction.new(name, None) simple.connect("activate", callback) self.add_action(simple) toggle_appearance_actions = { "toggle-bg": "region-background", "toggle-peaks": "peak", "toggle-region-vlines": "region-boundaries" } for name, keyword in toggle_appearance_actions.items(): simple_toggle = Gio.SimpleAction.new_stateful( name, None, GLib.Variant.new_boolean(True)) simple_toggle.connect("change-state", self.on_toggle_appearance, keyword) self.add_action(simple_toggle)
def on_import_spectra(self, _widget, *_args): """Load one or more spectra from a file chosen by the user.""" dialog = Gtk.FileChooserDialog( "Import data...", self.win, Gtk.FileChooserAction.OPEN, ("_Cancel", Gtk.ResponseType.CANCEL, "_Open", Gtk.ResponseType.OK), ) dialog.set_current_folder(__config__.get("io", "data_dir")) dialog.set_select_multiple(True) dialog.add_filter( SimpleFileFilter("all files", ["*.xym", "*.txt", "*.xy"])) dialog.add_filter(SimpleFileFilter(".xym", ["*.xym"])) dialog.add_filter(SimpleFileFilter(".xy", ["*.xy"])) dialog.add_filter(SimpleFileFilter(".txt", ["*.txt"])) specdicts = [] response = dialog.run() if response == Gtk.ResponseType.OK: __config__.set("io", "data_dir", dialog.get_current_folder()) for fname in dialog.get_filenames(): ext = fname.split(".")[-1] if ext in ["xym", "txt", "xy"]: specdicts.extend(fileio.parse_spectrum_file(fname)) logger.info("parsed and added file {}".format(fname)) else: logger.warning("file {} not recognized".format(fname)) for specdict in specdicts: self.dh.add_spectrum(**specdict) else: logger.debug("nothing selected to import") dialog.destroy()
def on_export_as_image(self, action, *_args): """Export current view as image.""" spectrumIDs = self.view.get_active_spectra() if len(spectrumIDs) < 1: logger.warning("image export on empty canvas not possible") return False cviface = XPLExportCanvasInterface(self.builder, self.dh) cviface.plot() cviface.configure_figure() cvdialog = self.builder.get_object("export_canvas_dialog") response = cvdialog.run() if response != Gtk.ResponseType.OK: cvdialog.hide() logger.debug("abort file export") return False fcdialog = Gtk.FileChooserDialog( "Export as image...", self.win, Gtk.FileChooserAction.SAVE, ("_Cancel", Gtk.ResponseType.CANCEL, "_Save", Gtk.ResponseType.OK), ) fcdialog.set_current_folder(__config__.get("io", "export_dir")) pfile = __config__.get("io", "project_file") if pfile != "None": bname = "{}_img.png".format(os.path.basename(pfile).split(".")[0]) else: bname = "Untitled.png" fcdialog.set_current_name(bname) fcdialog.set_do_overwrite_confirmation(True) fcdialog.add_filter( SimpleFileFilter( "images", ("*.png", "*.svg", "*.svgz", "*.jpeg", "*.jpg", "*.tif", "*.tiff", "*.ps", "*.eps", "*.pdf", "*.pgf"))) response = fcdialog.run() if response != Gtk.ResponseType.OK: fcdialog.destroy() logger.debug("abort file export") return self.on_export_as_image(action) fname = fcdialog.get_filename() cviface.save(fname) __config__.set("io", "export_dir", fname) fcdialog.destroy() return True
def on_save(self, widget, *_args): """Save the current project, call self.on_save_as if project file name is not set.""" fname = __config__.get("io", "project_file") if fname != "None": fileio.save_project(fname, self.dh) logger.info("saved project file to {}".format(fname)) return True return self.on_save_as(widget)
def do_activate(self): """Creates MainWindow.""" self.win = self.builder.get_object("main_window") self.win.set_application(self) self.win.set_helpers(self.builder, self.view) self.win.set_title(__appname__) self.win.show_all() def alter_dh(altered=True): """ Stars the filename in the window title when datahandler gets altered. """ title = self.win.get_title() if altered and u"—" in title and "*" not in title: fname = title.split(u"—")[0].strip() self.win.set_title(u"{}* — {}".format(fname, __appname__)) elif not altered and "*" in title: self.win.set_title(title.replace("*", "")) self.dh.connect("altered", alter_dh) fname = __config__.get("io", "project_file") if fname != "None": try: self.open_project(fname) except FileNotFoundError: self.dh.emit_init_ready() logger.warning("File '{}' not found".format(fname)) __config__.set("io", "project_file", "None") else: logger.info("loaded file {}".format(fname)) else: self.dh.emit_init_ready() handlers = { "on_main_window_delete_event": self.on_quit, "on_smoothing_scale_adjustment_value_changed": self.on_smoothen, "on_calibration_spinbutton_adjustment_value_changed": self.on_calibrate, # "on_normalization_switch_activate": self.on_normalize, "on_normalization_combo_changed": self.on_normalize, "on_region_background_type_combo_changed": self.on_change_bgtype, "on_peak_entry_activate": self.on_peak_entry_activate, "on_peak_name_entry_changed": self.on_peak_name_entry_changed, } handlers.update(self.win.handlers) self.builder.connect_signals(handlers)
def on_open_project(self, _widget, *_args): """Let the user choose a project file to open and open it through self.open_project.""" really_do_it = self.ask_for_save() if not really_do_it: return dialog = Gtk.FileChooserDialog( "Open...", self.win, Gtk.FileChooserAction.OPEN, ("_Cancel", Gtk.ResponseType.CANCEL, "_Open", Gtk.ResponseType.OK), ) dialog.set_current_folder(__config__.get("io", "project_dir")) dialog.add_filter(SimpleFileFilter(".xpl", ["*.xpl"])) response = dialog.run() if response == Gtk.ResponseType.OK: fname = dialog.get_filename() __config__.set("io", "project_file", fname) __config__.set("io", "project_dir", dialog.get_current_folder()) self.open_project(fname) else: logger.debug("abort project file opening") dialog.destroy()
def on_save_as(self, widget, *_args): """Saves project to a new file chosen by the user.""" dialog = Gtk.FileChooserDialog( "Save as...", self.win, Gtk.FileChooserAction.SAVE, ("_Cancel", Gtk.ResponseType.CANCEL, "_Save", Gtk.ResponseType.OK), ) dialog.set_current_folder(__config__.get("io", "project_dir")) dialog.set_do_overwrite_confirmation(True) dialog.add_filter(SimpleFileFilter(".xpl", ["*.xpl"])) dialog.set_current_name("untitled.xpl") response = dialog.run() if response == Gtk.ResponseType.OK: fname = dialog.get_filename() __config__.set("io", "project_file", fname) __config__.set("io", "project_dir", dialog.get_current_folder()) self.on_save(widget) dialog.destroy() return True logger.debug("abort project file saving") dialog.destroy() return False