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 context_menu;
|
||||||
mod controller;
|
mod controller;
|
||||||
mod dialogs;
|
pub mod dialogs;
|
||||||
mod menu_bar;
|
mod menu_bar;
|
||||||
mod movie;
|
mod movie;
|
||||||
mod picker;
|
mod picker;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
mod about_dialog;
|
mod about_dialog;
|
||||||
mod bookmarks_dialog;
|
mod bookmarks_dialog;
|
||||||
|
pub mod message_dialog;
|
||||||
mod open_dialog;
|
mod open_dialog;
|
||||||
mod open_url_dialog;
|
mod open_url_dialog;
|
||||||
mod preferences_dialog;
|
mod preferences_dialog;
|
||||||
|
@ -9,6 +10,7 @@ use crate::custom_event::RuffleEvent;
|
||||||
use crate::player::LaunchOptions;
|
use crate::player::LaunchOptions;
|
||||||
use crate::preferences::GlobalPreferences;
|
use crate::preferences::GlobalPreferences;
|
||||||
use bookmarks_dialog::{BookmarkAddDialog, BookmarksDialog};
|
use bookmarks_dialog::{BookmarkAddDialog, BookmarksDialog};
|
||||||
|
use message_dialog::{MessageDialog, MessageDialogConfiguration};
|
||||||
use open_dialog::OpenDialog;
|
use open_dialog::OpenDialog;
|
||||||
use open_url_dialog::OpenUrlDialog;
|
use open_url_dialog::OpenUrlDialog;
|
||||||
use preferences_dialog::PreferencesDialog;
|
use preferences_dialog::PreferencesDialog;
|
||||||
|
@ -29,6 +31,7 @@ pub struct Dialogs {
|
||||||
bookmarks_dialog: Option<BookmarksDialog>,
|
bookmarks_dialog: Option<BookmarksDialog>,
|
||||||
bookmark_add_dialog: Option<BookmarkAddDialog>,
|
bookmark_add_dialog: Option<BookmarkAddDialog>,
|
||||||
open_url_dialog: Option<OpenUrlDialog>,
|
open_url_dialog: Option<OpenUrlDialog>,
|
||||||
|
message_dialog: Option<MessageDialog>,
|
||||||
|
|
||||||
open_dialog: OpenDialog,
|
open_dialog: OpenDialog,
|
||||||
is_open_dialog_visible: bool,
|
is_open_dialog_visible: bool,
|
||||||
|
@ -43,6 +46,7 @@ pub struct Dialogs {
|
||||||
|
|
||||||
pub enum DialogDescriptor {
|
pub enum DialogDescriptor {
|
||||||
OpenUrl(url::Url),
|
OpenUrl(url::Url),
|
||||||
|
ShowMessage(MessageDialogConfiguration),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Dialogs {
|
impl Dialogs {
|
||||||
|
@ -59,6 +63,7 @@ impl Dialogs {
|
||||||
bookmarks_dialog: None,
|
bookmarks_dialog: None,
|
||||||
bookmark_add_dialog: None,
|
bookmark_add_dialog: None,
|
||||||
open_url_dialog: None,
|
open_url_dialog: None,
|
||||||
|
message_dialog: None,
|
||||||
|
|
||||||
open_dialog: OpenDialog::new(
|
open_dialog: OpenDialog::new(
|
||||||
player_options,
|
player_options,
|
||||||
|
@ -130,6 +135,9 @@ impl Dialogs {
|
||||||
DialogDescriptor::OpenUrl(url) => {
|
DialogDescriptor::OpenUrl(url) => {
|
||||||
self.open_url_dialog = Some(OpenUrlDialog::new(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_volume_controls(locale, egui_ctx, player);
|
||||||
self.show_about_dialog(locale, egui_ctx);
|
self.show_about_dialog(locale, egui_ctx);
|
||||||
self.show_open_url_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) {
|
fn show_open_dialog(&mut self, locale: &LanguageIdentifier, egui_ctx: &egui::Context) {
|
||||||
|
@ -219,4 +228,15 @@ impl Dialogs {
|
||||||
self.open_url_dialog = None;
|
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(
|
.with_ui(
|
||||||
DesktopUiBackend::new(
|
DesktopUiBackend::new(
|
||||||
window.clone(),
|
window.clone(),
|
||||||
|
event_loop.clone(),
|
||||||
opt.open_url_mode,
|
opt.open_url_mode,
|
||||||
font_database,
|
font_database,
|
||||||
preferences,
|
preferences,
|
||||||
|
|
Loading…
Reference in New Issue