Skip to main content

ImageView

Struct ImageView 

Source
pub struct ImageView { /* private fields */ }
Expand description

Image view.

Works on terminals that support the Kitty graphics protocol

The view supports shrink, fit, and scale sizing modes (shrink is the default), image alignment, and scrolling.

Implementations§

Source§

impl ImageView

Source

pub fn image(&self) -> Option<&Image>

Image.

Source

pub fn set_image(&mut self, image: Image)

Set image.

Examples found in repository?
examples/pdf.rs (line 77)
71fn set_page(cursive: &mut Cursive, index: usize) {
72    let image = {
73        let pages: &mut Pages = cursive.user_data().unwrap();
74        pages.index = index;
75        pages.images[index].take().unwrap()
76    };
77    cursive.call_on_name(NAME, |image_view: &mut ImageView| image_view.set_image(image));
78}
Source

pub fn take_image(&mut self) -> Option<Image>

Take image.

Examples found in repository?
examples/pdf.rs (line 81)
80fn unset_page(cursive: &mut Cursive) {
81    let image = cursive.call_on_name(NAME, |image_view: &mut ImageView| image_view.take_image()).unwrap();
82    if let Some(image) = image {
83        let pages: &mut Pages = cursive.user_data().unwrap();
84        pages.images[pages.index] = Some(image);
85    }
86}
Source

pub fn with_image(self, image: Image) -> Self

Set image.

Chainable.

Examples found in repository?
examples/gif.rs (lines 11-14)
8fn main() {
9    let mut cursive = default();
10
11    cursive.add_layer(Panel::new(ImageView::default().with_image(
12        // GIFs will always be RGBA
13        Image::new_stream_from_gif_file(FILE).expect("new_stream_from_gif_file"),
14    )));
15
16    cursive.add_global_callback('q', |cursive| cursive.quit());
17
18    cursive.run();
19}
More examples
Hide additional examples
examples/simple.rs (lines 14-19)
9fn main() {
10    let mut cursive = default();
11
12    // By default the image view uses "shrink" sizing
13
14    cursive.add_layer(Panel::new(ImageView::default().with_image(Image::new_file(
15        FILE,
16        false,
17        ImageFormat::PNG,
18        (96, 96),
19    ))));
20
21    cursive.add_global_callback('q', |cursive| cursive.quit());
22
23    cursive.run();
24}
examples/svg.rs (lines 12-16)
9fn main() {
10    let mut cursive = default();
11
12    cursive.add_layer(Panel::new(ImageView::default().with_image(
13        // SVG can be either PNG or RGBA (PNG is usually more efficient)
14        // Note that we can apply scaling during rendering
15        Image::new_stream_from_svg_file(FILE, ImageFormat::PNG, 2.5).expect("new_stream_from_svg_file"),
16    )));
17
18    cursive.add_global_callback('q', |cursive| cursive.quit());
19
20    cursive.run();
21}
examples/scrollable.rs (lines 18-23)
12fn main() {
13    let mut cursive = default();
14
15    cursive.add_layer(
16        Panel::new(
17            ImageView::default()
18                .with_image(
19                    // Note that RGBA is supported, too, if you need transparency
20                    Image::new_stream_from_jpeg_file(FILE, ImageFormat::RGB).expect("new_stream_from_jpeg_file"),
21                    // If you prefer to keep the image data in memory:
22                    // Image::new_owned_from_jpeg_file(FILE, ImageFormat::RGB, true).expect("new_owned_from_jpeg_file"),
23                )
24                .with_sizing(Sizing::original())
25                .scrollable()
26                .scroll_x(true),
27        )
28        .fixed_size((50, 20)),
29    );
30
31    cursive.add_global_callback('q', |cursive| cursive.quit());
32
33    cursive.run();
34}
examples/positioning.rs (line 22)
15fn main() {
16    let mut cursive = default();
17
18    cursive.add_layer(Panel::new(
19        ImageView::default()
20            // We're also showing the use of new_png_file(), which discovers the image size for us
21            // (requires the "png" feature)
22            .with_image(Image::new_png_file(FILE).expect("new_png_file"))
23            .with_name(NAME)
24            .fixed_size((50, 20)),
25    ));
26
27    cursive.add_global_callback('s', |cursive| {
28        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
29            image_view.set_sizing(match image_view.sizing() {
30                Sizing::Shrink => Sizing::Fit,
31                Sizing::Fit => Sizing::Scale(3.),
32                Sizing::Scale(_) => Sizing::Shrink,
33            })
34        });
35    });
36
37    cursive.add_global_callback('h', |cursive| {
38        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
39            image_view.set_align(match image_view.align() {
40                Align { h: HAlign::Left, v } => Align { h: HAlign::Center, v },
41                Align { h: HAlign::Center, v } => Align { h: HAlign::Right, v },
42                Align { h: HAlign::Right, v } => Align { h: HAlign::Left, v },
43            })
44        });
45    });
46
47    cursive.add_global_callback('v', |cursive| {
48        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
49            image_view.set_align(match image_view.align() {
50                Align { h, v: VAlign::Top } => Align { h, v: VAlign::Center },
51                Align { h, v: VAlign::Center } => Align { h, v: VAlign::Bottom },
52                Align { h, v: VAlign::Bottom } => Align { h, v: VAlign::Top },
53            })
54        });
55    });
56
57    cursive.add_global_callback('q', |cursive| cursive.quit());
58
59    cursive.run();
60}
Source

