1+ use std:: sync:: Arc ;
2+
13use fltk:: app:: Sender ;
24use fltk:: browser:: * ;
35use fltk:: button:: * ;
@@ -9,6 +11,9 @@ use fltk::tree::Tree;
911use fltk:: tree:: TreeItem ;
1012use fltk:: tree:: TreeReason ;
1113use fltk:: window:: * ;
14+ use tokio:: sync:: RwLock ;
15+
16+ use crate :: State ;
1217
1318use super :: add_bar;
1419use super :: ConnectionDlgEvent ;
@@ -17,10 +22,11 @@ use super::UIEvent;
1722pub struct ConnectionWindow {
1823 pub main_win : Window ,
1924 pub tree : Tree ,
25+ state : Arc < RwLock < State > > ,
2026}
2127
2228impl ConnectionWindow {
23- pub fn make_window ( s : Sender < UIEvent > ) -> Self {
29+ pub fn make_window ( s : Sender < UIEvent > , state : Arc < RwLock < State > > ) -> Self {
2430 let mut main_win = Window :: new ( 100 , 100 , 330 , 300 , "queue" ) ;
2531 main_win. set_frame ( FrameType :: UpBox ) ;
2632
@@ -64,7 +70,7 @@ impl ConnectionWindow {
6470 let mut tree = Tree :: default ( ) . with_size ( 210 , 230 ) . with_pos ( 10 , 32 ) ;
6571 tree. set_show_root ( false ) ;
6672
67- tree. add ( "unpopulated " ) ;
73+ // tree.add("");
6874
6975 tree. set_trigger ( CallbackTrigger :: Release ) ;
7076 tree. set_callback ( move |t| {
@@ -101,7 +107,11 @@ impl ConnectionWindow {
101107
102108 main_win. end ( ) ;
103109
104- Self { main_win, tree }
110+ Self {
111+ main_win,
112+ tree,
113+ state,
114+ }
105115 }
106116
107117 pub fn populate ( & mut self , list : Vec < Server > ) {
@@ -110,23 +120,9 @@ impl ConnectionWindow {
110120 tree. begin ( ) ;
111121 for server in list {
112122 let mut item = tree. add ( & server. name ) . unwrap ( ) ;
113- item. set_user_data ( server. addr ) ;
114- if let Some ( rooms) = & server. rooms {
115- for room in rooms {
116- let line = & format ! ( "{}/{}" , server. name, room. id) ;
117- if let Some ( mut sub_item) = tree. add ( & line) {
118- sub_item. set_user_data ( room. id ) ;
119- sub_item. close ( ) ;
120- for user in & room. user_names {
121- tree. add ( & format ! ( "{}/{}" , line, user) ) ;
122- }
123- let actual_line = & format ! ( "{} ({})" , room. name, room. user_names. len( ) ) ;
124- sub_item. set_label ( actual_line) ;
125- }
126- }
127- } else {
128- tree. add ( & format ! ( "{}/(unable to connect)" , server. name) ) ;
129- }
123+ item. set_user_data ( server. addr . clone ( ) ) ;
124+
125+ Self :: populate_server_item ( self . state . clone ( ) , tree, item, server) ;
130126 }
131127 tree. end ( ) ;
132128 tree. redraw ( ) ;
@@ -137,26 +133,50 @@ impl ConnectionWindow {
137133 if let Some ( mut item) = tree. find_item ( & server. name ) {
138134 item. clear_children ( ) ;
139135
140- if let Some ( rooms) = & server. rooms {
141- for room in rooms {
142- let line = & format ! ( "{}/{}" , server. name, room. id) ;
143- if let Some ( mut sub_item) = tree. add ( & line) {
144- sub_item. set_user_data ( room. id ) ;
145- sub_item. close ( ) ;
146- for user in & room. user_names {
147- tree. add ( & format ! ( "{}/{}" , line, user) ) ;
148- }
149- let actual_line = & format ! ( "{} ({})" , room. name, room. user_names. len( ) ) ;
150- sub_item. set_label ( actual_line) ;
136+ Self :: populate_server_item ( self . state . clone ( ) , tree, item, server)
137+ } else {
138+ println ! ( "couldn't find {} ????" , server. name) ;
139+ }
140+ tree. redraw ( ) ;
141+ }
142+
143+ fn populate_server_item (
144+ state : Arc < RwLock < State > > ,
145+ tree : & mut Tree ,
146+ mut item : TreeItem ,
147+ server : Server ,
148+ ) {
149+ // for paths to work right
150+ item. set_label ( & server. addr ) ;
151+
152+ if let Some ( rooms) = & server. rooms {
153+ for room in rooms {
154+ let line = & format ! ( "{}/{}" , server. addr, room. id) ;
155+ if let Some ( mut sub_item) = tree. add ( & line) {
156+ sub_item. set_user_data ( room. id ) ;
157+ sub_item. close ( ) ;
158+ for user in & room. user_names {
159+ tree. add ( & format ! ( "{}/{}" , line, user) ) ;
151160 }
161+ let actual_line = & format ! ( "{} ({})" , room. name, room. user_names. len( ) ) ;
162+ sub_item. set_label ( actual_line) ;
152163 }
153- } else {
154- eprintln ! ( "uhhhhhh should never happen,,,,,,,,,,," ) ;
155164 }
156165 } else {
157- println ! ( "couldn't find {} ????" , server. name) ;
166+ tree. add ( & format ! ( "{}/(unable to connect)" , server. addr) ) ;
167+ }
168+
169+ // connected indicator
170+ let state = state. blocking_read ( ) ;
171+ item. set_label ( & server. name ) ;
172+ item. set_label_font ( Font :: Helvetica ) ;
173+ if let Some ( c) = & state. connection {
174+ if c. addr == server. addr {
175+ // text doesn't look that good and also it breaks tree.find_item...
176+ item. set_label ( & format ! ( "{}" , & server. name) ) ;
177+ item. set_label_font ( Font :: HelveticaBold ) ;
178+ }
158179 }
159- tree. redraw ( ) ;
160180 }
161181}
162182
0 commit comments