Skip to content

Commit dbdb982

Browse files
committedMar 10, 2025
zoom rate preference
1 parent 74b6abb commit dbdb982

File tree

5 files changed

+73
-2
lines changed

5 files changed

+73
-2
lines changed
 

‎editor/src/messages/dialog/preferences_dialog/preferences_dialog_message_handler.rs

+60
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,27 @@ impl PreferencesDialogMessageHandler {
5555
TextLabel::new("Zoom with Scroll").table_align(true).tooltip(zoom_with_scroll_tooltip).widget_holder(),
5656
];
5757

58+
let zoom_rate_tooltip = "Adjust how fast zooming occurs when using the scroll wheel";
59+
let zoom_rate = vec![
60+
Separator::new(SeparatorType::Unrelated).widget_holder(),
61+
TextLabel::new("Zoom Rate: ").table_align(true).tooltip(zoom_rate_tooltip).widget_holder(),
62+
Separator::new(SeparatorType::Related).widget_holder(),
63+
NumberInput::new(Some(map_zoom_rate_to_display(preferences.viewport_zoom_wheel_rate)))
64+
.tooltip(zoom_rate_tooltip)
65+
.min(1.0)
66+
.max(100.0)
67+
.display_decimal_places(0) // Display as whole numbers
68+
.on_update(|number_input: &NumberInput| {
69+
if let Some(display_value) = number_input.value {
70+
let actual_rate = map_display_to_zoom_rate(display_value);
71+
PreferencesMessage::ViewportZoomWheelRate { rate: actual_rate }.into()
72+
} else {
73+
PreferencesMessage::ViewportZoomWheelRate { rate: (1. / 600.) * 3. }.into()
74+
}
75+
})
76+
.widget_holder(),
77+
];
78+
5879
// =======
5980
// EDITING
6081
// =======
@@ -184,6 +205,7 @@ impl PreferencesDialogMessageHandler {
184205

185206
Layout::WidgetLayout(WidgetLayout::new(vec![
186207
LayoutGroup::Row { widgets: navigation_header },
208+
LayoutGroup::Row { widgets: zoom_rate },
187209
LayoutGroup::Row { widgets: zoom_with_scroll },
188210
LayoutGroup::Row { widgets: editing_header },
189211
LayoutGroup::Row { widgets: selection_label },
@@ -250,3 +272,41 @@ impl PreferencesDialogMessageHandler {
250272
});
251273
}
252274
}
275+
// Map the actual rate value to display value (1-100)
276+
fn map_zoom_rate_to_display(rate: f64) -> f64 {
277+
let value = if rate <= 0.0001 {
278+
1.0
279+
} else if rate >= 0.05 {
280+
100.0
281+
} else {
282+
// Calculate the logarithmic position between 0.0001 and 0.05
283+
let log_min = 0.0001_f64.ln();
284+
let log_max = 0.05_f64.ln();
285+
let log_val = rate.ln();
286+
287+
// Map to 1-100 range
288+
let normalized = (log_val - log_min) / (log_max - log_min);
289+
1.0 + 99.0 * normalized
290+
};
291+
292+
value.round()
293+
}
294+
295+
// Map the display value (1-100) back to the actual rate value
296+
fn map_display_to_zoom_rate(display: f64) -> f64 {
297+
if display <= 1.0 {
298+
0.0001
299+
} else if display >= 100.0 {
300+
0.05
301+
} else {
302+
// Normalize to 0-1 range
303+
let normalized = (display - 1.0) / 99.0;
304+
305+
let log_min = 0.0001_f64.ln();
306+
let log_max = 0.05_f64.ln();
307+
let log_val = log_min + normalized * (log_max - log_min);
308+
309+
// Convert back to actual value
310+
log_val.exp()
311+
}
312+
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
192192
},
193193
document_ptz: &mut self.document_ptz,
194194
graph_view_overlay_open: self.graph_view_overlay_open,
195+
preferences,
195196
};
196197