pub fn sizing(&self) -> Sizing

Sizing.

Examples found in repository?
examples/positioning.rs (line 29)
15fn main() {
16    let mut cursive = default();
17
18    cursive.add_layer(Panel::new(
19        ImageView::default()
20            // We're also showing the use of new_png_file(), which discovers the image size for us
21            // (requires the "png" feature)
22            .with_image(Image::new_png_file(FILE).expect("new_png_file"))
23            .with_name(NAME)
24            .fixed_size((50, 20)),
25    ));
26
27    cursive.add_global_callback('s', |cursive| {
28        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
29            image_view.set_sizing(match image_view.sizing() {
30                Sizing::Shrink => Sizing::Fit,
31                Sizing::Fit => Sizing::Scale(3.),
32                Sizing::Scale(_) => Sizing::Shrink,
33            })
34        });
35    });
36
37    cursive.add_global_callback('h', |cursive| {
38        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
39            image_view.set_align(match image_view.align() {
40                Align { h: HAlign::Left, v } => Align { h: HAlign::Center, v },
41                Align { h: HAlign::Center, v } => Align { h: HAlign::Right, v },
42                Align { h: HAlign::Right, v } => Align { h: HAlign::Left, v },
43            })
44        });
45    });
46
47    cursive.add_global_callback('v', |cursive| {
48        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
49            image_view.set_align(match image_view.align() {
50                Align { h, v: VAlign::Top } => Align { h, v: VAlign::Center },
51                Align { h, v: VAlign::Center } => Align { h, v: VAlign::Bottom },
52                Align { h, v: VAlign::Bottom } => Align { h, v: VAlign::Top },
53            })
54        });
55    });
56
57    cursive.add_global_callback('q', |cursive| cursive.quit());
58
59    cursive.run();
60}
Source

pub fn set_sizing(&mut self, sizing: Sizing)

Set sizing.

