flip_ui/
lib.rs

1// Generate docs from readme
2#![doc = include_str!("../README.md")]
3#![no_std]
4#![no_main]
5
6// export proc macro
7pub use flip_ui_macro::flip_ui;
8
9use core::marker::PhantomData;
10
11use flipperzero::{
12    dialogs::{DialogFileBrowserOptions, DialogMessage, DialogMessageButton, DialogsApp},
13    furi::string::FuriString,
14};
15
16pub struct InputDialog<'a> {
17    phantom: PhantomData<&'a ()>,
18}
19
20pub enum View<'a> {
21    Message(DialogMessage<'a>),
22    Alert(DialogMessage<'a>),
23    Browser(DialogFileBrowserOptions<'a>),
24    Input(self::InputDialog<'a>),
25}
26
27pub enum Event {
28    Back,
29    MessageLeft,
30    MessageRight,
31    MessageCenter,
32    AlertOk,
33    BrowserSelect(FuriString),
34    Input(FuriString),
35}
36
37impl<'a> View<'a> {
38    pub fn show(&self, app: &mut DialogsApp) -> Event {
39        match self {
40            View::Message(dialog) => match app.show_message(dialog) {
41                DialogMessageButton::Back => Event::Back,
42                DialogMessageButton::Left => Event::MessageLeft,
43                DialogMessageButton::Right => Event::MessageRight,
44                DialogMessageButton::Center => Event::MessageCenter,
45            },
46            View::Alert(dialog) => match app.show_message(dialog) {
47                DialogMessageButton::Center => Event::AlertOk,
48                DialogMessageButton::Back => Event::Back,
49                _ => unreachable!(),
50            },
51            // todo: add browser to macro
52            View::Browser(dialog) => match app.show_file_browser(None, Some(dialog)) {
53                Some(path) => Event::BrowserSelect(path),
54                None => Event::Back,
55            },
56            // todo: add everything
57            View::Input(_) => Event::Input(FuriString::new()),
58        }
59    }
60}