geary/src/client/application/application-database-manager.vala
Michael Gratton c331145fd3 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
2021-01-19 23:50:29 +11:00

118 lines
3.7 KiB
Vala

/*
* Copyright 2016 Software Freedom Conservancy Inc.
* Copyright 2020 Michael Gratton <mike@vee.net>
*
* 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<GLib.Cancellable> cancellables =
new Gee.HashSet<GLib.Cancellable>();
/**
* 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;
}
}
}