summaryrefslogtreecommitdiffstats
path: root/native/src/widget
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-12-18 10:47:29 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-12-18 10:47:29 +0100
commitadd167d6a00843fb1229ff542d411f733f916035 (patch)
treef55b6597c597e61100f970e8c04c45511084a1ac /native/src/widget
parent21b10dc103638ead2a567b3426c937f39e9addbd (diff)
downloadiced-add167d6a00843fb1229ff542d411f733f916035.tar.gz
iced-add167d6a00843fb1229ff542d411f733f916035.tar.bz2
iced-add167d6a00843fb1229ff542d411f733f916035.zip
Pan `image::Viewer` even if the cursor is out of bounds
Diffstat (limited to 'native/src/widget')
-rw-r--r--native/src/widget/image/viewer.rs145
1 files changed, 68 insertions, 77 deletions
diff --git a/native/src/widget/image/viewer.rs b/native/src/widget/image/viewer.rs
index 8b8e9824..6c170341 100644
--- a/native/src/widget/image/viewer.rs
+++ b/native/src/widget/image/viewer.rs
@@ -215,92 +215,83 @@ where
let bounds = layout.bounds();
let is_mouse_over = bounds.contains(cursor_position);
- if is_mouse_over {
- match event {
- Event::Mouse(mouse::Event::WheelScrolled { delta }) => {
- match delta {
- mouse::ScrollDelta::Lines { y, .. }
- | mouse::ScrollDelta::Pixels { y, .. } => {
- let previous_scale =
- self.state.scale.unwrap_or(1.0);
-
- if y < 0.0 && previous_scale > self.min_scale
- || y > 0.0 && previous_scale < self.max_scale
- {
- self.state.scale = Some(
- (if y > 0.0 {
- self.state.scale.unwrap_or(1.0)
- * (1.0 + self.scale_pct)
- } else {
- self.state.scale.unwrap_or(1.0)
- / (1.0 + self.scale_pct)
- })
- .max(self.min_scale)
- .min(self.max_scale),
- );
-
- let image_size =
- self.image_size(renderer, bounds.size());
-
- let factor = self.state.scale.unwrap()
- / previous_scale
- - 1.0;
-
- let cursor_to_center =
- relative_cursor_position(
- cursor_position,
- bounds,
- ) - relative_center(bounds);
-
- let adjustment = cursor_to_center * factor
- + self.state.current_offset * factor;
-
- self.state.current_offset = Vector::new(
- if image_size.width > bounds.width {
- self.state.current_offset.x
- + adjustment.x
- } else {
- 0.0
- },
- if image_size.height > bounds.height {
- self.state.current_offset.y
- + adjustment.y
- } else {
- 0.0
- },
- );
- }
+ match event {
+ Event::Mouse(mouse::Event::WheelScrolled { delta })
+ if is_mouse_over =>
+ {
+ match delta {
+ mouse::ScrollDelta::Lines { y, .. }
+ | mouse::ScrollDelta::Pixels { y, .. } => {
+ let previous_scale = self.state.scale.unwrap_or(1.0);
+
+ if y < 0.0 && previous_scale > self.min_scale
+ || y > 0.0 && previous_scale < self.max_scale
+ {
+ self.state.scale = Some(
+ (if y > 0.0 {
+ self.state.scale.unwrap_or(1.0)
+ * (1.0 + self.scale_pct)
+ } else {
+ self.state.scale.unwrap_or(1.0)
+ / (1.0 + self.scale_pct)
+ })
+ .max(self.min_scale)
+ .min(self.max_scale),
+ );
+
+ let image_size =
+ self.image_size(renderer, bounds.size());
+
+ let factor = self.state.scale.unwrap()
+ / previous_scale
+ - 1.0;
+
+ let cursor_to_center = relative_cursor_position(
+ cursor_position,
+ bounds,
+ ) - relative_center(bounds);
+
+ let adjustment = cursor_to_center * factor
+ + self.state.current_offset * factor;
+
+ self.state.current_offset = Vector::new(
+ if image_size.width > bounds.width {
+ self.state.current_offset.x + adjustment.x
+ } else {
+ 0.0
+ },
+ if image_size.height > bounds.height {
+ self.state.current_offset.y + adjustment.y
+ } else {
+ 0.0
+ },
+ );
}
}
}
- Event::Mouse(mouse::Event::ButtonPressed(button)) => {
- if button == mouse::Button::Left {
- self.state.starting_cursor_pos = Some(cursor_position);
+ }
+ Event::Mouse(mouse::Event::ButtonPressed(button))
+ if is_mouse_over =>
+ {
+ if button == mouse::Button::Left {
+ self.state.starting_cursor_pos = Some(cursor_position);
- self.state.starting_offset = self.state.current_offset;
- }
+ self.state.starting_offset = self.state.current_offset;
}
- Event::Mouse(mouse::Event::ButtonReleased(button)) => {
- if button == mouse::Button::Left {
- self.state.starting_cursor_pos = None
- }
+ }
+ Event::Mouse(mouse::Event::ButtonReleased(button)) => {
+ if button == mouse::Button::Left {
+ self.state.starting_cursor_pos = None
}
- Event::Mouse(mouse::Event::CursorMoved { position }) => {
- if self.state.is_cursor_clicked() {
- let image_size =
- self.image_size(renderer, bounds.size());
+ }
+ Event::Mouse(mouse::Event::CursorMoved { position }) => {
+ if self.state.is_cursor_clicked() {
+ let image_size = self.image_size(renderer, bounds.size());
- self.state
- .pan(position.x, position.y, bounds, image_size);
- }
+ self.state.pan(position.x, position.y, bounds, image_size);
}
- _ => {}
- }
- } else if let Event::Mouse(mouse::Event::ButtonReleased(button)) = event
- {
- if button == mouse::Button::Left {
- self.state.starting_cursor_pos = None;
}
+ _ => {}
}
event::Status::Ignored