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