@@ -87,10 +87,22 @@ public class Code.ChooseProjectButton : Gtk.MenuButton {
8787
8888 popover = project_popover;
8989
90- project_listbox.bind_model (
91- Scratch .Services .GitManager .get_instance ().project_liststore,
92- create_project_row
93- );
90+ var model = Scratch.Services.GitManager.get_instance ().project_liststore;
91+
92+ model.items_changed.connect ((pos , n_removed , n_added ) => {
93+ // This model is put in sort order by the GitManager so model pos the same as listbox index
94+ var project_folder = (Scratch . FolderManager . ProjectFolderItem )(model. get_item (pos));
95+ if (n_added > 0 ) {
96+ var row = create_project_row (project_folder);
97+ project_listbox. insert (row, (int )pos);
98+ } else {
99+ // Double check we are removing correct row (do not rely on pos)
100+ var row = find_row_for_path (project_folder. file. file. get_path ());
101+ if (row != null ) {
102+ project_listbox. remove (row);
103+ }
104+ }
105+ });
94106
95107 project_listbox.remove.connect ((row ) => {
96108 var project_row = row as ProjectRow ;
@@ -109,9 +121,7 @@ public class Code.ChooseProjectButton : Gtk.MenuButton {
109121 });
110122 }
111123
112- private Gtk . Widget create_project_row (GLib . Object object ) {
113- unowned var project_folder = (Scratch . FolderManager . ProjectFolderItem ) object ;
114-
124+ private Gtk . Widget create_project_row (Scratch . FolderManager . ProjectFolderItem project_folder) {
115125 var project_row = new ProjectRow (project_folder. file. file. get_path ());
116126 project_folder. bind_property (" name" , project_row. project_radio, " label" , BindingFlags . DEFAULT | BindingFlags . SYNC_CREATE ,
117127 (binding, srcval, ref targetval) = > {
@@ -132,6 +142,19 @@ public class Code.ChooseProjectButton : Gtk.MenuButton {
132142 return project_row;
133143 }
134144
145+ private ProjectRow ? find_row_for_path (string project_path) {
146+ foreach (var child in project_listbox. get_children ()) {
147+ if (child is ProjectRow ) {
148+ var row = (ProjectRow )child;
149+ if (row. project_path == project_path) {
150+ return row;
151+ }
152+ }
153+ }
154+
155+ return null ;
156+ }
157+
135158 private void select_project (ProjectRow project_entry) {
136159 project_listbox. select_row (project_entry);
137160 label_widget. label = project_entry. project_name;
0 commit comments