Skip to content

Commit 91c96ff

Browse files
Improve performance
1 parent f1c2d41 commit 91c96ff

File tree

3 files changed

+29
-34
lines changed

3 files changed

+29
-34
lines changed

desktop/src/editor_api/editor_wrapper.rs

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,31 @@ mod intercept_message;
1515

1616
pub struct EditorWrapper {
1717
editor: Editor,
18-
queue: VecDeque<QueuedMessage>,
19-
}
20-
21-
#[allow(clippy::large_enum_variant)]
22-
enum QueuedMessage {
23-
Message(Message),
24-
EditorMessage(EditorMessage),
18+
queue: VecDeque<EditorMessage>,
19+
messages: Vec<Message>,
20+
responses: Vec<NativeMessage>,
2521
}
2622

2723
impl EditorApi for EditorWrapper {
2824
fn dispatch(&mut self, message: EditorMessage) -> Vec<NativeMessage> {
2925
self.queue_editor_message(message);
3026

31-
let mut responses = Vec::new();
32-
33-
while let Some(queued_message) = self.queue.pop_front() {
34-
match queued_message {
35-
QueuedMessage::Message(message) => self.handle_message(message, &mut responses),
36-
QueuedMessage::EditorMessage(editor_message) => self.handle_editor_message(editor_message, &mut responses),
27+
while !self.queue.is_empty() {
28+
while let Some(message) = self.queue.pop_front() {
29+
self.handle_editor_message(message);
3730
}
31+
let frontend_messages = self
32+
.editor
33+
.handle_message(Message::Batched {
34+
messages: std::mem::take(&mut self.messages).into_boxed_slice(),
35+
})
36+
.into_iter()
37+
.filter_map(|m| intercept_frontend_message::intercept_frontend_message(m, &mut self.responses))
38+
.collect::<Vec<_>>();
39+
self.respond(NativeMessage::ToFrontend(ron::to_string(&frontend_messages).unwrap().into_bytes()));
3840
}
3941

40-
responses
42+
std::mem::take(&mut self.responses)
4143
}
4244

4345
fn poll() -> Vec<NativeMessage> {
@@ -61,6 +63,8 @@ impl EditorWrapper {
6163
Self {
6264
editor: Editor::new(),
6365
queue: VecDeque::new(),
66+
messages: Vec::new(),
67+
responses: Vec::new(),
6468
}
6569
}
6670

@@ -69,27 +73,22 @@ impl EditorWrapper {
6973
futures::executor::block_on(graphite_editor::node_graph_executor::replace_application_io(application_io));
7074
}
7175

72-
fn handle_message(&mut self, message: Message, responses: &mut Vec<NativeMessage>) {
73-
if let Some(message) = intercept_message::intercept_message(message, responses) {
74-
let messages = self.editor.handle_message(message);
75-
let frontend_messages = messages
76-
.into_iter()
77-
.filter_map(|m| intercept_frontend_message::intercept_frontend_message(m, responses))
78-
.collect::<Vec<_>>();
79-
responses.push(NativeMessage::ToFrontend(ron::to_string(&frontend_messages).unwrap().into_bytes()));
80-
}
76+
fn handle_editor_message(&mut self, message: EditorMessage) {
77+
handle_editor_message::handle_editor_message(self, message);
8178
}
8279

83-
fn handle_editor_message(&mut self, message: EditorMessage, responses: &mut Vec<NativeMessage>) {
84-
handle_editor_message::handle_editor_message(self, message, responses);
80+
pub fn respond(&mut self, response: NativeMessage) {
81+
self.responses.push(response);
8582
}
8683

8784
pub(super) fn queue_editor_message(&mut self, message: EditorMessage) {
88-
self.queue.push_back(QueuedMessage::EditorMessage(message));
85+
self.queue.push_back(message);
8986
}
9087

9188
pub(super) fn queue_message(&mut self, message: Message) {
92-
self.queue.push_back(QueuedMessage::Message(message));
89+
if let Some(message) = intercept_message::intercept_message(message, &mut self.responses) {
90+
self.messages.push(message);
91+
}
9392
}
9493

9594
pub(super) fn poll_node_graph_evaluation(&mut self) {

desktop/src/editor_api/handle_editor_message.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::editor_api::messages::{EditorMessage, NativeMessage, OpenFileDialogCo
44

55
use super::EditorWrapper;
66

7-
pub(super) fn handle_editor_message(editor_wrapper: &mut EditorWrapper, message: EditorMessage, responses: &mut Vec<NativeMessage>) {
7+
pub(super) fn handle_editor_message(editor_wrapper: &mut EditorWrapper, message: EditorMessage) {
88
match message {
99
EditorMessage::FromFrontend(data) => {
1010
let string = std::str::from_utf8(&data).unwrap();
@@ -88,14 +88,14 @@ pub(super) fn handle_editor_message(editor_wrapper: &mut EditorWrapper, message:
8888
},
8989
EditorMessage::SaveFileDialogResult { path, context } => match context {
9090
SaveFileDialogContext::Document { document_id, content } => {
91-
responses.push(NativeMessage::WriteFile { path: path.clone(), content });
91+
editor_wrapper.respond(NativeMessage::WriteFile { path: path.clone(), content });
9292
editor_wrapper.queue_message(Message::Portfolio(PortfolioMessage::DocumentPassMessage {
9393
document_id,
9494
message: DocumentMessage::SavedDocument { path: Some(path) },
9595
}));
9696
}
9797
SaveFileDialogContext::Export { content } => {
98-
responses.push(NativeMessage::WriteFile { path, content });
98+
editor_wrapper.respond(NativeMessage::WriteFile { path, content });
9999
}
100100
},
101101
EditorMessage::PoolNodeGraphEvaluation => editor_wrapper.poll_node_graph_evaluation(),

desktop/src/editor_api/messages.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@ use std::path::PathBuf;
22

33
use graphite_editor::messages::prelude::DocumentId;
44

5-
pub enum WrappedMessage {
6-
x,
7-
}
8-
95
pub enum NativeMessage {
106
ToFrontend(Vec<u8>),
117
OpenFileDialog {

0 commit comments

Comments
 (0)