Examples found in repository?
examples/positioning.rs (lines 29-33)
15fn main() {
16    let mut cursive = default();
17
18    cursive.add_layer(Panel::new(
19        ImageView::default()
20            // We're also showing the use of new_png_file(), which discovers the image size for us
21            // (requires the "png" feature)
22            .with_image(Image::new_png_file(FILE).expect("new_png_file"))
23            .with_name(NAME)
24            .fixed_size((50, 20)),
25    ));
26
27    cursive.add_global_callback('s', |cursive| {
28        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
29            image_view.set_sizing(match image_view.sizing() {
30                Sizing::Shrink => Sizing::Fit,
31                Sizing::Fit => Sizing::Scale(3.),
32                Sizing::Scale(_) => Sizing::Shrink,
33            })
34        });
35    });
36
37    cursive.add_global_callback('h', |cursive| {
38        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
39            image_view.set_align(match image_view.align() {
40                Align { h: HAlign::Left, v } => Align { h: HAlign::Center, v },
41                Align { h: HAlign::Center, v } => Align { h: HAlign::Right, v },
42                Align { h: HAlign::Right, v } => Align { h: HAlign::Left, v },
43            })
44        });
45    });
46
47    cursive.add_global_callback('v', |cursive| {
48        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
49            image_view.set_align(match image_view.align() {
50                Align { h, v: VAlign::Top } => Align { h, v: VAlign::Center },
51                Align { h, v: VAlign::Center } => Align { h, v: VAlign::Bottom },
52                Align { h, v: VAlign::Bottom } => Align { h, v: VAlign::Top },
53            })
54        });
55    });
56
57    cursive.add_global_callback('q', |cursive| cursive.quit());
58
59    cursive.run();
60}
Source

pub fn with_sizing(self, sizing: Sizing) -> Self

Set sizing.

Chainable.

Examples found in repository?
examples/scrollable.rs (line 24)
12fn main() {
13    let mut cursive = default();
14
15    cursive.add_layer(
16        Panel::new(
17            ImageView::default()
18                .with_image(
19                    // Note that RGBA is supported, too, if you need transparency
20                    Image::new_stream_from_jpeg_file(FILE, ImageFormat::RGB).expect("new_stream_from_jpeg_file"),
21                    // If you prefer to keep the image data in memory:
22                    // Image::new_owned_from_jpeg_file(FILE, ImageFormat::RGB, true).expect("new_owned_from_jpeg_file"),
23                )
24                .with_sizing(Sizing::original())
25                .scrollable()
26                .scroll_x(true),
27        )
28        .fixed_size((50, 20)),
29    );
30
31    cursive.add_global_callback('q', |cursive| cursive.quit());
32
33    cursive.run();
34}
More examples
Hide additional examples
examples/pdf.rs (line 23)
10fn main() {
11    let mut cursive = default();
12
13    // The constructor returns a vector of images, one for each page in the PDF
14    // PDF pages can be either PNG or RGBA (PNG is usually more efficient)
15    // Note that we can apply scaling during rendering
16    let images = Image::new_owned_from_pdf_file(FILE, ImageFormat::PNG, 3., false).expect("new_owned_from_pdf_file");
17
18    cursive.set_user_data(Pages::new(images));
19
20    cursive.add_layer(
21        Dialog::around(
22            Panel::new(
23                ImageView::default().with_sizing(Sizing::original()).with_name(NAME).scrollable().scroll_x(true),
24            )
25            .fixed_size((50, 30)),
26        )
27        .button("Previous", |cursive| flip_page(cursive, -1))
28        .button("Next", |cursive| flip_page(cursive, 1)),
29    );
30
31    select_page(&mut cursive, 0);
32
33    cursive.add_global_callback('q', |cursive| cursive.quit());
34
35    cursive.run();
36}
Source

pub fn align(&self) -> Align

Align.

Examples found in repository?
examples/positioning.rs (line 39)
15fn main() {
16    let mut cursive = default();
17
18    cursive.add_layer(Panel::new(
19        ImageView::default()
20            // We're also showing the use of new_png_file(), which discovers the image size for us
21            // (requires the "png" feature)
22            .with_image(Image::new_png_file(FILE).expect("new_png_file"))
23            .with_name(NAME)
24            .fixed_size((50, 20)),
25    ));
26
27    cursive.add_global_callback('s', |cursive| {
28        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
29            image_view.set_sizing(match image_view.sizing() {
30                Sizing::Shrink => Sizing::Fit,
31                Sizing::Fit => Sizing::Scale(3.),
32                Sizing::Scale(_) => Sizing::Shrink,
33            })
34        });
35    });
36
37    cursive.add_global_callback('h', |cursive| {
38        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
39            image_view.set_align(match image_view.align() {
40                Align { h: HAlign::Left, v } => Align { h: HAlign::Center, v },
41                Align { h: HAlign::Center, v } => Align { h: HAlign::Right, v },
42                Align { h: HAlign::Right, v } => Align { h: HAlign::Left, v },
43            })
44        });
45    });
46
47    cursive.add_global_callback('v', |cursive| {
48        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
49            image_view.set_align(match image_view.align() {
50                Align { h, v: VAlign::Top } => Align { h, v: VAlign::Center },
51                Align { h, v: VAlign::Center } => Align { h, v: VAlign::Bottom },
52                Align { h, v: VAlign::Bottom } => Align { h, v: VAlign::Top },
53            })
54        });
55    });
56
57    cursive.add_global_callback('q', |cursive| cursive.quit());
58
59    cursive.run();
60}
Source

