1
1
use std:: usize;
2
2
3
3
use super :: keyboard:: { Key , KeyStates } ;
4
- use super :: mouse:: { MouseKeys , MouseState , ScrollDelta , ViewportPosition } ;
4
+ use super :: mouse:: { EditorMouseState , MouseKeys , MouseState , ViewportBounds } ;
5
5
use crate :: message_prelude:: * ;
6
6
use bitflags:: bitflags;
7
7
@@ -11,13 +11,13 @@ pub use graphene::DocumentResponse;
11
11
#[ impl_message( Message , InputPreprocessor ) ]
12
12
#[ derive( PartialEq , Clone , Debug ) ]
13
13
pub 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 ) ,
18
18
KeyUp ( Key , ModifierKeys ) ,
19
19
KeyDown ( Key , ModifierKeys ) ,
20
- ViewportResize ( ViewportPosition ) ,
20
+ BoundsOfViewports ( Vec < ViewportBounds > ) ,
21
21
}
22
22
23
23
bitflags ! {
@@ -34,7 +34,7 @@ bitflags! {
34
34
pub struct InputPreprocessor {
35
35
pub keyboard : KeyStates ,
36
36
pub mouse : MouseState ,
37
- pub viewport_size : ViewportPosition ,
37
+ pub viewport_bounds : ViewportBounds ,
38
38
}
39
39
40
40
enum KeyPosition {
@@ -45,28 +45,43 @@ enum KeyPosition {
45
45
impl MessageHandler < InputPreprocessorMessage , ( ) > for InputPreprocessor {
46
46
fn process_action ( & mut self , message : InputPreprocessorMessage , _data : ( ) , responses : & mut VecDeque < Message > ) {
47
47
match message {
48
- InputPreprocessorMessage :: MouseMove ( pos , modifier_keys) => {
48
+ InputPreprocessorMessage :: MouseMove ( editor_mouse_state , modifier_keys) => {
49
49
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
+
51
54
responses. push_back ( InputMapperMessage :: PointerMove . into ( ) ) ;
52
55
}
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) => {
59
57
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 ) {
61
63
responses. push_back ( message) ;
62
64
}
63
65
}
64
- InputPreprocessorMessage :: MouseUp ( state , modifier_keys) => {
66
+ InputPreprocessorMessage :: MouseUp ( editor_mouse_state , modifier_keys) => {
65
67
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 ) {
67
73
responses. push_back ( message) ;
68
74
}
69
75
}
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
+ }
70
85
InputPreprocessorMessage :: KeyDown ( key, modifier_keys) => {
71
86
self . handle_modifier_keys ( modifier_keys, responses) ;
72
87
self . keyboard . set ( key as usize ) ;
@@ -77,15 +92,24 @@ impl MessageHandler<InputPreprocessorMessage, ()> for InputPreprocessor {
77
92
self . keyboard . unset ( key as usize ) ;
78
93
responses. push_back ( InputMapperMessage :: KeyUp ( key) . into ( ) ) ;
79
94
}
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
+ for bounds in bounds_of_viewports {
97
+ let new_size = bounds. size ( ) ;
98
+ let existing_size = self . viewport_bounds . size ( ) ;
99
+
100
+ let translation = ( new_size - existing_size) / 2. ;
101
+
102
+ // TODO: Extend this to multiple viewports instead of setting it to the value of this last loop iteration
103
+ self . viewport_bounds = bounds;
104
+
105
+ responses. push_back (
106
+ graphene:: Operation :: TransformLayer {
107
+ path : vec ! [ ] ,
108
+ transform : glam:: DAffine2 :: from_translation ( translation) . to_cols_array ( ) ,
109
+ }
110
+ . into ( ) ,
111
+ ) ;
112
+ }
89
113
}
90
114
} ;
91
115
}
@@ -136,12 +160,16 @@ impl InputPreprocessor {
136
160
137
161
#[ cfg( test) ]
138
162
mod test {
163
+ use crate :: input:: mouse:: ViewportPosition ;
164
+
139
165
use super :: * ;
140
166
141
167
#[ test]
142
168
fn process_action_mouse_move_handle_modifier_keys ( ) {
143
169
let mut input_preprocessor = InputPreprocessor :: default ( ) ;
144
- let message = InputPreprocessorMessage :: MouseMove ( ( 4. , 809. ) . into ( ) , ModifierKeys :: ALT ) ;
170
+ let mut editor_mouse_state = EditorMouseState :: new ( ) ;
171
+ editor_mouse_state. editor_position = ViewportPosition :: new ( 4. , 809. ) ;
172
+ let message = InputPreprocessorMessage :: MouseMove ( editor_mouse_state, ModifierKeys :: ALT ) ;
145
173
let mut responses = VecDeque :: new ( ) ;
146
174
147
175
input_preprocessor. process_action ( message, ( ) , & mut responses) ;
@@ -153,7 +181,7 @@ mod test {
153
181
#[ test]
154
182
fn process_action_mouse_down_handle_modifier_keys ( ) {
155
183
let mut input_preprocessor = InputPreprocessor :: default ( ) ;
156
- let message = InputPreprocessorMessage :: MouseDown ( MouseState :: new ( ) , ModifierKeys :: CONTROL ) ;
184
+ let message = InputPreprocessorMessage :: MouseDown ( EditorMouseState :: new ( ) , ModifierKeys :: CONTROL ) ;
157
185
let mut responses = VecDeque :: new ( ) ;
158
186
159
187
input_preprocessor. process_action ( message, ( ) , & mut responses) ;
@@ -165,7 +193,7 @@ mod test {
165
193
#[ test]
166
194
fn process_action_mouse_up_handle_modifier_keys ( ) {
167
195
let mut input_preprocessor = InputPreprocessor :: default ( ) ;
168
- let message = InputPreprocessorMessage :: MouseUp ( MouseState :: new ( ) , ModifierKeys :: SHIFT ) ;
196
+ let message = InputPreprocessorMessage :: MouseUp ( EditorMouseState :: new ( ) , ModifierKeys :: SHIFT ) ;
169
197
let mut responses = VecDeque :: new ( ) ;
170
198
171
199
input_preprocessor. process_action ( message, ( ) , & mut responses) ;
0 commit comments