From 1446cecd704cdc4f1558363a98a3c37a0a92c676 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Tue, 27 May 2025 11:31:09 +0100 Subject: [PATCH 1/6] Save terminal-pane state explicitly - destroy signal unsuitable --- src/MainWindow.vala | 2 ++ src/Widgets/Terminal.vala | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 924c4b184c..1c3b73e336 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -860,6 +860,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 diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index 2219769a5a..3f61b2d586 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -89,10 +89,6 @@ public class Code.Terminal : Gtk.Box { add (scrolled_window); - destroy.connect (() => { - settings.set_string ("last-opened-path", get_shell_location ()); - }); - show_all (); } @@ -196,6 +192,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); } From 3737cda779308a9e8c02599686d1862ebe5cf7a2 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Tue, 27 May 2025 13:06:11 +0100 Subject: [PATCH 2/6] Use common action to set active project --- src/FolderManager/FileView.vala | 19 +++++++++++++------ src/MainWindow.vala | 24 +++++++++++++++--------- src/Widgets/ChooseProjectButton.vala | 12 ++++++++++-- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/FolderManager/FileView.vala b/src/FolderManager/FileView.vala index 61ea037892..93c2b74f2c 100644 --- a/src/FolderManager/FileView.vala +++ b/src/FolderManager/FileView.vala @@ -115,16 +115,16 @@ 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_active_project (path); } private void action_set_active_project (SimpleAction action, GLib.Variant? parameter) { @@ -138,7 +138,14 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane return; } - git_manager.active_project_path = path; + set_active_project (path); + } + + private void set_active_project (string path) { + toplevel_action_group.activate_action ( + MainWindow.ACTION_SET_ACTIVE_PROJECT, + new Variant.string (path) + ); write_settings (); } diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 1c3b73e336..085c622de8 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -108,6 +108,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"; @@ -165,6 +166,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 }, @@ -629,14 +631,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); } @@ -1371,7 +1365,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); } @@ -1383,6 +1377,18 @@ namespace Scratch { terminal.terminal.grab_focus (); } + private void action_set_active_project (SimpleAction action, Variant? param) { + var project_path = param.get_string (); + git_manager.active_project_path = project_path; + folder_manager_view.collapse_other_projects (); + + 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 90fba92596..3824d7a578 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 @@ -114,8 +120,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 (() => { From 68eb0fbd21b253a0e557704a7ca02c5e1099feba Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Thu, 29 May 2025 10:01:22 +0100 Subject: [PATCH 3/6] Disambiguate action name --- src/FolderManager/FileView.vala | 12 ++++++------ src/FolderManager/ProjectFolderItem.vala | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/FolderManager/FileView.vala b/src/FolderManager/FileView.vala index 93c2b74f2c..0a6652b144 100644 --- a/src/FolderManager/FileView.vala +++ b/src/FolderManager/FileView.vala @@ -36,7 +36,7 @@ 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"; + public const string ACTION_SET_PROJECT_ACTIVE = "set-project-active"; private const ActionEntry[] ACTION_ENTRIES = { { ACTION_LAUNCH_APP_WITH_FILE_PATH, action_launch_app_with_file_path, "as" }, @@ -49,7 +49,7 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane { 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_SET_PROJECT_ACTIVE, action_set_project_active, "s"} }; private GLib.Settings settings; @@ -124,10 +124,10 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane } } //Make remaining project the active one - set_active_project (path); + set_project_active (path); } - private void action_set_active_project (SimpleAction action, GLib.Variant? parameter) { + private void action_set_project_active (SimpleAction action, GLib.Variant? parameter) { var path = parameter.get_string (); if (path == null || path == "") { return; @@ -138,10 +138,10 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane return; } - set_active_project (path); + set_project_active (path); } - private void set_active_project (string path) { + private void set_project_active (string path) { toplevel_action_group.activate_action ( MainWindow.ACTION_SET_ACTIVE_PROJECT, new Variant.string (path) diff --git a/src/FolderManager/ProjectFolderItem.vala b/src/FolderManager/ProjectFolderItem.vala index c53be4d553..c64823f779 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, + FileView.ACTION_PREFIX + FileView.ACTION_SET_PROJECT_ACTIVE, new Variant.string (file.path) ) ); From 6d25e42f8410a2def0e46b7ce75be4d838456976 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Sat, 28 Jun 2025 15:34:59 +0100 Subject: [PATCH 4/6] Match self in get_project_for_file --- src/FolderManager/FileView.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FolderManager/FileView.vala b/src/FolderManager/FileView.vala index 26c49d435f..46f8934a45 100644 --- a/src/FolderManager/FileView.vala +++ b/src/FolderManager/FileView.vala @@ -258,7 +258,7 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane 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; } } From 20b82badeb0fa4ff13c02c43450778c80266638d Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Sat, 28 Jun 2025 15:36:08 +0100 Subject: [PATCH 5/6] Lose FileView.ACTION_SET_PROJECT_ACTIVE call MainWindow action directly --- src/FolderManager/FileView.vala | 30 +++++++----------------- src/FolderManager/FolderItem.vala | 1 - src/FolderManager/ProjectFolderItem.vala | 2 +- src/MainWindow.vala | 10 ++++++-- 4 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/FolderManager/FileView.vala b/src/FolderManager/FileView.vala index 46f8934a45..9161ebd81d 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_PROJECT_ACTIVE = "set-project-active"; 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_PROJECT_ACTIVE, action_set_project_active, "s"} + { ACTION_CLOSE_OTHER_FOLDERS, action_close_other_folders, "s"} }; private GLib.Settings settings; @@ -127,27 +125,11 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane set_project_active (path); } - private void action_set_project_active (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; - } - - set_project_active (path); - } - private void set_project_active (string path) { toplevel_action_group.activate_action ( MainWindow.ACTION_SET_ACTIVE_PROJECT, new Variant.string (path) ); - - write_settings (); } public async void restore_saved_state () { @@ -254,6 +236,10 @@ 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) { @@ -588,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; }); @@ -606,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 3f55c77c26..730a0df076 100644 --- a/src/FolderManager/FolderItem.vala +++ b/src/FolderManager/FolderItem.vala @@ -61,7 +61,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 c64823f779..76ea841609 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_PROJECT_ACTIVE, + MainWindow.ACTION_PREFIX + MainWindow.ACTION_SET_ACTIVE_PROJECT, new Variant.string (file.path) ) ); diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 7ae85fe3cf..7ac70db621 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -1452,8 +1452,14 @@ namespace Scratch { private void action_set_active_project (SimpleAction action, Variant? param) { var project_path = param.get_string (); - git_manager.active_project_path = project_path; - folder_manager_view.collapse_other_projects (); + 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); From 367b67205a61dfe564c4f25a4db9844e62dbe6ca Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Wed, 5 Nov 2025 15:20:06 +0000 Subject: [PATCH 6/6] Revert renaming function --- src/FolderManager/FileView.vala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FolderManager/FileView.vala b/src/FolderManager/FileView.vala index 9161ebd81d..c662bbf3a5 100644 --- a/src/FolderManager/FileView.vala +++ b/src/FolderManager/FileView.vala @@ -574,10 +574,10 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane } } Scratch.Services.GitManager.get_instance ().remove_project (folder_root); - save_opened_folders (); + write_settings (); }); - save_opened_folders (); + write_settings (); add_folder.callback (); return Source.REMOVE; }); @@ -592,7 +592,7 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane return false; } - private void save_opened_folders () { + private void write_settings () { string[] to_save = {}; foreach (var main_folder in root.children) {