Skip to content

Commit 0110291

Browse files
committed
Update main.rs
1 parent 1badbee commit 0110291

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

src/main.rs

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::{
55
collections::HashMap,
66
net::{IpAddr, SocketAddr},
77
str::FromStr,
8+
time::{Duration, Instant},
89
};
910

1011
use 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

595607
impl 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

Comments
 (0)