diff options
| author | 2020-12-18 23:29:51 +0100 | |
|---|---|---|
| committer | 2020-12-18 23:29:51 +0100 | |
| commit | 0e9f649cb741d7f02c4bafe4ea804bd68e0a1b7a (patch) | |
| tree | ba45c33eb69ce31ec50bd73f99c28e65ee1c9215 /graphics/src/widget/image | |
| parent | 07b570036aad3f42578876e1a299a0577e6761ae (diff) | |
| parent | 10d6df73e34e421cbf96d62b26c0c0701d9096ef (diff) | |
| download | iced-0e9f649cb741d7f02c4bafe4ea804bd68e0a1b7a.tar.gz iced-0e9f649cb741d7f02c4bafe4ea804bd68e0a1b7a.tar.bz2 iced-0e9f649cb741d7f02c4bafe4ea804bd68e0a1b7a.zip  | |
Merge pull request #319 from tarkah/image-pane
Add `ImagePane` widget
Diffstat (limited to '')
| -rw-r--r-- | graphics/src/widget/image.rs | 5 | ||||
| -rw-r--r-- | graphics/src/widget/image/viewer.rs | 55 | 
2 files changed, 59 insertions, 1 deletions
diff --git a/graphics/src/widget/image.rs b/graphics/src/widget/image.rs index 30f446e8..bdf03de3 100644 --- a/graphics/src/widget/image.rs +++ b/graphics/src/widget/image.rs @@ -1,11 +1,14 @@  //! Display images in your user interface. +pub mod viewer; +  use crate::backend::{self, Backend}; +  use crate::{Primitive, Renderer};  use iced_native::image;  use iced_native::mouse;  use iced_native::Layout; -pub use iced_native::image::{Handle, Image}; +pub use iced_native::image::{Handle, Image, Viewer};  impl<B> image::Renderer for Renderer<B>  where diff --git a/graphics/src/widget/image/viewer.rs b/graphics/src/widget/image/viewer.rs new file mode 100644 index 00000000..28dffc4f --- /dev/null +++ b/graphics/src/widget/image/viewer.rs @@ -0,0 +1,55 @@ +//! Zoom and pan on an image. +use crate::backend::{self, Backend}; +use crate::{Primitive, Renderer}; + +use iced_native::image; +use iced_native::image::viewer; +use iced_native::mouse; +use iced_native::{Rectangle, Size, Vector}; + +impl<B> viewer::Renderer for Renderer<B> +where +    B: Backend + backend::Image, +{ +    fn draw( +        &mut self, +        state: &viewer::State, +        bounds: Rectangle, +        image_size: Size, +        translation: Vector, +        handle: image::Handle, +        is_mouse_over: bool, +    ) -> Self::Output { +        ( +            { +                Primitive::Clip { +                    bounds, +                    content: Box::new(Primitive::Translate { +                        translation, +                        content: Box::new(Primitive::Image { +                            handle, +                            bounds: Rectangle { +                                x: bounds.x, +                                y: bounds.y, +                                ..Rectangle::with_size(image_size) +                            }, +                        }), +                    }), +                    offset: Vector::new(0, 0), +                } +            }, +            { +                if state.is_cursor_grabbed() { +                    mouse::Interaction::Grabbing +                } else if is_mouse_over +                    && (image_size.width > bounds.width +                        || image_size.height > bounds.height) +                { +                    mouse::Interaction::Grab +                } else { +                    mouse::Interaction::Idle +                } +            }, +        ) +    } +}  | 
