Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/FolderManager/FileView.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}
Expand Down Expand Up @@ -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) {
Expand Down
6 changes: 4 additions & 2 deletions src/FolderManager/ProjectFolderItem.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
107 changes: 57 additions & 50 deletions src/MainWindow.vala
Original file line number Diff line number Diff line change
Expand Up @@ -1051,70 +1051,77 @@ 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);
}

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 () {
Expand Down
123 changes: 75 additions & 48 deletions src/Services/Document.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -519,66 +575,30 @@ 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 ();
notify["tab.loading"].disconnect (on_tab_loading_change);
doc_closed ();
}

return ret_value;
return can_close;
}

// Handle save action (only use for user interaction)
Expand Down Expand Up @@ -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) {
Expand Down
Loading