# Python imports import os # Lib imports import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports class DialogSignalsMixin(): def on_open_clicked(self, param): file_chooser = Gtk.FileChooserDialog('Open', self.window, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) file_filter = Gtk.FileFilter() file_filter.set_name('XML files') file_filter.add_pattern('*.xml') file_chooser.add_filter(file_filter) file_filter = Gtk.FileFilter() file_filter.set_name('All files') file_filter.add_pattern('*') file_chooser.add_filter(file_filter) file_chooser.set_default_response(Gtk.ResponseType.OK) file_chooser.set_current_folder(os.path.expanduser('~')) path = None response = file_chooser.run() if response == Gtk.ResponseType.OK: path = file_chooser.get_filename() if path and not os.access(path, os.R_OK): abspath = os.path.abspath(path) self.message_dialog(Gtk.MessageType.ERROR, ('Could not open file "%s"') % abspath, ('The file "%s" could not be opened. ' 'Permission denied.') % abspath, file_chooser) path = None file_chooser.destroy() if not path: return self.load_scheme(path) def on_save_clicked(self, param): if not self.origSchemeFile: filename = run_save_as_dialog(self.window, self.entryId.get_text() + '.xml') if filename and not '.' in os.path.basename(filename): filename = f"{filename}.xml" if filename: self.write_scheme(filename, self.entryId.get_text()) self.origSchemeFile = filename else: self.write_scheme(self.origSchemeFile, self.entryId.get_text()) def on_save_as_clicked(self, param): filename = run_save_as_dialog(self.window, self.entryId.get_text() + '.xml') if filename and not '.' in os.path.basename(filename): filename = f"{filename}.xml" if filename: self.write_scheme(filename, self.entryId.get_text()) self.origSchemeFile = filename def message_dialog( dialog_type, short_msg, long_msg = None, parent = None, buttons = Gtk.ButtonsType.OK, additional_buttons = None ): dialog = Gtk.MessageDialog(parent = parent, flags = Gtk.DialogFlags.MODAL, type = dialog_type, buttons = buttons) if additional_buttons: dialog.add_buttons(*additional_buttons) dialog.set_markup(short_msg) if long_msg: if isinstance(long_msg, Gtk.Widget): widget = long_msg elif isinstance(long_msg, str): widget = Gtk.Label() widget.set_markup(long_msg) else: raise TypeError('"long_msg" must be a Gtk.Widget or a string') expander = Gtk.Expander(label = 'Click here for details') expander.set_border_width(6) expander.add(widget) dialog.vbox.pack_end(expander, True, True, 0) dialog.show_all() response = dialog.run() dialog.destroy() return response def run_save_as_dialog(parent, current_name): file_chooser = Gtk.FileChooserDialog('Save As', parent, Gtk.FileChooserAction.SAVE, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK)) file_filter = Gtk.FileFilter() file_filter.set_name('XML files') file_filter.add_pattern('*.xml') file_chooser.add_filter(file_filter) file_filter = Gtk.FileFilter() file_filter.set_name('All files') file_filter.add_pattern('*') file_chooser.add_filter(file_filter) file_chooser.set_default_response(Gtk.ResponseType.OK) file_chooser.set_current_folder( os.path.expanduser('~') ) if current_name: file_chooser.set_current_name(current_name) file_chooser.set_default_response(Gtk.ResponseType.OK) path = None while True: response = file_chooser.run() if response != Gtk.ResponseType.OK: path = None break path = file_chooser.get_filename() if not os.path.exists(path): break sub_msg_1 = ('A file named "%s" already exists') % os.path.abspath(path) sub_msg_2 = ('Do you which to replace it with the current project?') text = '%s\n\n%s\n' % (sub_msg_1, sub_msg_2) result = message_dialog(Gtk.MessageType.ERROR, text, parent = parent, buttons = Gtk.ButtonsType.NONE, additional_buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 'Replace', Gtk.ResponseType.YES)) if result == Gtk.ResponseType.YES: break file_chooser.destroy() return path