Skip to content

Commit 234a4b9

Browse files
mostly done
1 parent ede34b1 commit 234a4b9

10 files changed

Lines changed: 283 additions & 123 deletions

File tree

editor/src/messages/frontend/frontend_message.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::utility_types::{DocumentDetails, MouseCursorIcon, OpenDocument};
22
use crate::messages::app_window::app_window_message_handler::AppWindowPlatform;
3+
use crate::messages::frontend::utility_types::EyedropperPreviewImage;
34
use crate::messages::input_mapper::utility_types::misc::ActionShortcut;
45
use crate::messages::layout::utility_types::widget_prelude::*;
56
use crate::messages::portfolio::document::node_graph::utility_types::{
@@ -253,6 +254,7 @@ pub enum FrontendMessage {
253254
multiplier: (f64, f64),
254255
},
255256
UpdateEyedropperSamplingState {
257+
image: Option<EyedropperPreviewImage>,
256258
#[serde(rename = "mousePosition")]
257259
mouse_position: Option<(f64, f64)>,
258260
#[serde(rename = "primaryColor")]

editor/src/messages/frontend/utility_types.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,10 @@ pub enum ExportBounds {
6262
Selection,
6363
Artboard(LayerNodeIdentifier),
6464
}
65+
66+
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Serialize, serde::Deserialize, specta::Type)]
67+
pub struct EyedropperPreviewImage {
68+
pub data: Vec<u8>,
69+
pub width: u32,
70+
pub height: u32,
71+
}

editor/src/messages/portfolio/portfolio_message.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ pub enum PortfolioMessage {
148148
document_id: DocumentId,
149149
ignore_hash: bool,
150150
},
151+
SubmitEyedropperPreviewRender,
151152
ToggleResetNodesToDefinitionsOnOpen,
152153
ToggleFocusDocument,
153154
ToggleDataPanelOpen,

editor/src/messages/portfolio/portfolio_message_handler.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::messages::tool::utility_types::{HintData, ToolType};
2525
use crate::messages::viewport::ToPhysical;
2626
use crate::node_graph_executor::{ExportConfig, NodeGraphExecutor};
2727
use derivative::*;
28-
use glam::{DAffine2, DVec2};
28+
use glam::{DAffine2, DVec2, UVec2};
2929
use graph_craft::document::NodeId;
3030
use graphene_std::Color;
3131
use graphene_std::raster_types::Image;
@@ -1178,6 +1178,38 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
11781178
Ok(message) => responses.add_front(message),
11791179
}
11801180
}
1181+
#[cfg(not(target_family = "wasm"))]
1182+
PortfolioMessage::SubmitEyedropperPreviewRender => {
1183+
let Some(document_id) = self.active_document_id else {
1184+
return;
1185+
};
1186+
let Some(document) = self.documents.get_mut(&document_id) else {
1187+
return;
1188+
};
1189+
1190+
let document_to_viewport = document
1191+
.navigation_handler
1192+
.calculate_offset_transform(viewport.center_in_viewport_space().into(), &document.document_ptz);
1193+
let pointer_position = document_to_viewport.inverse().transform_point2(ipp.mouse.position);
1194+
1195+
let resolution = UVec2::splat(11);
1196+
1197+
let result = self.executor.submit_eyedropper_preview(document_id, resolution, timing_information, pointer_position);
1198+
1199+
match result {
1200+
Err(description) => {
1201+
responses.add(DialogMessage::DisplayDialogError {
1202+
title: "Unable to update node graph".to_string(),
1203+
description,
1204+
});
1205+
}
1206+
Ok(message) => responses.add_front(message),
1207+
}
1208+
}
1209+
#[cfg(target_family = "wasm")]
1210+
PortfolioMessage::SubmitEyedropperPreviewRender => {
1211+
// For wasm this is implemented through svg rendering
1212+
}
11811213
PortfolioMessage::ToggleFocusDocument => {
11821214
self.focus_document = !self.focus_document;
11831215
responses.add(MenuBarMessage::SendLayout);

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::tool_prelude::*;
2-
use crate::messages::tool::utility_types::DocumentToolData;
2+
use crate::messages::{frontend::utility_types::EyedropperPreviewImage, tool::utility_types::DocumentToolData};
33

44
#[derive(Default, ExtractField)]
55
pub struct EyedropperTool {
@@ -19,6 +19,8 @@ pub enum EyedropperToolMessage {
1919
PointerMove,
2020
SampleSecondaryColorBegin,
2121
SampleSecondaryColorEnd,
22+
23+
PreviewImage { data: Vec<u8>, width: u32, height: u32 },
2224
}
2325

2426
impl ToolMetadata for EyedropperTool {
@@ -42,6 +44,17 @@ impl LayoutHolder for EyedropperTool {
4244
#[message_handler_data]
4345
impl<'a> MessageHandler<ToolMessage, &mut ToolActionMessageContext<'a>> for EyedropperTool {
4446
fn process_message(&mut self, message: ToolMessage, responses: &mut VecDeque<Message>, context: &mut ToolActionMessageContext<'a>) {
47+
if let ToolMessage::Eyedropper(EyedropperToolMessage::PreviewImage { data, width, height }) = message {
48+
responses.add(FrontendMessage::UpdateEyedropperSamplingState {
49+
image: Some(EyedropperPreviewImage { data, width, height }),
50+
mouse_position: Some(context.input.mouse.position.into()),
51+
primary_color: "#".to_string() + context.global_tool_data.primary_color.to_rgb_hex_srgb().as_str(),
52+
secondary_color: "#".to_string() + context.global_tool_data.secondary_color.to_rgb_hex_srgb().as_str(),
53+
set_color_choice: Some("Primary".to_string()),
54+
});
55+
return;
56+
}
57+
4558
self.fsm_state.process_event(message, &mut self.data, context, &(), responses, true);
4659
}
4760

@@ -153,6 +166,7 @@ impl Fsm for EyedropperToolFsmState {
153166

154167
fn disable_cursor_preview(responses: &mut VecDeque<Message>) {
155168
responses.add(FrontendMessage::UpdateEyedropperSamplingState {
169+
image: None,
156170
mouse_position: None,
157171
primary_color: "".into(),
158172
secondary_color: "".into(),
@@ -161,10 +175,16 @@ fn disable_cursor_preview(responses: &mut VecDeque<Message>) {
161175
}
162176

163177
fn update_cursor_preview(responses: &mut VecDeque<Message>, input: &InputPreprocessorMessageHandler, global_tool_data: &DocumentToolData, set_color_choice: Option<String>) {
178+
#[cfg(target_family = "wasm")]
164179
responses.add(FrontendMessage::UpdateEyedropperSamplingState {
180+
image: None,
165181
mouse_position: Some(input.mouse.position.into()),
166182
primary_color: "#".to_string() + global_tool_data.primary_color.to_rgb_hex_srgb().as_str(),
167183
secondary_color: "#".to_string() + global_tool_data.secondary_color.to_rgb_hex_srgb().as_str(),
168184
set_color_choice,
169185
});
186+
#[cfg(not(target_family = "wasm"))]
187+
{
188+
responses.add(PortfolioMessage::SubmitEyedropperPreviewRender);
189+
}
170190
}

0 commit comments

Comments
 (0)