fix(renderer): refresh scenes after property edits

This commit is contained in:
Kayshen-X 2026-07-23 23:13:29 +08:00
parent 4eea87db2d
commit 9ed85e5c24
4 changed files with 45 additions and 10 deletions

View file

@ -641,6 +641,9 @@ impl EditorState {
if removed && index == 0 {
self.ui.variables.fill_refs.remove(&sel);
}
if removed {
self.mark_document_changed();
}
removed
}
@ -667,19 +670,28 @@ impl EditorState {
let Some(node) = find_node_mut(self.active_children_mut(), &sel) else {
return false;
};
if crate::image_node_props::set_image_node_mode(node, mode) {
let changed = if crate::image_node_props::set_image_node_mode(node, mode) {
true
} else {
crate::fills::set_primary_image_fill_mode(node, mode)
};
if changed {
self.mark_document_changed();
}
changed
}
/// Set TILE scale on a primary image fill. Unlike mode/adjustments, this
/// deliberately does not fall back to a standalone Image node because its
/// schema has no tileScale property.
pub fn set_selected_image_tile_scale(&mut self, value: f32) -> bool {
self.with_selected_node(|node| crate::fills::set_primary_image_tile_scale(node, value))
.unwrap_or(false)
let changed = self
.with_selected_node(|node| crate::fills::set_primary_image_tile_scale(node, value))
.unwrap_or(false);
if changed {
self.mark_document_changed();
}
changed
}
pub fn set_selected_image_adjustment(
@ -694,11 +706,15 @@ impl EditorState {
let Some(node) = find_node_mut(self.active_children_mut(), &sel) else {
return false;
};
if crate::image_node_props::set_image_node_adjustment(node, field, value) {
let changed = if crate::image_node_props::set_image_node_adjustment(node, field, value) {
true
} else {
crate::fills::set_primary_image_adjustment(node, field, value)
};
if changed {
self.mark_document_changed();
}
changed
}
pub fn reset_selected_image_adjustments(&mut self) -> bool {
@ -709,11 +725,15 @@ impl EditorState {
let Some(node) = find_node_mut(self.active_children_mut(), &sel) else {
return false;
};
if crate::image_node_props::reset_image_node_adjustments(node) {
let changed = if crate::image_node_props::reset_image_node_adjustments(node) {
true
} else {
crate::fills::reset_primary_image_adjustments(node)
};
if changed {
self.mark_document_changed();
}
changed
}
}

View file

@ -989,6 +989,7 @@ fn status_bar_search_click_frames_content_in_viewport() {
host.editor_state_mut().viewport.zoom = 0.2;
let (vw, vh) = (1200.0, 800.0);
let (_, _, canvas_w, canvas_h) = host.canvas_region(vw, vh);
let r = host
.status_bar_rect(vw, vh)
.expect("status bar visible at this size");
@ -997,9 +998,11 @@ fn status_bar_search_click_frames_content_in_viewport() {
assert!(consumed, "search-icon click must be consumed");
let v = host.editor_state().viewport;
let expected_pan_x = canvas_w / 2.0 - 250.0;
let expected_pan_y = canvas_h / 2.0 - 200.0;
assert!((v.zoom - 1.0).abs() < 1e-3, "zoom {}", v.zoom);
assert!((v.pan_x - 230.0).abs() < 1e-2, "pan_x {}", v.pan_x);
assert!((v.pan_y - 180.0).abs() < 1e-2, "pan_y {}", v.pan_y);
assert!((v.pan_x - expected_pan_x).abs() < 1e-2, "pan_x {}", v.pan_x);
assert!((v.pan_y - expected_pan_y).abs() < 1e-2, "pan_y {}", v.pan_y);
}
#[test]

View file

@ -140,10 +140,14 @@ fn manual_pick_wins_until_exit_then_reinfers() {
fn device_scroll_divides_by_fit_and_clamps() {
let _guard = test_lock();
let mut host = host_with_doc(phone_doc(2000));
host.last_viewport_w = 300.0;
host.last_viewport_w = 800.0;
host.last_viewport_h = 400.0;
host.enter_preview((300.0, 400.0));
host.recompute_device_frame(300.0, 400.0);
assert!(
host.enter_preview((800.0, 400.0)),
"preview entry failed: {:?}",
host.editor_state().editor_ui.preview_warnings
);
host.recompute_device_frame(800.0, 400.0);
let fit = host.preview_device_frame.as_ref().unwrap().fit;
host.apply_device_scroll(-100.0);
assert!((host.preview_scroll_y - 100.0 / fit).abs() < 0.5);

View file

@ -223,6 +223,14 @@ fn interaction_menu_hover_tracks_the_row_under_the_cursor() {
);
host.editor_state_mut()
.set_single_selection(NodeId::new("f1"));
let property_rect = host.property_rect(VIEWPORT_W, VIEWPORT_H);
assert!(host.apply_wheel(
property_rect.origin.x + property_rect.size.x / 2.0,
property_rect.origin.y + property_rect.size.y / 2.0,
-10_000.0,
VIEWPORT_W,
VIEWPORT_H,
));
host.apply_property_action(PropertyPanelAction::ToggleInteractionMenu);
assert!(host.editor_state().editor_ui.interaction_menu_open);
assert_eq!(host.editor_state().editor_ui.interaction_menu_hover, None);