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:
Kamil Jarosz 2024-08-29 23:27:47 +02:00
parent 5cdf4c8030
commit fc13643cc8
5 changed files with 86 additions and 1 deletions

View File

@ -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.

View File

@ -1,6 +1,6 @@
mod context_menu;
mod controller;
mod dialogs;
pub mod dialogs;
mod menu_bar;
mod movie;
mod picker;

View File

@ -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;
}
}
}

View File

@ -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
}
}

View File

@ -268,6 +268,7 @@ impl ActivePlayer {
.with_ui(
DesktopUiBackend::new(
window.clone(),
event_loop.clone(),
opt.open_url_mode,
font_database,
preferences,