Skip to main content

pdf/
pdf.rs

1use {
2    cursive::{view::*, views::*, *},
3    cursive_image::*,
4};
5
6// (note that rendering PDF is slow for dev builds)
7const FILE: &str = "assets/media/example.pdf";
8const NAME: &str = "Image";
9
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}
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        let pages: &mut Pages = cursive.user_data().unwrap();
84        pages.images[pages.index] = Some(image);
85    }
86}