From e1415608c3c53d164bcd8b36c8152fadc9c931dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Mon, 27 Jul 2026 17:39:38 -0700 Subject: [PATCH 1/3] AccountItemModel: replace map with list --- src/FolderList/AccountItemModel.vala | 49 ++++++++++++++++------------ 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/FolderList/AccountItemModel.vala b/src/FolderList/AccountItemModel.vala index 9c5610408..cebcf866a 100644 --- a/src/FolderList/AccountItemModel.vala +++ b/src/FolderList/AccountItemModel.vala @@ -26,8 +26,9 @@ public class Mail.AccountItemModel : Mail.SourceList.ExpandableItem, Mail.Source public signal void loaded (); public signal void start_edit (Mail.SourceList.Item item); + public ListStore? folder_list { get; protected set; default = null; } + private GLib.Cancellable connect_cancellable; - private Gee.HashMap folder_items; private AccountSavedState saved_state; private unowned Camel.OfflineStore offlinestore; @@ -38,12 +39,14 @@ public class Mail.AccountItemModel : Mail.SourceList.ExpandableItem, Mail.Source construct { visible = true; connect_cancellable = new GLib.Cancellable (); - folder_items = new Gee.HashMap (); saved_state = new AccountSavedState (account); saved_state.bind_with_expandable_item (this); offlinestore = (Camel.OfflineStore) account.service; + name = offlinestore.display_name; + folder_list = new ListStore (typeof (FolderItemModel)); + offlinestore.folder_created.connect (folder_created); offlinestore.folder_deleted.connect (folder_deleted); offlinestore.folder_info_stale.connect (reload_folders); @@ -66,40 +69,44 @@ public class Mail.AccountItemModel : Mail.SourceList.ExpandableItem, Mail.Source } private void folder_renamed (string old_name, Camel.FolderInfo folder_info) { - FolderItemModel item; - folder_items.unset (old_name, out item); - item.update_infos (folder_info); - folder_items[item.full_name] = item; + //FIXME: find by old name? + // item.update_infos (folder_info); } private void folder_deleted (Camel.FolderInfo folder_info) { - Mail.FolderItemModel? item = folder_items[folder_info.full_name]; - if (item != null) { + uint pos = -1; + if (folder_list.find (new FolderItemModel (account, folder_info), out pos)) { + var item = (FolderItemModel) folder_list.get_item (pos); item.parent.remove (item); - folder_items.unset (folder_info.full_name); + + folder_list.remove (pos); } } private void folder_created (Camel.FolderInfo folder_info) { if (folder_info.parent == null) { show_info (folder_info, this); - } else { - unowned Camel.FolderInfo parent_info = (Camel.FolderInfo) folder_info.parent; - var parent_item = folder_items[parent_info.full_name]; - if (parent_item == null) { - // Create the parent, then retry to create the children. - folder_created (parent_info); - folder_created (folder_info); - } else { - show_info (folder_info, parent_item); - } + return; + } + + uint pos = -1; + unowned var parent_info = (Camel.FolderInfo) folder_info.parent; + if (folder_list.find (new FolderItemModel (account, parent_info), out pos)) { + var parent_item = (FolderItemModel) folder_list.get_item (pos); + show_info (folder_info, parent_item); + return; } + + // Create the parent, then retry to create the children. + folder_created (parent_info); + folder_created (folder_info); } private async void reload_folders () { var offlinestore = (Camel.OfflineStore) account.service; - foreach (var folder_item in folder_items.values) { + for (int i = 0; i < folder_list.n_items; i++) { try { + var folder_item = (FolderItemModel) folder_list.get_item (i); var folder_info = yield offlinestore.get_folder_info (folder_item.full_name, 0, GLib.Priority.DEFAULT, connect_cancellable); folder_item.update_infos (folder_info); } catch (Error e) { @@ -115,8 +122,8 @@ public class Mail.AccountItemModel : Mail.SourceList.ExpandableItem, Mail.Source var folderinfo = _folderinfo; while (folderinfo != null) { var folder_item = new FolderItemModel (account, folderinfo); + folder_list.append (folder_item); saved_state.bind_with_expandable_item (folder_item); - folder_items[folderinfo.full_name] = folder_item; folder_item.start_edit.connect (() => start_edit (folder_item)); if (folderinfo.child != null) { From 0ec0166c32f5ddee308d731e8aa12b82de8f752b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Tue, 28 Jul 2026 10:01:01 -0700 Subject: [PATCH 2/3] Find old name --- src/FolderList/AccountItemModel.vala | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/FolderList/AccountItemModel.vala b/src/FolderList/AccountItemModel.vala index fcee91589..8799107e0 100644 --- a/src/FolderList/AccountItemModel.vala +++ b/src/FolderList/AccountItemModel.vala @@ -69,8 +69,13 @@ public class Mail.AccountItemModel : Mail.SourceList.ExpandableItem, Mail.Source } private void folder_renamed (string old_name, Camel.FolderInfo folder_info) { - //FIXME: find by old name? - // item.folder_info = folder_info; + for (int i = 0; i < folder_list.n_items; i++) { + var folder_item = (FolderItemModel) folder_list.get_item (i); + if (folder_item.folder_info.full_name == old_name) { + folder_item.folder_info = folder_info; + return; + } + } } private void folder_deleted (Camel.FolderInfo folder_info) { From 854956e8d9766316e2d942ff8102823c325287aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Tue, 28 Jul 2026 10:01:50 -0700 Subject: [PATCH 3/3] make private for now --- src/FolderList/AccountItemModel.vala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/FolderList/AccountItemModel.vala b/src/FolderList/AccountItemModel.vala index 8799107e0..9aedd4f52 100644 --- a/src/FolderList/AccountItemModel.vala +++ b/src/FolderList/AccountItemModel.vala @@ -26,10 +26,9 @@ public class Mail.AccountItemModel : Mail.SourceList.ExpandableItem, Mail.Source public signal void loaded (); public signal void start_edit (Mail.SourceList.Item item); - public ListStore? folder_list { get; protected set; default = null; } - private GLib.Cancellable connect_cancellable; private AccountSavedState saved_state; + private ListStore? folder_list; private unowned Camel.OfflineStore offlinestore; public AccountItemModel (Mail.Backend.Account account) {