desktop: Implement MessageDialog in egui
The implemented MessageDialog is meant to replace the rfd MessageDialog in order to be consistent with other UI elements.
This commit is contained in:
parent
5cdf4c8030
commit
fc13643cc8
|
@ -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.
|
|
@ -1,6 +1,6 @@
|
|||
mod context_menu;
|
||||
mod controller;
|
||||
mod dialogs;
|
||||
pub mod dialogs;
|
||||
mod menu_bar;
|
||||
mod movie;
|
||||
mod picker;
|
||||
|
|
|
@ -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<BookmarksDialog>,
|
||||
bookmark_add_dialog: Option<BookmarkAddDialog>,
|
||||
open_url_dialog: Option<OpenUrlDialog>,
|
||||
message_dialog: Option<MessageDialog>,
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -268,6 +268,7 @@ impl ActivePlayer {
|
|||
.with_ui(
|
||||
DesktopUiBackend::new(
|
||||
window.clone(),
|
||||
event_loop.clone(),
|
||||
opt.open_url_mode,
|
||||
font_database,
|
||||
preferences,
|
||||
|
|
Loading…
Reference in New Issue