Skip to content

Commit 4576197

Browse files
authored
Improve nudging when tilted and add Artboard tool nudge resizing; disable menu bar entries when no layer is selected (#2098)
* Make nudging follow a tilted viewport * Add artboard nudge resizing
1 parent 320d030 commit 4576197

File tree

12 files changed

+240
-118
lines changed

12 files changed

+240
-118
lines changed

editor/src/messages/input_mapper/input_mappings.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -109,30 +109,30 @@ pub fn input_mappings() -> Mapping {
109109
entry!(KeyUp(MouseLeft); action_dispatch=ArtboardToolMessage::PointerUp),
110110
entry!(KeyDown(Delete); action_dispatch=ArtboardToolMessage::DeleteSelected),
111111
entry!(KeyDown(Backspace); action_dispatch=ArtboardToolMessage::DeleteSelected),
112-
entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }),
113-
entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }),
114-
entry!(KeyDown(ArrowUp); modifiers=[Shift], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT }),
115-
entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }),
116-
entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }),
117-
entry!(KeyDown(ArrowDown); modifiers=[Shift], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT }),
118-
entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }),
119-
entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }),
120-
entry!(KeyDown(ArrowLeft); modifiers=[Shift], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0. }),
121-
entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT }),
122-
entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT }),
123-
entry!(KeyDown(ArrowRight); modifiers=[Shift], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0. }),
124-
entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }),
125-
entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }),
126-
entry!(KeyDown(ArrowUp); action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: 0., delta_y: -NUDGE_AMOUNT }),
127-
entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }),
128-
entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }),
129-
entry!(KeyDown(ArrowDown); action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: 0., delta_y: NUDGE_AMOUNT }),
130-
entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }),
131-
entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }),
132-
entry!(KeyDown(ArrowLeft); action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: 0. }),
133-
entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT }),
134-
entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }),
135-
entry!(KeyDown(ArrowRight); action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: 0. }),
112+
entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
113+
entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
114+
entry!(KeyDown(ArrowUp); modifiers=[Shift], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
115+
entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
116+
entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
117+
entry!(KeyDown(ArrowDown); modifiers=[Shift], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
118+
entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
119+
entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
120+
entry!(KeyDown(ArrowLeft); modifiers=[Shift], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }),
121+
entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
122+
entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
123+
entry!(KeyDown(ArrowRight); modifiers=[Shift], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }),
124+
entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
125+
entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
126+
entry!(KeyDown(ArrowUp); action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: 0., delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
127+
entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
128+
entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
129+
entry!(KeyDown(ArrowDown); action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: 0., delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
130+
entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
131+
entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
132+
entry!(KeyDown(ArrowLeft); action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: -NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }),
133+
entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
134+
entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
135+
entry!(KeyDown(ArrowRight); action_dispatch=ArtboardToolMessage::NudgeSelected { delta_x: NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }),
136136
entry!(KeyDown(MouseRight); action_dispatch=ArtboardToolMessage::Abort),
137137
entry!(KeyDown(Escape); action_dispatch=ArtboardToolMessage::Abort),
138138
//

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 69 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -650,62 +650,77 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
650650
} => {
651651
responses.add(DocumentMessage::AddTransaction);
652652

653-
let opposite_corner = ipp.keyboard.key(resize_opposite_corner);
654-
let delta = DVec2::new(delta_x, delta_y);
655-
let network_interface = &self.network_interface;
656-
let can_move = move |layer| {
657-
network_interface
653+
let resize = ipp.keyboard.key(resize);
654+
let resize_opposite_corner = ipp.keyboard.key(resize_opposite_corner);
655+
656+
let can_move = |layer| {
657+
self.network_interface
658658
.selected_nodes(&[])
659-
.is_some_and(|selected| selected.layer_visible(layer, network_interface) && !selected.layer_locked(layer, network_interface))
659+
.is_some_and(|selected| selected.layer_visible(layer, &self.network_interface) && !selected.layer_locked(layer, &self.network_interface))
660660
};
661661

662-
match ipp.keyboard.key(resize) {
663-
// Nudge translation
664-
false => {
665-
for layer in self.network_interface.shallowest_unique_layers(&[]).filter(|layer| can_move(*layer)) {
666-
responses.add(GraphOperationMessage::TransformChange {
667-
layer,
668-
transform: DAffine2::from_translation(delta),
669-
transform_in: TransformIn::Local,
670-
skip_rerender: false,
671-
});
672-
}
673-
}
674-
// Nudge resize
675-
true => {
676-
let selected_bounding_box = self.network_interface.selected_bounds_document_space(false, &[]);
677-
let Some([existing_top_left, existing_bottom_right]) = selected_bounding_box else { return };
678-
679-
let size = existing_bottom_right - existing_top_left;
680-
let new_size = size + if opposite_corner { -delta } else { delta };
681-
let enlargement_factor = new_size / size;
682-
683-
let position = existing_top_left + if opposite_corner { delta } else { DVec2::ZERO };
684-
let mut pivot = (existing_top_left * enlargement_factor - position) / (enlargement_factor - DVec2::splat(1.));
685-
if !pivot.x.is_finite() {
686-
pivot.x = 0.;
687-
}
688-
if !pivot.y.is_finite() {
689-
pivot.y = 0.;
690-
}
662+
// Nudge translation without resizing
663+
if !resize {
664+
let transform = DAffine2::from_translation(DVec2::from_angle(-self.document_ptz.tilt()).rotate(DVec2::new(delta_x, delta_y)));
691665

692-
let scale = DAffine2::from_scale(enlargement_factor);
693-
let pivot = DAffine2::from_translation(pivot);
694-
let transformation = pivot * scale * pivot.inverse();
695-
let document_to_viewport = self.navigation_handler.calculate_offset_transform(ipp.viewport_bounds.center(), &self.document_ptz);
696-
697-
for layer in self.network_interface.shallowest_unique_layers(&[]).filter(|layer| can_move(*layer)) {
698-
let to = document_to_viewport.inverse() * self.metadata().downstream_transform_to_viewport(layer);
699-
let original_transform = self.metadata().upstream_transform(layer.to_node());
700-
let new = to.inverse() * transformation * to * original_transform;
701-
responses.add(GraphOperationMessage::TransformSet {
702-
layer,
703-
transform: new,
704-
transform_in: TransformIn::Local,
705-
skip_rerender: false,
706-
});
707-
}
666+
for layer in self.network_interface.shallowest_unique_layers(&[]).filter(|layer| can_move(*layer)) {
667+
responses.add(GraphOperationMessage::TransformChange {
668+
layer,
669+
transform,
670+
transform_in: TransformIn::Local,
671+
skip_rerender: false,
672+
});
708673
}
674+
675+
return;
676+
}
677+
678+
let selected_bounding_box = self.network_interface.selected_bounds_document_space(false, &[]);
679+
let Some([existing_top_left, existing_bottom_right]) = selected_bounding_box else { return };
680+
681+
// Swap and negate coordinates as needed to match the resize direction that's closest to the current tilt angle
682+
let tilt = (self.document_ptz.tilt() + std::f64::consts::TAU) % std::f64::consts::TAU;
683+
let (delta_x, delta_y, opposite_x, opposite_y) = match ((tilt + std::f64::consts::FRAC_PI_4) / std::f64::consts::FRAC_PI_2).floor() as i32 % 4 {
684+
0 => (delta_x, delta_y, false, false),
685+
1 => (delta_y, -delta_x, false, true),
686+
2 => (-delta_x, -delta_y, true, true),
687+
3 => (-delta_y, delta_x, true, false),
688+
_ => unreachable!(),
689+
};
690+
691+
let size = existing_bottom_right - existing_top_left;
692+
let enlargement = DVec2::new(
693+
if resize_opposite_corner != opposite_x { -delta_x } else { delta_x },
694+
if resize_opposite_corner != opposite_y { -delta_y } else { delta_y },
695+
);
696+
let enlargement_factor = (enlargement + size) / size;
697+
698+
let position = DVec2::new(
699+
existing_top_left.x + if resize_opposite_corner != opposite_x { delta_x } else { 0. },
700+
existing_top_left.y + if resize_opposite_corner != opposite_y { delta_y } else { 0. },
701+
);
702+
let mut pivot = (existing_top_left * enlargement_factor - position) / (enlargement_factor - DVec2::ONE);
703+
if !pivot.x.is_finite() {
704+
pivot.x = 0.;
705+
}
706+
if !pivot.y.is_finite() {
707+
pivot.y = 0.;
708+
}
709+
let scale = DAffine2::from_scale(enlargement_factor);
710+
let pivot = DAffine2::from_translation(pivot);
711+
let transformation = pivot * scale * pivot.inverse();
712+
let document_to_viewport = self.navigation_handler.calculate_offset_transform(ipp.viewport_bounds.center(), &self.document_ptz);
713+
714+
for layer in self.network_interface.shallowest_unique_layers(&[]).filter(|layer| can_move(*layer)) {
715+
let to = document_to_viewport.inverse() * self.metadata().downstream_transform_to_viewport(layer);
716+
let original_transform = self.metadata().upstream_transform(layer.to_node());
717+
let new = to.inverse() * transformation * to * original_transform;
718+
responses.add(GraphOperationMessage::TransformSet {
719+
layer,
720+
transform: new,
721+
transform_in: TransformIn::Local,
722+
skip_rerender: false,
723+
});
709724
}
710725
}
711726
DocumentMessage::PasteImage {
@@ -1814,7 +1829,7 @@ impl DocumentMessageHandler {
18141829

18151830
widgets.extend(navigation_controls(&self.document_ptz, &self.navigation_handler, "Canvas"));
18161831

1817-
let tilt_value = self.navigation_handler.snapped_tilt(self.document_ptz.tilt) / (std::f64::consts::PI / 180.);
1832+
let tilt_value = self.navigation_handler.snapped_tilt(self.document_ptz.tilt()) / (std::f64::consts::PI / 180.);
18181833
if tilt_value.abs() > 0.00001 {
18191834
widgets.extend([
18201835
Separator::new(SeparatorType::Related).widget_holder(),
@@ -1835,7 +1850,7 @@ impl DocumentMessageHandler {
18351850
}
18361851
.into()
18371852
})
1838-
.tooltip("Document tilt within the viewport")
1853+
.tooltip("Canvas Tilt")
18391854
.on_update(|number_input: &NumberInput| {
18401855
NavigationMessage::CanvasTiltSet {
18411856
angle_radians: number_input.value.unwrap().to_radians(),
@@ -2178,7 +2193,7 @@ pub fn navigation_controls(ptz: &PTZ, navigation_handler: &NavigationMessageHand
21782193
.tooltip("Reset Tilt and Zoom to 100%")
21792194
.tooltip_shortcut(action_keys!(NavigationMessageDiscriminant::CanvasTiltResetAndZoomTo100Percent))
21802195
.on_update(|_| NavigationMessage::CanvasTiltResetAndZoomTo100Percent.into())
2181-
.disabled(ptz.tilt.abs() < 1e-4 && (ptz.zoom() - 1.).abs() < 1e-4)
2196+
.disabled(ptz.tilt().abs() < 1e-4 && (ptz.zoom() - 1.).abs() < 1e-4)
21822197
.widget_holder(),
21832198
PopoverButton::new()
21842199
.popover_layout(vec![

editor/src/messages/portfolio/document/navigation/navigation_message_handler.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
107107
});
108108

109109
self.navigation_operation = NavigationOperation::Tilt {
110-
tilt_original_for_abort: ptz.tilt,
111-
tilt_raw_not_snapped: ptz.tilt,
110+
tilt_original_for_abort: ptz.tilt(),
111+
tilt_raw_not_snapped: ptz.tilt(),
112112
snap: false,
113113
};
114114

@@ -179,7 +179,7 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
179179
log::error!("Could not get mutable PTZ in CanvasTiltResetAndZoomTo100Percent");
180180
return;
181181
};
182-
ptz.tilt = 0.;
182+
ptz.set_tilt(0.);
183183
ptz.set_zoom(1.);
184184
if graph_view_overlay_open {
185185
responses.add(NodeGraphMessage::UpdateGraphBarRight);
@@ -194,7 +194,7 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
194194
log::error!("Could not get mutable PTZ in CanvasTiltSet");
195195
return;
196196
};
197-
ptz.tilt = angle_radians;
197+
ptz.set_tilt(angle_radians);
198198
responses.add(DocumentMessage::PTZUpdate);
199199
if !graph_view_overlay_open {
200200
responses.add(PortfolioMessage::UpdateDocumentWidgets);
@@ -277,7 +277,7 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
277277
match self.navigation_operation {
278278
NavigationOperation::None => {}
279279
NavigationOperation::Tilt { tilt_original_for_abort, .. } => {
280-
ptz.tilt = tilt_original_for_abort;
280+
ptz.set_tilt(tilt_original_for_abort);
281281
}
282282
NavigationOperation::Pan { pan_original_for_abort, .. } => {
283283
ptz.pan = pan_original_for_abort;
@@ -289,7 +289,7 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
289289
}
290290

291291
// Final chance to apply snapping if the key was pressed during this final frame
292-
ptz.tilt = self.snapped_tilt(ptz.tilt);
292+
ptz.set_tilt(self.snapped_tilt(ptz.tilt()));
293293
ptz.set_zoom(self.snapped_zoom(ptz.zoom()));
294294
responses.add(DocumentMessage::PTZUpdate);
295295
if graph_view_overlay_open {
@@ -397,7 +397,7 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
397397
log::error!("Could not get mutable PTZ in Tilt");
398398
return;
399399
};
400-
ptz.tilt = self.snapped_tilt(tilt_raw_not_snapped);
400+
ptz.set_tilt(self.snapped_tilt(tilt_raw_not_snapped));
401401

402402
let snap = ipp.keyboard.get(snap as usize);
403403

@@ -407,7 +407,7 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
407407
snap,
408408
};
409409

410-
responses.add(NavigationMessage::CanvasTiltSet { angle_radians: ptz.tilt });
410+
responses.add(NavigationMessage::CanvasTiltSet { angle_radians: ptz.tilt() });
411411
}
412412
NavigationOperation::Zoom {
413413
zoom_raw_not_snapped,
@@ -503,7 +503,7 @@ impl NavigationMessageHandler {
503503

504504
pub fn calculate_offset_transform(&self, viewport_center: DVec2, ptz: &PTZ) -> DAffine2 {
505505
let pan = ptz.pan;
506-
let tilt = ptz.tilt;
506+
let tilt = ptz.tilt();
507507
let zoom = ptz.zoom();
508508

509509
let scaled_center = viewport_center / self.snapped_zoom(zoom);

0 commit comments

Comments
 (0)