11/* -
2- * Copyright (c) 2017 - 2022 elementary LLC. (https://elementary.io),
2+ * Copyright (c) 2017 - 2024 elementary LLC. (https://elementary.io),
33 * 2013 Julien Spautz <spautz.julien@gmail.com>
44 *
55 * This program is free software: you can redistribute it and/or modify
@@ -126,9 +126,9 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane
126126 write_settings ();
127127 }
128128
129- public void restore_saved_state () {
129+ public async void restore_saved_state () {
130130 foreach (unowned string path in settings. get_strv (" opened-folders" )) {
131- add_folder (new File (path), false );
131+ yield add_folder (new File (path), false );
132132 }
133133 }
134134
@@ -505,7 +505,7 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane
505505 }
506506 }
507507
508- private void add_folder (File folder , bool expand ) {
508+ private async void add_folder (File folder , bool expand ) {
509509 if (is_open (folder)) {
510510 warning (" Folder '%s ' is already open." , folder. path);
511511 return ;
@@ -514,25 +514,80 @@ public class Scratch.FolderManager.FileView : Code.Widgets.SourceList, Code.Pane
514514 return ;
515515 }
516516
517- var folder_root = new ProjectFolderItem (folder, this ); // Constructor adds project to GitManager
518- this . root. add (folder_root);
519- rename_items_with_same_name (folder_root);
517+ var add_file = folder. file;
518+ // Need to deal with case where folder is parent or child of an existing project
519+ var parents = new List<ProjectFolderItem > ();
520+ var children = new List<ProjectFolderItem > ();
520521
521- folder_root. expanded = expand;
522- folder_root. closed. connect (() = > {
523- toplevel_action_group. activate_action (MainWindow . ACTION_CLOSE_PROJECT_DOCS , new Variant .string (folder_root. path));
524- root. remove (folder_root);
525- foreach (var child in root. children) {
526- var child_folder = (ProjectFolderItem ) child;
527- if (child_folder. name != child_folder. file. name) {
528- rename_items_with_same_name (child_folder);
522+ foreach (var child in root. children) {
523+ var item = (ProjectFolderItem ) child;
524+ if (add_file. get_relative_path (item. file. file) != null ) {
525+ debug (" Trying to add parent of existing project" );
526+ children. append (item);
527+ } else if (item. file. file. get_relative_path (add_file) != null ) {
528+ debug (" Trying to add child of existing project" );
529+ parents. append (item);
530+ }
531+ }
532+
533+ if (parents. length () > 0 || children. length () > 0 ) {
534+ assert (parents. length () <= 1 );
535+ assert (parents. length () == 0 || children. length () == 0 );
536+ var dialog = new Scratch .Dialogs .CloseProjectsConfirmationDialog (
537+ (MainWindow ) get_toplevel (),
538+ parents. length (),
539+ children. length ()
540+ );
541+
542+ var close_projects = false ;
543+ dialog. response. connect ((res) = > {
544+ dialog. destroy ();
545+ if (res == Gtk . ResponseType . ACCEPT ) {
546+ close_projects = true ;
547+ }
548+ });
549+
550+ dialog. run ();
551+
552+ if (close_projects) {
553+ foreach (var item in parents) {
554+ item. closed ();
555+ }
556+
557+ foreach (var item in children) {
558+ item. closed ();
529559 }
560+ } else {
561+ return ;
530562 }
531- Scratch . Services . GitManager . get_instance (). remove_project (folder_root);
563+ }
564+
565+ // Process any closed signals emitted before proceeding
566+ Idle . add (() = > {
567+ var folder_root = new ProjectFolderItem (folder, this ); // Constructor adds project to GitManager
568+ this . root. add (folder_root);
569+ rename_items_with_same_name (folder_root);
570+
571+ folder_root. expanded = expand;
572+ folder_root. closed. connect (() = > {
573+ toplevel_action_group. activate_action (MainWindow . ACTION_CLOSE_PROJECT_DOCS , new Variant .string (folder_root. path));
574+ root. remove (folder_root);
575+ foreach (var child in root. children) {
576+ var child_folder = (ProjectFolderItem ) child;
577+ if (child_folder. name != child_folder. file. name) {
578+ rename_items_with_same_name (child_folder);
579+ }
580+ }
581+ Scratch . Services . GitManager . get_instance (). remove_project (folder_root);
582+ write_settings ();
583+ });
584+
532585 write_settings ();
586+ add_folder. callback ();
587+ return Source . REMOVE ;
533588 });
534589
535- write_settings () ;
590+ yield ;
536591 }
537592
538593 private bool is_open (File folder ) {
0 commit comments