mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-31 14:27:02 -06:00
Squash of PR #533 by @vangel76. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
83 lines
3.1 KiB
Rust
83 lines
3.1 KiB
Rust
//! The External References palette (#525): XREF opens it; its rows and buttons act through the
|
|
//! engine's -XREF commands.
|
|
|
|
use cadcraft_engine::Session;
|
|
use cadcraft_engine::cmd::file::{IoHooks, set_io};
|
|
use cadcraft_engine::doc::geom::Vec3;
|
|
use cadcraft_engine::doc::{Drawing, Entity, EntityKind, Handle, Layer, Line, XrefStatus};
|
|
use cadcraft_ui_egui::{CadApp, Services, docking::Panel};
|
|
use egui::vec2;
|
|
use egui_kittest::Harness;
|
|
use egui_kittest::kittest::Queryable;
|
|
use serde_json::json;
|
|
|
|
/// Test drawings: any file holds one line on layer Walls.
|
|
fn read(_bytes: &[u8], _name: &str) -> Result<Drawing, String> {
|
|
let mut d = Drawing::new_metric();
|
|
d.layers.push(Layer { name: "Walls".into(), ..Layer::default() });
|
|
let mut e = Entity::new(Handle(0x60), EntityKind::Line(Line { a: Vec3::ZERO, b: Vec3::new(50.0, 20.0, 0.0) }));
|
|
e.common.layer = "Walls".into();
|
|
d.model.push(e);
|
|
Ok(d)
|
|
}
|
|
|
|
fn site_file() -> String {
|
|
let dir = std::env::temp_dir().join(format!("cadcraft-xref-palette-{}", std::process::id()));
|
|
std::fs::create_dir_all(&dir).unwrap();
|
|
let p = dir.join("site.dxf");
|
|
std::fs::write(&p, "site").unwrap();
|
|
p.to_string_lossy().into_owned()
|
|
}
|
|
|
|
fn status(app: &CadApp) -> Option<XrefStatus> {
|
|
app.session.doc().ok()?.block("site").map(|b| b.xref_status)
|
|
}
|
|
|
|
#[test]
|
|
fn xref_opens_the_palette_and_its_buttons_manage_the_xref() {
|
|
set_io(IoHooks { read, write: |_, _| Err("no writer in this test".into()), plot: None });
|
|
let mut app = CadApp::new(Session::default(), Services::default());
|
|
app.run("xattach", json!({ "path": site_file(), "at": [10, 10] })).unwrap();
|
|
assert_eq!(status(&app), Some(XrefStatus::Loaded));
|
|
// Typed (by its alias) it opens the palette instead of listing.
|
|
assert!(app.cmdline("XR").is_none());
|
|
assert!(app.ui.docking.layout.contains(&Panel::ExternalRefs));
|
|
app.ui.in_window_menu = false;
|
|
let mut h = Harness::builder().with_size(vec2(1400.0, 900.0)).build_ui_state(
|
|
|ui, app: &mut CadApp| {
|
|
app.logic(&ui.ctx().clone());
|
|
app.ui(ui);
|
|
},
|
|
app,
|
|
);
|
|
h.run_steps(4);
|
|
h.get_by_label("site");
|
|
h.get_by_label("Loaded");
|
|
h.get_by_label("Unload").click();
|
|
h.run_steps(3);
|
|
assert_eq!(status(h.state()), Some(XrefStatus::Unloaded));
|
|
h.get_by_label("Unloaded");
|
|
h.get_by_label("Reload").click();
|
|
h.run_steps(3);
|
|
assert_eq!(status(h.state()), Some(XrefStatus::Loaded));
|
|
h.get_by_label("Overlay").click();
|
|
h.run_steps(3);
|
|
assert!(h.state().session.doc().unwrap().block("site").unwrap().xref_overlay);
|
|
h.get_by_label("Detach").click();
|
|
h.run_steps(3);
|
|
assert_eq!(status(h.state()), None);
|
|
h.get_by_label("No external references are attached.");
|
|
// Undo brings it back, and the palette lists it again.
|
|
h.state_mut().session.undo().unwrap();
|
|
h.run_steps(3);
|
|
h.get_by_label("site");
|
|
}
|
|
|
|
#[test]
|
|
fn json_xref_lists_and_never_opens_the_palette() {
|
|
let mut app = CadApp::new(Session::default(), Services::default());
|
|
let r = app.run("xref", json!({})).unwrap();
|
|
assert_eq!(r["xrefs"], json!([]));
|
|
assert!(!app.ui.docking.layout.contains(&Panel::ExternalRefs));
|
|
}
|