From c331145fd368beedecb8ec3d09d1056a4ddcfda2 Mon Sep 17 00:00:00 2001 From: Michael Gratton Date: Tue, 19 Jan 2021 23:50:29 +1100 Subject: [PATCH] client: Clean up database upgrade dialog implementation Rename `UpgradeDialog` to `DatabaseManager` since it's not actually a dialog, move it into the APplication package. Replace old Glade UI file with a custom built dialog since it's trivial and so we can make it modal for a main window. Fixes #1007 --- po/POTFILES.in | 3 +- .../application/application-controller.vala | 8 +- .../application-database-manager.vala | 118 ++++++++++++++++++ src/client/dialogs/upgrade-dialog.vala | 95 -------------- src/client/meson.build | 2 +- ui/geary.css | 10 ++ ui/org.gnome.Geary.gresource.xml | 1 - ui/upgrade_dialog.glade | 113 ----------------- 8 files changed, 134 insertions(+), 216 deletions(-) create mode 100644 src/client/application/application-database-manager.vala delete mode 100644 src/client/dialogs/upgrade-dialog.vala delete mode 100644 ui/upgrade_dialog.glade diff --git a/po/POTFILES.in b/po/POTFILES.in index 1e476d67..a5804402 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -23,6 +23,7 @@ src/client/application/application-configuration.vala src/client/application/application-contact-store.vala src/client/application/application-contact.vala src/client/application/application-controller.vala +src/client/application/application-database-manager.vala src/client/application/application-email-plugin-context.vala src/client/application/application-email-store-factory.vala src/client/application/application-folder-context.vala @@ -85,7 +86,6 @@ src/client/dialogs/attachment-dialog.vala src/client/dialogs/certificate-warning-dialog.vala src/client/dialogs/dialogs-problem-details-dialog.vala src/client/dialogs/password-dialog.vala -src/client/dialogs/upgrade-dialog.vala src/client/folder-list/folder-list-abstract-folder-entry.vala src/client/folder-list/folder-list-account-branch.vala src/client/folder-list/folder-list-folder-entry.vala @@ -481,4 +481,3 @@ ui/main-toolbar.ui ui/main-toolbar-menus.ui ui/password-dialog.glade ui/problem-details-dialog.ui -ui/upgrade_dialog.glade diff --git a/src/client/application/application-controller.vala b/src/client/application/application-controller.vala index 6aec77ac..203bbda3 100644 --- a/src/client/application/application-controller.vala +++ b/src/client/application/application-controller.vala @@ -84,7 +84,7 @@ internal class Application.Controller : // Cancelled if the controller is closed private GLib.Cancellable controller_open; - private UpgradeDialog upgrade_dialog; + private DatabaseManager database_manager; private Folks.IndividualAggregator folks; // List composers that have not yet been closed @@ -134,7 +134,7 @@ internal class Application.Controller : IconFactory.init(application.get_resource_directory()); // Create DB upgrade dialog. - this.upgrade_dialog = new UpgradeDialog(application); + this.database_manager = new DatabaseManager(application); // Initialise WebKit and WebViews Components.WebView.init_web_context( @@ -977,7 +977,7 @@ internal class Application.Controller : ); this.accounts.set(account.information, context); - this.upgrade_dialog.add_account(account, this.controller_open); + this.database_manager.add_account(account, this.controller_open); account.information.authentication_failure.connect( on_authentication_failure @@ -1058,7 +1058,7 @@ internal class Application.Controller : // Guard against trying to close the account twice this.accounts.unset(account.information); - this.upgrade_dialog.remove_account(account); + this.database_manager.remove_account(account); // Stop updating status and showing errors when closing // the account - the user doesn't care any more diff --git a/src/client/application/application-database-manager.vala b/src/client/application/application-database-manager.vala new file mode 100644 index 00000000..f559cbd9 --- /dev/null +++ b/src/client/application/application-database-manager.vala @@ -0,0 +1,118 @@ +/* + * Copyright 2016 Software Freedom Conservancy Inc. + * Copyright 2020 Michael Gratton + * + * This software is licensed under the GNU Lesser General Public License + * (version 2.1 or later). See the COPYING file in this distribution. + */ + +/** Manages progress when upgrading and rebuilding account databases. */ +internal class Application.DatabaseManager : Geary.BaseObject { + + + /* Progress monitor for database operations. */ + public Geary.AggregateProgressMonitor monitor { + public get; private set; + default = new Geary.AggregateProgressMonitor(); + } + + /** Determines whether or not the database dialog is visible. */ + public bool visible { get; set; } + + private weak Application.Client application; + + private Gtk.Dialog? dialog = null; + private Gee.Set cancellables = + new Gee.HashSet(); + + /** + * Creates a new manager for the given application. + */ + public DatabaseManager(Application.Client application) { + this.application = application; + + this.monitor.start.connect(on_start); + this.monitor.finish.connect(on_close); + } + + /** + * Adds an account to be monitored for upgrades by the dialog. + * + * Accounts should be added before being opened. + */ + public void add_account(Geary.Account account, + GLib.Cancellable? cancellable = null) { + monitor.add(account.db_upgrade_monitor); + monitor.add(account.db_vacuum_monitor); + if (cancellable != null) { + cancellables.add(cancellable); + } + } + + /** + * Stops an account from being monitored. + */ + public void remove_account(Geary.Account account) { + monitor.remove(account.db_upgrade_monitor); + monitor.remove(account.db_vacuum_monitor); + } + + private void on_start() { + // Disable main windows + foreach (Application.MainWindow window in this.application.get_main_windows()) { + window.sensitive = false; + } + + var spinner = new Gtk.Spinner(); + spinner.set_size_request(45, 45); + spinner.start(); + + var grid = new Gtk.Grid(); + grid.orientation = VERTICAL; + grid.add(spinner); + /// Translators: Label for account database upgrade dialog + grid.add(new Gtk.Label(_("Account update in progress"))); + grid.show_all(); + + this.dialog = new Gtk.Dialog.with_buttons( + /// Translators: Window title for account database upgrade + /// dialog + _("Account update"), + this.application.get_active_main_window(), + MODAL + ); + this.dialog.get_style_context().add_class("geary-upgrade"); + this.dialog.get_content_area().add(grid); + this.dialog.deletable = false; + this.dialog.delete_event.connect(this.on_delete_event); + this.dialog.close.connect(this.on_close); + this.dialog.show(); + } + + private bool on_delete_event() { + // Don't allow window to close until we're finished. + return !this.monitor.is_in_progress; + } + + private void on_close() { + // If the user quit the dialog before the upgrade completed, cancel everything. + if (this.monitor.is_in_progress) { + foreach (var c in cancellables) { + c.cancel(); + } + } + + if (this.dialog != null && + this.dialog.visible) { + this.dialog.hide(); + this.dialog.destroy(); + this.dialog = null; + } + + // Enable main windows + foreach (Application.MainWindow window in this.application.get_main_windows()) { + window.sensitive = true; + } + } + +} diff --git a/src/client/dialogs/upgrade-dialog.vala b/src/client/dialogs/upgrade-dialog.vala deleted file mode 100644 index e4871984..00000000 --- a/src/client/dialogs/upgrade-dialog.vala +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. - * - * This software is licensed under the GNU Lesser General Public License - * (version 2.1 or later). See the COPYING file in this distribution. - */ - -public class UpgradeDialog : Object { - public const string PROP_VISIBLE_NAME = "visible"; - - // Progress monitor associated with the upgrade. - public Geary.AggregateProgressMonitor monitor { public get; private set; - default = new Geary.AggregateProgressMonitor(); } - - // Whether or not this dialog is visible. - public bool visible { get; set; } - - private weak Application.Client application; - - private Gtk.Dialog? dialog = null; - private Gee.HashSet cancellables = new Gee.HashSet(); - - /** - * Creates and loads the upgrade progress dialog. - */ - public UpgradeDialog(Application.Client application) { - this.application = application; - - // Load UI. - // Hook up signals. - monitor.start.connect(on_start); - monitor.finish.connect(on_close); - } - - private void on_start() { - // Disable main windows - foreach (Application.MainWindow window in this.application.get_main_windows()) { - window.sensitive = false; - } - - Gtk.Builder builder = GioUtil.create_builder("upgrade_dialog.glade"); - this.dialog = (Gtk.Dialog) builder.get_object("dialog"); - this.dialog.set_transient_for( - this.application.get_active_main_window() - ); - this.dialog.delete_event.connect(on_delete_event); - this.dialog.show(); - } - - private bool on_delete_event() { - // Don't allow window to close until we're finished. - return !monitor.is_in_progress; - } - - private void on_close() { - // If the user quit the dialog before the upgrade completed, cancel everything. - if (monitor.is_in_progress) { - foreach(Cancellable c in cancellables) - c.cancel(); - } - - if (this.dialog != null && - this.dialog.visible) { - this.dialog.hide(); - this.dialog = null; - } - - // Enable main windows - foreach (Application.MainWindow window in this.application.get_main_windows()) { - window.sensitive = true; - } - } - - /** - * Adds an account to be monitored for upgrades by the dialog. - * - * Accounts should be added before being opened. - */ - public void add_account(Geary.Account account, - GLib.Cancellable? cancellable = null) { - monitor.add(account.db_upgrade_monitor); - monitor.add(account.db_vacuum_monitor); - if (cancellable != null) { - cancellables.add(cancellable); - } - } - - /** - * Stops an account from being monitored. - */ - public void remove_account(Geary.Account account) { - monitor.remove(account.db_upgrade_monitor); - monitor.remove(account.db_vacuum_monitor); - } - -} diff --git a/src/client/meson.build b/src/client/meson.build index e4726ceb..f20fe5c8 100644 --- a/src/client/meson.build +++ b/src/client/meson.build @@ -22,6 +22,7 @@ client_vala_sources = files( 'application/application-contact-store.vala', 'application/application-contact.vala', 'application/application-controller.vala', + 'application/application-database-manager.vala', 'application/application-email-plugin-context.vala', 'application/application-email-store-factory.vala', 'application/application-folder-context.vala', @@ -104,7 +105,6 @@ client_vala_sources = files( 'dialogs/certificate-warning-dialog.vala', 'dialogs/dialogs-problem-details-dialog.vala', 'dialogs/password-dialog.vala', - 'dialogs/upgrade-dialog.vala', 'folder-list/folder-list-abstract-folder-entry.vala', 'folder-list/folder-list-account-branch.vala', diff --git a/ui/geary.css b/ui/geary.css index 03d856d8..12f94d7d 100644 --- a/ui/geary.css +++ b/ui/geary.css @@ -372,3 +372,13 @@ treeview.sidebar:drop(active).into { .geary-inspector-log-viewer .sidebar row > grid * { margin: 4px; } + +/* Upgrade dialog */ + +dialog.geary-upgrade grid { + margin: 12px; +} + +dialog.geary-upgrade label { + margin-top: 12px; +} diff --git a/ui/org.gnome.Geary.gresource.xml b/ui/org.gnome.Geary.gresource.xml index 7fe9b865..891ab1c8 100644 --- a/ui/org.gnome.Geary.gresource.xml +++ b/ui/org.gnome.Geary.gresource.xml @@ -46,7 +46,6 @@ password-dialog.glade problem-details-dialog.ui signature-web-view.js - upgrade_dialog.glade geary.css single-key-shortcuts.css diff --git a/ui/upgrade_dialog.glade b/ui/upgrade_dialog.glade deleted file mode 100644 index 792af946..00000000 --- a/ui/upgrade_dialog.glade +++ /dev/null @@ -1,113 +0,0 @@ - - - - - False - 5 - False - center - dialog - False - - - False - vertical - 2 - - - False - end - - - - - - False - False - end - 0 - - - - - True - False - 8 - 8 - 8 - 8 - 8 - 8 - - - 45 - 45 - True - False - True - - - 1 - 0 - 1 - 1 - - - - - True - False - Geary update in progress… - - - 1 - 1 - 1 - 1 - - - - - True - False - True - True - - - - - - 2 - 0 - 1 - 2 - - - - - True - False - True - True - - - - - - 0 - 0 - 1 - 2 - - - - - False - True - 1 - - - - - -