@ -865,7 +865,7 @@ impl Account {
}
}
match op {
match op {
FolderOperation ::Create ( path ) = > {
FolderOperation ::Create ( path ) = > {
let mut folder = self
let ( folder_hash , mut folder s) = self
. backend
. backend
. write ( )
. write ( )
. unwrap ( )
. unwrap ( )
@ -873,40 +873,51 @@ impl Account {
self . sender
self . sender
. send ( ThreadEvent ::UIEvent ( UIEvent ::MailboxCreate ( (
. send ( ThreadEvent ::UIEvent ( UIEvent ::MailboxCreate ( (
self . index ,
self . index ,
folder . hash ( ) ,
folder _hash ,
) ) ) )
) ) ) )
. unwrap ( ) ;
. unwrap ( ) ;
let mut new = FileFolderConf ::default ( ) ;
let mut new = FileFolderConf ::default ( ) ;
new . folder_conf . subscribe = super ::ToggleFlag ::InternalVal ( true ) ;
new . folder_conf . subscribe = super ::ToggleFlag ::InternalVal ( true ) ;
new . folder_conf . usage = if folder . special_usage ( ) ! = SpecialUsageMailbox ::Normal {
new . folder_conf . usage =
Some ( folder . special_usage ( ) )
if folders [ & folder_hash ] . special_usage ( ) ! = SpecialUsageMailbox ::Normal {
} else {
Some ( folders [ & folder_hash ] . special_usage ( ) )
let tmp = SpecialUsageMailbox ::detect_usage ( folder . name ( ) ) ;
} else {
if tmp ! = Some ( SpecialUsageMailbox ::Normal ) & & tmp ! = None {
let tmp = SpecialUsageMailbox ::detect_usage ( folders [ & folder_hash ] . name ( ) ) ;
let _ = folder . set_special_usage ( tmp . unwrap ( ) ) ;
if tmp ! = Some ( SpecialUsageMailbox ::Normal ) & & tmp ! = None {
}
folders . entry ( folder_hash ) . and_modify ( | entry | {
tmp
let _ = entry . set_special_usage ( tmp . unwrap ( ) ) ;
} ;
} ) ;
}
tmp
} ;
/* if new folder has parent, we need to update its children field */
if let Some ( parent_hash ) = folders [ & folder_hash ] . parent ( ) {
self . folder_entries . entry ( parent_hash ) . and_modify ( | parent | {
parent . ref_folder = folders . remove ( & parent_hash ) . unwrap ( ) ;
} ) ;
}
let folder_hash = folder . hash ( ) ;
self . folder_entries . insert (
self . folder_entries . insert (
folder_hash ,
folder_hash ,
FolderEntry {
FolderEntry {
name : folder . path ( ) . to_string ( ) ,
name : folder s[ & folder_hash ] . path ( ) . to_string ( ) ,
status : MailboxStatus ::Parsing ( 0 , 0 ) ,
status : MailboxStatus ::Parsing ( 0 , 0 ) ,
conf : new ,
conf : new ,
worker : Account ::new_worker (
worker : Account ::new_worker (
folder . clone ( ) ,
folder s[ & folder_hash ] . clone ( ) ,
& mut self . backend ,
& mut self . backend ,
& self . work_context ,
& self . work_context ,
self . notify_fn . clone ( ) ,
self . notify_fn . clone ( ) ,
) ,
) ,
ref_folder : folder ,
ref_folder : folder s. remove ( & folder_hash ) . unwrap ( ) ,
} ,
} ,
) ;
) ;
self . collection
self . collection
. threads
. threads
. insert ( folder_hash , Threads ::default ( ) ) ;
. insert ( folder_hash , Threads ::default ( ) ) ;
self . collection
. mailboxes
. insert ( folder_hash , Default ::default ( ) ) ;
build_folders_order (
build_folders_order (
& mut self . tree ,
& mut self . tree ,
& self . folder_entries ,
& self . folder_entries ,
@ -927,7 +938,7 @@ impl Account {
} else {
} else {
return Err ( MeliError ::new ( "Mailbox with that path not found." ) ) ;
return Err ( MeliError ::new ( "Mailbox with that path not found." ) ) ;
} ;
} ;
self . backend . write ( ) . unwrap ( ) . delete_folder ( folder_hash ) ? ;
let mut folders = self . backend . write ( ) . unwrap ( ) . delete_folder ( folder_hash ) ? ;
self . sender
self . sender
. send ( ThreadEvent ::UIEvent ( UIEvent ::MailboxDelete ( (
. send ( ThreadEvent ::UIEvent ( UIEvent ::MailboxDelete ( (
self . index ,
self . index ,
@ -944,8 +955,24 @@ impl Account {
self . sent_folder = None ;
self . sent_folder = None ;
}
}
self . collection . threads . remove ( & folder_hash ) ;
self . collection . threads . remove ( & folder_hash ) ;
/* if deleted folder had parent, we need to update its children field */
if let Some ( parent_hash ) = self
. folder_entries
. remove ( & folder_hash )
. unwrap ( )
. ref_folder
. parent ( )
{
self . folder_entries . entry ( parent_hash ) . and_modify ( | parent | {
parent . ref_folder = folders . remove ( & parent_hash ) . unwrap ( ) ;
} ) ;
}
self . collection . mailboxes . remove ( & folder_hash ) ;
self . collection . mailboxes . remove ( & folder_hash ) ;
self . folder_entries . remove ( & folder_hash ) ;
build_folders_order (
& mut self . tree ,
& self . folder_entries ,
& mut self . folders_order ,
) ;
// FIXME Kill worker as well
// FIXME Kill worker as well
// FIXME remove from settings as well
// FIXME remove from settings as well
@ -1063,7 +1090,6 @@ fn build_folders_order(
folder_entries : & FnvHashMap < FolderHash , FolderEntry > ,
folder_entries : & FnvHashMap < FolderHash , FolderEntry > ,
folders_order : & mut Vec < FolderHash > ,
folders_order : & mut Vec < FolderHash > ,
) {
) {
let mut stack : SmallVec < [ FolderHash ; 8 ] > = SmallVec ::new ( ) ;
tree . clear ( ) ;
tree . clear ( ) ;
folders_order . clear ( ) ;
folders_order . clear ( ) ;
for ( h , f ) in folder_entries . iter ( ) {
for ( h , f ) in folder_entries . iter ( ) {
@ -1079,20 +1105,14 @@ fn build_folders_order(
depth ,
depth ,
} ;
} ;
for & c in folder_entries [ & h ] . ref_folder . children ( ) {
for & c in folder_entries [ & h ] . ref_folder . children ( ) {
node . children . push ( rec ( c , folder_entries , depth + 1 ) ) ;
if folder_entries . contains_key ( & c ) {
node . children . push ( rec ( c , folder_entries , depth + 1 ) ) ;
}
}
}
node
node
} ;
} ;
tree . push ( rec ( * h , & folder_entries , 0 ) ) ;
tree . push ( rec ( * h , & folder_entries , 0 ) ) ;
for & c in f . ref_folder . children ( ) {
stack . push ( c ) ;
}
while let Some ( next ) = stack . pop ( ) {
for c in folder_entries [ & next ] . ref_folder . children ( ) {
stack . push ( * c ) ;
}
}
}
}
}
}