From 6e45b3afdc3f98d6183bcb927bc0827c0bcfce27 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 28 Jun 2026 17:58:23 -0700 Subject: [PATCH] fix: image flickering --- src/main.rs | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index dee2ae1..ad633ad 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,16 +9,18 @@ use image::{EncodableLayout, ImageReader, RgbaImage, imageops}; #[derive(Clone, Debug)] enum Message { + ImageDisplayReady(Result), + Event(iced::Event), } #[derive(Clone, Debug)] struct State { image: RgbaImage, - image_handle: widget::image::Handle, + image_display: Option, } impl State { - fn new() -> Self { + fn new() -> (Self, Task) { let image = if let Some(path) = env::args().nth(1) { ImageReader::open(path) .unwrap() @@ -29,18 +31,34 @@ impl State { RgbaImage::new(100, 100) }; - State { - image_handle: widget::image::Handle::from_rgba(image.width(), image.height(), unsafe { - std::mem::transmute::<_, &'static [u8]>(image.as_bytes()) - }), - image, - } + let allocate_image = widget::image::allocate(widget::image::Handle::from_rgba( + image.width(), + image.height(), + unsafe { std::mem::transmute::<_, &'static [u8]>(image.as_bytes()) }, + )) + .map(Message::ImageDisplayReady); + + ( + State { + image_display: None, + image, + }, + allocate_image, + ) } fn view(&self) -> Element<'_, Message, Theme, Renderer> { - widget::image(&self.image_handle).expand(true).into() + if let Some(allocation) = self.image_display.as_ref() { + widget::image(allocation.handle()).expand(true).into() + } else { + widget::space().into() + } } fn update(&mut self, message: Message) -> Task { match message { + Message::ImageDisplayReady(result) => { + self.image_display = Some(result.unwrap()); + } + Message::Event(iced::Event::Keyboard(keyboard::Event::KeyPressed { key, modifiers, @@ -59,11 +77,12 @@ impl State { Key::Character("r") => { self.image = imageops::rotate90(&self.image); - self.image_handle = widget::image::Handle::from_rgba( + return widget::image::allocate(widget::image::Handle::from_rgba( self.image.width(), self.image.height(), unsafe { std::mem::transmute::<_, &'static [u8]>(self.image.as_bytes()) }, - ) + )) + .map(Message::ImageDisplayReady); } // ignore unused keys