197198
self.navigation_handler.process_message(message, responses, data);

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

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::consts::{
22
VIEWPORT_ROTATE_SNAP_INTERVAL, VIEWPORT_SCROLL_RATE, VIEWPORT_ZOOM_LEVELS, VIEWPORT_ZOOM_MIN_FRACTION_COVER, VIEWPORT_ZOOM_MOUSE_RATE, VIEWPORT_ZOOM_SCALE_MAX, VIEWPORT_ZOOM_SCALE_MIN,
3-
VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR, VIEWPORT_ZOOM_WHEEL_RATE,
3+
VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR,
44
};
55
use crate::messages::frontend::utility_types::MouseCursorIcon;
66
use crate::messages::input_mapper::utility_types::input_keyboard::{Key, MouseMotion};
@@ -22,6 +22,7 @@ pub struct NavigationMessageData<'a> {
2222
pub selection_bounds: Option<[DVec2; 2]>,
2323
pub document_ptz: &'a mut PTZ,
2424
pub graph_view_overlay_open: bool,
25+
pub preferences: &'a PreferencesMessageHandler,
2526
}
2627

2728
#[derive(Debug, Clone, PartialEq, Default)]
@@ -41,6 +42,7 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
4142
selection_bounds,
4243
document_ptz,
4344
graph_view_overlay_open,
45+
preferences,
4446
} = data;
4547

4648
fn get_ptz<'a>(document_ptz: &'a PTZ, network_interface: &'a NodeNetworkInterface, graph_view_overlay_open: bool, breadcrumb_network_path: &[NodeId]) -> Option<&'a PTZ> {
@@ -233,7 +235,8 @@ impl MessageHandler<NavigationMessage, NavigationMessageData<'_>> for Navigation
233235
}
234236
NavigationMessage::CanvasZoomMouseWheel => {
235237
let scroll = ipp.mouse.scroll_delta.scroll_delta();
236-
let mut zoom_factor = 1. + scroll.abs() * VIEWPORT_ZOOM_WHEEL_RATE;
238+
log::info!("nagivationMessage rate: {}", preferences.viewport_zoom_wheel_rate);
239+
let mut zoom_factor = 1. + scroll.abs() * preferences.viewport_zoom_wheel_rate;
237240
if ipp.mouse.scroll_delta.y > 0. {
238241
zoom_factor = 1. / zoom_factor
239242
}

‎editor/src/messages/preferences/preferences_message.rs

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub enum PreferencesMessage {
1515
VectorMeshes { enabled: bool },
1616
ModifyLayout { zoom_with_scroll: bool },
1717
GraphWireStyle { style: GraphWireStyle },
18+
ViewportZoomWheelRate { rate: f64 },
1819
// ImaginateRefreshFrequency { seconds: f64 },
1920
// ImaginateServerHostname { hostname: String },
2021
}

‎editor/src/messages/preferences/preferences_message_handler.rs

+6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub struct PreferencesMessageHandler {
1414
pub use_vello: bool,
1515
pub vector_meshes: bool,
1616
pub graph_wire_style: GraphWireStyle,
17+
pub viewport_zoom_wheel_rate: f64,
1718
}
1819

1920
impl PreferencesMessageHandler {
@@ -48,6 +49,7 @@ impl Default for PreferencesMessageHandler {
4849
use_vello,
4950
vector_meshes: false,
5051
graph_wire_style: GraphWireStyle::default(),
52+
viewport_zoom_wheel_rate: (1. / 600.) * 3.,
5153
}
5254
}
5355
}
@@ -103,6 +105,10 @@ impl MessageHandler<PreferencesMessage, ()> for PreferencesMessageHandler {
103105
self.graph_wire_style = style;
104106
responses.add(NodeGraphMessage::SendGraph);
105107
}
108+
PreferencesMessage::ViewportZoomWheelRate { rate } => {
109+
log::info!("pref_mess_handler zRate: {}", rate);
110+
self.viewport_zoom_wheel_rate = rate;
111+
}
106112
}
107113
// TODO: Reenable when Imaginate is restored (and move back up one line since the auto-formatter doesn't like it in that block)
108114
// PreferencesMessage::ImaginateRefreshFrequency { seconds } => {

0 commit comments

Comments
 (0)
Failed to load comments.