Skip to content

Commit 9b787d8

Browse files
committed
fix: Svg status not getting updated
1 parent 283d0e7 commit 9b787d8

1 file changed

Lines changed: 32 additions & 12 deletions

File tree

widget/src/svg.rs

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ use crate::core::mouse;
2020
use crate::core::renderer;
2121
use crate::core::svg;
2222
use crate::core::widget::Tree;
23+
use crate::core::window;
2324
use 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

2829
use std::path::PathBuf;
@@ -63,6 +64,7 @@ where
6364
class: Theme::Class<'a>,
6465
rotation: Rotation,
6566
opacity: f32,
67+
status: Option<Status>,
6668
}
6769

6870
impl<'a, Theme> Svg<'a, Theme>
@@ -79,6 +81,7 @@ where
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

Comments
 (0)