diff --git a/src/FolderManager/FileView.vala b/src/FolderManager/FileView.vala index 2bb5035b3..9161ebd81 100644 --- a/src/FolderManager/FileView.vala +++ b/src/FolderManager/FileView.vala @@ -36,7 +36,6 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane public const string ACTION_CHECKOUT_REMOTE_BRANCH = "checkout-remote-branch"; public const string ACTION_CLOSE_FOLDER = "close-folder"; public const string ACTION_CLOSE_OTHER_FOLDERS = "close-other-folders"; - public const string ACTION_SET_ACTIVE_PROJECT = "set-active-project"; private const ActionEntry[] ACTION_ENTRIES = { { ACTION_LAUNCH_APP_WITH_FILE_PATH, action_launch_app_with_file_path, "as" }, @@ -48,8 +47,7 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane { ACTION_NEW_FILE, add_new_file, "s" }, { ACTION_NEW_FOLDER, add_new_folder, "s"}, { ACTION_CLOSE_FOLDER, action_close_folder, "s"}, - { ACTION_CLOSE_OTHER_FOLDERS, action_close_other_folders, "s"}, - { ACTION_SET_ACTIVE_PROJECT, action_set_active_project, "s"} + { ACTION_CLOSE_OTHER_FOLDERS, action_close_other_folders, "s"} }; private GLib.Settings settings; @@ -115,32 +113,23 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane foreach (var child in root.children) { var project_folder_item = (ProjectFolderItem) child; if (project_folder_item != folder_root) { - toplevel_action_group.activate_action (MainWindow.ACTION_CLOSE_PROJECT_DOCS, new Variant.string (project_folder_item.path)); + toplevel_action_group.activate_action ( + MainWindow.ACTION_CLOSE_PROJECT_DOCS, + new Variant.string (project_folder_item.path) + ); root.remove (project_folder_item); git_manager.remove_project (project_folder_item); } } - //Make remaining project the active one - git_manager.active_project_path = path; - - write_settings (); + set_project_active (path); } - private void action_set_active_project (SimpleAction action, GLib.Variant? parameter) { - var path = parameter.get_string (); - if (path == null || path == "") { - return; - } - - var folder_root = find_path (root, path) as ProjectFolderItem; - if (folder_root == null) { - return; - } - - git_manager.active_project_path = path; - - write_settings (); + private void set_project_active (string path) { + toplevel_action_group.activate_action ( + MainWindow.ACTION_SET_ACTIVE_PROJECT, + new Variant.string (path) + ); } public async void restore_saved_state () { @@ -247,11 +236,15 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane return null; } + public bool project_is_open (string project_path) { + return get_project_for_file (GLib.File.new_for_path (project_path)) != null; + } + public ProjectFolderItem? get_project_for_file (GLib.File file) { foreach (var item in root.children) { if (item is ProjectFolderItem) { var folder = (ProjectFolderItem)item; - if (folder.contains_file (file)) { + if (folder.file.file.equal (file) || folder.contains_file (file)) { return folder; } } @@ -581,10 +574,10 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane } } Scratch.Services.GitManager.get_instance ().remove_project (folder_root); - write_settings (); + save_opened_folders (); }); - write_settings (); + save_opened_folders (); add_folder.callback (); return Source.REMOVE; }); @@ -599,7 +592,7 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane return false; } - private void write_settings () { + private void save_opened_folders () { string[] to_save = {}; foreach (var main_folder in root.children) { diff --git a/src/FolderManager/FolderItem.vala b/src/FolderManager/FolderItem.vala index 1fb9c2069..817da2c38 100644 --- a/src/FolderManager/FolderItem.vala +++ b/src/FolderManager/FolderItem.vala @@ -62,7 +62,6 @@ namespace Scratch.FolderManager { } } - public void load_children () { if (loading_required) { foreach (var child in file.children) { diff --git a/src/FolderManager/ProjectFolderItem.vala b/src/FolderManager/ProjectFolderItem.vala index 460504362..1436f790a 100644 --- a/src/FolderManager/ProjectFolderItem.vala +++ b/src/FolderManager/ProjectFolderItem.vala @@ -146,7 +146,7 @@ namespace Scratch.FolderManager { set_active_folder_item = new GLib.MenuItem ( _("Set as Active Project"), GLib.Action.print_detailed_name ( - FileView.ACTION_PREFIX + FileView.ACTION_SET_ACTIVE_PROJECT, + MainWindow.ACTION_PREFIX + MainWindow.ACTION_SET_ACTIVE_PROJECT, new Variant.string (file.path) ) ); diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 10e02af36..7ac70db62 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -109,6 +109,7 @@ namespace Scratch { public const string ACTION_TOGGLE_OUTLINE = "action-toggle-outline"; public const string ACTION_TOGGLE_TERMINAL = "action-toggle-terminal"; public const string ACTION_OPEN_IN_TERMINAL = "action-open-in-terminal"; + public const string ACTION_SET_ACTIVE_PROJECT = "action-set-active-project"; public const string ACTION_NEXT_TAB = "action-next-tab"; public const string ACTION_PREVIOUS_TAB = "action-previous-tab"; public const string ACTION_CLEAR_LINES = "action-clear-lines"; @@ -167,6 +168,7 @@ namespace Scratch { { ACTION_TOGGLE_SIDEBAR, action_toggle_sidebar, null, "true" }, { ACTION_TOGGLE_TERMINAL, action_toggle_terminal, null, "false"}, { ACTION_OPEN_IN_TERMINAL, action_open_in_terminal, "s"}, + { ACTION_SET_ACTIVE_PROJECT, action_set_active_project, "s"}, { ACTION_TOGGLE_OUTLINE, action_toggle_outline, null, "false" }, { ACTION_NEXT_TAB, action_next_tab }, { ACTION_PREVIOUS_TAB, action_previous_tab }, @@ -631,14 +633,6 @@ namespace Scratch { } }); - sidebar.choose_project_button.project_chosen.connect (() => { - folder_manager_view.collapse_other_projects (); - if (terminal.visible) { - var open_in_terminal_action = Utils.action_from_group (ACTION_OPEN_IN_TERMINAL, actions); - var param = new Variant.string (Services.GitManager.get_instance ().get_default_build_dir (null)); - open_in_terminal_action.activate (param); - } - }); set_widgets_sensitive (false); } @@ -863,6 +857,8 @@ namespace Scratch { // Plugin panes size Scratch.saved_state.set_int ("hp1-size", hp1.get_position ()); Scratch.saved_state.set_int ("vp-size", vp.get_position ()); + + terminal.save_settings (); } // SIGTERM/SIGINT Handling @@ -1442,7 +1438,7 @@ namespace Scratch { private void action_open_in_terminal (SimpleAction action, Variant? param) { // Ensure terminal is visible - if (terminal == null || !terminal.visible) { + if (!terminal.visible) { var toggle_terminal_action = Utils.action_from_group (ACTION_TOGGLE_TERMINAL, actions); toggle_terminal_action.activate (null); } @@ -1454,6 +1450,24 @@ namespace Scratch { terminal.terminal.grab_focus (); } + private void action_set_active_project (SimpleAction action, Variant? param) { + var project_path = param.get_string (); + if (folder_manager_view.project_is_open (project_path)) { + git_manager.active_project_path = project_path; + folder_manager_view.collapse_other_projects (); + //The opened folders are not changed so no need to update "opened-folders" setting + } else { + warning ("Attempt to set folder path %s which is not opened as active project ignored", project_path); + //TODO Handle this by opening the folder + } + + var new_build_dir = Services.GitManager.get_instance ().get_default_build_dir (null); + terminal.change_location (new_build_dir); + if (terminal.visible) { + terminal.terminal.grab_focus (); + } + } + private void action_toggle_outline (SimpleAction action) { action.set_state (!action.get_state ().get_boolean ()); document_view.outline_visible = action.get_state ().get_boolean (); diff --git a/src/Widgets/ChooseProjectButton.vala b/src/Widgets/ChooseProjectButton.vala index 3b035c5b2..c70e3837c 100644 --- a/src/Widgets/ChooseProjectButton.vala +++ b/src/Widgets/ChooseProjectButton.vala @@ -22,9 +22,15 @@ public class Code.ChooseProjectButton : Gtk.MenuButton { private Gtk.Label label_widget; private Gtk.ListBox project_listbox; + public ActionGroup toplevel_action_group { get; construct; } public signal void project_chosen (); construct { + realize.connect (() => { + toplevel_action_group = get_action_group (Scratch.MainWindow.ACTION_GROUP); + assert_nonnull (toplevel_action_group); + }); + var img = new Gtk.Image () { gicon = new ThemedIcon ("git-symbolic"), icon_size = Gtk.IconSize.SMALL_TOOLBAR @@ -128,8 +134,10 @@ public class Code.ChooseProjectButton : Gtk.MenuButton { project_listbox.row_activated.connect ((row) => { var project_entry = ((ProjectRow) row); - git_manager.active_project_path = project_entry.project_path; - project_chosen (); + toplevel_action_group.activate_action ( + Scratch.MainWindow.ACTION_SET_ACTIVE_PROJECT, + new Variant.string (project_entry.project_path) + ); }); toggled.connect (() => { diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index 1a2202eb2..640d8403a 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -97,10 +97,6 @@ public class Code.Terminal : Gtk.Box { add (scrolled_window); - destroy.connect (() => { - settings.set_string ("last-opened-path", get_shell_location ()); - }); - show_all (); } @@ -204,6 +200,10 @@ public class Code.Terminal : Gtk.Box { this.terminal.set_colors (foreground_color, background_color, palette); } + public void save_settings () { + Scratch.saved_state.set_string ("last-opened-path", get_shell_location ()); + } + public void increment_size () { terminal.font_scale = (terminal.font_scale + 0.1).clamp (MIN_SCALE, MAX_SCALE); }