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)]
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 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 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 #[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 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 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 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 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 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 #[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 #[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 #[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}