use clipboard::{ClipboardContext, ClipboardProvider}; use rfd::{MessageButtons, MessageDialog, MessageLevel}; use ruffle_core::backend::ui::{Error, MouseCursor, UiBackend}; use std::rc::Rc; use winit::window::{Fullscreen, Window}; pub struct DesktopUiBackend { window: Rc, cursor_visible: bool, clipboard: ClipboardContext, } impl DesktopUiBackend { pub fn new(window: Rc) -> Self { Self { window, cursor_visible: true, clipboard: ClipboardProvider::new().unwrap(), } } } // TODO: Move link to https://ruffle.rs/faq or similar const UNSUPPORTED_CONTENT_MESSAGE: &str = "\ This content is not yet supported by Ruffle and will likely not run as intended. See the following link for more info: https://github.com/ruffle-rs/ruffle/wiki/Frequently-Asked-Questions-For-Users"; const DOWNLOAD_FAILED_MESSAGE: &str = "Ruffle failed to open or download this file."; impl UiBackend for DesktopUiBackend { fn mouse_visible(&self) -> bool { self.cursor_visible } fn set_mouse_visible(&mut self, visible: bool) { self.window.set_cursor_visible(visible); self.cursor_visible = visible; } fn set_mouse_cursor(&mut self, cursor: MouseCursor) { use winit::window::CursorIcon; let icon = match cursor { MouseCursor::Arrow => CursorIcon::Arrow, MouseCursor::Hand => CursorIcon::Hand, MouseCursor::IBeam => CursorIcon::Text, MouseCursor::Grab => CursorIcon::Grab, }; self.window.set_cursor_icon(icon); } fn set_clipboard_content(&mut self, content: String) { self.clipboard.set_contents(content).unwrap(); } fn set_fullscreen(&mut self, is_full: bool) -> Result<(), Error> { self.window.set_fullscreen(if is_full { Some(Fullscreen::Borderless(None)) } else { None }); Ok(()) } fn display_unsupported_message(&self) { let dialog = MessageDialog::new() .set_level(MessageLevel::Warning) .set_title("Ruffle - Unsupported content") .set_description(UNSUPPORTED_CONTENT_MESSAGE) .set_buttons(MessageButtons::Ok); dialog.show(); } fn display_root_movie_download_failed_message(&self) { let dialog = MessageDialog::new() .set_level(MessageLevel::Warning) .set_title("Ruffle - Load failed") .set_description(DOWNLOAD_FAILED_MESSAGE) .set_buttons(MessageButtons::Ok); dialog.show(); } fn message(&self, message: &str) { let dialog = MessageDialog::new() .set_level(MessageLevel::Info) .set_title("Ruffle") .set_description(message) .set_buttons(MessageButtons::Ok); dialog.show(); } }