139 lines
4.9 KiB
Python
139 lines
4.9 KiB
Python
# 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 = '<span weight="bold" size="larger">%s</span>\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 |