← Commit history

#133: dismiss rescans chained Open dialogs

Colby Knox ·d0a80a47eb ·3d ago ·parent 12228a8
2 files changed +20−5
CHANGELOG.md+7
@@ -3,6 +3,13 @@ All notable changes to the Adom Bridge Fusion 360 bridge, newest first. Canonical: https://wiki.adom.inc/adom/fusion-bridge ยท GitHub backup: `adom-inc/fusion-bridge` +## 1.13.41 (2026-10-30)++- `fusion_dismiss_blocking_dialogs` scans again after closing a native Open dialog: a cancelled EAGLE import opens its+  next Open dialog (the .brd after the .sch) at once, which one pass left behind (seen live).+- Checked live on 1.13.40 with add-in 1.0.30 (#133): fusion_new_electronics_from_eagle imported a .sch and .brd pair+  as AI Flow calls it, 109 of 109 parts placed, success true, no dialog left.+ ## 1.13.40 (2026-10-30)  - Issue #133, second half: the EAGLE import's wait for the new design compared the workspace's NAME (PCB Editor), but
rust/bridge/src/small_verbs.rs+13−5
@@ -485,11 +485,19 @@ pub fn dismiss_blocking_dialogs(state_dir: &Path, args: &Value, caller: &fusion_     // lists them, so this answers them too, with Cancel, and proves each is gone (issue #133)     let mut native_answered = Vec::new();     if want.is_empty() || want.iter().any(|w| w == "file_dialog") {-        for w in native_file_dialogs(&ab, caller, fusion_pids) {-            let Some(h) = w["hwnd"].as_i64() else { continue };-            let (closed, how) = close_native_dialog(&ab, caller, h);-            crate::fusion_prefs::action_ledger(state_dir, "dialog_dismissed", json!({"title": w["title"], "category": "file_dialog", "hwnd": h, "closed": closed, "how": how}));-            native_answered.push(json!({"title": w["title"], "category": "file_dialog", "answeredWith": format!("Cancel ({how})"), "closed": closed, "hwnd": h}));+        // a cancelled import opens its next Open dialog (the .brd after the .sch) at once: scan again+        // until none is left, a few rounds at most+        for round in 0..3 {+            let found = native_file_dialogs(&ab, caller, fusion_pids);+            if found.is_empty() { break; }+            if round > 0 { std::thread::sleep(std::time::Duration::from_millis(500)); }+            for w in found {+                let Some(h) = w["hwnd"].as_i64() else { continue };+                let (closed, how) = close_native_dialog(&ab, caller, h);+                crate::fusion_prefs::action_ledger(state_dir, "dialog_dismissed", json!({"title": w["title"], "category": "file_dialog", "hwnd": h, "closed": closed, "how": how}));+                native_answered.push(json!({"title": w["title"], "category": "file_dialog", "answeredWith": format!("Cancel ({how})"), "closed": closed, "hwnd": h}));+            }+            std::thread::sleep(std::time::Duration::from_millis(1500));         }     }     if classified.is_empty() && !native_answered.is_empty() {