11use super :: tool_prelude:: * ;
2+ use crate :: messages:: frontend:: utility_types:: EyedropperPreviewImage ;
23use crate :: messages:: tool:: utility_types:: DocumentToolData ;
34
45#[ derive( Default , ExtractField ) ]
@@ -19,6 +20,8 @@ pub enum EyedropperToolMessage {
1920 PointerMove ,
2021 SampleSecondaryColorBegin ,
2122 SampleSecondaryColorEnd ,
23+
24+ PreviewImage { data : Vec < u8 > , width : u32 , height : u32 } ,
2225}
2326
2427impl ToolMetadata for EyedropperTool {
@@ -42,6 +45,17 @@ impl LayoutHolder for EyedropperTool {
4245#[ message_handler_data]
4346impl < ' a > MessageHandler < ToolMessage , & mut ToolActionMessageContext < ' a > > for EyedropperTool {
4447 fn process_message ( & mut self , message : ToolMessage , responses : & mut VecDeque < Message > , context : & mut ToolActionMessageContext < ' a > ) {
48+ if let ToolMessage :: Eyedropper ( EyedropperToolMessage :: PreviewImage { data, width, height } ) = message {
49+ let image = EyedropperPreviewImage { data, width, height } ;
50+
51+ update_cursor_preview_common ( responses, Some ( image) , context. input , context. global_tool_data , self . data . color_choice . clone ( ) ) ;
52+
53+ if !self . data . preview {
54+ disable_cursor_preview ( responses, & mut self . data ) ;
55+ }
56+ return ;
57+ }
58+
4559 self . fsm_state . process_event ( message, & mut self . data , context, & ( ) , responses, true ) ;
4660 }
4761
@@ -74,13 +88,16 @@ enum EyedropperToolFsmState {
7488}
7589
7690#[ derive( Clone , Debug , Default ) ]
77- struct EyedropperToolData { }
91+ struct EyedropperToolData {
92+ preview : bool ,
93+ color_choice : Option < String > ,
94+ }
7895
7996impl Fsm for EyedropperToolFsmState {
8097 type ToolData = EyedropperToolData ;
8198 type ToolOptions = ( ) ;
8299
83- fn transition ( self , event : ToolMessage , _tool_data : & mut Self :: ToolData , tool_action_data : & mut ToolActionMessageContext , _tool_options : & ( ) , responses : & mut VecDeque < Message > ) -> Self {
100+ fn transition ( self , event : ToolMessage , tool_data : & mut Self :: ToolData , tool_action_data : & mut ToolActionMessageContext , _tool_options : & ( ) , responses : & mut VecDeque < Message > ) -> Self {
84101 let ToolActionMessageContext {
85102 global_tool_data, input, viewport, ..
86103 } = tool_action_data;
@@ -89,7 +106,7 @@ impl Fsm for EyedropperToolFsmState {
89106 match ( self , event) {
90107 // Ready -> Sampling
91108 ( EyedropperToolFsmState :: Ready , mouse_down) if matches ! ( mouse_down, EyedropperToolMessage :: SamplePrimaryColorBegin | EyedropperToolMessage :: SampleSecondaryColorBegin ) => {
92- update_cursor_preview ( responses, input, global_tool_data, None ) ;
109+ update_cursor_preview ( responses, tool_data , input, global_tool_data, None ) ;
93110
94111 if mouse_down == EyedropperToolMessage :: SamplePrimaryColorBegin {
95112 EyedropperToolFsmState :: SamplingPrimary
@@ -101,24 +118,24 @@ impl Fsm for EyedropperToolFsmState {
101118 ( EyedropperToolFsmState :: SamplingPrimary | EyedropperToolFsmState :: SamplingSecondary , EyedropperToolMessage :: PointerMove ) => {
102119 let mouse_position = viewport. logical ( input. mouse . position ) ;
103120 if viewport. is_in_bounds ( mouse_position + viewport. offset ( ) ) {
104- update_cursor_preview ( responses, input, global_tool_data, None ) ;
121+ update_cursor_preview ( responses, tool_data , input, global_tool_data, None ) ;
105122 } else {
106- disable_cursor_preview ( responses) ;
123+ disable_cursor_preview ( responses, tool_data ) ;
107124 }
108125
109126 self
110127 }
111128 // Sampling -> Ready
112129 ( EyedropperToolFsmState :: SamplingPrimary , EyedropperToolMessage :: SamplePrimaryColorEnd ) | ( EyedropperToolFsmState :: SamplingSecondary , EyedropperToolMessage :: SampleSecondaryColorEnd ) => {
113130 let set_color_choice = if self == EyedropperToolFsmState :: SamplingPrimary { "Primary" } else { "Secondary" } . to_string ( ) ;
114- update_cursor_preview ( responses, input, global_tool_data, Some ( set_color_choice) ) ;
115- disable_cursor_preview ( responses) ;
131+ update_cursor_preview ( responses, tool_data , input, global_tool_data, Some ( set_color_choice) ) ;
132+ disable_cursor_preview ( responses, tool_data ) ;
116133
117134 EyedropperToolFsmState :: Ready
118135 }
119136 // Any -> Ready
120137 ( _, EyedropperToolMessage :: Abort ) => {
121- disable_cursor_preview ( responses) ;
138+ disable_cursor_preview ( responses, tool_data ) ;
122139
123140 EyedropperToolFsmState :: Ready
124141 }
@@ -151,17 +168,53 @@ impl Fsm for EyedropperToolFsmState {
151168 }
152169}
153170
154- fn disable_cursor_preview ( responses : & mut VecDeque < Message > ) {
171+ fn disable_cursor_preview ( responses : & mut VecDeque < Message > , tool_data : & mut EyedropperToolData ) {
172+ tool_data. preview = false ;
155173 responses. add ( FrontendMessage :: UpdateEyedropperSamplingState {
174+ image : None ,
156175 mouse_position : None ,
157176 primary_color : "" . into ( ) ,
158177 secondary_color : "" . into ( ) ,
159178 set_color_choice : None ,
160179 } ) ;
161180}
162181
163- fn update_cursor_preview ( responses : & mut VecDeque < Message > , input : & InputPreprocessorMessageHandler , global_tool_data : & DocumentToolData , set_color_choice : Option < String > ) {
182+ #[ cfg( not( target_family = "wasm" ) ) ]
183+ fn update_cursor_preview (
184+ responses : & mut VecDeque < Message > ,
185+ tool_data : & mut EyedropperToolData ,
186+ _input : & InputPreprocessorMessageHandler ,
187+ _global_tool_data : & DocumentToolData ,
188+ set_color_choice : Option < String > ,
189+ ) {
190+ tool_data. preview = true ;
191+ tool_data. color_choice = set_color_choice;
192+ responses. add ( PortfolioMessage :: SubmitEyedropperPreviewRender ) ;
193+ }
194+
195+ #[ cfg( target_family = "wasm" ) ]
196+ fn update_cursor_preview (
197+ responses : & mut VecDeque < Message > ,
198+ tool_data : & mut EyedropperToolData ,
199+ input : & InputPreprocessorMessageHandler ,
200+ global_tool_data : & DocumentToolData ,
201+ set_color_choice : Option < String > ,
202+ ) {
203+ tool_data. preview = true ;
204+ tool_data. color_choice = set_color_choice. clone ( ) ;
205+
206+ update_cursor_preview_common ( responses, None , input, global_tool_data, set_color_choice) ;
207+ }
208+
209+ fn update_cursor_preview_common (
210+ responses : & mut VecDeque < Message > ,
211+ image : Option < EyedropperPreviewImage > ,
212+ input : & InputPreprocessorMessageHandler ,
213+ global_tool_data : & DocumentToolData ,
214+ set_color_choice : Option < String > ,
215+ ) {
164216 responses. add ( FrontendMessage :: UpdateEyedropperSamplingState {
217+ image,
165218 mouse_position : Some ( input. mouse . position . into ( ) ) ,
166219 primary_color : "#" . to_string ( ) + global_tool_data. primary_color . to_rgb_hex_srgb ( ) . as_str ( ) ,
167220 secondary_color : "#" . to_string ( ) + global_tool_data. secondary_color . to_rgb_hex_srgb ( ) . as_str ( ) ,
0 commit comments