1
- use crate :: { frontend :: FrontendMessageHandler , message_prelude:: * , Callback , EditorError } ;
1
+ use crate :: { message_prelude:: * , EditorError } ;
2
2
3
3
pub use crate :: document:: DocumentsMessageHandler ;
4
4
pub use crate :: input:: { InputMapper , InputPreprocessor } ;
@@ -8,57 +8,54 @@ use crate::global::GlobalMessageHandler;
8
8
use std:: collections:: VecDeque ;
9
9
10
10
pub struct Dispatcher {
11
- frontend_message_handler : FrontendMessageHandler ,
12
11
input_preprocessor : InputPreprocessor ,
13
12
input_mapper : InputMapper ,
14
13
global_message_handler : GlobalMessageHandler ,
15
14
tool_message_handler : ToolMessageHandler ,
16
15
documents_message_handler : DocumentsMessageHandler ,
17
16
messages : VecDeque < Message > ,
17
+ pub responses : Vec < FrontendMessage > ,
18
18
}
19
19
20
+ const GROUP_MESSAGES : & [ MessageDiscriminant ] = & [
21
+ MessageDiscriminant :: Documents ( DocumentsMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: RenderDocument ) ) ,
22
+ MessageDiscriminant :: Documents ( DocumentsMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: FolderChanged ) ) ,
23
+ MessageDiscriminant :: Frontend ( FrontendMessageDiscriminant :: UpdateLayer ) ,
24
+ MessageDiscriminant :: Frontend ( FrontendMessageDiscriminant :: ExpandFolder ) ,
25
+ MessageDiscriminant :: Tool ( ToolMessageDiscriminant :: SelectedLayersChanged ) ,
26
+ ] ;
27
+
20
28
impl Dispatcher {
21
29
pub fn handle_message < T : Into < Message > > ( & mut self , message : T ) -> Result < ( ) , EditorError > {
22
- let message = message. into ( ) ;
30
+ self . messages . push_back ( message. into ( ) ) ;
31
+
23
32
use Message :: * ;
24
- if !( matches ! (
25
- message,
26
- Message :: InputPreprocessor ( _)
27
- | Message :: InputMapper ( _)
28
- | Message :: Documents ( DocumentsMessage :: Document ( DocumentMessage :: RenderDocument ) )
29
- | Message :: Frontend ( FrontendMessage :: UpdateCanvas { .. } )
30
- | Message :: Frontend ( FrontendMessage :: UpdateScrollbars { .. } )
31
- | Message :: Frontend ( FrontendMessage :: SetCanvasZoom { .. } )
32
- | Message :: Frontend ( FrontendMessage :: SetCanvasRotation { .. } )
33
- ) || MessageDiscriminant :: from ( & message) . local_name ( ) . ends_with ( "MouseMove" ) )
34
- {
35
- log:: trace!( "Message: {:?}" , message) ;
36
- //log::trace!("Hints:{:?}", self.input_mapper.hints(self.collect_actions()));
37
- }
38
- match message {
39
- NoOp => ( ) ,
40
- Documents ( message) => self . documents_message_handler . process_action ( message, & self . input_preprocessor , & mut self . messages ) ,
41
- Global ( message) => self . global_message_handler . process_action ( message, ( ) , & mut self . messages ) ,
42
- Tool ( message) => self
43
- . tool_message_handler
44
- . process_action ( message, ( self . documents_message_handler . active_document ( ) , & self . input_preprocessor ) , & mut self . messages ) ,
45
- Frontend ( message) => self . frontend_message_handler . process_action ( message, ( ) , & mut self . messages ) ,
46
- InputPreprocessor ( message) => self . input_preprocessor . process_action ( message, ( ) , & mut self . messages ) ,
47
- InputMapper ( message) => {
48
- let actions = self . collect_actions ( ) ;
49
- self . input_mapper . process_action ( message, ( & self . input_preprocessor , actions) , & mut self . messages )
33
+ while let Some ( message) = self . messages . pop_front ( ) {
34
+ if GROUP_MESSAGES . contains ( & message. to_discriminant ( ) ) && self . messages . contains ( & message) {
35
+ continue ;
36
+ }
37
+ log_message ( & message) ;
38
+ match message {
39
+ NoOp => ( ) ,
40
+ Documents ( message) => self . documents_message_handler . process_action ( message, & self . input_preprocessor , & mut self . messages ) ,
41
+ Global ( message) => self . global_message_handler . process_action ( message, ( ) , & mut self . messages ) ,
42
+ Tool ( message) => self
43
+ . tool_message_handler
44
+ . process_action ( message, ( self . documents_message_handler . active_document ( ) , & self . input_preprocessor ) , & mut self . messages ) ,
45
+ Frontend ( message) => self . responses . push ( message) ,
46
+ InputPreprocessor ( message) => self . input_preprocessor . process_action ( message, ( ) , & mut self . messages ) ,
47
+ InputMapper ( message) => {
48
+ let actions = self . collect_actions ( ) ;
49
+ self . input_mapper . process_action ( message, ( & self . input_preprocessor , actions) , & mut self . messages )
50
+ }
50
51
}
51
- }
52
- if let Some ( message) = self . messages . pop_front ( ) {
53
- self . handle_message ( message) ?;
54
52
}
55
53
Ok ( ( ) )
56
54
}
57
55
58
56
pub fn collect_actions ( & self ) -> ActionList {
59
57
//TODO: reduce the number of heap allocations
60
58
let mut list = Vec :: new ( ) ;
61
- list. extend ( self . frontend_message_handler . actions ( ) ) ;
62
59
list. extend ( self . input_preprocessor . actions ( ) ) ;
63
60
list. extend ( self . input_mapper . actions ( ) ) ;
64
61
list. extend ( self . global_message_handler . actions ( ) ) ;
@@ -67,24 +64,36 @@ impl Dispatcher {
67
64
list
68
65
}
69
66
70
- pub fn new ( callback : Callback ) -> Dispatcher {
67
+ pub fn new ( ) -> Dispatcher {
71
68
Dispatcher {
72
- frontend_message_handler : FrontendMessageHandler :: new ( callback) ,
73
69
input_preprocessor : InputPreprocessor :: default ( ) ,
74
70
global_message_handler : GlobalMessageHandler :: new ( ) ,
75
71
input_mapper : InputMapper :: default ( ) ,
76
72
documents_message_handler : DocumentsMessageHandler :: default ( ) ,
77
73
tool_message_handler : ToolMessageHandler :: default ( ) ,
78
74
messages : VecDeque :: new ( ) ,
75
+ responses : vec ! [ ] ,
79
76
}
80
77
}
81
78
}
82
79
80
+ fn log_message ( message : & Message ) {
81
+ use Message :: * ;
82
+ if log:: max_level ( ) == log:: LevelFilter :: Trace
83
+ && !( matches ! (
84
+ message,
85
+ InputPreprocessor ( _) | Frontend ( FrontendMessage :: SetCanvasZoom { .. } ) | Frontend ( FrontendMessage :: SetCanvasRotation { .. } )
86
+ ) || MessageDiscriminant :: from ( message) . local_name ( ) . ends_with ( "MouseMove" ) )
87
+ {
88
+ log:: trace!( "Message: {:?}" , message) ;
89
+ //log::trace!("Hints:{:?}", self.input_mapper.hints(self.collect_actions()));
90
+ }
91
+ }
92
+
83
93
#[ cfg( test) ]
84
94
mod test {
85
95
use crate :: { document:: DocumentMessageHandler , message_prelude:: * , misc:: test_utils:: EditorTestUtils , Editor } ;
86
96
use graphene:: { color:: Color , Operation } ;
87
- use log:: info;
88
97
89
98
fn init_logger ( ) {
90
99
let _ = env_logger:: builder ( ) . is_test ( true ) . try_init ( ) ;
@@ -95,9 +104,7 @@ mod test {
95
104
/// 2. A blue shape
96
105
/// 3. A green ellipse
97
106
fn create_editor_with_three_layers ( ) -> Editor {
98
- let mut editor = Editor :: new ( Box :: new ( |e| {
99
- info ! ( "Got frontend message: {:?}" , e) ;
100
- } ) ) ;
107
+ let mut editor = Editor :: new ( ) ;
101
108
102
109
editor. select_primary_color ( Color :: RED ) ;
103
110
editor. draw_rect ( 100. , 200. , 300. , 400. ) ;
0 commit comments