Build the node graph frontend with placeholder graph info (#581)

* Build the node graph frontend

* Graph pan and zoom

* Graph's dot grid now pans/zooms also

* Interactive horisontal to vertical curves

* Data types and zooming on wires

* Icon definitions code beautification

* Add a visibility toggle

Co-authored-by: 0hypercube <0hypercube@gmail.com>
This commit is contained in:
Keavon Chambers
2022-05-10 22:34:25 -07:00
parent 5571f39b41
commit 19b2d3f859
32 changed files with 826 additions and 145 deletions

View File

@@ -4,6 +4,7 @@ use crate::input::{InputMapperMessageHandler, InputPreprocessorMessageHandler};
use crate::layout::layout_message_handler::LayoutMessageHandler;
use crate::message_prelude::*;
use crate::viewport_tools::tool_message_handler::ToolMessageHandler;
use crate::workspace::WorkspaceMessageHandler;
use std::collections::VecDeque;
@@ -27,6 +28,7 @@ struct DispatcherMessageHandlers {
layout_message_handler: LayoutMessageHandler,
portfolio_message_handler: PortfolioMessageHandler,
tool_message_handler: ToolMessageHandler,
workspace_message_handler: WorkspaceMessageHandler,
}
/// For optimization, these are messages guaranteed to be redundant when repeated.
@@ -40,7 +42,7 @@ const SIDE_EFFECT_FREE_MESSAGES: &[MessageDiscriminant] = &[
))),
MessageDiscriminant::Portfolio(PortfolioMessageDiscriminant::Document(DocumentMessageDiscriminant::FolderChanged)),
MessageDiscriminant::Frontend(FrontendMessageDiscriminant::UpdateDocumentLayer),
MessageDiscriminant::Frontend(FrontendMessageDiscriminant::DisplayDocumentLayerTreeStructure),
MessageDiscriminant::Frontend(FrontendMessageDiscriminant::UpdateDocumentLayerTreeStructure),
MessageDiscriminant::Frontend(FrontendMessageDiscriminant::UpdateOpenDocumentsList),
MessageDiscriminant::Tool(ToolMessageDiscriminant::DocumentIsDirty),
];
@@ -113,6 +115,11 @@ impl Dispatcher {
&mut self.message_queue,
);
}
Workspace(message) => {
self.message_handlers
.workspace_message_handler
.process_action(message, &self.message_handlers.input_preprocessor_message_handler, &mut self.message_queue);
}
#[remain::unsorted]
PopulateBuildMetadata { new } => self.build_metadata = new,

View File

@@ -39,6 +39,8 @@ pub enum Message {
Portfolio(PortfolioMessage),
#[child]
Tool(ToolMessage),
#[child]
Workspace(WorkspaceMessage),
#[remain::unsorted]
PopulateBuildMetadata { new: BuildMetadata },

View File

@@ -846,7 +846,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
DocumentHistoryForward => self.redo(responses).unwrap_or_else(|e| log::warn!("{}", e)),
DocumentStructureChanged => {
let data_buffer: RawBuffer = self.serialize_root().into();
responses.push_back(FrontendMessage::DisplayDocumentLayerTreeStructure { data_buffer }.into())
responses.push_back(FrontendMessage::UpdateDocumentLayerTreeStructure { data_buffer }.into())
}
DuplicateSelectedLayers => {
self.backup(responses);

View File

@@ -16,7 +16,6 @@ pub enum FrontendMessage {
DisplayDialog { icon: String },
DisplayDialogDismiss,
DisplayDialogPanic { panic_info: String, title: String, description: String },
DisplayDocumentLayerTreeStructure { data_buffer: RawBuffer },
DisplayEditableTextbox { text: String, line_width: Option<f64>, font_size: f64, color: Color },
DisplayRemoveEditableTextbox,
@@ -43,12 +42,14 @@ pub enum FrontendMessage {
UpdateDocumentArtwork { svg: String },
UpdateDocumentBarLayout { layout_target: LayoutTarget, layout: SubLayout },
UpdateDocumentLayer { data: LayerPanelEntry },
UpdateDocumentLayerTreeStructure { data_buffer: RawBuffer },
UpdateDocumentOverlays { svg: String },
UpdateDocumentRulers { origin: (f64, f64), spacing: f64, interval: f64 },
UpdateDocumentScrollbars { position: (f64, f64), size: (f64, f64), multiplier: (f64, f64) },
UpdateImageData { image_data: Vec<FrontendImageData> },
UpdateInputHints { hint_data: HintData },
UpdateMouseCursor { cursor: MouseCursorIcon },
UpdateNodeGraphVisibility { visible: bool },
UpdateOpenDocumentsList { open_documents: Vec<FrontendDocumentDetails> },
UpdatePropertyPanelOptionsLayout { layout_target: LayoutTarget, layout: SubLayout },
UpdatePropertyPanelSectionsLayout { layout_target: LayoutTarget, layout: SubLayout },

View File

@@ -11,6 +11,7 @@ pub mod global;
pub mod input;
pub mod layout;
pub mod viewport_tools;
pub mod workspace;
#[doc(inline)]
pub use graphene::color::Color;
@@ -89,6 +90,7 @@ pub mod message_prelude {
pub use crate::viewport_tools::tools::shape_tool::{ShapeToolMessage, ShapeToolMessageDiscriminant};
pub use crate::viewport_tools::tools::spline_tool::{SplineToolMessage, SplineToolMessageDiscriminant};
pub use crate::viewport_tools::tools::text_tool::{TextMessage, TextMessageDiscriminant};
pub use crate::workspace::{WorkspaceMessage, WorkspaceMessageDiscriminant};
pub use graphite_proc_macros::*;
pub use std::collections::VecDeque;

View File

@@ -0,0 +1,7 @@
mod workspace_message;
mod workspace_message_handler;
#[doc(inline)]
pub use workspace_message::{WorkspaceMessage, WorkspaceMessageDiscriminant};
#[doc(inline)]
pub use workspace_message_handler::WorkspaceMessageHandler;

View File

@@ -0,0 +1,11 @@
use crate::message_prelude::*;
use serde::{Deserialize, Serialize};
#[remain::sorted]
#[impl_message(Message, Workspace)]
#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
pub enum WorkspaceMessage {
// Messages
NodeGraphToggleVisibility,
}

View File

@@ -0,0 +1,29 @@
use crate::input::InputPreprocessorMessageHandler;
use crate::message_prelude::*;
#[derive(Debug, Clone, Default)]
pub struct WorkspaceMessageHandler {
node_graph_visible: bool,
}
impl MessageHandler<WorkspaceMessage, &InputPreprocessorMessageHandler> for WorkspaceMessageHandler {
#[remain::check]
fn process_action(&mut self, message: WorkspaceMessage, _ipp: &InputPreprocessorMessageHandler, responses: &mut VecDeque<Message>) {
use WorkspaceMessage::*;
#[remain::sorted]
match message {
// Messages
NodeGraphToggleVisibility => {
self.node_graph_visible = !self.node_graph_visible;
responses.push_back(FrontendMessage::UpdateNodeGraphVisibility { visible: self.node_graph_visible }.into());
}
}
}
fn actions(&self) -> ActionList {
actions!(WorkspaceMessageDiscriminant;
NodeGraphToggleVisibility,
)
}
}