Skip to main content

ferroui_base/input/
data_transfer_item_extensions.rs

1use super::{DataFormat, DataFormatOf, IDataTransferItem};
2use crate::media::imaging::Bitmap;
3use crate::platform::storage::IStorageItem;
4use std::rc::Rc;
5
6/// Contains extension methods for [`IDataTransferItem`].
7pub trait DataTransferItemExtensions: IDataTransferItem {
8    /// Gets whether the item supports a specific format.
9    fn contains(&self, format: &DataFormat) -> bool {
10        self.formats().iter().any(|candidate| candidate == format)
11    }
12
13    /// Tries to get a value for a given format from the item. Returns
14    /// `None` if the format is not supported.
15    fn try_get_value<T: Clone + 'static>(&self, format: &DataFormatOf<T>) -> Option<T> {
16        self.try_get_raw(format).and_then(|value| value.downcast_ref::<T>().cloned())
17    }
18
19    /// Returns a text, if available, from the item.
20    fn try_get_text(&self) -> Option<String> {
21        self.try_get_value(&DataFormat::text())
22    }
23
24    /// Returns a bitmap, if available, from the item.
25    fn try_get_bitmap(&self) -> Option<Rc<Bitmap>> {
26        self.try_get_value(&DataFormat::bitmap())
27    }
28
29    /// Returns a file (or folder), if available, from the item.
30    ///
31    /// See [`DataFormat::file`].
32    fn try_get_file(&self) -> Option<Rc<dyn IStorageItem>> {
33        self.try_get_value(&DataFormat::file())
34    }
35}
36
37impl<I: IDataTransferItem + ?Sized> DataTransferItemExtensions for I {}