Remeasure scenario Fit viewport after owner or document changes
This commit is contained in:
@@ -649,6 +649,7 @@ fn canvas_pane<'a, R: iced::advanced::text::Renderer + 'a>(
|
|||||||
.width(Fill)
|
.width(Fill)
|
||||||
.height(Fill),
|
.height(Fill),
|
||||||
))
|
))
|
||||||
|
.key((context.document, context.scenario))
|
||||||
.on_show(move |size| Message::ScenarioCanvas(CanvasEvent::Viewport(context, size)))
|
.on_show(move |size| Message::ScenarioCanvas(CanvasEvent::Viewport(context, size)))
|
||||||
.on_resize(move |size| Message::ScenarioCanvas(CanvasEvent::Viewport(context, size))),
|
.on_resize(move |size| Message::ScenarioCanvas(CanvasEvent::Viewport(context, size))),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -341,6 +341,72 @@ fn scenario_workspace_fit_uses_measured_inner_viewport_and_rejects_nonfinite_inp
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn scenario_workspace_same_size_owner_and_document_changes_remeasure_fit_viewport() {
|
||||||
|
use super::super::direct_tests::{navigation_event, navigation_fixture};
|
||||||
|
let (project, [a, b, _], [reference, _, _]) = navigation_fixture();
|
||||||
|
let mut app = App::with_project(project.clone());
|
||||||
|
let _ = app.update(Message::Select(a));
|
||||||
|
let _ = app.update(Message::Page(crate::app::Page::Behavior));
|
||||||
|
let size = Size::new(500., 570.);
|
||||||
|
let graph = Size::new(1800., 2400.);
|
||||||
|
let mut view = fixture_view(
|
||||||
|
&app.behavior.scenario,
|
||||||
|
app.scenario_context().unwrap(),
|
||||||
|
false,
|
||||||
|
68.,
|
||||||
|
);
|
||||||
|
let mut tree = widget::Tree::new(view.as_widget());
|
||||||
|
redraw(&mut view, &mut tree, size, &mut app);
|
||||||
|
let first_viewport = app.behavior.scenario.presentation.viewport.unwrap();
|
||||||
|
navigation_event(&mut app, |ctx| CanvasEvent::Zoom(ctx, None));
|
||||||
|
assert!(app.behavior.scenario.presentation.scale(graph) < 1.);
|
||||||
|
|
||||||
|
navigation_event(&mut app, |ctx| CanvasEvent::OpenUse(ctx, reference));
|
||||||
|
assert_eq!(app.scenario_context().unwrap().scenario, b);
|
||||||
|
assert!(app.behavior.scenario.presentation.viewport.is_none());
|
||||||
|
view = fixture_view(
|
||||||
|
&app.behavior.scenario,
|
||||||
|
app.scenario_context().unwrap(),
|
||||||
|
false,
|
||||||
|
68.,
|
||||||
|
);
|
||||||
|
tree.diff(view.as_widget());
|
||||||
|
redraw(&mut view, &mut tree, size, &mut app);
|
||||||
|
assert_eq!(
|
||||||
|
app.behavior.scenario.presentation.viewport,
|
||||||
|
Some(first_viewport)
|
||||||
|
);
|
||||||
|
navigation_event(&mut app, |ctx| CanvasEvent::Zoom(ctx, None));
|
||||||
|
let fitted = app.behavior.scenario.presentation.scale(graph);
|
||||||
|
assert!(graph.width * fitted <= first_viewport.width - 16.);
|
||||||
|
assert!(graph.height * fitted <= first_viewport.height - 16.);
|
||||||
|
|
||||||
|
let prior_document = app.scenario_context().unwrap().document;
|
||||||
|
app = App::with_project(project);
|
||||||
|
let _ = app.update(Message::Select(b));
|
||||||
|
let _ = app.update(Message::Page(crate::app::Page::Behavior));
|
||||||
|
let context = app.scenario_context().unwrap();
|
||||||
|
assert_ne!(context.document, prior_document);
|
||||||
|
assert_eq!(
|
||||||
|
context.scenario, b,
|
||||||
|
"semantic UUID is retained across documents"
|
||||||
|
);
|
||||||
|
assert!(app.behavior.scenario.presentation.viewport.is_none());
|
||||||
|
let accepted = app.document.snapshot();
|
||||||
|
view = fixture_view(&app.behavior.scenario, context, false, 68.);
|
||||||
|
tree.diff(view.as_widget());
|
||||||
|
redraw(&mut view, &mut tree, size, &mut app);
|
||||||
|
assert_eq!(
|
||||||
|
app.behavior.scenario.presentation.viewport,
|
||||||
|
Some(first_viewport)
|
||||||
|
);
|
||||||
|
navigation_event(&mut app, |ctx| CanvasEvent::Zoom(ctx, None));
|
||||||
|
assert_eq!(app.behavior.scenario.presentation.scale(graph), fitted);
|
||||||
|
assert!(std::sync::Arc::ptr_eq(&accepted, &app.document.snapshot()));
|
||||||
|
assert!(!app.document.can_undo());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn scenario_workspace_open_and_back_restore_owner_and_mounted_scroll_after_preselection() {
|
fn scenario_workspace_open_and_back_restore_owner_and_mounted_scroll_after_preselection() {
|
||||||
use super::super::direct_tests::{navigation_event, navigation_fixture};
|
use super::super::direct_tests::{navigation_event, navigation_fixture};
|
||||||
|
|||||||
Reference in New Issue
Block a user