1
1
use super :: broadcast_message_handler:: BroadcastMessageHandler ;
2
+ use crate :: consts:: { DEFAULT_FONT_FAMILY , DEFAULT_FONT_STYLE } ;
2
3
use crate :: document:: PortfolioMessageHandler ;
3
4
use crate :: global:: GlobalMessageHandler ;
4
5
use crate :: input:: { InputMapperMessageHandler , InputPreprocessorMessageHandler } ;
@@ -7,6 +8,8 @@ use crate::message_prelude::*;
7
8
use crate :: viewport_tools:: tool_message_handler:: ToolMessageHandler ;
8
9
use crate :: workspace:: WorkspaceMessageHandler ;
9
10
11
+ use graphene:: layers:: text_layer:: Font ;
12
+
10
13
use std:: collections:: VecDeque ;
11
14
12
15
#[ derive( Debug , Default ) ]
@@ -42,8 +45,6 @@ const SIDE_EFFECT_FREE_MESSAGES: &[MessageDiscriminant] = &[
42
45
MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: FolderChanged ) ) ,
43
46
MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: DocumentStructureChanged ) ) ,
44
47
MessageDiscriminant :: Frontend ( FrontendMessageDiscriminant :: UpdateDocumentLayerTreeStructure ) ,
45
- MessageDiscriminant :: Frontend ( FrontendMessageDiscriminant :: UpdateActiveDocument ) ,
46
- MessageDiscriminant :: Frontend ( FrontendMessageDiscriminant :: UpdateOpenDocumentsList ) ,
47
48
MessageDiscriminant :: Frontend ( FrontendMessageDiscriminant :: TriggerFontLoad ) ,
48
49
MessageDiscriminant :: Broadcast ( BroadcastMessageDiscriminant :: TriggerSignal ( BroadcastSignalDiscriminant :: DocumentIsDirty ) ) ,
49
50
] ;
@@ -87,21 +88,35 @@ impl Dispatcher {
87
88
match message {
88
89
#[ remain:: unsorted]
89
90
NoOp => { }
91
+ #[ remain:: unsorted]
92
+ Init => {
93
+ // Display the menu bar at the top of the window
94
+ let message = MenuBarMessage :: SendLayout . into ( ) ;
95
+ queue. push_back ( message) ;
96
+
97
+ // Load the default font
98
+ let font = Font :: new ( DEFAULT_FONT_FAMILY . into ( ) , DEFAULT_FONT_STYLE . into ( ) ) ;
99
+ let message = FrontendMessage :: TriggerFontLoad { font, is_default : true } . into ( ) ;
100
+ queue. push_back ( message) ;
101
+ }
102
+
90
103
Broadcast ( message) => self . message_handlers . broadcast_message_handler . process_action ( message, ( ) , & mut queue) ,
91
104
Dialog ( message) => {
92
105
self . message_handlers
93
106
. dialog_message_handler
94
107
. process_action ( message, & self . message_handlers . portfolio_message_handler , & mut queue) ;
95
108
}
96
109
Frontend ( message) => {
97
- // Image and font loading should be immediately handled
98
- if let FrontendMessage :: UpdateImageData { .. } | FrontendMessage :: TriggerFontLoad { .. } = message {
110
+ // Handle these messages immediately by returning early
111
+ if let FrontendMessage :: UpdateImageData { .. } | FrontendMessage :: TriggerFontLoad { .. } | FrontendMessage :: TriggerRefreshBoundsOfViewports = message {
99
112
self . responses . push ( message) ;
113
+
114
+ // Return early to avoid running the code after the match block
100
115
return ;
116
+ } else {
117
+ // `FrontendMessage`s are saved and will be sent to the frontend after the message queue is done being processed
118
+ self . responses . push ( message) ;
101
119
}
102
-
103
- // `FrontendMessage`s are saved and will be sent to the frontend after the message queue is done being processed
104
- self . responses . push ( message) ;
105
120
}
106
121
Global ( message) => {
107
122
self . message_handlers . global_message_handler . process_action ( message, ( ) , & mut queue) ;
@@ -122,15 +137,19 @@ impl Dispatcher {
122
137
. process_action ( message, & self . message_handlers . input_preprocessor_message_handler , & mut queue) ;
123
138
}
124
139
Tool ( message) => {
125
- self . message_handlers . tool_message_handler . process_action (
126
- message,
127
- (
128
- self . message_handlers . portfolio_message_handler . active_document ( ) ,
129
- & self . message_handlers . input_preprocessor_message_handler ,
130
- self . message_handlers . portfolio_message_handler . font_cache ( ) ,
131
- ) ,
132
- & mut queue,
133
- ) ;
140
+ if let Some ( document) = self . message_handlers . portfolio_message_handler . active_document ( ) {
141
+ self . message_handlers . tool_message_handler . process_action (
142
+ message,
143
+ (
144
+ document,
145
+ & self . message_handlers . input_preprocessor_message_handler ,
146
+ self . message_handlers . portfolio_message_handler . font_cache ( ) ,
147
+ ) ,
148
+ & mut queue,
149
+ ) ;
150
+ } else {
151
+ log:: warn!( "Called ToolMessage without an active document.\n Got {:?}" , message) ;
152
+ }
134
153
}
135
154
Workspace ( message) => {
136
155
self . message_handlers
@@ -153,7 +172,9 @@ impl Dispatcher {
153
172
list. extend ( self . message_handlers . input_preprocessor_message_handler . actions ( ) ) ;
154
173
list. extend ( self . message_handlers . input_mapper_message_handler . actions ( ) ) ;
155
174
list. extend ( self . message_handlers . global_message_handler . actions ( ) ) ;
156
- list. extend ( self . message_handlers . tool_message_handler . actions ( ) ) ;
175
+ if self . message_handlers . portfolio_message_handler . active_document ( ) . is_some ( ) {
176
+ list. extend ( self . message_handlers . tool_message_handler . actions ( ) ) ;
177
+ }
157
178
list. extend ( self . message_handlers . portfolio_message_handler . actions ( ) ) ;
158
179
list
159
180
}
@@ -192,6 +213,7 @@ mod test {
192
213
set_uuid_seed ( 0 ) ;
193
214
let mut editor = Editor :: new ( ) ;
194
215
216
+ editor. new_document ( ) ;
195
217
editor. select_primary_color ( Color :: RED ) ;
196
218
editor. draw_rect ( 100. , 200. , 300. , 400. ) ;
197
219
editor. select_primary_color ( Color :: BLUE ) ;
@@ -211,14 +233,14 @@ mod test {
211
233
init_logger ( ) ;
212
234
let mut editor = create_editor_with_three_layers ( ) ;
213
235
214
- let document_before_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . graphene_document . clone ( ) ;
236
+ let document_before_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . graphene_document . clone ( ) ;
215
237
editor. handle_message ( PortfolioMessage :: Copy { clipboard : Clipboard :: Internal } ) ;
216
238
editor. handle_message ( PortfolioMessage :: PasteIntoFolder {
217
239
clipboard : Clipboard :: Internal ,
218
240
folder_path : vec ! [ ] ,
219
241
insert_index : -1 ,
220
242
} ) ;
221
- let document_after_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . graphene_document . clone ( ) ;
243
+ let document_after_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . graphene_document . clone ( ) ;
222
244
223
245
let layers_before_copy = document_before_copy. root . as_folder ( ) . unwrap ( ) . layers ( ) ;
224
246
let layers_after_copy = document_after_copy. root . as_folder ( ) . unwrap ( ) . layers ( ) ;
@@ -245,7 +267,7 @@ mod test {
245
267
init_logger ( ) ;
246
268
let mut editor = create_editor_with_three_layers ( ) ;
247
269
248
- let document_before_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . graphene_document . clone ( ) ;
270
+ let document_before_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . graphene_document . clone ( ) ;
249
271
let shape_id = document_before_copy. root . as_folder ( ) . unwrap ( ) . layer_ids [ 1 ] ;
250
272
251
273
editor. handle_message ( DocumentMessage :: SetSelectedLayers {
@@ -258,7 +280,7 @@ mod test {
258
280
insert_index : -1 ,
259
281
} ) ;
260
282
261
- let document_after_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . graphene_document . clone ( ) ;
283
+ let document_after_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . graphene_document . clone ( ) ;
262
284
263
285
let layers_before_copy = document_before_copy. root . as_folder ( ) . unwrap ( ) . layers ( ) ;
264
286
let layers_after_copy = document_after_copy. root . as_folder ( ) . unwrap ( ) . layers ( ) ;
@@ -290,7 +312,7 @@ mod test {
290
312
291
313
editor. handle_message ( DocumentMessage :: CreateEmptyFolder { container_path : vec ! [ ] } ) ;
292
314
293
- let document_before_added_shapes = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . graphene_document . clone ( ) ;
315
+ let document_before_added_shapes = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . graphene_document . clone ( ) ;
294
316
let folder_id = document_before_added_shapes. root . as_folder ( ) . unwrap ( ) . layer_ids [ FOLDER_INDEX ] ;
295
317
296
318
// TODO: This adding of a Line and Pen should be rewritten using the corresponding functions in EditorTestUtils.
@@ -314,7 +336,7 @@ mod test {
314
336
replacement_selected_layers : vec ! [ vec![ folder_id] ] ,
315
337
} ) ;
316
338
317
- let document_before_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . graphene_document . clone ( ) ;
339
+ let document_before_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . graphene_document . clone ( ) ;
318
340
319
341
editor. handle_message ( PortfolioMessage :: Copy { clipboard : Clipboard :: Internal } ) ;
320
342
editor. handle_message ( DocumentMessage :: DeleteSelectedLayers ) ;
@@ -329,7 +351,7 @@ mod test {
329
351
insert_index : -1 ,
330
352
} ) ;
331
353
332
- let document_after_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . graphene_document . clone ( ) ;
354
+ let document_after_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . graphene_document . clone ( ) ;
333
355
334
356
let layers_before_copy = document_before_copy. root . as_folder ( ) . unwrap ( ) . layers ( ) ;
335
357
let layers_after_copy = document_after_copy. root . as_folder ( ) . unwrap ( ) . layers ( ) ;
@@ -380,7 +402,7 @@ mod test {
380
402
const SHAPE_INDEX : usize = 1 ;
381
403
const RECT_INDEX : usize = 0 ;
382
404
383
- let document_before_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . graphene_document . clone ( ) ;
405
+ let document_before_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . graphene_document . clone ( ) ;
384
406
let rect_id = document_before_copy. root . as_folder ( ) . unwrap ( ) . layer_ids [ RECT_INDEX ] ;
385
407
let ellipse_id = document_before_copy. root . as_folder ( ) . unwrap ( ) . layer_ids [ ELLIPSE_INDEX ] ;
386
408
@@ -401,7 +423,7 @@ mod test {
401
423
insert_index : -1 ,
402
424
} ) ;
403
425
404
- let document_after_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . graphene_document . clone ( ) ;
426
+ let document_after_copy = editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . graphene_document . clone ( ) ;
405
427
406
428
let layers_before_copy = document_before_copy. root . as_folder ( ) . unwrap ( ) . layers ( ) ;
407
429
let layers_after_copy = document_after_copy. root . as_folder ( ) . unwrap ( ) . layers ( ) ;
@@ -431,7 +453,7 @@ mod test {
431
453
fn map_to_vec ( paths : Vec < & [ LayerId ] > ) -> Vec < Vec < LayerId > > {
432
454
paths. iter ( ) . map ( |layer| layer. to_vec ( ) ) . collect :: < Vec < _ > > ( )
433
455
}
434
- let sorted_layers = map_to_vec ( editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . all_layers_sorted ( ) ) ;
456
+ let sorted_layers = map_to_vec ( editor. dispatcher . message_handlers . portfolio_message_handler . active_document ( ) . unwrap ( ) . all_layers_sorted ( ) ) ;
435
457
println ! ( "Sorted layers: {:?}" , sorted_layers) ;
436
458
437
459
let verify_order = |handler : & mut DocumentMessageHandler | {
@@ -447,15 +469,15 @@ mod test {
447
469
} ) ;
448
470
449
471
editor. handle_message ( DocumentMessage :: ReorderSelectedLayers { relative_index_offset : 1 } ) ;
450
- let ( all, non_selected, selected) = verify_order ( editor. dispatcher . message_handlers . portfolio_message_handler . active_document_mut ( ) ) ;
472
+ let ( all, non_selected, selected) = verify_order ( editor. dispatcher . message_handlers . portfolio_message_handler . active_document_mut ( ) . unwrap ( ) ) ;
451
473
assert_eq ! ( all, non_selected. into_iter( ) . chain( selected. into_iter( ) ) . collect:: <Vec <_>>( ) ) ;
452
474
453
475
editor. handle_message ( DocumentMessage :: ReorderSelectedLayers { relative_index_offset : -1 } ) ;
454
- let ( all, non_selected, selected) = verify_order ( editor. dispatcher . message_handlers . portfolio_message_handler . active_document_mut ( ) ) ;
476
+ let ( all, non_selected, selected) = verify_order ( editor. dispatcher . message_handlers . portfolio_message_handler . active_document_mut ( ) . unwrap ( ) ) ;
455
477
assert_eq ! ( all, selected. into_iter( ) . chain( non_selected. into_iter( ) ) . collect:: <Vec <_>>( ) ) ;
456
478
457
479
editor. handle_message ( DocumentMessage :: ReorderSelectedLayers { relative_index_offset : isize:: MAX } ) ;
458
- let ( all, non_selected, selected) = verify_order ( editor. dispatcher . message_handlers . portfolio_message_handler . active_document_mut ( ) ) ;
480
+ let ( all, non_selected, selected) = verify_order ( editor. dispatcher . message_handlers . portfolio_message_handler . active_document_mut ( ) . unwrap ( ) ) ;
459
481
assert_eq ! ( all, non_selected. into_iter( ) . chain( selected. into_iter( ) ) . collect:: <Vec <_>>( ) ) ;
460
482
}
461
483
0 commit comments