GtkCodeThemer/src/core/mixins/signals/widget_signals/dialog_signals_mixin.py

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