ferrishot_iced_core/
shell.rs1use crate::InputMethod;
2use crate::event;
3use crate::window;
4
5#[derive(Debug)]
12pub struct Shell<'a, Message> {
13 messages: &'a mut Vec<Message>,
14 event_status: event::Status,
15 redraw_request: window::RedrawRequest,
16 input_method: InputMethod,
17 is_layout_invalid: bool,
18 are_widgets_invalid: bool,
19}
20
21impl<'a, Message> Shell<'a, Message> {
22 pub fn new(messages: &'a mut Vec<Message>) -> Self {
24 Self {
25 messages,
26 event_status: event::Status::Ignored,
27 redraw_request: window::RedrawRequest::Wait,
28 is_layout_invalid: false,
29 are_widgets_invalid: false,
30 input_method: InputMethod::Disabled,
31 }
32 }
33
34 pub fn is_empty(&self) -> bool {
36 self.messages.is_empty()
37 }
38
39 pub fn publish(&mut self, message: Message) {
41 self.messages.push(message);
42 }
43
44 pub fn capture_event(&mut self) {
49 self.event_status = event::Status::Captured;
50 }
51
52 pub fn event_status(&self) -> event::Status {
54 self.event_status
55 }
56
57 pub fn is_event_captured(&self) -> bool {
59 self.event_status == event::Status::Captured
60 }
61
62 pub fn request_redraw(&mut self) {
64 self.redraw_request = window::RedrawRequest::NextFrame;
65 }
66
67 pub fn request_redraw_at(
69 &mut self,
70 redraw_request: impl Into<window::RedrawRequest>,
71 ) {
72 self.redraw_request = self.redraw_request.min(redraw_request.into());
73 }
74
75 pub fn redraw_request(&self) -> window::RedrawRequest {
77 self.redraw_request
78 }
79
80 pub fn replace_redraw_request(
86 shell: &mut Self,
87 redraw_request: window::RedrawRequest,
88 ) {
89 shell.redraw_request = redraw_request;
90 }
91
92 pub fn request_input_method<T: AsRef<str>>(
97 &mut self,
98 ime: &InputMethod<T>,
99 ) {
100 self.input_method.merge(ime);
101 }
102
103 pub fn input_method(&self) -> &InputMethod {
105 &self.input_method
106 }
107
108 pub fn input_method_mut(&mut self) -> &mut InputMethod {
110 &mut self.input_method
111 }
112
113 pub fn is_layout_invalid(&self) -> bool {
115 self.is_layout_invalid
116 }
117
118 pub fn invalidate_layout(&mut self) {
122 self.is_layout_invalid = true;
123 }
124
125 pub fn revalidate_layout(&mut self, f: impl FnOnce()) {
128 if self.is_layout_invalid {
129 self.is_layout_invalid = false;
130
131 f();
132 }
133 }
134
135 pub fn are_widgets_invalid(&self) -> bool {
138 self.are_widgets_invalid
139 }
140
141 pub fn invalidate_widgets(&mut self) {
145 self.are_widgets_invalid = true;
146 }
147
148 pub fn merge<B>(&mut self, other: Shell<'_, B>, f: impl Fn(B) -> Message) {
153 self.messages.extend(other.messages.drain(..).map(f));
154
155 self.is_layout_invalid =
156 self.is_layout_invalid || other.is_layout_invalid;
157
158 self.are_widgets_invalid =
159 self.are_widgets_invalid || other.are_widgets_invalid;
160
161 self.redraw_request = self.redraw_request.min(other.redraw_request);
162 self.event_status = self.event_status.merge(other.event_status);
163 self.input_method.merge(&other.input_method);
164 }
165}