Skip to main content

pdfkit/
thumbnail_view.rs

1use std::ptr;
2
3use crate::error::Result;
4use crate::ffi;
5use crate::handle::ObjectHandle;
6use crate::page::PdfPage;
7use crate::types::{PdfSize, PdfThumbnailViewInfo};
8use crate::util::parse_json;
9use crate::view::PdfView;
10
11#[derive(Debug, Clone)]
12pub struct PdfThumbnailView {
13    handle: ObjectHandle,
14}
15
16impl PdfThumbnailView {
17    pub(crate) fn from_handle(handle: ObjectHandle) -> Self {
18        Self { handle }
19    }
20
21    pub fn new(size: PdfSize) -> Result<Self> {
22        let mut out_view = ptr::null_mut();
23        let mut out_error = ptr::null_mut();
24        let status = unsafe {
25            ffi::pdf_thumbnail_view_new(size.width, size.height, &mut out_view, &mut out_error)
26        };
27        crate::util::status_result(status, out_error)?;
28        Ok(Self::from_handle(crate::util::required_handle(
29            out_view,
30            "PDFThumbnailView",
31        )?))
32    }
33
34    pub fn info(&self) -> Result<PdfThumbnailViewInfo> {
35        parse_json(
36            unsafe { ffi::pdf_thumbnail_view_info_json(self.handle.as_ptr()) },
37            "PDFThumbnailView",
38        )
39    }
40
41    #[must_use]
42    pub fn pdf_view(&self) -> Option<PdfView> {
43        let ptr = unsafe { ffi::pdf_thumbnail_view_pdf_view(self.handle.as_ptr()) };
44        unsafe { ObjectHandle::from_retained_ptr(ptr) }.map(PdfView::from_handle)
45    }
46
47    pub fn set_pdf_view(&self, pdf_view: Option<&PdfView>) -> Result<()> {
48        let mut out_error = ptr::null_mut();
49        let status = unsafe {
50            ffi::pdf_thumbnail_view_set_pdf_view(
51                self.handle.as_ptr(),
52                pdf_view.map_or(ptr::null_mut(), PdfView::as_handle_ptr),
53                &mut out_error,
54            )
55        };
56        crate::util::status_result(status, out_error)
57    }
58
59    pub fn set_thumbnail_size(&self, size: PdfSize) {
60        unsafe {
61            ffi::pdf_thumbnail_view_set_thumbnail_size(
62                self.handle.as_ptr(),
63                size.width,
64                size.height,
65            );
66        };
67    }
68
69    pub fn set_maximum_number_of_columns(&self, value: usize) {
70        unsafe {
71            ffi::pdf_thumbnail_view_set_maximum_number_of_columns(
72                self.handle.as_ptr(),
73                value as u64,
74            );
75        };
76    }
77
78    pub fn set_allows_dragging(&self, value: bool) {
79        unsafe {
80            ffi::pdf_thumbnail_view_set_allows_dragging(self.handle.as_ptr(), i32::from(value));
81        };
82    }
83
84    pub fn set_allows_multiple_selection(&self, value: bool) {
85        unsafe {
86            ffi::pdf_thumbnail_view_set_allows_multiple_selection(
87                self.handle.as_ptr(),
88                i32::from(value),
89            );
90        };
91    }
92
93    #[must_use]
94    pub fn selected_page_count(&self) -> usize {
95        unsafe { ffi::pdf_thumbnail_view_selected_page_count(self.handle.as_ptr()) as usize }
96    }
97
98    #[must_use]
99    pub fn selected_page(&self, index: usize) -> Option<PdfPage> {
100        let ptr =
101            unsafe { ffi::pdf_thumbnail_view_selected_page_at(self.handle.as_ptr(), index as u64) };
102        unsafe { ObjectHandle::from_retained_ptr(ptr) }.map(PdfPage::from_handle)
103    }
104
105    #[must_use]
106    pub fn selected_pages(&self) -> Vec<PdfPage> {
107        (0..self.selected_page_count())
108            .filter_map(|index| self.selected_page(index))
109            .collect()
110    }
111}