pub fn set_align(&mut self, align: Align)

Set align.

Examples found in repository?
examples/positioning.rs (lines 39-43)
15fn main() {
16    let mut cursive = default();
17
18    cursive.add_layer(Panel::new(
19        ImageView::default()
20            // We're also showing the use of new_png_file(), which discovers the image size for us
21            // (requires the "png" feature)
22            .with_image(Image::new_png_file(FILE).expect("new_png_file"))
23            .with_name(NAME)
24            .fixed_size((50, 20)),
25    ));
26
27    cursive.add_global_callback('s', |cursive| {
28        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
29            image_view.set_sizing(match image_view.sizing() {
30                Sizing::Shrink => Sizing::Fit,
31                Sizing::Fit => Sizing::Scale(3.),
32                Sizing::Scale(_) => Sizing::Shrink,
33            })
34        });
35    });
36
37    cursive.add_global_callback('h', |cursive| {
38        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
39            image_view.set_align(match image_view.align() {
40                Align { h: HAlign::Left, v } => Align { h: HAlign::Center, v },
41                Align { h: HAlign::Center, v } => Align { h: HAlign::Right, v },
42                Align { h: HAlign::Right, v } => Align { h: HAlign::Left, v },
43            })
44        });
45    });
46
47    cursive.add_global_callback('v', |cursive| {
48        _ = cursive.call_on_name(NAME, |image_view: &mut ImageView| {
49            image_view.set_align(match image_view.align() {
50                Align { h, v: VAlign::Top } => Align { h, v: VAlign::Center },
51                Align { h, v: VAlign::Center } => Align { h, v: VAlign::Bottom },
52                Align { h, v: VAlign::Bottom } => Align { h, v: VAlign::Top },
53            })
54        });
55    });
56
57    cursive.add_global_callback('q', |cursive| cursive.quit());
58
59    cursive.run();
60}
Source

pub fn with_align(self, align: Align) -> Self

Set align.

Chainable.

Trait Implementations§

Source§

impl Default for ImageView

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl View for ImageView

Source§

fn type_name(&self) -> &'static str

Returns the type of this view. Read more
Source§

fn required_size(&mut self, constraint: Vec2) -> Vec2

Returns the minimum size the view requires with the given restrictions. Read more
Source§

fn needs_relayout(&self) -> bool

Should return true if the view content changed since the last call to layout(). Read more
Source§

fn layout(&mut self, size: Vec2)

Called once the size for this view has been decided. Read more
Source§

fn draw(&self, printer: &Printer<'_, '_>)

Draws the view with the given printer (includes bounds) and focus. Read more
Source§

fn on_event(&mut self, _: Event) -> EventResult

Called when an event is received (key press, mouse event, …). Read more
Source§

fn call_on_any( &mut self, _: &Selector<'_>, _: &mut dyn FnMut(&mut (dyn View + 'static)), )

Runs a closure on the view identified by the given selector. Read more
Source§

