use crate::backend::AsyncMessageDialogImpl;
use crate::backend::MessageDialogImpl;
use std::future::Future;
use raw_window_handle::{HasRawWindowHandle, RawWindowHandle};
#[derive(Default, Debug, Clone)]
pub struct MessageDialog {
pub(crate) title: String,
pub(crate) description: String,
pub(crate) level: MessageLevel,
pub(crate) buttons: MessageButtons,
pub(crate) parent: Option<RawWindowHandle>,
}
unsafe impl Send for MessageDialog {}
impl MessageDialog {
pub fn new() -> Self {
Default::default()
}
pub fn set_level(mut self, level: MessageLevel) -> Self {
self.level = level;
self
}
pub fn set_title(mut self, text: &str) -> Self {
self.title = text.into();
self
}
pub fn set_description(mut self, text: &str) -> Self {
self.description = text.into();
self
}
pub fn set_buttons(mut self, btn: MessageButtons) -> Self {
self.buttons = btn;
self
}
pub fn set_parent<W: HasRawWindowHandle>(mut self, parent: &W) -> Self {
self.parent = Some(parent.raw_window_handle());
self
}
pub fn show(self) -> bool {
MessageDialogImpl::show(self)
}
}
#[derive(Default, Debug, Clone)]
pub struct AsyncMessageDialog(MessageDialog);
impl AsyncMessageDialog {
pub fn new() -> Self {
Default::default()
}
pub fn set_level(mut self, level: MessageLevel) -> Self {
self.0 = self.0.set_level(level);
self
}
pub fn set_title(mut self, text: &str) -> Self {
self.0 = self.0.set_title(text);
self
}
pub fn set_description(mut self, text: &str) -> Self {
self.0 = self.0.set_description(text);
self
}
pub fn set_buttons(mut self, btn: MessageButtons) -> Self {
self.0 = self.0.set_buttons(btn);
self
}
pub fn set_parent<W: HasRawWindowHandle>(mut self, parent: &W) -> Self {
self.0 = self.0.set_parent(parent);
self
}
pub fn show(self) -> impl Future<Output = bool> {
AsyncMessageDialogImpl::show_async(self.0)
}
}
#[derive(Debug, Clone, Copy)]
pub enum MessageLevel {
Info,
Warning,
Error,
}
impl Default for MessageLevel {
fn default() -> Self {
Self::Info
}
}
#[derive(Debug, Clone, Copy)]
pub enum MessageButtons {
Ok,
OkCancel,
YesNo,
}
impl Default for MessageButtons {
fn default() -> Self {
Self::Ok
}
}