diff --git a/gramps/gui/utils.py b/gramps/gui/utils.py index a0d17de39..c122fd927 100644 --- a/gramps/gui/utils.py +++ b/gramps/gui/utils.py @@ -99,6 +99,61 @@ class CLIDialog: pass vbox = CLIVbox() +#------------------------------------------------------------------------- +# +# Popup class +# +#------------------------------------------------------------------------- + +class Popup: + """ + Popup a message for Gramps. + + The Popup is used to display a message + This class must be closed when no longer needed. + + """ + + def __init__(self, title, message, parent=None): + """ + Specify the title and the message to display. + """ + from gi.repository import Gtk + self.__popup = None + if has_display(): + self.__popup = Gtk.Dialog() + self.__popup.connect('delete_event', self.do_nothing) + self.__popup.set_title(title) + self.__popup.set_size_request(400, 100) + self.__popup.vbox.set_spacing(10) + self.__popup.vbox.set_border_width(24) + self.__mesg = Gtk.Label(label=message) + self.__mesg.set_use_markup(True) + self.__popup.vbox.add(self.__mesg) + if not parent: # if we don't have an explicit parent, + # try to find one + for win in Gtk.Window.list_toplevels(): + if win.is_active(): + parent = win + break + # if we still don't have a parent, give up + if parent: + self.__popup.set_transient_for(parent) + self.__popup.set_modal(True) + self.__popup.show_all() + else: # This class is useful only in gui mode + return + + def destroy(self): + if self.__popup: + self.__popup.destroy() + + def do_nothing(self, widget, value): + """ + Avoid to close the Popup + """ + return True + #------------------------------------------------------------------------- # # Progress meter class diff --git a/gramps/gui/viewmanager.py b/gramps/gui/viewmanager.py index a1463ea95..1304a2743 100644 --- a/gramps/gui/viewmanager.py +++ b/gramps/gui/viewmanager.py @@ -73,7 +73,7 @@ from gramps.gen.plug import REPORT from gramps.gen.plug.report._constants import standalone_categories from .plug import (PluginWindows, ReportPluginDialog, ToolPluginDialog) from .plug.report import report, BookSelector -from .utils import AvailableUpdates +from .utils import (AvailableUpdates, Popup) from .pluginmanager import GuiPluginManager from gramps.gen.relationship import get_relationship_calculator from .displaystate import DisplayState, RecentDocsMenu @@ -1209,6 +1209,10 @@ class ViewManager(CLIManager): if(self.dbstate.db.is_open() and self.dbstate.db.has_changed > self.prev_has_changed): self.prev_has_changed = self.dbstate.db.has_changed + message = _("Please, wait before closing gramps") + message = '%s' % message + pgr_title = _("Autobackup...") + popup = Popup(pgr_title, message, parent=self.window) self.uistate.set_busy_cursor(True) self.uistate.progress.show() self.uistate.push_message(self.dbstate, _("Autobackup...")) @@ -1218,6 +1222,7 @@ class ViewManager(CLIManager): self.uistate.push_message(self.dbstate, _("Error saving backup data")) self.uistate.set_busy_cursor(False) + popup.destroy() self.uistate.progress.hide() def __backup(self): @@ -1782,6 +1787,10 @@ class QuickBackup(ManagedWindow): # TODO move this class into its own module position = self.window.get_position() # crock window.hide() self.window.move(position[0], position[1]) + message = _("Please, wait before closing gramps") + message = '%s' % message + pgr_title = _("Making backup...") + popup = Popup(pgr_title, message, parent=self.window) self.uistate.set_busy_cursor(True) self.uistate.pulse_progressbar(0) self.uistate.progress.show() @@ -1796,6 +1805,7 @@ class QuickBackup(ManagedWindow): # TODO move this class into its own module strip_photos=0, compress=1) writer.write(filename) self.uistate.set_busy_cursor(False) + popup.destroy() self.uistate.progress.hide() self.uistate.push_message(self.dbstate, _("Backup saved to '%s'") % filename)