From d51c2a94cb0ddf50d0416dc3d863a4d875efb858 Mon Sep 17 00:00:00 2001 From: CaligulaAlucard Date: Fri, 25 Apr 2025 16:14:30 +1000 Subject: [PATCH 1/3] fix too greedy node deletion search --- .../portfolio/document/utility_types/network_interface.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/editor/src/messages/portfolio/document/utility_types/network_interface.rs b/editor/src/messages/portfolio/document/utility_types/network_interface.rs index 8edabf1dd0..bd44c73bd4 100644 --- a/editor/src/messages/portfolio/document/utility_types/network_interface.rs +++ b/editor/src/messages/portfolio/document/utility_types/network_interface.rs @@ -4199,7 +4199,8 @@ impl NodeNetworkInterface { if let InputConnector::Node { node_id: downstream_id, .. } = downstream_node { let downstream_node_output = OutputConnector::node(*downstream_id, 0); if !delete_nodes.contains(downstream_id) { - stack.push(downstream_node_output); + can_delete = false; + break; } // Continue traversing over the downstream sibling, if the current node is a sibling to a node that will be deleted and it is a layer else { From aaa73764f8ab216327e5037111bcb0b3695495c4 Mon Sep 17 00:00:00 2001 From: Daniel53245 Date: Mon, 12 May 2025 10:34:44 +1000 Subject: [PATCH 2/3] Create new signal PreviewImage and register with portfolio_message --- editor/src/messages/portfolio/portfolio_message.rs | 1 + editor/src/messages/portfolio/portfolio_message_handler.rs | 4 ++++ frontend/src/state-providers/portfolio.ts | 5 ++++- frontend/wasm/src/editor_api.rs | 6 ++++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/editor/src/messages/portfolio/portfolio_message.rs b/editor/src/messages/portfolio/portfolio_message.rs index 5fadad7d3a..a866ab35f8 100644 --- a/editor/src/messages/portfolio/portfolio_message.rs +++ b/editor/src/messages/portfolio/portfolio_message.rs @@ -102,6 +102,7 @@ pub enum PortfolioMessage { mouse: Option<(f64, f64)>, parent_and_insert_index: Option<(LayerNodeIdentifier, usize)>, }, + PreviewImage, PrevDocument, SetActivePanel { panel: PanelType, diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 6601de3664..662cc40725 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -356,6 +356,7 @@ impl MessageHandler> for PortfolioMes // self.persistent_data.imaginate.set_host_name(&preferences.imaginate_server_hostname); // } PortfolioMessage::Import => { + //this is where itheppend // This portfolio message wraps the frontend message so it can be listed as an action, which isn't possible for frontend messages responses.add(FrontendMessage::TriggerImport); } @@ -1080,6 +1081,9 @@ impl MessageHandler> for PortfolioMes responses.add(FrontendMessage::TriggerDelayedZoomCanvasToFitAll); } } + PortfolioMessage::PreviewImage => { + debug!("PortfolioMessage Preview Image") + } PortfolioMessage::PrevDocument => { if let Some(active_document_id) = self.active_document_id { let len = self.document_ids.len(); diff --git a/frontend/src/state-providers/portfolio.ts b/frontend/src/state-providers/portfolio.ts index 1cf63a2811..3b853e95be 100644 --- a/frontend/src/state-providers/portfolio.ts +++ b/frontend/src/state-providers/portfolio.ts @@ -72,7 +72,8 @@ export function createPortfolioState(editor: Editor) { if (data.type.includes("svg")) { const svg = new TextDecoder().decode(data.content.data); - editor.handle.pasteSvg(data.filename, svg); + editor.handle.pasteSvg(data.filename, svg);//calls to the backend for a immediate image paste + editor.handle.previewImage(); return; } @@ -83,7 +84,9 @@ export function createPortfolioState(editor: Editor) { } const imageData = await extractPixelData(new Blob([data.content.data], { type: data.type })); + console.debug("editor paste Image ") editor.handle.pasteImage(data.filename, new Uint8Array(imageData.data), imageData.width, imageData.height); + }); editor.subscriptions.subscribeJsMessage(TriggerDownloadTextFile, (triggerFileDownload) => { downloadFileText(triggerFileDownload.name, triggerFileDownload.document); diff --git a/frontend/wasm/src/editor_api.rs b/frontend/wasm/src/editor_api.rs index 489e2518dc..ee3d7bc751 100644 --- a/frontend/wasm/src/editor_api.rs +++ b/frontend/wasm/src/editor_api.rs @@ -659,6 +659,12 @@ impl EditorHandle { }; self.dispatch(message); } + #[wasm_bindgen(js_name=previewImage)] + pub fn preview_image(&self) { + let message = PortfolioMessage::PreviewImage {}; + debug!("editor api,preview image,dispatch message to PortfolioMessage PreviewMessage"); + self.dispatch(message); + } /// Toggle visibility of a layer or node given its node ID #[wasm_bindgen(js_name = toggleNodeVisibilityLayerPanel)] From 612cee46082f2f5926e815dd3e7a0ecdd2b4a218 Mon Sep 17 00:00:00 2001 From: Daniel53245 Date: Wed, 14 May 2025 21:32:41 +1000 Subject: [PATCH 3/3] add new property in PreviewImage signal,create new Sevlet component for paste image preview --- .../src/messages/portfolio/portfolio_message.rs | 5 ++++- .../portfolio/portfolio_message_handler.rs | 5 ++++- .../floating-menus/ImportImagePreview.svelte | 17 +++++++++++++++++ frontend/src/components/panels/Document.svelte | 1 + frontend/src/state-providers/portfolio.ts | 7 +++---- frontend/wasm/src/editor_api.rs | 4 ++-- 6 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 frontend/src/components/floating-menus/ImportImagePreview.svelte diff --git a/editor/src/messages/portfolio/portfolio_message.rs b/editor/src/messages/portfolio/portfolio_message.rs index a866ab35f8..4f46b17c66 100644 --- a/editor/src/messages/portfolio/portfolio_message.rs +++ b/editor/src/messages/portfolio/portfolio_message.rs @@ -102,7 +102,10 @@ pub enum PortfolioMessage { mouse: Option<(f64, f64)>, parent_and_insert_index: Option<(LayerNodeIdentifier, usize)>, }, - PreviewImage, + PreviewImage { + name: Option, + svg: String, + }, PrevDocument, SetActivePanel { panel: PanelType, diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 662cc40725..ef23d96cd5 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -1081,8 +1081,11 @@ impl MessageHandler> for PortfolioMes responses.add(FrontendMessage::TriggerDelayedZoomCanvasToFitAll); } } - PortfolioMessage::PreviewImage => { + PortfolioMessage::PreviewImage { name, svg } => { debug!("PortfolioMessage Preview Image") + //TODO: draw a preview image following cursor + + //TODO: get a preview } PortfolioMessage::PrevDocument => { if let Some(active_document_id) = self.active_document_id { diff --git a/frontend/src/components/floating-menus/ImportImagePreview.svelte b/frontend/src/components/floating-menus/ImportImagePreview.svelte new file mode 100644 index 0000000000..42ee359f5c --- /dev/null +++ b/frontend/src/components/floating-menus/ImportImagePreview.svelte @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/frontend/src/components/panels/Document.svelte b/frontend/src/components/panels/Document.svelte index db91741442..1e856efd78 100644 --- a/frontend/src/components/panels/Document.svelte +++ b/frontend/src/components/panels/Document.svelte @@ -22,6 +22,7 @@ import { updateBoundsOfViewports } from "@graphite/utility-functions/viewports"; import EyedropperPreview, { ZOOM_WINDOW_DIMENSIONS } from "@graphite/components/floating-menus/EyedropperPreview.svelte"; + import ImportImagePreview from "@graphite/components/floating-menus/ImportImagePreview.svelte"; import LayoutCol from "@graphite/components/layout/LayoutCol.svelte"; import LayoutRow from "@graphite/components/layout/LayoutRow.svelte"; import Graph from "@graphite/components/views/Graph.svelte"; diff --git a/frontend/src/state-providers/portfolio.ts b/frontend/src/state-providers/portfolio.ts index 3b853e95be..87bf7ec5c1 100644 --- a/frontend/src/state-providers/portfolio.ts +++ b/frontend/src/state-providers/portfolio.ts @@ -72,8 +72,8 @@ export function createPortfolioState(editor: Editor) { if (data.type.includes("svg")) { const svg = new TextDecoder().decode(data.content.data); - editor.handle.pasteSvg(data.filename, svg);//calls to the backend for a immediate image paste - editor.handle.previewImage(); + //editor.handle.pasteSvg(data.filename, svg); //calls to the backend for a immediate image paste + editor.handle.previewImage(data.filename, svg); return; } @@ -84,9 +84,8 @@ export function createPortfolioState(editor: Editor) { } const imageData = await extractPixelData(new Blob([data.content.data], { type: data.type })); - console.debug("editor paste Image ") + console.debug("editor paste Image "); editor.handle.pasteImage(data.filename, new Uint8Array(imageData.data), imageData.width, imageData.height); - }); editor.subscriptions.subscribeJsMessage(TriggerDownloadTextFile, (triggerFileDownload) => { downloadFileText(triggerFileDownload.name, triggerFileDownload.document); diff --git a/frontend/wasm/src/editor_api.rs b/frontend/wasm/src/editor_api.rs index ee3d7bc751..2b3b5049ab 100644 --- a/frontend/wasm/src/editor_api.rs +++ b/frontend/wasm/src/editor_api.rs @@ -660,8 +660,8 @@ impl EditorHandle { self.dispatch(message); } #[wasm_bindgen(js_name=previewImage)] - pub fn preview_image(&self) { - let message = PortfolioMessage::PreviewImage {}; + pub fn preview_image(&self, name: Option, svg: String) { + let message = PortfolioMessage::PreviewImage { name, svg }; debug!("editor api,preview image,dispatch message to PortfolioMessage PreviewMessage"); self.dispatch(message); }