diff --git a/src/FolderManager/FileView.vala b/src/FolderManager/FileView.vala index f8f380012..2841e2715 100644 --- a/src/FolderManager/FileView.vala +++ b/src/FolderManager/FileView.vala @@ -348,7 +348,7 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane : search_root.file.file; bool is_explicit = !(item_for_path is ProjectFolderItem); - search_root.global_search (start_folder, term, is_explicit); + search_root.global_search.begin (start_folder, term, is_explicit); } } } @@ -621,13 +621,16 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane var close_projects = false; dialog.response.connect ((res) => { - dialog.destroy (); if (res == Gtk.ResponseType.ACCEPT) { close_projects = true; } + + dialog.destroy (); + add_folder.callback (); }); - dialog.run (); + dialog.show (); + yield; if (close_projects) { foreach (var item in parents) { diff --git a/src/FolderManager/ProjectFolderItem.vala b/src/FolderManager/ProjectFolderItem.vala index 654c61014..4f44497cd 100644 --- a/src/FolderManager/ProjectFolderItem.vala +++ b/src/FolderManager/ProjectFolderItem.vala @@ -450,7 +450,7 @@ namespace Scratch.FolderManager { // via a context menu on an explicitly chosen folder, in which case everything in that // folder will be searched, or whether the hot-key was used in which case the search will // take place on the active project and will omit certain folders - public void global_search ( + public async void global_search ( GLib.File start_folder = this.file.file, string? term = null, bool is_explicit = false @@ -511,9 +511,11 @@ namespace Scratch.FolderManager { } dialog.destroy (); + global_search.callback (); }); - dialog.run (); + dialog.show (); + yield; if (search_term != null) { // Remove results of previous search before attempting a new one diff --git a/src/MainWindow.vala b/src/MainWindow.vala index dcd34dbc3..e79ee53d3 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -1051,6 +1051,10 @@ namespace Scratch { } private void action_clone_repo (SimpleAction action, Variant? param) { + clone_repo.begin (); + } + + private async void clone_repo () { var default_projects_folder = Scratch.settings.get_string ("default-projects-folder"); if (default_projects_folder == "" && git_manager.active_project_path != "") { default_projects_folder = Path.get_dirname (git_manager.active_project_path); @@ -1058,63 +1062,66 @@ namespace Scratch { var default_remote = Scratch.settings.get_string ("default-remote"); var clone_dialog = new Dialogs.CloneRepositoryDialog (default_projects_folder, default_remote); + + var action_complete = false; clone_dialog.response.connect ((res) => { - // Persist last entries (not necessarily valid) - Scratch.settings.set_string ("default-remote", clone_dialog.get_remote ()); - Scratch.settings.set_string ("default-projects-folder", clone_dialog.get_projects_folder ()); - //TODO Show more information re progress using Ggit callbacks - if (res == Gtk.ResponseType.APPLY && clone_dialog.can_clone) { - sidebar.cloning_in_progress = true; + action_complete = (res != Gtk.ResponseType.APPLY || !clone_dialog.can_clone); + clone_repo.callback (); + }); + + while (!action_complete) { + clone_dialog.show (); + yield; + + if (!action_complete) { + Scratch.settings.set_string ("default-remote", clone_dialog.get_remote ()); + Scratch.settings.set_string ("default-projects-folder", clone_dialog.get_projects_folder ()); + //TODO Show more information re progress using Ggit callbacks clone_dialog.hide (); + var uri = clone_dialog.get_valid_source_repository_uri (); var target = clone_dialog.get_valid_target (); - git_manager.clone_repository.begin ( - uri, - target, - (obj, res) => { - sidebar.cloning_in_progress = false; - File? workdir = null; - string? error = null; - if (git_manager.clone_repository.end (res, out workdir, out error)) { - open_folder (workdir); - clone_dialog.destroy (); - if (this.is_active) { - sidebar.notify_cloning_success (); - } else { - var notification = new Notification (_("Cloning completed")); - notification.set_body (_("Clone successfully created in %s").printf (target)); - notification.set_icon (new ThemedIcon ("process-completed-symbolic")); - app.send_notification ("cloning-finished-%s".printf (target), notification); - } - } else { - var message_dialog = new Granite.MessageDialog.with_image_from_icon_name ( - _("Unable to clone %s").printf (uri), - error, - "dialog-error", - Gtk.ButtonsType.CLOSE - ) { - transient_for = this - }; - message_dialog.add_button (_("Retry"), 1); - message_dialog.response.connect ((res) => { - if (res == 1) { - clone_dialog.show (); - } else { - clone_dialog.destroy (); - } - - message_dialog.destroy (); - }); - message_dialog.present (); - } + sidebar.cloning_in_progress = true; + File? workdir = null; + string? error = null; + var success = yield git_manager.clone_repository (uri, target, out workdir, out error); + sidebar.cloning_in_progress = false; + + if (success) { + open_folder (workdir); + if (this.is_active) { + sidebar.notify_cloning_success (); + } else { + var notification = new Notification (_("Cloning completed")); + notification.set_body (_("Clone successfully created in %s").printf (target)); + notification.set_icon (new ThemedIcon ("process-completed-symbolic")); + app.send_notification ("cloning-finished-%s".printf (target), notification); } - ); - } else { - clone_dialog.destroy (); + + action_complete = true; + } else { + var message_dialog = new Granite.MessageDialog.with_image_from_icon_name ( + _("Unable to clone %s").printf (uri), + error, + "dialog-error", + Gtk.ButtonsType.CLOSE + ) { + transient_for = this, + modal = true + }; + message_dialog.add_button (_("Retry"), 1); + message_dialog.response.connect ((res) => { + action_complete = res != 1; + message_dialog.destroy (); + clone_repo.callback (); + }); + message_dialog.show (); + yield; + } } - }); + } - clone_dialog.present (); + clone_dialog.destroy (); } private void action_collapse_all_folders () { diff --git a/src/Services/Document.vala b/src/Services/Document.vala index 70afef93f..a8c7fd907 100644 --- a/src/Services/Document.vala +++ b/src/Services/Document.vala @@ -508,6 +508,62 @@ namespace Scratch.Services { return; } + private async bool ask_save_changes () { + var parent_window = source_view.get_toplevel () as Gtk.Window; + var dialog = new Granite.MessageDialog ( + _("Save changes to ā€œ%sā€ before closing?").printf (this.get_basename ()), + _("If you don't save, changes will be permanently lost."), + new ThemedIcon ("dialog-warning"), + Gtk.ButtonsType.NONE + ) { + modal = true + }; + dialog.transient_for = parent_window; + + var no_save_button = (Gtk.Button) dialog.add_button (_("Close Without Saving"), Gtk.ResponseType.NO); + no_save_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); + + dialog.add_button (_("Cancel"), Gtk.ResponseType.CANCEL); + dialog.add_button (_("Save"), Gtk.ResponseType.YES); + dialog.set_default_response (Gtk.ResponseType.YES); + + var can_close = true; + var try_save = false; + dialog.response.connect ((res) => { + dialog.destroy (); + switch (res) { + case Gtk.ResponseType.CANCEL: + case Gtk.ResponseType.DELETE_EVENT: + can_close = false; + break; + case Gtk.ResponseType.YES: // Save and close if success + try_save = true; + break; + case Gtk.ResponseType.NO: // Do not save but close + if (this.is_file_temporary) { + delete_temporary_file (true); + } + + break; + } + + ask_save_changes.callback (); + }); + + dialog.show (); + yield; + + if (try_save) { + if (locked || this.is_file_temporary) { + can_close = yield save_as_with_hold (); + } else { + can_close = yield save_with_hold (); + } + } + + return can_close; + } + public async bool do_close (bool app_closing = false) { debug ("Closing \"%s\"", get_basename ()); if (closing) { @@ -519,58 +575,22 @@ namespace Scratch.Services { return true; } - bool ret_value = true; + bool can_close = true; // Prevent trying to save locked document to current location if (!locked && Scratch.settings.get_boolean ("autosave") && !saved) { - ret_value = yield save_with_hold (); + can_close = yield save_with_hold (); } else if (!locked && app_closing && is_file_temporary && !delete_temporary_file ()) { debug ("Save temporary file!"); - ret_value = yield save_with_hold (); + can_close = yield save_with_hold (); } else if (!this.saved || // Even locked documents can be modified (!app_closing && is_file_temporary && !delete_temporary_file ())) { // Ask whether to save changes - var parent_window = source_view.get_toplevel () as Gtk.Window; - var dialog = new Granite.MessageDialog ( - _("Save changes to ā€œ%sā€ before closing?").printf (this.get_basename ()), - _("If you don't save, changes will be permanently lost."), - new ThemedIcon ("dialog-warning"), - Gtk.ButtonsType.NONE - ); - dialog.transient_for = parent_window; + can_close = yield ask_save_changes (); - var no_save_button = (Gtk.Button) dialog.add_button (_("Close Without Saving"), Gtk.ResponseType.NO); - no_save_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); - - dialog.add_button (_("Cancel"), Gtk.ResponseType.CANCEL); - dialog.add_button (_("Save"), Gtk.ResponseType.YES); - dialog.set_default_response (Gtk.ResponseType.YES); - - int response = dialog.run (); - switch (response) { - case Gtk.ResponseType.CANCEL: - case Gtk.ResponseType.DELETE_EVENT: - ret_value = false; - break; - case Gtk.ResponseType.YES: - // Must save locked or temporary documents to a different location - if (locked || this.is_file_temporary) { - ret_value = yield save_as_with_hold (); - } else { - ret_value = yield save_with_hold (); - } - break; - case Gtk.ResponseType.NO: - ret_value = true; - if (this.is_file_temporary) { - delete_temporary_file (true); - } - break; - } - dialog.destroy (); } - if (ret_value) { + if (can_close) { // Delete backup copy file closing = true; // Stops recreating backup when trailing space stripped delete_backup (); @@ -578,7 +598,7 @@ namespace Scratch.Services { doc_closed (); } - return ret_value; + return can_close; } // Handle save action (only use for user interaction) @@ -723,12 +743,19 @@ namespace Scratch.Services { var current_file = file.dup (); var is_current_file_temporary = this.is_file_temporary; - if (file_chooser.run () == Gtk.ResponseType.ACCEPT) { - file = File.new_for_uri (file_chooser.get_uri ()); - // Update last visited path - Utils.last_path = Path.get_dirname (file_chooser.get_file ().get_uri ()); - success = true; - } + file_chooser.response.connect ((res) => { + if (res == Gtk.ResponseType.ACCEPT) { + file = File.new_for_uri (file_chooser.get_uri ()); + // Update last visited path + Utils.last_path = Path.get_dirname (file_chooser.get_file ().get_uri ()); + success = true; + } + + save_as.callback (); + }); + + file_chooser.show (); + yield; var is_saved = false; if (success) {