fn focus_view(&mut self, _: &Selector<'_>) -> Result<EventResult, ViewNotFound>

Moves the focus to the view identified by the given selector. Read more
Source§

fn take_focus(&mut self, source: Direction) -> Result<EventResult, CannotFocus>

Attempt to give this view the focus. Read more
Source§

fn important_area(&self, view_size: XY<usize>) -> Rect

What part of the view is important and should be visible? Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> AnyView for T
where T: View,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Downcast self to a Any.

Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Downcast self to a mutable Any.

Source§

fn as_boxed_any(self: Box<T>) -> Box<dyn Any>

Returns a boxed any from a boxed self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Finder for T
where T: View,

Source§

fn call_on_all<V, F>(&mut self, sel: &Selector<'_>, callback: F)
where V: View, F: FnMut(&mut V),

Runs a callback on all views identified by sel. Read more
Source§

fn call_on<V, F, R>(&mut self, sel: &Selector<'_>, callback: F) -> Option<R>
where V: View, F: FnOnce(&mut V) -> R,

Runs a callback on the view identified by sel. Read more
Source§

fn call_on_name<V, F, R>(&mut self, name: &str, callback: F) -> Option<R>
where V: View, F: FnOnce(&mut V) -> R,

Convenient method to use call_on with a view::Selector::Name.
Source§

fn find_name<V>(&mut self, name: &str) -> Option<ViewRef<V>>
where V: View,

Convenient method to find a view wrapped in an NamedView.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoBoxedView for T
where T: View,

Source§

fn into_boxed_view(self) -> Box<dyn View>

Returns a Box<View>.
Source§

impl<T> Nameable for T
where T: View,

Source§

fn with_name<S>(self, name: S) -> NamedView<Self>
where S: Into<String>,

Wraps this view into an NamedView with the given id. Read more
Source§

impl<T> Resizable for T
where T: View,

Source§

fn resized( self, width: SizeConstraint, height: SizeConstraint, ) -> ResizedView<Self>

Wraps self in a ResizedView with the given size constraints.
Source§

fn fixed_size<S>(self, size: S) -> ResizedView<Self>
where S: Into<XY<usize>>,

Wraps self into a fixed-size ResizedView.
Source§

fn fixed_width(self, width: usize) -> ResizedView<Self>

Wraps self into a fixed-width ResizedView.
Source§

fn fixed_height(self, height: usize) -> ResizedView<Self>

Wraps self into a fixed-width ResizedView.
Source§

fn full_screen(self) -> ResizedView<Self>

Wraps self into a full-screen ResizedView.
Source§

fn full_width(self) -> ResizedView<Self>

Wraps self into a full-width ResizedView.
Source§

fn full_height(self) -> ResizedView<Self>

Wraps self into a full-height ResizedView.
Source§

fn max_size<S>(self, size: S) -> ResizedView<Self>
where S: Into<XY<usize>>,

Wraps self into a limited-size ResizedView.
Source§

fn max_width(self, max_width: usize) -> ResizedView<Self>

Wraps self into a limited-width ResizedView.
Source§

fn max_height(self, max_height: usize) -> ResizedView<Self>

Wraps self into a limited-height ResizedView.
Source§

fn min_size<S>(self, size: S) -> ResizedView<Self>
where S: Into<XY<usize>>,

Wraps self into a ResizedView at least sized size.
Source§

fn min_width(self, min_width: usize) -> ResizedView<Self>

Wraps self in a ResizedView at least min_width wide.
Source§

fn min_height(self, min_height: usize) -> ResizedView<Self>

Wraps self in a ResizedView at least min_height tall.
Source§

impl<T> Scrollable for T
where T: View,

Source§

fn scrollable(self) -> ScrollView<Self>

Wraps self in a ScrollView.
Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(value: T, _simd: S) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> With for T

Source§

fn wrap_with<U, F>(self, f: F) -> U
where F: FnOnce(Self) -> U,

Calls the given closure and return the result. Read more
Source§

fn with<F>(self, f: F) -> Self
where F: FnOnce(&mut Self),

Calls the given closure on self.
Source§

fn try_with<E, F>(self, f: F) -> Result<Self, E>
where F: FnOnce(&mut Self) -> Result<(), E>,

Calls the given closure on self.
Source§

fn with_if<F>(self, condition: bool, f: F) -> Self
where F: FnOnce(&mut Self),

Calls the given closure if condition == true.
Source§

impl<T> ErasedDestructor for T
where T: 'static,