diff options
author | 2025-02-03 22:49:28 +0100 | |
---|---|---|
committer | 2025-02-03 22:49:28 +0100 | |
commit | 5ab056318e7c2db981f008bd65d9e0b2aacb46c5 (patch) | |
tree | 5aa3e2cdb69dd85fe247ba15c8cfc22bb53dd961 /core/src/shell.rs | |
parent | ca009ba92af72c09ec6f22ca4eea06fe6228f19d (diff) | |
parent | bab18858cd60168b63ae442026f45a90eb6be731 (diff) | |
download | iced-5ab056318e7c2db981f008bd65d9e0b2aacb46c5.tar.gz iced-5ab056318e7c2db981f008bd65d9e0b2aacb46c5.tar.bz2 iced-5ab056318e7c2db981f008bd65d9e0b2aacb46c5.zip |
Merge pull request #2777 from kenz-gelsoft/explore-input-method2
Input Method Support
Diffstat (limited to 'core/src/shell.rs')
-rw-r--r-- | core/src/shell.rs | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/core/src/shell.rs b/core/src/shell.rs index c2275f71..509e3822 100644 --- a/core/src/shell.rs +++ b/core/src/shell.rs @@ -1,6 +1,6 @@ use crate::event; -use crate::time::Instant; use crate::window; +use crate::InputMethod; /// A connection to the state of a shell. /// @@ -12,7 +12,8 @@ use crate::window; pub struct Shell<'a, Message> { messages: &'a mut Vec<Message>, event_status: event::Status, - redraw_request: Option<window::RedrawRequest>, + redraw_request: window::RedrawRequest, + input_method: InputMethod, is_layout_invalid: bool, are_widgets_invalid: bool, } @@ -23,9 +24,10 @@ impl<'a, Message> Shell<'a, Message> { Self { messages, event_status: event::Status::Ignored, - redraw_request: None, + redraw_request: window::RedrawRequest::Wait, is_layout_invalid: false, are_widgets_invalid: false, + input_method: InputMethod::None, } } @@ -59,24 +61,19 @@ impl<'a, Message> Shell<'a, Message> { /// Requests a new frame to be drawn as soon as possible. pub fn request_redraw(&mut self) { - self.redraw_request = Some(window::RedrawRequest::NextFrame); - } - - /// Requests a new frame to be drawn at the given [`Instant`]. - pub fn request_redraw_at(&mut self, at: Instant) { - match self.redraw_request { - None => { - self.redraw_request = Some(window::RedrawRequest::At(at)); - } - Some(window::RedrawRequest::At(current)) if at < current => { - self.redraw_request = Some(window::RedrawRequest::At(at)); - } - _ => {} - } + self.redraw_request = window::RedrawRequest::NextFrame; + } + + /// Requests a new frame to be drawn at the given [`window::RedrawRequest`]. + pub fn request_redraw_at( + &mut self, + redraw_request: impl Into<window::RedrawRequest>, + ) { + self.redraw_request = self.redraw_request.min(redraw_request.into()); } /// Returns the request a redraw should happen, if any. - pub fn redraw_request(&self) -> Option<window::RedrawRequest> { + pub fn redraw_request(&self) -> window::RedrawRequest { self.redraw_request } @@ -87,11 +84,32 @@ impl<'a, Message> Shell<'a, Message> { /// method. pub fn replace_redraw_request( shell: &mut Self, - redraw_request: Option<window::RedrawRequest>, + redraw_request: window::RedrawRequest, ) { shell.redraw_request = redraw_request; } + /// Requests the current [`InputMethod`] strategy. + /// + /// __Important__: This request will only be honored by the + /// [`Shell`] only during a [`window::Event::RedrawRequested`]. + pub fn request_input_method<T: AsRef<str>>( + &mut self, + ime: &InputMethod<T>, + ) { + self.input_method.merge(ime); + } + + /// Returns the current [`InputMethod`] strategy. + pub fn input_method(&self) -> &InputMethod { + &self.input_method + } + + /// Returns the current [`InputMethod`] strategy. + pub fn input_method_mut(&mut self) -> &mut InputMethod { + &mut self.input_method + } + /// Returns whether the current layout is invalid or not. pub fn is_layout_invalid(&self) -> bool { self.is_layout_invalid @@ -134,20 +152,14 @@ impl<'a, Message> Shell<'a, Message> { pub fn merge<B>(&mut self, other: Shell<'_, B>, f: impl Fn(B) -> Message) { self.messages.extend(other.messages.drain(..).map(f)); - if let Some(new) = other.redraw_request { - self.redraw_request = Some( - self.redraw_request - .map(|current| if current < new { current } else { new }) - .unwrap_or(new), - ); - } - self.is_layout_invalid = self.is_layout_invalid || other.is_layout_invalid; self.are_widgets_invalid = self.are_widgets_invalid || other.are_widgets_invalid; + self.redraw_request = self.redraw_request.min(other.redraw_request); self.event_status = self.event_status.merge(other.event_status); + self.input_method.merge(&other.input_method); } } |