@@ -5,6 +5,7 @@ use std::{
55 collections:: HashMap ,
66 net:: { IpAddr , SocketAddr } ,
77 str:: FromStr ,
8+ time:: { Duration , Instant } ,
89} ;
910
1011use egui:: { Color32 , ComboBox , RichText } ;
@@ -67,6 +68,11 @@ fn main() {
6768 gui_recv,
6869 idevice_sender : idevice_sender. clone ( ) ,
6970 show_logs : false ,
71+ lazy_in_progress : false ,
72+ lazy_status : None ,
73+ lazy_sent_load : false ,
74+ lazy_sent_installs : false ,
75+ last_lazy_refresh : None ,
7076 } ;
7177
7278 let mut options = eframe:: NativeOptions :: default ( ) ;
@@ -590,6 +596,12 @@ struct MyApp {
590596 idevice_sender : UnboundedSender < IdeviceCommands > ,
591597
592598 show_logs : bool ,
599+
600+ lazy_in_progress : bool ,
601+ lazy_status : Option < String > ,
602+ lazy_sent_load : bool ,
603+ lazy_sent_installs : bool ,
604+ last_lazy_refresh : Option < Instant > ,
593605}
594606
595607impl eframe:: App for MyApp {
@@ -735,7 +747,127 @@ impl eframe::App for MyApp {
735747 egui:: frame:: Frame :: new ( ) . corner_radius ( 3 ) . inner_margin ( 3 ) . fill ( p_background_color) . show ( ui, |ui| {
736748 ui. toggle_value ( & mut self . show_logs , "logs" ) ;
737749 } ) ;
750+ ui. with_layout ( egui:: Layout :: right_to_left ( egui:: Align :: Center ) , |ui| {
751+ if ui. button ( "I am lazy" ) . clicked ( ) {
752+ self . lazy_in_progress = true ;
753+ self . lazy_status = Some ( "Refreshing device list..." . to_string ( ) ) ;
754+ self . lazy_sent_load = false ;
755+ self . lazy_sent_installs = false ;
756+ self . install_res . clear ( ) ;
757+ let _ = self . idevice_sender . send ( IdeviceCommands :: GetDevices ) ;
758+ self . last_lazy_refresh = Some ( Instant :: now ( ) ) ;
759+ }
760+ if let Some ( status) = & self . lazy_status {
761+ ui. label ( status) ;
762+ }
763+ } ) ;
738764 } ) ;
765+
766+ if self . lazy_in_progress {
767+ match & self . devices {
768+ None => {
769+ self . lazy_status = Some ( "Loading devices..." . to_string ( ) ) ;
770+ }
771+ Some ( devs) => {
772+ if devs. is_empty ( ) {
773+ self . lazy_status = Some ( "Waiting for a device to be plugged in..." . to_string ( ) ) ;
774+ // Periodically refresh while waiting
775+ let should_refresh = match self . last_lazy_refresh {
776+ None => true ,
777+ Some ( t) => t. elapsed ( ) > Duration :: from_secs ( 2 ) ,
778+ } ;
779+ if should_refresh {
780+ let _ = self . idevice_sender . send ( IdeviceCommands :: GetDevices ) ;
781+ self . last_lazy_refresh = Some ( Instant :: now ( ) ) ;
782+ }
783+ ctx. request_repaint_after ( Duration :: from_millis ( 500 ) ) ;
784+ } else {
785+ if self . selected_device . is_empty ( ) {
786+ if devs. len ( ) == 1 {
787+ if let Some ( ( name, _) ) = devs. iter ( ) . next ( ) {
788+ self . selected_device = name. clone ( ) ;
789+ }
790+ } else {
791+ self . lazy_status = Some ( "Multiple devices connected. Please select one." . to_string ( ) ) ;
792+ ctx. request_repaint_after ( Duration :: from_millis ( 500 ) ) ;
793+ return ; // pause the flow until user selects
794+ }
795+ }
796+
797+ if !self . lazy_sent_load {
798+ if let Some ( dev) = devs. get ( & self . selected_device ) {
799+ self . pairing_file_message = Some ( "Loading..." . to_string ( ) ) ;
800+ self . pairing_file_string = None ;
801+ let _ = self . idevice_sender . send ( IdeviceCommands :: LoadPairingFile ( dev. clone ( ) ) ) ;
802+ self . lazy_sent_load = true ;
803+ self . lazy_status = Some ( "Loading pairing file..." . to_string ( ) ) ;
804+ }
805+ } else if self . pairing_file . is_none ( ) {
806+ self . lazy_status = Some ( "Waiting for pairing file..." . to_string ( ) ) ;
807+ ctx. request_repaint_after ( Duration :: from_millis ( 200 ) ) ;
808+ } else {
809+ if self . installed_apps . is_none ( ) {
810+ if let Some ( dev) = devs. get ( & self . selected_device ) {
811+ let desired: Vec < String > = self . supported_apps . keys ( ) . cloned ( ) . collect ( ) ;
812+ let _ = self . idevice_sender . send ( IdeviceCommands :: InstalledApps ( ( dev. clone ( ) , desired) ) ) ;
813+ }
814+ self . lazy_status = Some ( "Getting installed apps..." . to_string ( ) ) ;
815+ ctx. request_repaint_after ( Duration :: from_millis ( 200 ) ) ;
816+ } else if let Some ( Err ( _e) ) = & self . installed_apps {
817+ self . lazy_in_progress = false ;
818+ self . lazy_status = Some ( "Failed to get installed apps" . to_string ( ) ) ;
819+ } else if let Some ( Ok ( apps) ) = & self . installed_apps {
820+ if !self . lazy_sent_installs {
821+ let mut install_count = 0usize ;
822+ if let Some ( dev) = devs. get ( & self . selected_device ) {
823+ let pf = self . pairing_file . clone ( ) . unwrap ( ) ;
824+ for ( name, bundle_id) in apps. iter ( ) {
825+ if let Some ( path) = self . supported_apps . get ( name) {
826+ let _ = self . idevice_sender . send ( IdeviceCommands :: InstallPairingFile ( (
827+ dev. clone ( ) ,
828+ name. clone ( ) ,
829+ bundle_id. clone ( ) ,
830+ path. clone ( ) ,
831+ pf. clone ( ) ,
832+ ) ) ) ;
833+ self . install_res . insert ( name. clone ( ) , None ) ;
834+ install_count += 1 ;
835+ }
836+ }
837+ }
838+ self . lazy_sent_installs = true ;
839+ if install_count == 0 {
840+ self . lazy_in_progress = false ;
841+ self . lazy_status = Some ( "No compatible apps installed" . to_string ( ) ) ;
842+ } else {
843+ self . lazy_status = Some ( format ! ( "Installing into {} apps..." , install_count) ) ;
844+ }
845+ ctx. request_repaint_after ( Duration :: from_millis ( 200 ) ) ;
846+ } else {
847+ // Wait for all targeted installs to complete
848+ let mut all_done = true ;
849+ for ( name, _bundle_id) in apps. iter ( ) {
850+ if self . supported_apps . contains_key ( name) {
851+ match self . install_res . get ( name) {
852+ Some ( Some ( _) ) => { }
853+ _ => all_done = false ,
854+ }
855+ }
856+ }
857+ if all_done {
858+ self . lazy_in_progress = false ;
859+ self . lazy_status = Some ( "Done" . to_string ( ) ) ;
860+ } else {
861+ self . lazy_status = Some ( "Installing..." . to_string ( ) ) ;
862+ ctx. request_repaint_after ( Duration :: from_millis ( 200 ) ) ;
863+ }
864+ }
865+ }
866+ }
867+ }
868+ }
869+ }
870+ }
739871 match & self . devices {
740872 Some ( devs) => {
741873 if devs. is_empty ( ) {
0 commit comments