1use std::time::Duration;
2
3use crate::Task;
4
5pub struct Effect<M> {
7 task: Task<M>,
8 popover: Option<PopoverRequest>,
9 dialog: Option<DialogRequest>,
10 nudge: Option<NudgeRequest>,
11}
12
13#[doc(hidden)]
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15pub enum PopoverRequest {
16 Open,
17 Close,
18}
19
20#[doc(hidden)]
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22pub enum DialogRequest {
23 Open,
24 Close,
25}
26
27#[derive(Debug, Clone, Copy, PartialEq, Eq)]
34pub enum Nudge {
35 Up,
36 Down,
37 Left,
38 Right,
39}
40
41#[doc(hidden)]
44#[derive(Debug, Clone, Copy, PartialEq, Eq)]
45pub struct NudgeRequest {
46 pub nudge: Nudge,
47 pub lasting: Option<Duration>,
48}
49
50impl From<Nudge> for NudgeRequest {
51 fn from(nudge: Nudge) -> Self {
52 Self {
53 nudge,
54 lasting: None,
55 }
56 }
57}
58
59impl<M> Effect<M> {
60 pub fn none() -> Self {
61 Self {
62 task: Task::none(),
63 popover: None,
64 dialog: None,
65 nudge: None,
66 }
67 }
68
69 pub fn task(task: Task<M>) -> Self {
70 Self {
71 task,
72 popover: None,
73 dialog: None,
74 nudge: None,
75 }
76 }
77
78 pub fn and_task(mut self, task: Task<M>) -> Self
80 where
81 M: Send + 'static,
82 {
83 self.task = Task::batch([self.task, task]);
84 self
85 }
86
87 pub fn open_popover(mut self) -> Self {
90 self.popover = Some(PopoverRequest::Open);
91 self
92 }
93
94 pub fn close_popover(mut self) -> Self {
95 self.popover = Some(PopoverRequest::Close);
96 self
97 }
98
99 pub fn open_dialog(mut self) -> Self {
106 self.dialog = Some(DialogRequest::Open);
107 self
108 }
109
110 pub fn close_dialog(mut self) -> Self {
111 self.dialog = Some(DialogRequest::Close);
112 self
113 }
114
115 pub fn nudge(mut self, nudge: Nudge) -> Self {
117 self.nudge = Some(NudgeRequest {
118 nudge,
119 lasting: None,
120 });
121 self
122 }
123
124 pub fn nudge_lasting(mut self, nudge: Nudge, lasting: Duration) -> Self {
128 self.nudge = Some(NudgeRequest {
129 nudge,
130 lasting: Some(lasting),
131 });
132 self
133 }
134
135 #[doc(hidden)]
136 pub fn into_parts(self) -> (Task<M>, Option<PopoverRequest>, Option<NudgeRequest>) {
137 (self.task, self.popover, self.nudge)
138 }
139
140 #[doc(hidden)]
143 pub fn dialog_request(&self) -> Option<DialogRequest> {
144 self.dialog
145 }
146}
147
148impl<M> From<Task<M>> for Effect<M> {
149 fn from(task: Task<M>) -> Self {
150 Self::task(task)
151 }
152}