11use std:: usize;
22
33use super :: keyboard:: { Key , KeyStates } ;
4- use super :: mouse:: { MouseKeys , MouseState , ScrollDelta , ViewportPosition } ;
4+ use super :: mouse:: { EditorMouseState , MouseKeys , MouseState , ViewportBounds } ;
55use crate :: message_prelude:: * ;
66use bitflags:: bitflags;
77
@@ -11,13 +11,13 @@ pub use graphene::DocumentResponse;
1111#[ impl_message( Message , InputPreprocessor ) ]
1212#[ derive( PartialEq , Clone , Debug ) ]
1313pub enum InputPreprocessorMessage {
14- MouseDown ( MouseState , ModifierKeys ) ,
15- MouseUp ( MouseState , ModifierKeys ) ,
16- MouseMove ( ViewportPosition , ModifierKeys ) ,
17- MouseScroll ( ScrollDelta , ModifierKeys ) ,
14+ MouseDown ( EditorMouseState , ModifierKeys ) ,
15+ MouseUp ( EditorMouseState , ModifierKeys ) ,
16+ MouseMove ( EditorMouseState , ModifierKeys ) ,
17+ MouseScroll ( EditorMouseState , ModifierKeys ) ,
1818 KeyUp ( Key , ModifierKeys ) ,
1919 KeyDown ( Key , ModifierKeys ) ,
20- ViewportResize ( ViewportPosition ) ,
20+ BoundsOfViewports ( Vec < ViewportBounds > ) ,
2121}
2222
2323bitflags ! {
@@ -34,7 +34,7 @@ bitflags! {
3434pub struct InputPreprocessor {
3535 pub keyboard : KeyStates ,
3636 pub mouse : MouseState ,
37- pub viewport_size : ViewportPosition ,
37+ pub viewport_bounds : ViewportBounds ,
3838}
3939
4040enum KeyPosition {
@@ -45,28 +45,43 @@ enum KeyPosition {
4545impl MessageHandler < InputPreprocessorMessage , ( ) > for InputPreprocessor {
4646 fn process_action ( & mut self , message : InputPreprocessorMessage , _data : ( ) , responses : & mut VecDeque < Message > ) {
4747 match message {
48- InputPreprocessorMessage :: MouseMove ( pos , modifier_keys) => {
48+ InputPreprocessorMessage :: MouseMove ( editor_mouse_state , modifier_keys) => {
4949 self . handle_modifier_keys ( modifier_keys, responses) ;
50- self . mouse . position = pos;
50+
51+ let mouse_state = editor_mouse_state. to_mouse_state ( & self . viewport_bounds ) ;
52+ self . mouse . position = mouse_state. position ;
53+
5154 responses. push_back ( InputMapperMessage :: PointerMove . into ( ) ) ;
5255 }
53- InputPreprocessorMessage :: MouseScroll ( delta, modifier_keys) => {
54- self . handle_modifier_keys ( modifier_keys, responses) ;
55- self . mouse . scroll_delta = delta;
56- responses. push_back ( InputMapperMessage :: MouseScroll . into ( ) ) ;
57- }
58- InputPreprocessorMessage :: MouseDown ( state, modifier_keys) => {
56+ InputPreprocessorMessage :: MouseDown ( editor_mouse_state, modifier_keys) => {
5957 self . handle_modifier_keys ( modifier_keys, responses) ;
60- if let Some ( message) = self . translate_mouse_event ( state, KeyPosition :: Pressed ) {
58+
59+ let mouse_state = editor_mouse_state. to_mouse_state ( & self . viewport_bounds ) ;
60+ self . mouse . position = mouse_state. position ;
61+
62+ if let Some ( message) = self . translate_mouse_event ( mouse_state, KeyPosition :: Pressed ) {
6163 responses. push_back ( message) ;
6264 }
6365 }
64- InputPreprocessorMessage :: MouseUp ( state , modifier_keys) => {
66+ InputPreprocessorMessage :: MouseUp ( editor_mouse_state , modifier_keys) => {
6567 self . handle_modifier_keys ( modifier_keys, responses) ;
66- if let Some ( message) = self . translate_mouse_event ( state, KeyPosition :: Released ) {
68+
69+ let mouse_state = editor_mouse_state. to_mouse_state ( & self . viewport_bounds ) ;
70+ self . mouse . position = mouse_state. position ;
71+
72+ if let Some ( message) = self . translate_mouse_event ( mouse_state, KeyPosition :: Released ) {
6773 responses. push_back ( message) ;
6874 }
6975 }
76+ InputPreprocessorMessage :: MouseScroll ( editor_mouse_state, modifier_keys) => {
77+ self . handle_modifier_keys ( modifier_keys, responses) ;
78+
79+ let mouse_state = editor_mouse_state. to_mouse_state ( & self . viewport_bounds ) ;
80+ self . mouse . position = mouse_state. position ;
81+ self . mouse . scroll_delta = mouse_state. scroll_delta ;
82+
83+ responses. push_back ( InputMapperMessage :: MouseScroll . into ( ) ) ;
84+ }
7085 InputPreprocessorMessage :: KeyDown ( key, modifier_keys) => {
7186 self . handle_modifier_keys ( modifier_keys, responses) ;
7287 self . keyboard . set ( key as usize ) ;
@@ -77,15 +92,26 @@ impl MessageHandler<InputPreprocessorMessage, ()> for InputPreprocessor {
7792 self . keyboard . unset ( key as usize ) ;
7893 responses. push_back ( InputMapperMessage :: KeyUp ( key) . into ( ) ) ;
7994 }
80- InputPreprocessorMessage :: ViewportResize ( size) => {
81- responses. push_back (
82- graphene:: Operation :: TransformLayer {
83- path : vec ! [ ] ,
84- transform : glam:: DAffine2 :: from_translation ( ( size - self . viewport_size ) / 2. ) . to_cols_array ( ) ,
85- }
86- . into ( ) ,
87- ) ;
88- self . viewport_size = size;
95+ InputPreprocessorMessage :: BoundsOfViewports ( bounds_of_viewports) => {
96+ assert_eq ! ( bounds_of_viewports. len( ) , 1 , "Only one viewport is currently supported" ) ;
97+
98+ for bounds in bounds_of_viewports {
99+ let new_size = bounds. size ( ) ;
100+ let existing_size = self . viewport_bounds . size ( ) ;
101+
102+ let translation = ( new_size - existing_size) / 2. ;
103+
104+ // TODO: Extend this to multiple viewports instead of setting it to the value of this last loop iteration
105+ self . viewport_bounds = bounds;
106+
107+ responses. push_back (
108+ graphene:: Operation :: TransformLayer {
109+ path : vec ! [ ] ,
110+ transform : glam:: DAffine2 :: from_translation ( translation) . to_cols_array ( ) ,
111+ }
112+ . into ( ) ,
113+ ) ;
114+ }
89115 }
90116 } ;
91117 }
@@ -136,12 +162,16 @@ impl InputPreprocessor {
136162
137163#[ cfg( test) ]
138164mod test {
165+ use crate :: input:: mouse:: ViewportPosition ;
166+
139167 use super :: * ;
140168
141169 #[ test]
142170 fn process_action_mouse_move_handle_modifier_keys ( ) {
143171 let mut input_preprocessor = InputPreprocessor :: default ( ) ;
144- let message = InputPreprocessorMessage :: MouseMove ( ( 4. , 809. ) . into ( ) , ModifierKeys :: ALT ) ;
172+ let mut editor_mouse_state = EditorMouseState :: new ( ) ;
173+ editor_mouse_state. editor_position = ViewportPosition :: new ( 4. , 809. ) ;
174+ let message = InputPreprocessorMessage :: MouseMove ( editor_mouse_state, ModifierKeys :: ALT ) ;
145175 let mut responses = VecDeque :: new ( ) ;
146176
147177 input_preprocessor. process_action ( message, ( ) , & mut responses) ;
@@ -153,7 +183,7 @@ mod test {
153183 #[ test]
154184 fn process_action_mouse_down_handle_modifier_keys ( ) {
155185 let mut input_preprocessor = InputPreprocessor :: default ( ) ;
156- let message = InputPreprocessorMessage :: MouseDown ( MouseState :: new ( ) , ModifierKeys :: CONTROL ) ;
186+ let message = InputPreprocessorMessage :: MouseDown ( EditorMouseState :: new ( ) , ModifierKeys :: CONTROL ) ;
157187 let mut responses = VecDeque :: new ( ) ;
158188
159189 input_preprocessor. process_action ( message, ( ) , & mut responses) ;
@@ -165,7 +195,7 @@ mod test {
165195 #[ test]
166196 fn process_action_mouse_up_handle_modifier_keys ( ) {
167197 let mut input_preprocessor = InputPreprocessor :: default ( ) ;
168- let message = InputPreprocessorMessage :: MouseUp ( MouseState :: new ( ) , ModifierKeys :: SHIFT ) ;
198+ let message = InputPreprocessorMessage :: MouseUp ( EditorMouseState :: new ( ) , ModifierKeys :: SHIFT ) ;
169199 let mut responses = VecDeque :: new ( ) ;
170200
171201 input_preprocessor. process_action ( message, ( ) , & mut responses) ;
0 commit comments