1use std::time::Duration;
2
3use crate::Task;
4
5pub struct Effect<M> {
7 task: Task<M>,
8 popover: Option<PopoverRequest>,
9 nudge: Option<NudgeRequest>,
10}
11
12#[doc(hidden)]
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14pub enum PopoverRequest {
15 Open,
16 Close,
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq)]
26pub enum Nudge {
27 Up,
28 Down,
29 Left,
30 Right,
31}
32
33#[doc(hidden)]
36#[derive(Debug, Clone, Copy, PartialEq, Eq)]
37pub struct NudgeRequest {
38 pub nudge: Nudge,
39 pub lasting: Option<Duration>,
40}
41
42impl From<Nudge> for NudgeRequest {
43 fn from(nudge: Nudge) -> Self {
44 Self {
45 nudge,
46 lasting: None,
47 }
48 }
49}
50
51impl<M> Effect<M> {
52 pub fn none() -> Self {
53 Self {
54 task: Task::none(),
55 popover: None,
56 nudge: None,
57 }
58 }
59
60 pub fn task(task: Task<M>) -> Self {
61 Self {
62 task,
63 popover: None,
64 nudge: None,
65 }
66 }
67
68 pub fn and_task(mut self, task: Task<M>) -> Self
70 where
71 M: Send + 'static,
72 {
73 self.task = Task::batch([self.task, task]);
74 self
75 }
76
77 pub fn open_popover(mut self) -> Self {
80 self.popover = Some(PopoverRequest::Open);
81 self
82 }
83
84 pub fn close_popover(mut self) -> Self {
85 self.popover = Some(PopoverRequest::Close);
86 self
87 }
88
89 pub fn nudge(mut self, nudge: Nudge) -> Self {
91 self.nudge = Some(NudgeRequest {
92 nudge,
93 lasting: None,
94 });
95 self
96 }
97
98 pub fn nudge_lasting(mut self, nudge: Nudge, lasting: Duration) -> Self {
102 self.nudge = Some(NudgeRequest {
103 nudge,
104 lasting: Some(lasting),
105 });
106 self
107 }
108
109 #[doc(hidden)]
110 pub fn into_parts(self) -> (Task<M>, Option<PopoverRequest>, Option<NudgeRequest>) {
111 (self.task, self.popover, self.nudge)
112 }
113}
114
115impl<M> From<Task<M>> for Effect<M> {
116 fn from(task: Task<M>) -> Self {
117 Self::task(task)
118 }
119}