ravenrs_widgets/
clipboard.rs1use std::cell::RefCell;
4use std::fmt;
5use std::rc::Rc;
6
7pub trait ClipboardProvider {
10 fn read_text(&self) -> Option<String>;
13 fn write_text(&self, text: &str);
15}
16
17#[derive(Debug, Default)]
19#[cfg_attr(feature = "live", ravenrs_live::expose(part = "fields"))]
20pub struct MemoryClipboard(RefCell<Option<String>>);
21
22impl ClipboardProvider for MemoryClipboard {
23 fn read_text(&self) -> Option<String> {
24 self.0.borrow().clone()
25 }
26
27 fn write_text(&self, text: &str) {
28 *self.0.borrow_mut() = Some(text.to_owned());
29 }
30}
31
32#[derive(Clone)]
43#[cfg_attr(feature = "live", ravenrs_live::expose(part = "fields"))]
44pub struct Clipboard(Rc<dyn ClipboardProvider>);
45
46#[cfg_attr(feature = "live", ravenrs_live::expose)]
47impl Clipboard {
48 pub fn new(provider: impl ClipboardProvider + 'static) -> Self {
50 Self(Rc::new(provider))
51 }
52
53 pub fn read(&self) -> Option<String> {
55 self.0.read_text()
56 }
57
58 pub fn write(&self, text: &str) {
60 self.0.write_text(text);
61 }
62}
63
64impl Default for Clipboard {
65 fn default() -> Self {
66 Self::new(MemoryClipboard::default())
67 }
68}
69
70impl fmt::Debug for Clipboard {
71 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
72 f.write_str("Clipboard")
73 }
74}