use std::cell::RefCell;
use std::rc::Rc;
pub trait PlatformClipboard {
fn write_text(&self, text: &str);
fn read_text(&self) -> Option<String>;
}
pub(crate) struct ClipboardSessionState {
platform: RefCell<Option<Rc<dyn PlatformClipboard>>>,
fallback: RefCell<Option<String>>,
}
impl ClipboardSessionState {
pub(crate) fn new() -> Self {
Self {
platform: RefCell::new(None),
fallback: RefCell::new(None),
}
}
fn set_platform(&self, clipboard: Option<Rc<dyn PlatformClipboard>>) {
*self.platform.borrow_mut() = clipboard;
}
fn write(&self, text: &str) {
if let Some(platform) = self.platform.borrow().clone() {
platform.write_text(text);
} else {
*self.fallback.borrow_mut() = Some(text.to_string());
}
}
fn read(&self) -> Option<String> {
if let Some(platform) = self.platform.borrow().clone() {
platform.read_text()
} else {
self.fallback.borrow().clone()
}
}
}
pub fn set_platform_clipboard(clipboard: Rc<dyn PlatformClipboard>) {
crate::render_state::with_clipboard_session(|state| state.set_platform(Some(clipboard)));
}
pub fn clear_platform_clipboard() {
crate::render_state::with_clipboard_session(|state| state.set_platform(None));
}
pub fn clipboard_write_text(text: &str) {
crate::render_state::with_clipboard_session(|state| state.write(text));
}
pub fn clipboard_read_text() -> Option<String> {
crate::render_state::with_clipboard_session(|state| state.read())
}