修复越界锚点持久化兼容

移除持久化层对有序越界 anchor 的错误范围限制

同步移除编辑器中的越界锚点误导警告

新增越界 anchor 保存加载往返回归测试
This commit is contained in:
2026-09-01 19:46:32 +08:00
parent e776a8d8af
commit 97ed504a88
2 changed files with 28 additions and 12 deletions
@@ -678,16 +678,6 @@ fn validate_node(
{
return Err("UI 节点 Transform 必须是有限数值".to_string());
}
if node
.layout
.transform
.anchor_min
.iter()
.chain(node.layout.transform.anchor_max.iter())
.any(|value| *value < 0.0 || *value > 1.0)
{
return Err("UI 节点 Transform 的 anchor 必须处于 0..=1 范围".to_string());
}
if node
.layout
.transform
@@ -1053,6 +1043,34 @@ mod tests {
assert_eq!(loaded.state, state);
}
#[test]
fn preserves_ordered_out_of_range_transform_anchors() {
let (directory, asset_id) = fixture();
let mut state = state_with_sprite_and_dragged_transform();
let transform = &mut state.ui_trees[0].root.children[0].layout.transform;
transform.anchor_min = Vector2::new(-0.25, -0.5);
transform.anchor_max = Vector2::new(1.5, 1.25);
let saved = save_ui_design_state_at(input(directory.path(), &asset_id, 0, state.clone()))
.expect("save ordered out-of-range anchors");
assert!(matches!(
saved,
SaveUiDesignStateResult::Saved {
revision: 1,
state: ref installed,
..
} if installed == &state
));
let loaded = load_ui_design_state_at(LoadUiDesignStateInput {
project_path: directory.path().to_string_lossy().into_owned(),
expected_project_id: PROJECT_ID.to_string(),
asset_id,
})
.expect("load ordered out-of-range anchors");
assert_eq!(loaded.state, state);
}
#[test]
fn rejects_inverted_transform_anchors() {
let state: State = serde_json::from_value(serde_json::json!({
@@ -367,8 +367,6 @@ export function TransformEditor({
const warning =
transform.anchor_min[0] > transform.anchor_max[0] ||
transform.anchor_min[1] > transform.anchor_max[1] ||
transform.anchor_min.some((value) => value < 0 || value > 1) ||
transform.anchor_max.some((value) => value < 0 || value > 1) ||
geometry?.invalid;
return (