pub struct Toast { /* private fields */ }Expand description
Represents a Windows toast.
See https://docs.microsoft.com/en-us/uwp/api/windows.ui.notifications.toastnotification
Implementations§
Source§impl Toast
impl Toast
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates an empty toast.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Sourcepub fn text1<T: Into<Text>>(&mut self, text: T) -> &mut Toast
pub fn text1<T: Into<Text>>(&mut self, text: T) -> &mut Toast
The first text element, usually the title.
§Example
// You can use anything that is Into<String>
toast.text1("text");
// Or you can use a `Text`
toast.text1(
Text::new("text").with_placement(TextPlacement::Attribution)
);Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Sourcepub fn text2<T: Into<Text>>(&mut self, text: T) -> &mut Toast
pub fn text2<T: Into<Text>>(&mut self, text: T) -> &mut Toast
The second text element, usually the body.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Sourcepub fn text3<T: Into<Text>>(&mut self, text: T) -> &mut Toast
pub fn text3<T: Into<Text>>(&mut self, text: T) -> &mut Toast
The third text element, usually the body or attribution.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Sourcepub fn image(&mut self, id: u8, image: Image) -> &mut Toast
pub fn image(&mut self, id: u8, image: Image) -> &mut Toast
Add an image with the corresponding ID to the toast.
§ID
The image element in the toast template that this image is intended for. If a template has only one image, then this value is 1. The number of available image positions is based on the template definition.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Sourcepub fn input(&mut self, input: Input) -> &mut Toast
pub fn input(&mut self, input: Input) -> &mut Toast
Add an input field to the toast.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Sourcepub fn selection(&mut self, selection: Selection) -> &mut Toast
pub fn selection(&mut self, selection: Selection) -> &mut Toast
Add a selection field to the toast.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Sourcepub fn action(&mut self, action: Action) -> &mut Toast
pub fn action(&mut self, action: Action) -> &mut Toast
Add a new action to the toast.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Sourcepub fn tag(&mut self, tag: impl Into<String>) -> &mut Toast
pub fn tag(&mut self, tag: impl Into<String>) -> &mut Toast
Set the tag of this toast.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Sourcepub fn remote_id(&mut self, remote_id: impl Into<String>) -> &mut Toast
pub fn remote_id(&mut self, remote_id: impl Into<String>) -> &mut Toast
Set a remote id for the notification that enables the system to correlate this notification with another one generated on another device.
Sourcepub fn scenario(&mut self, scenario: Scenario) -> &mut Toast
pub fn scenario(&mut self, scenario: Scenario) -> &mut Toast
Set the scenario of this toast.
The scenario adjusts a few behaviors to create a consistent and unified user experience.
Sourcepub fn launch(&mut self, launch: impl Into<String>) -> &mut Toast
pub fn launch(&mut self, launch: impl Into<String>) -> &mut Toast
A string that is passed to the application when it is activated by the toast.
The format and contents of this string are defined by the app for its own use. When the user taps or clicks the toast to launch its associated app, the launch string provides the context to the app that allows it to show the user a view relevant to the toast content, rather than launching in its default way.
Sourcepub fn duration(&mut self, duration: ToastDuration) -> &mut Toast
pub fn duration(&mut self, duration: ToastDuration) -> &mut Toast
The amount of time the toast should display.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}Enable the use of button style for this toast.
Sourcepub fn expires_in(&mut self, duration: Duration) -> &mut Toast
pub fn expires_in(&mut self, duration: Duration) -> &mut Toast
Set the expiration time of this toast, starting from the moment it is shown.
After expiration, the toast will be removed from the Notification Center.
Sourcepub fn audio(&mut self, audio: Audio) -> &mut Toast
pub fn audio(&mut self, audio: Audio) -> &mut Toast
Set the audio for this toast.
The audio will play when the toast is shown.
Examples found in repository?
15fn main() -> Result<()> {
16 let manager = ToastManager::new(ToastManager::POWERSHELL_AUM_ID);
17
18 let mut toast = Toast::new();
19
20 let hero_image =
21 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/flower.jpg"))?
22 .with_placement(ImagePlacement::Hero);
23
24 let icon_image =
25 Image::new_local(Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/images/cat.jpg"))?
26 .with_placement(ImagePlacement::AppLogoOverride)
27 .with_hint_crop(ImageHintCrop::Circle);
28
29 toast
30 .tag("example")
31 .text1("Title")
32 .text2(Text::new("Body"))
33 .text3(Text::new("Via SMS").with_placement(TextPlacement::Attribution))
34 .image(1, hero_image)
35 .image(2, icon_image)
36 .duration(ToastDuration::Long)
37 .audio(Audio::new(Sound::Looping(LoopingSound::Alarm5)).with_looping())
38 .input(
39 Input::new("box", InputType::Selection)
40 .with_title("Select an option")
41 .with_default_input("breakfast"),
42 )
43 .selection(Selection::new("breakfast", "Breakfast"))
44 .selection(Selection::new("lunch", "Lunch"))
45 .selection(Selection::new("dinner", "Dinner"))
46 .action(Action::new("Send", "send", "").with_input_id("box"))
47 .action(Action::new("Dismiss", "dismiss", ""));
48
49 // Clone the action_take atomic bool for the closures
50 // This is necessary because the closures are Fn/FnMut,
51 // and we need to be able to modify the action_take bool
52 // from within the closures
53 let action_take = Arc::new(AtomicBool::new(false));
54 let action_clone = Arc::clone(&action_take);
55 let dismiss_clone = Arc::clone(&action_take);
56
57 fn handle_activated_action(action: Option<ActivatedAction>) {
58 match action {
59 Some(action) => {
60 let message = format!(
61 "You clicked on {}{}!",
62 action.arg,
63 action
64 .values
65 .get(&action.input_id.unwrap_or_default())
66 .map_or(String::new(), |value| format!(", input = {value}"))
67 );
68 println!("{message}");
69 }
70 None => println!("You clicked me!"),
71 }
72 }
73
74 manager
75 .on_activated(Some("box"), move |action| {
76 handle_activated_action(action);
77 action_clone.store(true, Ordering::SeqCst);
78 })
79 .on_dismissed(move |reason| {
80 match reason {
81 Ok(r) if r.reason == DismissalReason::UserCanceled => println!("UserCanceled"),
82 Ok(r) if r.reason == DismissalReason::ApplicationHidden => {
83 println!("ApplicationHidden")
84 }
85 Ok(r) if r.reason == DismissalReason::TimedOut => println!("TimedOut"),
86 Ok(_r) => println!("Unknown dismissal reason"),
87 Err(e) => eprintln!("Error: {e:?}"),
88 }
89 dismiss_clone.store(true, Ordering::SeqCst);
90 })
91 .on_failed(|e| eprintln!("Error: {e:?}"))
92 .show(&toast)
93 .expect("Failed to show toast");
94
95 // Wait for the user to interact with the toast
96 let time_instant = Instant::now();
97 while time_instant.elapsed() < Duration::from_secs(25) {
98 if action_take.load(Ordering::SeqCst) {
99 break;
100 }
101 sleep(Duration::from_millis(100));
102 }
103
104 Ok(())
105}