diff --git a/desktop/assets/texts/en-US/message_dialogs.ftl b/desktop/assets/texts/en-US/message_dialogs.ftl new file mode 100644 index 000000000..4dee65970 --- /dev/null +++ b/desktop/assets/texts/en-US/message_dialogs.ftl @@ -0,0 +1,2 @@ +message-dialog-root-movie-load-error-title = Movie Failed to Load +message-dialog-root-movie-load-error-description = Failed to open or download this movie. diff --git a/desktop/src/gui.rs b/desktop/src/gui.rs index 635a53246..4017fdad2 100644 --- a/desktop/src/gui.rs +++ b/desktop/src/gui.rs @@ -1,6 +1,6 @@ mod context_menu; mod controller; -mod dialogs; +pub mod dialogs; mod menu_bar; mod movie; mod picker; diff --git a/desktop/src/gui/dialogs.rs b/desktop/src/gui/dialogs.rs index 71c9ef8fe..69cf922af 100644 --- a/desktop/src/gui/dialogs.rs +++ b/desktop/src/gui/dialogs.rs @@ -1,5 +1,6 @@ mod about_dialog; mod bookmarks_dialog; +pub mod message_dialog; mod open_dialog; mod open_url_dialog; mod preferences_dialog; @@ -9,6 +10,7 @@ use crate::custom_event::RuffleEvent; use crate::player::LaunchOptions; use crate::preferences::GlobalPreferences; use bookmarks_dialog::{BookmarkAddDialog, BookmarksDialog}; +use message_dialog::{MessageDialog, MessageDialogConfiguration}; use open_dialog::OpenDialog; use open_url_dialog::OpenUrlDialog; use preferences_dialog::PreferencesDialog; @@ -29,6 +31,7 @@ pub struct Dialogs { bookmarks_dialog: Option, bookmark_add_dialog: Option, open_url_dialog: Option, + message_dialog: Option, open_dialog: OpenDialog, is_open_dialog_visible: bool, @@ -43,6 +46,7 @@ pub struct Dialogs { pub enum DialogDescriptor { OpenUrl(url::Url), + ShowMessage(MessageDialogConfiguration), } impl Dialogs { @@ -59,6 +63,7 @@ impl Dialogs { bookmarks_dialog: None, bookmark_add_dialog: None, open_url_dialog: None, + message_dialog: None, open_dialog: OpenDialog::new( player_options, @@ -130,6 +135,9 @@ impl Dialogs { DialogDescriptor::OpenUrl(url) => { self.open_url_dialog = Some(OpenUrlDialog::new(url)); } + DialogDescriptor::ShowMessage(config) => { + self.message_dialog = Some(MessageDialog::new(config)); + } } } @@ -146,6 +154,7 @@ impl Dialogs { self.show_volume_controls(locale, egui_ctx, player); self.show_about_dialog(locale, egui_ctx); self.show_open_url_dialog(locale, egui_ctx); + self.show_message_dialog(locale, egui_ctx); } fn show_open_dialog(&mut self, locale: &LanguageIdentifier, egui_ctx: &egui::Context) { @@ -219,4 +228,15 @@ impl Dialogs { self.open_url_dialog = None; } } + + fn show_message_dialog(&mut self, locale: &LanguageIdentifier, egui_ctx: &egui::Context) { + let keep_open = if let Some(dialog) = &mut self.message_dialog { + dialog.show(locale, egui_ctx) + } else { + true + }; + if !keep_open { + self.message_dialog = None; + } + } } diff --git a/desktop/src/gui/dialogs/message_dialog.rs b/desktop/src/gui/dialogs/message_dialog.rs new file mode 100644 index 000000000..9bd11341c --- /dev/null +++ b/desktop/src/gui/dialogs/message_dialog.rs @@ -0,0 +1,62 @@ +use crate::gui::{text, LocalizableText}; +use egui::{Align2, Ui, Window}; +use unic_langid::LanguageIdentifier; + +pub struct MessageDialogConfiguration { + title: LocalizableText, + body: LocalizableText, +} + +impl MessageDialogConfiguration { + pub fn new(title: LocalizableText, body: LocalizableText) -> Self { + Self { title, body } + } +} + +pub struct MessageDialog { + config: MessageDialogConfiguration, +} + +impl MessageDialog { + pub fn new(config: MessageDialogConfiguration) -> Self { + Self { config } + } + + pub fn show(&mut self, locale: &LanguageIdentifier, egui_ctx: &egui::Context) -> bool { + let mut keep_open = true; + let mut should_close = false; + + Window::new(self.config.title.localize(locale)) + .open(&mut keep_open) + .anchor(Align2::CENTER_CENTER, egui::Vec2::ZERO) + .collapsible(false) + .resizable(false) + .show(egui_ctx, |ui| { + egui::ScrollArea::vertical().show(ui, |ui| { + should_close = self.render_window_contents(locale, ui) + }); + }); + + keep_open && !should_close + } + + pub fn render_window_contents(&mut self, locale: &LanguageIdentifier, ui: &mut Ui) -> bool { + let mut should_close = false; + + ui.vertical_centered(|ui| { + ui.label(""); + ui.label(self.config.body.localize(locale)); + ui.label(""); + }); + + ui.horizontal(|ui| { + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if ui.button(text(locale, "dialog-ok")).clicked() { + should_close = true; + } + }) + }); + + should_close + } +} diff --git a/desktop/src/player.rs b/desktop/src/player.rs index 05dbd718e..dd32d6daf 100644 --- a/desktop/src/player.rs +++ b/desktop/src/player.rs @@ -268,6 +268,7 @@ impl ActivePlayer { .with_ui( DesktopUiBackend::new( window.clone(), + event_loop.clone(), opt.open_url_mode, font_database, preferences,