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 { ffi::pdf_thumbnail_view_set_thumbnail_size(self.handle.as_ptr(), size.width, size.height) };
61 }
62
63 pub fn set_maximum_number_of_columns(&self, value: usize) {
64 unsafe { ffi::pdf_thumbnail_view_set_maximum_number_of_columns(self.handle.as_ptr(), value as u64) };
65 }
66
67 pub fn set_allows_dragging(&self, value: bool) {
68 unsafe { ffi::pdf_thumbnail_view_set_allows_dragging(self.handle.as_ptr(), i32::from(value)) };
69 }
70
71 pub fn set_allows_multiple_selection(&self, value: bool) {
72 unsafe {
73 ffi::pdf_thumbnail_view_set_allows_multiple_selection(self.handle.as_ptr(), i32::from(value));
74 };
75 }
76
77 #[must_use]
78 pub fn selected_page_count(&self) -> usize {
79 unsafe { ffi::pdf_thumbnail_view_selected_page_count(self.handle.as_ptr()) as usize }
80 }
81
82 #[must_use]
83 pub fn selected_page(&self, index: usize) -> Option<PdfPage> {
84 let ptr = unsafe { ffi::pdf_thumbnail_view_selected_page_at(self.handle.as_ptr(), index as u64) };
85 unsafe { ObjectHandle::from_retained_ptr(ptr) }.map(PdfPage::from_handle)
86 }
87
88 #[must_use]
89 pub fn selected_pages(&self) -> Vec<PdfPage> {
90 (0..self.selected_page_count())
91 .filter_map(|index| self.selected_page(index))
92 .collect()
93 }
94}