@@ -130,8 +130,7 @@ mod imp {
130130 pub containers_query : Query < Vec < Container > > ,
131131
132132 pub containers : TypedListStore < Container > ,
133- #[ property( get, set, nullable) ]
134- selected_container : RefCell < Option < crate :: container:: Container > > ,
133+ pub selected_container_model : OnceCell < gtk:: SingleSelection > ,
135134
136135 pub tasks : TypedListStore < DistroboxTask > ,
137136 #[ property( get, set, nullable) ]
@@ -154,7 +153,7 @@ mod imp {
154153 terminal_repository : RefCell :: new ( TerminalRepository :: new (
155154 CommandRunner :: new_null ( ) ,
156155 ) ) ,
157- selected_container : Default :: default ( ) ,
156+ selected_container_model : OnceCell :: new ( ) ,
158157 current_view : Default :: default ( ) ,
159158 current_dialog : Default :: default ( ) ,
160159 distrobox : Default :: default ( ) ,
@@ -203,6 +202,14 @@ impl RootStore {
203202 . or ( Err ( "distrobox already set" ) )
204203 . unwrap ( ) ;
205204
205+ // Initialize the SingleSelection model
206+ let selection = gtk:: SingleSelection :: new ( Some ( this. containers ( ) . inner ( ) . clone ( ) ) ) ;
207+ this. imp ( )
208+ . selected_container_model
209+ . set ( selection)
210+ . or ( Err ( "selected_container_model already set" ) )
211+ . unwrap ( ) ;
212+
206213 let this_clone = this. clone ( ) ;
207214 this. imp ( ) . distrobox_version . set_fetcher ( move || {
208215 let this_clone = this_clone. clone ( ) ;
@@ -242,20 +249,13 @@ impl RootStore {
242249 let this_clone = this. clone ( ) ;
243250 this. containers_query ( ) . connect_success ( move |containers| {
244251 let this = this_clone. clone ( ) ;
245- let previous_selected = this. selected_container ( ) . clone ( ) ;
246252
247253 reconcile_list_by_key (
248254 this. containers ( ) ,
249255 & containers[ ..] ,
250256 |item| item. name ( ) ,
251257 & [ "name" , "status-tag" , "status-detail" , "distro" , "image" ] ,
252258 ) ;
253-
254- if previous_selected. is_none ( ) {
255- if let Some ( first) = containers. first ( ) {
256- this. set_selected_container ( Some ( first. clone ( ) ) ) ;
257- }
258- }
259259 } ) ;
260260
261261 if this. selected_terminal ( ) . is_none ( ) {
@@ -306,6 +306,21 @@ impl RootStore {
306306 & self . imp ( ) . tasks
307307 }
308308
309+ pub fn selected_container_model ( & self ) -> gtk:: SingleSelection {
310+ self . imp ( ) . selected_container_model . get ( ) . unwrap ( ) . clone ( )
311+ }
312+
313+ /// Get the currently selected container, if any
314+ pub fn selected_container ( & self ) -> Option < Container > {
315+ let model = self . selected_container_model ( ) ;
316+ let position = model. selected ( ) ;
317+ if position == gtk:: INVALID_LIST_POSITION {
318+ None
319+ } else {
320+ model. selected_item ( ) . and_then ( |obj| obj. downcast :: < Container > ( ) . ok ( ) )
321+ }
322+ }
323+
309324 pub fn load_containers ( & self ) {
310325 self . containers_query ( ) . refetch_if_stale ( Duration :: from_secs ( 1 ) ) ;
311326 }
0 commit comments