@@ -6,13 +6,7 @@ use glib::{
6
6
subclass:: { prelude:: * , Signal } ,
7
7
} ;
8
8
use once_cell:: sync:: Lazy ;
9
- use std:: {
10
- cell:: RefCell ,
11
- collections:: { HashMap , HashSet } ,
12
- iter:: FromIterator ,
13
- process,
14
- rc:: Rc ,
15
- } ;
9
+ use std:: { cell:: RefCell , collections:: HashMap , process, rc:: Rc } ;
16
10
17
11
mod board;
18
12
mod color;
@@ -33,7 +27,6 @@ use daemon::*;
33
27
#[ derive( Default ) ]
34
28
pub struct BackendInner {
35
29
daemon : DerefCell < Rc < dyn Daemon > > ,
36
- ids : RefCell < HashSet < BoardId > > ,
37
30
boards : RefCell < HashMap < BoardId , Board > > ,
38
31
}
39
32
@@ -102,20 +95,24 @@ impl Backend {
102
95
error ! ( "Failed to refresh boards: {}" , err) ;
103
96
}
104
97
105
- let mut ids = self . inner ( ) . ids . borrow_mut ( ) ;
106
- let new_ids = HashSet :: from_iter ( self . inner ( ) . daemon . boards ( ) . unwrap ( ) . into_iter ( ) ) ;
98
+ let new_ids = self . inner ( ) . daemon . boards ( ) . unwrap ( ) ;
107
99
108
100
let mut boards = self . inner ( ) . boards . borrow_mut ( ) ;
109
101
110
102
// Removed boards
111
- for i in ids. difference ( & new_ids) {
112
- self . emit_by_name ( "board-removed" , & [ & boards[ i] ] ) . unwrap ( ) ;
113
- boards. remove ( i) ;
114
- }
103
+ boards. retain ( |k, v| {
104
+ if new_ids. iter ( ) . find ( |i| * i == k) . is_none ( ) {
105
+ self . emit_by_name ( "board-removed" , & [ v] ) . unwrap ( ) ;
106
+ return false ;
107
+ }
108
+ true
109
+ } ) ;
115
110
116
111
// Added boards
117
- // TODO: emit in correct order
118
- for i in new_ids. difference ( & ids) {
112
+ for i in & new_ids {
113
+ if boards. contains_key ( i) {
114
+ continue ;
115
+ }
119
116
match Board :: new ( self . inner ( ) . daemon . clone ( ) , * i) {
120
117
Ok ( board) => {
121
118
boards. insert ( * i, board. clone ( ) ) ;
@@ -124,8 +121,6 @@ impl Backend {
124
121
Err ( err) => error ! ( "Failed to add board: {}" , err) ,
125
122
}
126
123
}
127
-
128
- * ids = new_ids;
129
124
}
130
125
131
126
pub fn connect_board_added < F : Fn ( Board ) + ' static > ( & self , cb : F ) {
0 commit comments