Skip to content

Commit ef2fab3

Browse files
authored
Track which document the deferred executions belong to (#3010)
* Track which document the deferred executions belong to * Cleanup * Fix tests * Fix freehand tool * Notify defer handler of graph execution updates asap
1 parent 96a1b12 commit ef2fab3

File tree

11 files changed

+64
-41
lines changed

11 files changed

+64
-41
lines changed

editor/src/dispatcher.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::messages::debug::utility_types::MessageLoggingVerbosity;
2+
use crate::messages::defer::DeferMessageContext;
23
use crate::messages::dialog::DialogMessageContext;
34
use crate::messages::layout::layout_message_handler::LayoutMessageContext;
45
use crate::messages::prelude::*;
@@ -133,7 +134,10 @@ impl Dispatcher {
133134
self.message_handlers.debug_message_handler.process_message(message, &mut queue, ());
134135
}
135136
Message::Defer(message) => {
136-
self.message_handlers.defer_message_handler.process_message(message, &mut queue, ());
137+
let context = DeferMessageContext {
138+
portfolio: &self.message_handlers.portfolio_message_handler,
139+
};
140+
self.message_handlers.defer_message_handler.process_message(message, &mut queue, context);
137141
}
138142
Message::Dialog(message) => {
139143
let context = DialogMessageContext {

editor/src/messages/defer/defer_message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::messages::prelude::*;
44
#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)]
55
pub enum DeferMessage {
66
SetGraphSubmissionIndex(u64),
7-
TriggerGraphRun(u64),
7+
TriggerGraphRun(u64, DocumentId),
88
AfterGraphRun { messages: Vec<Message> },
99
TriggerNavigationReady,
1010
AfterNavigationReady { messages: Vec<Message> },

editor/src/messages/defer/defer_message_handler.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,45 @@
11
use crate::messages::prelude::*;
22

3+
#[derive(ExtractField)]
4+
pub struct DeferMessageContext<'a> {
5+
pub portfolio: &'a PortfolioMessageHandler,
6+
}
7+
38
#[derive(Debug, Default, ExtractField)]
49
pub struct DeferMessageHandler {
5-
after_graph_run: Vec<(u64, Message)>,
10+
after_graph_run: HashMap<DocumentId, Vec<(u64, Message)>>,
611
after_viewport_resize: Vec<Message>,
712
current_graph_submission_id: u64,
813
}
914

1015
#[message_handler_data]
11-
impl MessageHandler<DeferMessage, ()> for DeferMessageHandler {
12-
fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque<Message>, _: ()) {
16+
impl MessageHandler<DeferMessage, DeferMessageContext<'_>> for DeferMessageHandler {
17+
fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque<Message>, context: DeferMessageContext) {
1318
match message {
1419
DeferMessage::AfterGraphRun { mut messages } => {
15-
self.after_graph_run.extend(messages.drain(..).map(|m| (self.current_graph_submission_id, m)));
20+
let after_graph_run = self.after_graph_run.entry(context.portfolio.active_document_id.unwrap_or(DocumentId(0))).or_default();
21+
after_graph_run.extend(messages.drain(..).map(|m| (self.current_graph_submission_id, m)));
1622
}
1723
DeferMessage::AfterNavigationReady { messages } => {
1824
self.after_viewport_resize.extend_from_slice(&messages);
1925
}
2026
DeferMessage::SetGraphSubmissionIndex(execution_id) => {
2127
self.current_graph_submission_id = execution_id + 1;
2228
}
23-
DeferMessage::TriggerGraphRun(execution_id) => {
24-
if self.after_graph_run.is_empty() {
29+
DeferMessage::TriggerGraphRun(execution_id, document_id) => {
30+
let after_graph_run = self.after_graph_run.entry(document_id).or_default();
31+
if after_graph_run.is_empty() {
2532
return;
2633
}
2734
// Find the index of the last message we can process
28-
let split = self.after_graph_run.partition_point(|&(id, _)| id <= execution_id);
29-
let elements = self.after_graph_run.drain(..split);
35+
let split = after_graph_run.partition_point(|&(id, _)| id <= execution_id);
36+
let elements = after_graph_run.drain(..split);
3037
for (_, message) in elements.rev() {
3138
responses.add_front(message);
3239
}
40+
if !after_graph_run.is_empty() {
41+
responses.add(NodeGraphMessage::RunDocumentGraph);
42+
}
3343
}
3444
DeferMessage::TriggerNavigationReady => {
3545
for message in self.after_viewport_resize.drain(..).rev() {

editor/src/messages/defer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ mod defer_message_handler;
44
#[doc(inline)]
55
pub use defer_message::{DeferMessage, DeferMessageDiscriminant};
66
#[doc(inline)]
7-
pub use defer_message_handler::DeferMessageHandler;
7+
pub use defer_message_handler::{DeferMessageContext, DeferMessageHandler};

editor/src/messages/dialog/new_document_dialog/new_document_dialog_message_handler.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ impl MessageHandler<NewDocumentDialogMessage, ()> for NewDocumentDialogMessageHa
3232
artboard: graphene_std::Artboard::new(IVec2::ZERO, self.dimensions.as_ivec2()),
3333
}
3434
.into(),
35+
NodeGraphMessage::ForceRunDocumentGraph.into(),
36+
DeferMessage::AfterGraphRun {
37+
messages: vec![DeferMessage::TriggerNavigationReady.into()],
38+
}
39+
.into(),
3540
],
3641
});
3742
responses.add(DeferMessage::AfterNavigationReady {

editor/src/messages/input_preprocessor/input_preprocessor_message_handler.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,6 @@ impl MessageHandler<InputPreprocessorMessage, InputPreprocessorMessageContext> f
3535

3636
responses.add(NavigationMessage::CanvasPan { delta: DVec2::ZERO });
3737
responses.add(NodeGraphMessage::SetGridAlignedEdges);
38-
// We have to wait until a node node graph has run and all messages from that execution have been processed.
39-
responses.add(DeferMessage::AfterGraphRun {
40-
messages: vec![
41-
DeferMessage::AfterGraphRun {
42-
messages: vec![DeferMessage::TriggerNavigationReady.into()],
43-
}
44-
.into(),
45-
],
46-
});
4738
}
4839
}
4940
InputPreprocessorMessage::DoubleClick { editor_mouse_state, modifier_keys } => {

editor/src/messages/portfolio/portfolio_message_handler.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -347,12 +347,13 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
347347
let inspect_node = self.inspect_node_id();
348348
if let Ok(message) = self.executor.submit_node_graph_evaluation(
349349
self.documents.get_mut(document_id).expect("Tried to render non-existent document"),
350+
*document_id,
350351
ipp.viewport_bounds.size().as_uvec2(),
351352
timing_information,
352353
inspect_node,
353354
true,
354355
) {
355-
responses.add(message);
356+
responses.add_front(message);
356357
}
357358
}
358359

@@ -378,16 +379,19 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
378379
PortfolioMessage::NewDocumentWithName { name } => {
379380
let mut new_document = DocumentMessageHandler::default();
380381
new_document.name = name;
381-
responses.add(DocumentMessage::PTZUpdate);
382+
let mut new_responses = VecDeque::new();
383+
new_responses.add(DocumentMessage::PTZUpdate);
382384

383385
let document_id = DocumentId(generate_uuid());
384386
if self.active_document().is_some() {
385-
responses.add(BroadcastEvent::ToolAbort);
386-
responses.add(NavigationMessage::CanvasPan { delta: (0., 0.).into() });
387+
new_responses.add(BroadcastEvent::ToolAbort);
388+
new_responses.add(NavigationMessage::CanvasPan { delta: (0., 0.).into() });
387389
}
388390

389-
self.load_document(new_document, document_id, responses, false);
390-
responses.add(PortfolioMessage::SelectDocument { document_id });
391+
self.load_document(new_document, document_id, &mut new_responses, false);
392+
new_responses.add(PortfolioMessage::SelectDocument { document_id });
393+
new_responses.extend(responses.drain(..));
394+
*responses = new_responses;
391395
}
392396
PortfolioMessage::NextDocument => {
393397
if let Some(active_document_id) = self.active_document_id {
@@ -899,7 +903,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
899903
transparent_background,
900904
..Default::default()
901905
};
902-
let result = self.executor.submit_document_export(document, export_config);
906+
let result = self.executor.submit_document_export(document, self.active_document_id.unwrap(), export_config);
903907

904908
if let Err(description) = result {
905909
responses.add(DialogMessage::DisplayDialogError {
@@ -917,6 +921,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
917921
let inspect_node = self.inspect_node_id();
918922
let result = self.executor.submit_node_graph_evaluation(
919923
self.documents.get_mut(&document_id).expect("Tried to render non-existent document"),
924+
document_id,
920925
ipp.viewport_bounds.size().as_uvec2(),
921926
timing_information,
922927
inspect_node,
@@ -930,7 +935,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
930935
description,
931936
});
932937
}
933-
Ok(message) => responses.add(message),
938+
Ok(message) => responses.add_front(message),
934939
}
935940
}
936941
PortfolioMessage::ToggleRulers => {

editor/src/messages/tool/tool_messages/freehand_tool.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -251,12 +251,8 @@ impl Fsm for FreehandToolFsmState {
251251
let nodes = vec![(NodeId(0), node)];
252252

253253
let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, parent, responses);
254-
let defered_responses = &mut VecDeque::new();
255-
tool_options.fill.apply_fill(layer, defered_responses);
256-
tool_options.stroke.apply_stroke(tool_data.weight, layer, defered_responses);
257-
responses.add(DeferMessage::AfterGraphRun {
258-
messages: defered_responses.drain(..).collect(),
259-
});
254+
tool_options.fill.apply_fill(layer, responses);
255+
tool_options.stroke.apply_stroke(tool_data.weight, layer, responses);
260256
tool_data.layer = Some(layer);
261257

262258
FreehandToolFsmState::Drawing

editor/src/messages/tool/tool_messages/shape_tool.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,7 @@ impl Fsm for ShapeToolFsmState {
706706
responses.add(DeferMessage::AfterGraphRun {
707707
messages: defered_responses.drain(..).collect(),
708708
});
709+
responses.add(NodeGraphMessage::RunDocumentGraph);
709710

710711
ShapeToolFsmState::Drawing(tool_data.current_shape)
711712
}

editor/src/node_graph_executor.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ pub struct NodeGraphExecutor {
6363
#[derive(Debug, Clone)]
6464
struct ExecutionContext {
6565
export_config: Option<ExportConfig>,
66+
document_id: DocumentId,
6667
}
6768

6869
impl NodeGraphExecutor {
@@ -133,7 +134,13 @@ impl NodeGraphExecutor {
133134
}
134135

135136
/// Adds an evaluate request for whatever current network is cached.
136-
pub(crate) fn submit_current_node_graph_evaluation(&mut self, document: &mut DocumentMessageHandler, viewport_resolution: UVec2, time: TimingInformation) -> Result<Message, String> {
137+
pub(crate) fn submit_current_node_graph_evaluation(
138+
&mut self,
139+
document: &mut DocumentMessageHandler,
140+
document_id: DocumentId,
141+
viewport_resolution: UVec2,
142+
time: TimingInformation,
143+
) -> Result<Message, String> {
137144
let render_config = RenderConfig {
138145
viewport: Footprint {
139146
transform: document.metadata().document_to_viewport,
@@ -153,7 +160,7 @@ impl NodeGraphExecutor {
153160
// Execute the node graph
154161
let execution_id = self.queue_execution(render_config);
155162

156-
self.futures.insert(execution_id, ExecutionContext { export_config: None });
163+
self.futures.insert(execution_id, ExecutionContext { export_config: None, document_id });
157164

158165
Ok(DeferMessage::SetGraphSubmissionIndex(execution_id).into())
159166
}
@@ -162,17 +169,18 @@ impl NodeGraphExecutor {
162169
pub fn submit_node_graph_evaluation(
163170
&mut self,
164171
document: &mut DocumentMessageHandler,
172+
document_id: DocumentId,
165173
viewport_resolution: UVec2,
166174
time: TimingInformation,
167175
inspect_node: Option<NodeId>,
168176
ignore_hash: bool,
169177
) -> Result<Message, String> {
170178
self.update_node_graph(document, inspect_node, ignore_hash)?;
171-
self.submit_current_node_graph_evaluation(document, viewport_resolution, time)
179+
self.submit_current_node_graph_evaluation(document, document_id, viewport_resolution, time)
172180
}
173181

174182
/// Evaluates a node graph for export
175-
pub fn submit_document_export(&mut self, document: &mut DocumentMessageHandler, mut export_config: ExportConfig) -> Result<(), String> {
183+
pub fn submit_document_export(&mut self, document: &mut DocumentMessageHandler, document_id: DocumentId, mut export_config: ExportConfig) -> Result<(), String> {
176184
let network = document.network_interface.document_network().clone();
177185

178186
// Calculate the bounding box of the region to be exported
@@ -204,7 +212,10 @@ impl NodeGraphExecutor {
204212
.send(GraphRuntimeRequest::GraphUpdate(GraphUpdate { network, inspect_node: None }))
205213
.map_err(|e| e.to_string())?;
206214
let execution_id = self.queue_execution(render_config);
207-
let execution_context = ExecutionContext { export_config: Some(export_config) };
215+
let execution_context = ExecutionContext {
216+
export_config: Some(export_config),
217+
document_id,
218+
};
208219
self.futures.insert(execution_id, execution_context);
209220

210221
Ok(())
@@ -279,7 +290,7 @@ impl NodeGraphExecutor {
279290
} else {
280291
self.process_node_graph_output(node_graph_output, transform, responses)?
281292
}
282-
responses.add(DeferMessage::TriggerGraphRun(execution_id));
293+
responses.add_front(DeferMessage::TriggerGraphRun(execution_id, execution_context.document_id));
283294

284295
// Update the spreadsheet on the frontend using the value of the inspect result.
285296
if self.old_inspect_node.is_some() {

0 commit comments

Comments
 (0)