1use {
2 cursive::{view::*, views::*, *},
3 cursive_image::*,
4};
5
6const FILE: &str = "assets/media/example.pdf";
8const NAME: &str = "Image";
9
10fn main() {
11 let mut cursive = default();
12
13 let images = Image::new_owned_from_pdf_file(FILE, ImageFormat::PNG, 1.5, 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}
37
38struct Pages {
39 images: Vec<Option<Image>>,
40 index: usize,
41}
42
43impl Pages {
44 pub fn new(images: Vec<Image>) -> Self {
45 Self { images: images.into_iter().map(|image| Some(image)).collect(), index: 0 }
46 }
47}
48
49fn flip_page(cursive: &mut Cursive, delta: isize) {
50 let new_index = {
51 let pages: &mut Pages = cursive.user_data().unwrap();
52 if let Some(index) = pages.index.checked_add_signed(delta)
53 && index < pages.images.len()
54 {
55 Some(index)
56 } else {
57 None
58 }
59 };
60
61 if let Some(new_index) = new_index {
62 select_page(cursive, new_index);
63 }
64}
65
66fn select_page(cursive: &mut Cursive, index: usize) {
67 unset_page(cursive);
68 set_page(cursive, index);
69}
70
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}
79
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 _ = image.hide();
84 let pages: &mut Pages = cursive.user_data().unwrap();
85 pages.images[pages.index] = Some(image);
86 }
87}