From 7db5256b720c3ecbe7c1cce7a1b47fd03151e03a Mon Sep 17 00:00:00 2001 From: KENZ Date: Fri, 10 Jan 2025 07:12:31 +0900 Subject: Draft `input_method` support --- core/src/shell.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'core/src/shell.rs') diff --git a/core/src/shell.rs b/core/src/shell.rs index 12ebbaa8..d2c1b9ec 100644 --- a/core/src/shell.rs +++ b/core/src/shell.rs @@ -1,6 +1,15 @@ -use crate::event; use crate::time::Instant; use crate::window; +use crate::{event, Point}; + +/// TODO +#[derive(Clone, Copy, Debug)] +pub struct CaretInfo { + /// TODO + pub position: Point, + /// TODO + pub input_method_allowed: bool, +} /// A connection to the state of a shell. /// @@ -15,6 +24,7 @@ pub struct Shell<'a, Message> { redraw_request: Option, is_layout_invalid: bool, are_widgets_invalid: bool, + caret_info: Option, } impl<'a, Message> Shell<'a, Message> { @@ -26,6 +36,7 @@ impl<'a, Message> Shell<'a, Message> { redraw_request: None, is_layout_invalid: false, are_widgets_invalid: false, + caret_info: None, } } @@ -80,6 +91,16 @@ impl<'a, Message> Shell<'a, Message> { self.redraw_request } + /// TODO + pub fn update_caret_info(&mut self, caret_info: Option) { + self.caret_info = caret_info.or(self.caret_info); + } + + /// TODO + pub fn caret_info(&self) -> Option { + self.caret_info + } + /// Returns whether the current layout is invalid or not. pub fn is_layout_invalid(&self) -> bool { self.is_layout_invalid @@ -130,6 +151,8 @@ impl<'a, Message> Shell<'a, Message> { ); } + self.update_caret_info(other.caret_info()); + self.is_layout_invalid = self.is_layout_invalid || other.is_layout_invalid; -- cgit From ae10adda74320e8098bfeb401f12a278e1e7b3e2 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 2 Feb 2025 20:45:29 +0100 Subject: Refactor and simplify `input_method` API --- core/src/shell.rs | 78 +++++++++++++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 46 deletions(-) (limited to 'core/src/shell.rs') diff --git a/core/src/shell.rs b/core/src/shell.rs index d2c1b9ec..e87d1696 100644 --- a/core/src/shell.rs +++ b/core/src/shell.rs @@ -1,15 +1,6 @@ -use crate::time::Instant; +use crate::event; use crate::window; -use crate::{event, Point}; - -/// TODO -#[derive(Clone, Copy, Debug)] -pub struct CaretInfo { - /// TODO - pub position: Point, - /// TODO - pub input_method_allowed: bool, -} +use crate::InputMethod; /// A connection to the state of a shell. /// @@ -21,10 +12,10 @@ pub struct CaretInfo { pub struct Shell<'a, Message> { messages: &'a mut Vec, event_status: event::Status, - redraw_request: Option, + redraw_request: window::RedrawRequest, + input_method: InputMethod, is_layout_invalid: bool, are_widgets_invalid: bool, - caret_info: Option, } impl<'a, Message> Shell<'a, Message> { @@ -33,10 +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, - caret_info: None, + input_method: InputMethod::Disabled, } } @@ -70,35 +61,38 @@ 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, + ) { + 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 { + pub fn redraw_request(&self) -> window::RedrawRequest { self.redraw_request } - /// TODO - pub fn update_caret_info(&mut self, caret_info: Option) { - self.caret_info = caret_info.or(self.caret_info); + /// Requests the current [`InputMethod`] strategy. + pub fn request_input_method>( + &mut self, + ime: &InputMethod, + ) { + self.input_method.merge(ime); } - /// TODO - pub fn caret_info(&self) -> Option { - self.caret_info + /// 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. @@ -143,22 +137,14 @@ impl<'a, Message> Shell<'a, Message> { pub fn merge(&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.update_caret_info(other.caret_info()); - 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); } } -- cgit From db990b77e4aa8d001c774703301342c951d6caaa Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 2 Feb 2025 21:06:50 +0100 Subject: Add neutral `None` variant to `InputMethod` --- core/src/shell.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core/src/shell.rs') diff --git a/core/src/shell.rs b/core/src/shell.rs index e87d1696..d01233c7 100644 --- a/core/src/shell.rs +++ b/core/src/shell.rs @@ -27,7 +27,7 @@ impl<'a, Message> Shell<'a, Message> { redraw_request: window::RedrawRequest::Wait, is_layout_invalid: false, are_widgets_invalid: false, - input_method: InputMethod::Disabled, + input_method: InputMethod::None, } } -- cgit From ba755c69d648cace61f23537266f2e556ee70c15 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 3 Feb 2025 03:34:41 +0100 Subject: Fulfill `InputMethod` requests only during `RedrawRequested` --- core/src/shell.rs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'core/src/shell.rs') diff --git a/core/src/shell.rs b/core/src/shell.rs index d01233c7..a13492d5 100644 --- a/core/src/shell.rs +++ b/core/src/shell.rs @@ -78,6 +78,9 @@ impl<'a, Message> Shell<'a, Message> { } /// 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>( &mut self, ime: &InputMethod, -- cgit