diff --git a/plugins/spell/spell.vala b/plugins/spell/spell.vala index 193e023ad..0fa5fb98d 100644 --- a/plugins/spell/spell.vala +++ b/plugins/spell/spell.vala @@ -129,7 +129,6 @@ public class Scratch.Plugins.Spell: Peas.ExtensionBase, Scratch.Services.Activat window = w; window.destroy.connect (save_settings); }); - } diff --git a/src/Dialogs/PreferencesDialog.vala b/src/Dialogs/PreferencesDialog.vala index 36a67a8d9..ee38c43a6 100644 --- a/src/Dialogs/PreferencesDialog.vala +++ b/src/Dialogs/PreferencesDialog.vala @@ -182,6 +182,8 @@ public class Scratch.Dialogs.Preferences : Granite.Dialog { realize.connect (() => { stack.set_visible_child_name ("behavior"); }); + + show_all (); } private class SettingSwitch : Gtk.Grid { 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..17e32bbca 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -957,7 +957,7 @@ namespace Scratch { preferences_dialog.destroy (); }); - preferences_dialog.present (); + preferences_dialog.show (); } private void action_close_window () { @@ -989,19 +989,22 @@ namespace Scratch { file_chooser.select_multiple = true; file_chooser.set_current_folder_uri (Utils.last_path ?? GLib.Environment.get_home_dir ()); - var response = file_chooser.run (); - file_chooser.destroy (); // Close now so it does not stay open during lengthy or failed loading - - if (response == Gtk.ResponseType.ACCEPT) { - foreach (string uri in file_chooser.get_uris ()) { - // Update last visited path - Utils.last_path = Path.get_dirname (uri); - // Open the file - var file = File.new_for_uri (uri); - var doc = new Scratch.Services.Document (actions, file); - open_document.begin (doc); + file_chooser.response.connect ((res) => { + var uris = file_chooser.get_uris (); + file_chooser.destroy (); // Close now so it does not stay open during lengthy or failed loading + if (res == Gtk.ResponseType.ACCEPT) { + foreach (string uri in file_chooser.get_uris ()) { + // Update last visited path + Utils.last_path = Path.get_dirname (uri); + // Open the file + var file = File.new_for_uri (uri); + var doc = new Scratch.Services.Document (actions, file); + open_document.begin (doc); + } } - } + }); + + file_chooser.show (); } private void action_open_in_new_window (SimpleAction action, Variant? param) { @@ -1031,14 +1034,18 @@ namespace Scratch { chooser.select_multiple = true; - if (chooser.run () == Gtk.ResponseType.ACCEPT) { - chooser.get_files ().foreach ((glib_file) => { - var foldermanager_file = new FolderManager.File (glib_file.get_path ()); - folder_manager_view.open_folder (foldermanager_file); - }); - } + chooser.response.connect ((res) => { + var files = chooser.get_files (); + chooser.destroy (); + if (res == Gtk.ResponseType.ACCEPT) { + files.foreach ((glib_file) => { + var foldermanager_file = new FolderManager.File (glib_file.get_path ()); + folder_manager_view.open_folder (foldermanager_file); + }); + } + }); - chooser.destroy (); + chooser.show (); } private void action_open_folder (SimpleAction action, Variant? param) { @@ -1051,6 +1058,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 +1069,65 @@ namespace Scratch { var default_remote = Scratch.settings.get_string ("default-remote"); var clone_dialog = new Dialogs.CloneRepositoryDialog (default_projects_folder, default_remote); + + var cloning_done = 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; + cloning_done = (res != Gtk.ResponseType.APPLY || !clone_dialog.can_clone); + clone_repo.callback (); + }); + + while (!cloning_done) { + clone_dialog.show (); + yield; + + if (!cloning_done) { + 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 (); + cloning_done = 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) => { + cloning_done = res != 1; + message_dialog.destroy (); + clone_repo.callback (); + }); + message_dialog.show (); + yield; + } } - }); + } - clone_dialog.present (); + clone_dialog.destroy (); } private void action_collapse_all_folders () { @@ -1155,13 +1168,18 @@ namespace Scratch { private void action_revert () { var confirmation_dialog = new Scratch.Dialogs.RestoreConfirmationDialog (this); - if (confirmation_dialog.run () == Gtk.ResponseType.ACCEPT) { - var doc = get_current_document (); - if (doc != null) { - doc.revert (); + confirmation_dialog.response.connect ((res) => { + if (res == Gtk.ResponseType.ACCEPT) { + var doc = get_current_document (); + if (doc != null) { + doc.revert (); + } } - } - confirmation_dialog.destroy (); + + confirmation_dialog.destroy (); + }); + + confirmation_dialog.show (); } private void action_duplicate () { diff --git a/src/Services/Document.vala b/src/Services/Document.vala index 70afef93f..a10e954d2 100644 --- a/src/Services/Document.vala +++ b/src/Services/Document.vala @@ -530,55 +530,73 @@ namespace Scratch.Services { (!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; + if (yield ask_save_changes ()) { + if (locked || this.is_file_temporary) { + ret_value = yield save_as_with_hold (); + } else { + ret_value = yield save_with_hold (); + } + } else { + ret_value = false; + } + } + + if (ret_value) { + // Delete backup copy file + closing = true; // Stops recreating backup when trailing space stripped + delete_backup (); + notify["tab.loading"].disconnect (on_tab_loading_change); + doc_closed (); + } + + return ret_value; + } + + 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); + 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); + 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) { + var dialog_response = false; + dialog.response.connect ((res) => { + dialog.destroy (); + switch (res) { 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 (); - } + dialog_response = true; break; case Gtk.ResponseType.NO: - ret_value = true; if (this.is_file_temporary) { delete_temporary_file (true); } + + dialog_response = true; break; } - dialog.destroy (); - } - if (ret_value) { - // Delete backup copy file - closing = true; // Stops recreating backup when trailing space stripped - delete_backup (); - notify["tab.loading"].disconnect (on_tab_loading_change); - doc_closed (); - } + ask_save_changes.callback (); + }); - return ret_value; + dialog.show (); + yield; + + return dialog_response; } // Handle save action (only use for user interaction) @@ -723,13 +741,20 @@ 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; + warning ("dialog success path %s", Utils.last_path); + } + + save_as.callback (); + }); + file_chooser.show (); + yield; var is_saved = false; if (success) { // Should not set "modified" state of the buffer to true - this is automatic @@ -751,7 +776,7 @@ namespace Scratch.Services { // Calling function responsible for restoring original } - /* We delay destruction of file chooser dialog til to avoid the document focussing in, + /* We delay destruction of file chooser dialog til now to avoid the document focussing in, * which triggers premature loading of overwritten content. */ file_chooser.destroy ();