ferroui_base/input/
data_transfer_extensions.rs1use super::{DataFormat, DataFormatOf, DataTransferItemExtensions, IDataTransfer, IDataTransferItem};
2use crate::media::imaging::Bitmap;
3use crate::platform::storage::IStorageItem;
4use std::rc::Rc;
5
6pub struct DataTransferItems {
8 items: Rc<[Rc<dyn IDataTransferItem>]>,
9 format: DataFormat,
10 index: usize,
11}
12
13impl Iterator for DataTransferItems {
14 type Item = Rc<dyn IDataTransferItem>;
15
16 fn next(&mut self) -> Option<Self::Item> {
17 while let Some(item) = self.items.get(self.index) {
18 self.index += 1;
19 if item.contains(&self.format) {
20 return Some(item.clone());
21 }
22 }
23 None
24 }
25}
26
27pub trait DataTransferExtensions: IDataTransfer {
32 fn contains(&self, format: &DataFormat) -> bool {
34 self.formats().iter().any(|candidate| candidate == format)
35 }
36
37 fn get_items(&self, format: &DataFormat) -> DataTransferItems {
43 DataTransferItems { items: self.items(), format: format.clone(), index: 0 }
44 }
45
46 fn try_get_value<T: Clone + 'static>(&self, format: &DataFormatOf<T>) -> Option<T> {
52 self.get_items(format).next().and_then(|item| item.try_get_value(format))
53 }
54
55 fn try_get_values<T: Clone + 'static>(&self, format: &DataFormatOf<T>) -> Option<Vec<T>> {
58 let mut results: Option<Vec<T>> = None;
59
60 for item in self.get_items(format) {
61 let Some(result) = item.try_get_value(format) else { continue };
62 results.get_or_insert_with(Vec::new).push(result);
63 }
64
65 results
66 }
67
68 fn try_get_text(&self) -> Option<String> {
73 self.try_get_value(&DataFormat::text())
74 }
75
76 fn try_get_bitmap(&self) -> Option<Rc<Bitmap>> {
81 self.try_get_value(&DataFormat::bitmap())
82 }
83
84 fn try_get_file(&self) -> Option<Rc<dyn IStorageItem>> {
88 self.try_get_value(&DataFormat::file())
89 }
90
91 fn try_get_files(&self) -> Option<Vec<Rc<dyn IStorageItem>>> {
96 self.try_get_values(&DataFormat::file())
97 }
98}
99
100impl<I: IDataTransfer + ?Sized> DataTransferExtensions for I {}