@@ -20,9 +20,10 @@ use crate::core::mouse;
2020use crate :: core:: renderer;
2121use crate :: core:: svg;
2222use crate :: core:: widget:: Tree ;
23+ use crate :: core:: window;
2324use crate :: core:: {
24- Color , ContentFit , Element , Layout , Length , Point , Rectangle , Rotation ,
25- Size , Theme , Vector , Widget ,
25+ Clipboard , Color , ContentFit , Element , Event , Layout , Length , Point ,
26+ Rectangle , Rotation , Shell , Size , Theme , Vector , Widget ,
2627} ;
2728
2829use std:: path:: PathBuf ;
6364 class : Theme :: Class < ' a > ,
6465 rotation : Rotation ,
6566 opacity : f32 ,
67+ status : Option < Status > ,
6668}
6769
6870impl < ' a , Theme > Svg < ' a , Theme >
7981 class : Theme :: default ( ) ,
8082 rotation : Rotation :: default ( ) ,
8183 opacity : 1.0 ,
84+ status : None ,
8285 }
8386 }
8487
@@ -195,14 +198,38 @@ where
195198 layout:: Node :: new ( final_size)
196199 }
197200
201+ fn update (
202+ & mut self ,
203+ _state : & mut Tree ,
204+ event : & Event ,
205+ layout : Layout < ' _ > ,
206+ cursor : mouse:: Cursor ,
207+ _renderer : & Renderer ,
208+ _clipboard : & mut dyn Clipboard ,
209+ shell : & mut Shell < ' _ , Message > ,
210+ _viewport : & Rectangle ,
211+ ) {
212+ let current_status = if cursor. is_over ( layout. bounds ( ) ) {
213+ Status :: Hovered
214+ } else {
215+ Status :: Idle
216+ } ;
217+
218+ if let Event :: Window ( window:: Event :: RedrawRequested ( _now) ) = event {
219+ self . status = Some ( current_status) ;
220+ } else if self . status . is_some_and ( |status| status != current_status) {
221+ shell. request_redraw ( ) ;
222+ }
223+ }
224+
198225 fn draw (
199226 & self ,
200227 _state : & Tree ,
201228 renderer : & mut Renderer ,
202229 theme : & Theme ,
203230 _style : & renderer:: Style ,
204231 layout : Layout < ' _ > ,
205- cursor : mouse:: Cursor ,
232+ _cursor : mouse:: Cursor ,
206233 _viewport : & Rectangle ,
207234 ) {
208235 let Size { width, height } = renderer. measure_svg ( & self . handle ) ;
@@ -231,15 +258,8 @@ where
231258
232259 let drawing_bounds = Rectangle :: new ( position, final_size) ;
233260
234- let is_mouse_over = cursor. is_over ( bounds) ;
235-
236- let status = if is_mouse_over {
237- Status :: Hovered
238- } else {
239- Status :: Idle
240- } ;
241-
242- let style = theme. style ( & self . class , status) ;
261+ let style =
262+ theme. style ( & self . class , self . status . unwrap_or ( Status :: Idle ) ) ;
243263
244264 let render = |renderer : & mut Renderer | {
245265 renderer. draw_svg (
0 commit comments