1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
pub use rfd::*;

#[cfg(not(target_os = "linux"))]
macro_rules! run_dialog {
  ($e:expr, $h: ident) => {{
    std::thread::spawn(move || {
      let response = $e;
      $h(response);
    });
  }};
}

#[cfg(target_os = "linux")]
macro_rules! run_dialog {
  ($e:expr, $h: ident) => {{
    std::thread::spawn(move || {
      let context = glib::MainContext::default();
      context.invoke_with_priority(glib::PRIORITY_HIGH, move || {
        let response = $e;
        $h(response);
      });
    });
  }};
}

/// # 运行dialog
/// ```rust
/// use e_utils::dialog::*;
/// fn main() {
///     dialog(
///       "测试",
///       "通知",
///       MessageButtons::OkCancelCustom("确认".to_string(), "取消".to_string()),
///       MessageLevel::Info,
///       |x| match x {
///         MessageDialogResult::Yes => todo!(),
///         MessageDialogResult::No => todo!(),
///         MessageDialogResult::Ok => todo!(),
///         MessageDialogResult::Cancel => todo!(),
///         MessageDialogResult::Custom(_) => todo!(),
///       },
///     )
///   }
/// ```
#[allow(unused_variables)]
pub fn dialog<F: FnOnce(MessageDialogResult) + Send + 'static>(
  title: impl AsRef<str>,
  message: impl AsRef<str>,
  buttons: MessageButtons,
  level: MessageLevel,
  f: F,
) {
  let title = title.as_ref().to_string();
  let message = message.as_ref().to_string();
  #[allow(unused_mut)]
  let mut builder = MessageDialog::new()
    .set_title(&title)
    .set_description(&message)
    .set_buttons(buttons)
    .set_level(level.into());

  run_dialog!(builder.show(), f)
}
/// # 错误dialog
#[allow(unused_variables)]
pub fn dialog_err(title: impl AsRef<str>, message: impl AsRef<str>) {
  let msg = message.as_ref();
  dialog(
    title.as_ref(),
    msg,
    MessageButtons::Ok,
    MessageLevel::Error,
    |_|{},
  );
}