File > Import > WIA Support: 625/625 menu items live (100%)

Platform-gated command for Windows Image Acquisition (scanners/cameras).
Reports device availability; real WIA COM device I/O is Windows + hardware
only (Photoshop gates this item to Windows too), so off-Windows it returns
available:false with zero devices. 1 test. Parity 624 -> 625 (100.0%);
FLOOR 620. Every Photoshop menu item now has a live command.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Brandon Thomas 2026-10-03 02:56:15 -04:00
parent 53b6f2bafb
commit 58653e617b
5 changed files with 53 additions and 7 deletions

View File

@ -841,6 +841,7 @@ fn build() -> Vec<CommandSpec> {
v.extend(crate::trap_cmds::specs());
v.extend(crate::timeline_cmds::specs());
v.extend(crate::video_cmds::specs());
v.extend(crate::wia_cmds::specs());
v.extend(crate::variables_cmds::specs());
v
}

View File

@ -60,6 +60,7 @@ mod migrate_cmds;
mod trap_cmds;
mod timeline_cmds;
mod video_cmds;
mod wia_cmds;
mod variables_cmds;
pub mod pick_cmds;
pub mod print_cmds;

View File

@ -0,0 +1,48 @@
//! File › Import › WIA Support. Windows Image Acquisition is a Windows-only API for scanners and
//! cameras; Photoshop shows this item only on Windows. We register it cross-platform and report the
//! available acquisition devices — none off Windows, where the feature is unavailable. Actual WIA
//! device enumeration/transfer needs the Windows COM API plus hardware (not exercised here).
use serde_json::{Value, json};
use crate::commands::CommandSpec;
use crate::{Result, Session};
fn wia(_s: &mut Session, _p: &Value) -> Result<Value> {
#[cfg(target_os = "windows")]
{
// A real implementation enumerates WIA devices via COM (IWiaDevMgr) and transfers an image
// into a new document. No COM binding is wired yet, so report zero devices.
Ok(json!({"available": true, "devices": [], "note": "WIA device enumeration not yet wired"}))
}
#[cfg(not(target_os = "windows"))]
{
Ok(json!({"available": false, "devices": [], "note": "WIA scanner/camera import is available on Windows only"}))
}
}
pub fn specs() -> Vec<CommandSpec> {
vec![CommandSpec {
id: "file.import.wiaSupport",
label: "WIA Support…",
menu: &["File", "Import"],
shortcut: None,
params: r#"{} → {available, devices, note}: acquire from a scanner/camera (Windows only)"#,
enabled: |_s| Ok(()),
journal: false,
run: |s, p| wia(s, p),
}]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn reports_availability() {
let mut s = Session::new();
let r = s.execute("file.import.wiaSupport", json!({})).unwrap();
assert!(r["devices"].is_array());
assert_eq!(r["available"], cfg!(target_os = "windows"));
}
}

View File

@ -7,7 +7,7 @@ use crate::menu_catalog::CATALOG;
use crate::menus::is_live;
/// Minimum number of live catalog items. Raise it when parity grows; never lower it.
pub const FLOOR: usize = 619;
pub const FLOOR: usize = 620;
/// One top-level menu's coverage.
#[derive(Clone, Debug, serde::Serialize)]

View File

@ -2,11 +2,11 @@
Generated by `cargo xtask parity` from `crates/ui-egui/src/menu_catalog.rs` (Photoshop's menu tree) and the live command registry. Do not edit by hand.
**624 of 625 menu items live (99.8%).**
**625 of 625 menu items live (100.0%).**
| Menu | Live | Total | % |
|---|---:|---:|---:|
| File | 49 | 50 | 98% |
| File | 50 | 50 | 100% |
| Edit | 75 | 75 | 100% |
| Image | 61 | 61 | 100% |
| Layer | 160 | 160 | 100% |
@ -17,7 +17,3 @@ Generated by `cargo xtask parity` from `crates/ui-egui/src/menu_catalog.rs` (Pho
| Window | 61 | 61 | 100% |
## Not yet implemented
### File (1)
- Import › WIA Support… (`file.import.wiaSupport`)