diff --git a/src/client/folder-list/folder-list-account-branch.vala b/src/client/folder-list/folder-list-account-branch.vala index 465e9a50..877fb852 100644 --- a/src/client/folder-list/folder-list-account-branch.vala +++ b/src/client/folder-list/folder-list-account-branch.vala @@ -20,14 +20,14 @@ public class FolderList.AccountBranch : Sidebar.Branch { account.information.notify["nickname"].connect(on_nicknamed_changed); - graft(get_root(), user_folder_group); - entry_removed.connect(on_entry_removed); + entry_moved.connect(check_user_folders); } ~AccountBranch() { account.information.notify["nickname"].disconnect(on_nicknamed_changed); entry_removed.disconnect(on_entry_removed); + entry_moved.disconnect(check_user_folders); } private void on_nicknamed_changed() { @@ -87,6 +87,10 @@ public class FolderList.AccountBranch : Sidebar.Branch { } else if (folder.path.get_parent() == null) { // Top-level folders get put in our special user folders group. graft_point = user_folder_group; + + if (!has_entry(user_folder_group)) { + graft(get_root(), user_folder_group); + } } else { Sidebar.Entry? entry = folder_entries.get(folder.path.get_parent()); if (entry != null) @@ -129,5 +133,16 @@ public class FolderList.AccountBranch : Sidebar.Branch { FolderEntry? folder_entry = entry as FolderEntry; if (folder_entry != null && folder_entries.has_key(folder_entry.folder.path)) folder_entries.unset(folder_entry.folder.path); + + check_user_folders(entry); + } + + private void check_user_folders(Sidebar.Entry entry) { + if (entry != user_folder_group) { + // remove "Labels" entry if there are no more user entries + if (has_entry(user_folder_group) && (get_child_count(user_folder_group) == 0)) { + prune(user_folder_group); + } + } } } diff --git a/src/client/sidebar/sidebar-tree.vala b/src/client/sidebar/sidebar-tree.vala index 7136f2fe..e5c5ac73 100644 --- a/src/client/sidebar/sidebar-tree.vala +++ b/src/client/sidebar/sidebar-tree.vala @@ -641,10 +641,10 @@ public class Sidebar.Tree : Gtk.TreeView { private void on_branch_entry_removed(Sidebar.Branch branch, Sidebar.Entry entry) { EntryWrapper? wrapper = get_wrapper(entry); - assert(wrapper != null); - assert(!(wrapper is RootWrapper)); - - disassociate_wrapper_and_signal(wrapper, false); + if (wrapper != null) { + assert(!(wrapper is RootWrapper)); + disassociate_wrapper_and_signal(wrapper, false); + } } private void on_branch_entry_moved(Sidebar.Branch branch, Sidebar.Entry entry) { diff --git a/src/engine/api/geary-account-information.vala b/src/engine/api/geary-account-information.vala index c2a34b3e..0b0ce5e4 100644 --- a/src/engine/api/geary-account-information.vala +++ b/src/engine/api/geary-account-information.vala @@ -466,8 +466,8 @@ public class Geary.AccountInformation : BaseObject { /** * Sets the path Geary will look for or create a special folder. This is * only obeyed if the server doesn't tell Geary which folders are special. - * Only the DRAFTS, SENT, SPAM, and TRASH special folder types are valid to - * pass to this function. + * Only the DRAFTS, SENT, SPAM, TRASH and ARCHIVE special folder types are + * valid to pass to this function. */ public void set_special_folder_path(Geary.SpecialFolderType special, Geary.FolderPath? path) { switch (special) {