mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-02 19:28:12 +08:00
Add Handler for defered execution of messages
This commit is contained in:
@@ -5,7 +5,6 @@ use crate::messages::prelude::*;
|
|||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct Dispatcher {
|
pub struct Dispatcher {
|
||||||
buffered_queue: Option<Vec<VecDeque<Message>>>,
|
|
||||||
message_queues: Vec<VecDeque<Message>>,
|
message_queues: Vec<VecDeque<Message>>,
|
||||||
pub responses: Vec<FrontendMessage>,
|
pub responses: Vec<FrontendMessage>,
|
||||||
pub message_handlers: DispatcherMessageHandlers,
|
pub message_handlers: DispatcherMessageHandlers,
|
||||||
@@ -17,6 +16,7 @@ pub struct DispatcherMessageHandlers {
|
|||||||
app_window_message_handler: AppWindowMessageHandler,
|
app_window_message_handler: AppWindowMessageHandler,
|
||||||
broadcast_message_handler: BroadcastMessageHandler,
|
broadcast_message_handler: BroadcastMessageHandler,
|
||||||
debug_message_handler: DebugMessageHandler,
|
debug_message_handler: DebugMessageHandler,
|
||||||
|
defer_message_handler: DeferMessageHandler,
|
||||||
dialog_message_handler: DialogMessageHandler,
|
dialog_message_handler: DialogMessageHandler,
|
||||||
globals_message_handler: GlobalsMessageHandler,
|
globals_message_handler: GlobalsMessageHandler,
|
||||||
input_preprocessor_message_handler: InputPreprocessorMessageHandler,
|
input_preprocessor_message_handler: InputPreprocessorMessageHandler,
|
||||||
@@ -91,14 +91,6 @@ impl Dispatcher {
|
|||||||
|
|
||||||
pub fn handle_message<T: Into<Message>>(&mut self, message: T, process_after_all_current: bool) {
|
pub fn handle_message<T: Into<Message>>(&mut self, message: T, process_after_all_current: bool) {
|
||||||
let message = message.into();
|
let message = message.into();
|
||||||
// Add all additional messages to the buffer if it exists (except from the end buffer message)
|
|
||||||
if !matches!(message, Message::EndBuffer { .. }) {
|
|
||||||
if let Some(buffered_queue) = &mut self.buffered_queue {
|
|
||||||
Self::schedule_execution(buffered_queue, true, [message]);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we are not maintaining the buffer, simply add to the current queue
|
// If we are not maintaining the buffer, simply add to the current queue
|
||||||
Self::schedule_execution(&mut self.message_queues, process_after_all_current, [message]);
|
Self::schedule_execution(&mut self.message_queues, process_after_all_current, [message]);
|
||||||
@@ -137,6 +129,9 @@ impl Dispatcher {
|
|||||||
Message::Debug(message) => {
|
Message::Debug(message) => {
|
||||||
self.message_handlers.debug_message_handler.process_message(message, &mut queue, ());
|
self.message_handlers.debug_message_handler.process_message(message, &mut queue, ());
|
||||||
}
|
}
|
||||||
|
Message::Defer(message) => {
|
||||||
|
self.message_handlers.defer_message_handler.process_message(message, &mut queue, ());
|
||||||
|
}
|
||||||
Message::Dialog(message) => {
|
Message::Dialog(message) => {
|
||||||
let context = DialogMessageContext {
|
let context = DialogMessageContext {
|
||||||
portfolio: &self.message_handlers.portfolio_message_handler,
|
portfolio: &self.message_handlers.portfolio_message_handler,
|
||||||
@@ -232,37 +227,6 @@ impl Dispatcher {
|
|||||||
Message::Batched { messages } => {
|
Message::Batched { messages } => {
|
||||||
messages.iter().for_each(|message| self.handle_message(message.to_owned(), false));
|
messages.iter().for_each(|message| self.handle_message(message.to_owned(), false));
|
||||||
}
|
}
|
||||||
Message::StartBuffer => {
|
|
||||||
self.buffered_queue = Some(std::mem::take(&mut self.message_queues));
|
|
||||||
}
|
|
||||||
Message::EndBuffer { render_metadata } => {
|
|
||||||
// Assign the message queue to the currently buffered queue
|
|
||||||
if let Some(buffered_queue) = self.buffered_queue.take() {
|
|
||||||
self.cleanup_queues(false);
|
|
||||||
assert!(self.message_queues.is_empty(), "message queues are always empty when ending a buffer");
|
|
||||||
self.message_queues = buffered_queue;
|
|
||||||
};
|
|
||||||
|
|
||||||
let graphene_std::renderer::RenderMetadata {
|
|
||||||
upstream_footprints: footprints,
|
|
||||||
local_transforms,
|
|
||||||
first_instance_source_id,
|
|
||||||
click_targets,
|
|
||||||
clip_targets,
|
|
||||||
} = render_metadata;
|
|
||||||
|
|
||||||
// Run these update state messages immediately
|
|
||||||
let messages = [
|
|
||||||
DocumentMessage::UpdateUpstreamTransforms {
|
|
||||||
upstream_footprints: footprints,
|
|
||||||
local_transforms,
|
|
||||||
first_instance_source_id,
|
|
||||||
},
|
|
||||||
DocumentMessage::UpdateClickTargets { click_targets },
|
|
||||||
DocumentMessage::UpdateClipTargets { clip_targets },
|
|
||||||
];
|
|
||||||
Self::schedule_execution(&mut self.message_queues, false, messages.map(Message::from));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are child messages, append the queue to the list of queues
|
// If there are child messages, append the queue to the list of queues
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
use crate::messages::prelude::*;
|
||||||
|
|
||||||
|
#[impl_message(Message, Defer)]
|
||||||
|
#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)]
|
||||||
|
pub enum DeferMessage {
|
||||||
|
TriggerGraphRun,
|
||||||
|
AfterGraphRun { messages: Vec<Message> },
|
||||||
|
TriggerViewportResize,
|
||||||
|
AfterViewportResize { messages: Vec<Message> },
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
use crate::messages::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Debug, Default, ExtractField)]
|
||||||
|
pub struct DeferMessageHandler {
|
||||||
|
after_graph_run: Vec<Message>,
|
||||||
|
after_viewport_resize: Vec<Message>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[message_handler_data]
|
||||||
|
impl MessageHandler<DeferMessage, ()> for DeferMessageHandler {
|
||||||
|
fn process_message(&mut self, message: DeferMessage, responses: &mut VecDeque<Message>, _: ()) {
|
||||||
|
match message {
|
||||||
|
DeferMessage::AfterGraphRun { messages } => {
|
||||||
|
self.after_graph_run.extend_from_slice(&messages);
|
||||||
|
}
|
||||||
|
DeferMessage::AfterViewportResize { messages } => {
|
||||||
|
self.after_viewport_resize.extend_from_slice(&messages);
|
||||||
|
}
|
||||||
|
DeferMessage::TriggerGraphRun => {
|
||||||
|
for message in self.after_graph_run.drain(..) {
|
||||||
|
responses.push_front(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DeferMessage::TriggerViewportResize => {
|
||||||
|
for message in self.after_viewport_resize.drain(..) {
|
||||||
|
responses.push_front(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
advertise_actions!(DeferMessageDiscriminant;
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
mod defer_message;
|
||||||
|
mod defer_message_handler;
|
||||||
|
|
||||||
|
#[doc(inline)]
|
||||||
|
pub use defer_message::{DeferMessage, DeferMessageDiscriminant};
|
||||||
|
#[doc(inline)]
|
||||||
|
pub use defer_message_handler::DeferMessageHandler;
|
||||||
+12
-6
@@ -24,17 +24,23 @@ impl MessageHandler<NewDocumentDialogMessage, ()> for NewDocumentDialogMessageHa
|
|||||||
|
|
||||||
let create_artboard = !self.infinite && self.dimensions.x > 0 && self.dimensions.y > 0;
|
let create_artboard = !self.infinite && self.dimensions.x > 0 && self.dimensions.y > 0;
|
||||||
if create_artboard {
|
if create_artboard {
|
||||||
responses.add(Message::StartBuffer);
|
responses.add(NodeGraphMessage::RunDocumentGraph);
|
||||||
responses.add(GraphOperationMessage::NewArtboard {
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
id: NodeId::new(),
|
messages: vec![
|
||||||
artboard: graphene_std::Artboard::new(IVec2::ZERO, self.dimensions.as_ivec2()),
|
GraphOperationMessage::NewArtboard {
|
||||||
|
id: NodeId::new(),
|
||||||
|
artboard: graphene_std::Artboard::new(IVec2::ZERO, self.dimensions.as_ivec2()),
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Figure out how to get StartBuffer to work here so we can delete this and use `DocumentMessage::ZoomCanvasToFitAll` instead
|
// TODO: Figure out how to get StartBuffer to work here so we can delete this and use `DocumentMessage::ZoomCanvasToFitAll` instead
|
||||||
// Currently, it is necessary to use `FrontendMessage::TriggerDelayedZoomCanvasToFitAll` rather than `DocumentMessage::ZoomCanvasToFitAll` because the size of the viewport is not yet populated
|
// Currently, it is necessary to use `FrontendMessage::TriggerDelayedZoomCanvasToFitAll` rather than `DocumentMessage::ZoomCanvasToFitAll` because the size of the viewport is not yet populated
|
||||||
responses.add(Message::StartBuffer);
|
responses.add(DeferMessage::AfterViewportResize {
|
||||||
responses.add(FrontendMessage::TriggerDelayedZoomCanvasToFitAll);
|
messages: vec![DocumentMessage::ZoomCanvasToFitAll.into()],
|
||||||
|
});
|
||||||
responses.add(DocumentMessage::DeselectAllLayers);
|
responses.add(DocumentMessage::DeselectAllLayers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ impl MessageHandler<InputPreprocessorMessage, InputPreprocessorMessageContext> f
|
|||||||
self.viewport_bounds = bounds;
|
self.viewport_bounds = bounds;
|
||||||
|
|
||||||
responses.add(NavigationMessage::CanvasPan { delta: DVec2::ZERO });
|
responses.add(NavigationMessage::CanvasPan { delta: DVec2::ZERO });
|
||||||
|
responses.add(DeferMessage::TriggerGraphRun);
|
||||||
responses.add(NodeGraphMessage::SetGridAlignedEdges);
|
responses.add(NodeGraphMessage::SetGridAlignedEdges);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
use crate::messages::prelude::*;
|
use crate::messages::prelude::*;
|
||||||
use graphene_std::renderer::RenderMetadata;
|
|
||||||
use graphite_proc_macros::*;
|
use graphite_proc_macros::*;
|
||||||
|
|
||||||
#[impl_message]
|
#[impl_message]
|
||||||
@@ -15,6 +14,8 @@ pub enum Message {
|
|||||||
#[child]
|
#[child]
|
||||||
Debug(DebugMessage),
|
Debug(DebugMessage),
|
||||||
#[child]
|
#[child]
|
||||||
|
Defer(DeferMessage),
|
||||||
|
#[child]
|
||||||
Dialog(DialogMessage),
|
Dialog(DialogMessage),
|
||||||
#[child]
|
#[child]
|
||||||
Frontend(FrontendMessage),
|
Frontend(FrontendMessage),
|
||||||
@@ -40,10 +41,6 @@ pub enum Message {
|
|||||||
Batched {
|
Batched {
|
||||||
messages: Box<[Message]>,
|
messages: Box<[Message]>,
|
||||||
},
|
},
|
||||||
StartBuffer,
|
|
||||||
EndBuffer {
|
|
||||||
render_metadata: RenderMetadata,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Provides an impl of `specta::Type` for `MessageDiscriminant`, the struct created by `impl_message`.
|
/// Provides an impl of `specta::Type` for `MessageDiscriminant`, the struct created by `impl_message`.
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ pub mod animation;
|
|||||||
pub mod app_window;
|
pub mod app_window;
|
||||||
pub mod broadcast;
|
pub mod broadcast;
|
||||||
pub mod debug;
|
pub mod debug;
|
||||||
|
pub mod defer;
|
||||||
pub mod dialog;
|
pub mod dialog;
|
||||||
pub mod frontend;
|
pub mod frontend;
|
||||||
pub mod globals;
|
pub mod globals;
|
||||||
|
|||||||
@@ -1866,14 +1866,14 @@ impl DocumentMessageHandler {
|
|||||||
|
|
||||||
let previous_network = std::mem::replace(&mut self.network_interface, network_interface);
|
let previous_network = std::mem::replace(&mut self.network_interface, network_interface);
|
||||||
|
|
||||||
// Push the UpdateOpenDocumentsList message to the bus in order to update the save status of the open documents
|
|
||||||
responses.add(PortfolioMessage::UpdateOpenDocumentsList);
|
|
||||||
responses.add(NodeGraphMessage::SelectedNodesUpdated);
|
|
||||||
responses.add(NodeGraphMessage::ForceRunDocumentGraph);
|
|
||||||
// TODO: Remove once the footprint is used to load the imports/export distances from the edge
|
// TODO: Remove once the footprint is used to load the imports/export distances from the edge
|
||||||
responses.add(NodeGraphMessage::UnloadWires);
|
responses.push_front(NodeGraphMessage::UnloadWires.into());
|
||||||
responses.add(NodeGraphMessage::SetGridAlignedEdges);
|
responses.push_front(NodeGraphMessage::SetGridAlignedEdges.into());
|
||||||
responses.add(Message::StartBuffer);
|
|
||||||
|
// Push the UpdateOpenDocumentsList message to the bus in order to update the save status of the open documents
|
||||||
|
responses.push_front(NodeGraphMessage::ForceRunDocumentGraph.into());
|
||||||
|
responses.push_front(NodeGraphMessage::SelectedNodesUpdated.into());
|
||||||
|
responses.push_front(PortfolioMessage::UpdateOpenDocumentsList.into());
|
||||||
Some(previous_network)
|
Some(previous_network)
|
||||||
}
|
}
|
||||||
pub fn redo_with_history(&mut self, ipp: &InputPreprocessorMessageHandler, responses: &mut VecDeque<Message>) {
|
pub fn redo_with_history(&mut self, ipp: &InputPreprocessorMessageHandler, responses: &mut VecDeque<Message>) {
|
||||||
|
|||||||
@@ -568,8 +568,9 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
|
|||||||
|
|
||||||
responses.add(NodeGraphMessage::RunDocumentGraph);
|
responses.add(NodeGraphMessage::RunDocumentGraph);
|
||||||
responses.add(NodeGraphMessage::SelectedNodesSet { nodes: all_new_ids });
|
responses.add(NodeGraphMessage::SelectedNodesSet { nodes: all_new_ids });
|
||||||
responses.add(Message::StartBuffer);
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
responses.add(PortfolioMessage::CenterPastedLayers { layers });
|
messages: vec![PortfolioMessage::CenterPastedLayers { layers }.into()],
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -701,13 +702,13 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
|
|||||||
|
|
||||||
if create_document {
|
if create_document {
|
||||||
// Wait for the document to be rendered so the click targets can be calculated in order to determine the artboard size that will encompass the pasted image
|
// Wait for the document to be rendered so the click targets can be calculated in order to determine the artboard size that will encompass the pasted image
|
||||||
responses.add(Message::StartBuffer);
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
responses.add(DocumentMessage::WrapContentInArtboard { place_artboard_at_origin: true });
|
messages: vec![DocumentMessage::WrapContentInArtboard { place_artboard_at_origin: true }.into()],
|
||||||
|
});
|
||||||
|
|
||||||
// TODO: Figure out how to get StartBuffer to work here so we can delete this and use `DocumentMessage::ZoomCanvasToFitAll` instead
|
responses.add(DeferMessage::AfterViewportResize {
|
||||||
// Currently, it is necessary to use `FrontendMessage::TriggerDelayedZoomCanvasToFitAll` rather than `DocumentMessage::ZoomCanvasToFitAll` because the size of the viewport is not yet populated
|
messages: vec![DocumentMessage::ZoomCanvasToFitAll.into()],
|
||||||
responses.add(Message::StartBuffer);
|
});
|
||||||
responses.add(FrontendMessage::TriggerDelayedZoomCanvasToFitAll);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PortfolioMessage::PasteSvg {
|
PortfolioMessage::PasteSvg {
|
||||||
@@ -733,13 +734,13 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
|
|||||||
|
|
||||||
if create_document {
|
if create_document {
|
||||||
// Wait for the document to be rendered so the click targets can be calculated in order to determine the artboard size that will encompass the pasted image
|
// Wait for the document to be rendered so the click targets can be calculated in order to determine the artboard size that will encompass the pasted image
|
||||||
responses.add(Message::StartBuffer);
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
responses.add(DocumentMessage::WrapContentInArtboard { place_artboard_at_origin: true });
|
messages: vec![DocumentMessage::WrapContentInArtboard { place_artboard_at_origin: true }.into()],
|
||||||
|
});
|
||||||
|
|
||||||
// TODO: Figure out how to get StartBuffer to work here so we can delete this and use `DocumentMessage::ZoomCanvasToFitAll` instead
|
responses.add(DeferMessage::AfterViewportResize {
|
||||||
// Currently, it is necessary to use `FrontendMessage::TriggerDelayedZoomCanvasToFitAll` rather than `DocumentMessage::ZoomCanvasToFitAll` because the size of the viewport is not yet populated
|
messages: vec![DocumentMessage::ZoomCanvasToFitAll.into()],
|
||||||
responses.add(Message::StartBuffer);
|
});
|
||||||
responses.add(FrontendMessage::TriggerDelayedZoomCanvasToFitAll);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PortfolioMessage::PrevDocument => {
|
PortfolioMessage::PrevDocument => {
|
||||||
@@ -1019,9 +1020,7 @@ impl PortfolioMessageHandler {
|
|||||||
/text>"#
|
/text>"#
|
||||||
// It's a mystery why the `/text>` tag above needs to be missing its `<`, but when it exists it prints the `<` character in the text. However this works with it removed.
|
// It's a mystery why the `/text>` tag above needs to be missing its `<`, but when it exists it prints the `<` character in the text. However this works with it removed.
|
||||||
.to_string();
|
.to_string();
|
||||||
responses.add(Message::EndBuffer {
|
responses.add(DeferMessage::TriggerGraphRun);
|
||||||
render_metadata: graphene_std::renderer::RenderMetadata::default(),
|
|
||||||
});
|
|
||||||
responses.add(FrontendMessage::UpdateDocumentArtwork { svg: error });
|
responses.add(FrontendMessage::UpdateDocumentArtwork { svg: error });
|
||||||
}
|
}
|
||||||
result
|
result
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ pub use crate::messages::animation::{AnimationMessage, AnimationMessageDiscrimin
|
|||||||
pub use crate::messages::app_window::{AppWindowMessage, AppWindowMessageDiscriminant, AppWindowMessageHandler};
|
pub use crate::messages::app_window::{AppWindowMessage, AppWindowMessageDiscriminant, AppWindowMessageHandler};
|
||||||
pub use crate::messages::broadcast::{BroadcastMessage, BroadcastMessageDiscriminant, BroadcastMessageHandler};
|
pub use crate::messages::broadcast::{BroadcastMessage, BroadcastMessageDiscriminant, BroadcastMessageHandler};
|
||||||
pub use crate::messages::debug::{DebugMessage, DebugMessageDiscriminant, DebugMessageHandler};
|
pub use crate::messages::debug::{DebugMessage, DebugMessageDiscriminant, DebugMessageHandler};
|
||||||
|
pub use crate::messages::defer::{DeferMessage, DeferMessageDiscriminant, DeferMessageHandler};
|
||||||
pub use crate::messages::dialog::export_dialog::{ExportDialogMessage, ExportDialogMessageContext, ExportDialogMessageDiscriminant, ExportDialogMessageHandler};
|
pub use crate::messages::dialog::export_dialog::{ExportDialogMessage, ExportDialogMessageContext, ExportDialogMessageDiscriminant, ExportDialogMessageHandler};
|
||||||
pub use crate::messages::dialog::new_document_dialog::{NewDocumentDialogMessage, NewDocumentDialogMessageDiscriminant, NewDocumentDialogMessageHandler};
|
pub use crate::messages::dialog::new_document_dialog::{NewDocumentDialogMessage, NewDocumentDialogMessageDiscriminant, NewDocumentDialogMessageHandler};
|
||||||
pub use crate::messages::dialog::preferences_dialog::{PreferencesDialogMessage, PreferencesDialogMessageContext, PreferencesDialogMessageDiscriminant, PreferencesDialogMessageHandler};
|
pub use crate::messages::dialog::preferences_dialog::{PreferencesDialogMessage, PreferencesDialogMessageContext, PreferencesDialogMessageDiscriminant, PreferencesDialogMessageHandler};
|
||||||
|
|||||||
@@ -153,8 +153,9 @@ pub fn merge_layers(document: &DocumentMessageHandler, first_layer: LayerNodeIde
|
|||||||
});
|
});
|
||||||
|
|
||||||
responses.add(NodeGraphMessage::RunDocumentGraph);
|
responses.add(NodeGraphMessage::RunDocumentGraph);
|
||||||
responses.add(Message::StartBuffer);
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
responses.add(PenToolMessage::RecalculateLatestPointsPosition);
|
messages: vec![PenToolMessage::RecalculateLatestPointsPosition.into()],
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Merge the `first_endpoint` with `second_endpoint`.
|
/// Merge the `first_endpoint` with `second_endpoint`.
|
||||||
|
|||||||
@@ -383,8 +383,9 @@ impl Fsm for BrushToolFsmState {
|
|||||||
else {
|
else {
|
||||||
new_brush_layer(document, responses);
|
new_brush_layer(document, responses);
|
||||||
responses.add(NodeGraphMessage::RunDocumentGraph);
|
responses.add(NodeGraphMessage::RunDocumentGraph);
|
||||||
responses.add(Message::StartBuffer);
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
responses.add(BrushToolMessage::DragStart);
|
messages: vec![BrushToolMessage::DragStart.into()],
|
||||||
|
});
|
||||||
BrushToolFsmState::Ready
|
BrushToolFsmState::Ready
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -251,9 +251,12 @@ impl Fsm for FreehandToolFsmState {
|
|||||||
let nodes = vec![(NodeId(0), node)];
|
let nodes = vec![(NodeId(0), node)];
|
||||||
|
|
||||||
let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, parent, responses);
|
let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, parent, responses);
|
||||||
responses.add(Message::StartBuffer);
|
let defered_responses = &mut VecDeque::new();
|
||||||
tool_options.fill.apply_fill(layer, responses);
|
tool_options.fill.apply_fill(layer, defered_responses);
|
||||||
tool_options.stroke.apply_stroke(tool_data.weight, layer, responses);
|
tool_options.stroke.apply_stroke(tool_data.weight, layer, defered_responses);
|
||||||
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
|
messages: defered_responses.drain(..).collect(),
|
||||||
|
});
|
||||||
tool_data.layer = Some(layer);
|
tool_data.layer = Some(layer);
|
||||||
|
|
||||||
FreehandToolFsmState::Drawing
|
FreehandToolFsmState::Drawing
|
||||||
|
|||||||
@@ -1257,10 +1257,10 @@ impl PenToolData {
|
|||||||
self.prior_segments = None;
|
self.prior_segments = None;
|
||||||
responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![layer.to_node()] });
|
responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![layer.to_node()] });
|
||||||
|
|
||||||
// This causes the following message to be run only after the next graph evaluation runs and the transforms are updated
|
|
||||||
responses.add(Message::StartBuffer);
|
|
||||||
// It is necessary to defer this until the transform of the layer can be accurately computed (quite hacky)
|
// It is necessary to defer this until the transform of the layer can be accurately computed (quite hacky)
|
||||||
responses.add(PenToolMessage::AddPointLayerPosition { layer, viewport });
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
|
messages: vec![PenToolMessage::AddPointLayerPosition { layer, viewport }.into()],
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Perform extension of an existing path
|
/// Perform extension of an existing path
|
||||||
|
|||||||
@@ -624,29 +624,33 @@ impl Fsm for ShapeToolFsmState {
|
|||||||
let nodes = vec![(NodeId(0), node)];
|
let nodes = vec![(NodeId(0), node)];
|
||||||
let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, document.new_layer_bounding_artboard(input), responses);
|
let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, document.new_layer_bounding_artboard(input), responses);
|
||||||
|
|
||||||
responses.add(Message::StartBuffer);
|
let defered_responses = &mut VecDeque::new();
|
||||||
|
|
||||||
match tool_data.current_shape {
|
match tool_data.current_shape {
|
||||||
ShapeType::Ellipse | ShapeType::Rectangle | ShapeType::Arc | ShapeType::Polygon | ShapeType::Star => {
|
ShapeType::Ellipse | ShapeType::Rectangle | ShapeType::Arc | ShapeType::Polygon | ShapeType::Star => {
|
||||||
responses.add(GraphOperationMessage::TransformSet {
|
defered_responses.add(GraphOperationMessage::TransformSet {
|
||||||
layer,
|
layer,
|
||||||
transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position),
|
transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position),
|
||||||
transform_in: TransformIn::Viewport,
|
transform_in: TransformIn::Viewport,
|
||||||
skip_rerender: false,
|
skip_rerender: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
tool_options.fill.apply_fill(layer, responses);
|
tool_options.fill.apply_fill(layer, defered_responses);
|
||||||
}
|
}
|
||||||
ShapeType::Line => {
|
ShapeType::Line => {
|
||||||
tool_data.line_data.weight = tool_options.line_weight;
|
tool_data.line_data.weight = tool_options.line_weight;
|
||||||
tool_data.line_data.editing_layer = Some(layer);
|
tool_data.line_data.editing_layer = Some(layer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses);
|
tool_options.stroke.apply_stroke(tool_options.line_weight, layer, defered_responses);
|
||||||
|
|
||||||
tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses);
|
tool_options.stroke.apply_stroke(tool_options.line_weight, layer, defered_responses);
|
||||||
tool_data.data.layer = Some(layer);
|
tool_data.data.layer = Some(layer);
|
||||||
|
|
||||||
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
|
messages: defered_responses.drain(..).collect(),
|
||||||
|
});
|
||||||
|
|
||||||
ShapeToolFsmState::Drawing(tool_data.current_shape)
|
ShapeToolFsmState::Drawing(tool_data.current_shape)
|
||||||
}
|
}
|
||||||
(ShapeToolFsmState::Drawing(shape), ShapeToolMessage::PointerMove(modifier)) => {
|
(ShapeToolFsmState::Drawing(shape), ShapeToolMessage::PointerMove(modifier)) => {
|
||||||
|
|||||||
@@ -360,7 +360,7 @@ impl Fsm for SplineToolFsmState {
|
|||||||
tool_options.stroke.apply_stroke(tool_data.weight, layer, responses);
|
tool_options.stroke.apply_stroke(tool_data.weight, layer, responses);
|
||||||
tool_data.current_layer = Some(layer);
|
tool_data.current_layer = Some(layer);
|
||||||
|
|
||||||
responses.add(Message::StartBuffer);
|
// responses.add(Message::StartBuffer);
|
||||||
|
|
||||||
SplineToolFsmState::Drawing
|
SplineToolFsmState::Drawing
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -385,20 +385,25 @@ impl TextToolData {
|
|||||||
parent: document.new_layer_parent(true),
|
parent: document.new_layer_parent(true),
|
||||||
insert_index: 0,
|
insert_index: 0,
|
||||||
});
|
});
|
||||||
responses.add(Message::StartBuffer);
|
responses.add(DeferMessage::AfterGraphRun {
|
||||||
responses.add(GraphOperationMessage::FillSet {
|
messages: vec![
|
||||||
layer: self.layer,
|
GraphOperationMessage::FillSet {
|
||||||
fill: if editing_text.color.is_some() {
|
layer: self.layer,
|
||||||
Fill::Solid(editing_text.color.unwrap().to_gamma_srgb())
|
fill: if editing_text.color.is_some() {
|
||||||
} else {
|
Fill::Solid(editing_text.color.unwrap().to_gamma_srgb())
|
||||||
Fill::None
|
} else {
|
||||||
},
|
Fill::None
|
||||||
});
|
},
|
||||||
responses.add(GraphOperationMessage::TransformSet {
|
}
|
||||||
layer: self.layer,
|
.into(),
|
||||||
transform: editing_text.transform,
|
GraphOperationMessage::TransformSet {
|
||||||
transform_in: TransformIn::Viewport,
|
layer: self.layer,
|
||||||
skip_rerender: true,
|
transform: editing_text.transform,
|
||||||
|
transform_in: TransformIn::Viewport,
|
||||||
|
skip_rerender: true,
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
],
|
||||||
});
|
});
|
||||||
self.editing_text = Some(editing_text);
|
self.editing_text = Some(editing_text);
|
||||||
|
|
||||||
|
|||||||
@@ -384,9 +384,26 @@ impl NodeGraphExecutor {
|
|||||||
return Err(format!("Invalid node graph output type: {node_graph_output:#?}"));
|
return Err(format!("Invalid node graph output type: {node_graph_output:#?}"));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
responses.add(Message::EndBuffer {
|
// responses.add(Message::EndBuffer {
|
||||||
render_metadata: render_output_metadata,
|
// render_metadata: render_output_metadata,
|
||||||
|
// });
|
||||||
|
responses.add(DeferMessage::TriggerGraphRun);
|
||||||
|
let graphene_std::renderer::RenderMetadata {
|
||||||
|
upstream_footprints: footprints,
|
||||||
|
local_transforms,
|
||||||
|
first_instance_source_id,
|
||||||
|
click_targets,
|
||||||
|
clip_targets,
|
||||||
|
} = render_output_metadata;
|
||||||
|
|
||||||
|
// Run these update state messages immediately
|
||||||
|
responses.add(DocumentMessage::UpdateUpstreamTransforms {
|
||||||
|
upstream_footprints: footprints,
|
||||||
|
local_transforms,
|
||||||
|
first_instance_source_id,
|
||||||
});
|
});
|
||||||
|
responses.add(DocumentMessage::UpdateClickTargets { click_targets });
|
||||||
|
responses.add(DocumentMessage::UpdateClipTargets { clip_targets });
|
||||||
responses.add(DocumentMessage::RenderScrollbars);
|
responses.add(DocumentMessage::RenderScrollbars);
|
||||||
responses.add(DocumentMessage::RenderRulers);
|
responses.add(DocumentMessage::RenderRulers);
|
||||||
responses.add(OverlaysMessage::Draw);
|
responses.add(OverlaysMessage::Draw);
|
||||||
|
|||||||
Reference in New Issue
Block a user