images.rs (2354B)
1 use notedeck::{GifStateMap, Images, MediaCache, MediaCacheType, TexturedImage}; 2 3 use crate::images::ImageType; 4 5 use super::ProfilePic; 6 7 #[allow(clippy::too_many_arguments)] 8 pub fn render_images( 9 ui: &mut egui::Ui, 10 images: &mut Images, 11 url: &str, 12 img_type: ImageType, 13 cache_type: MediaCacheType, 14 show_waiting: impl FnOnce(&mut egui::Ui), 15 show_error: impl FnOnce(&mut egui::Ui, String), 16 show_success: impl FnOnce(&mut egui::Ui, &str, &mut TexturedImage, &mut GifStateMap), 17 ) -> egui::Response { 18 let cache = match cache_type { 19 MediaCacheType::Image => &mut images.static_imgs, 20 MediaCacheType::Gif => &mut images.gifs, 21 }; 22 23 render_media_cache( 24 ui, 25 cache, 26 &mut images.gif_states, 27 url, 28 img_type, 29 cache_type, 30 show_waiting, 31 show_error, 32 show_success, 33 ) 34 } 35 36 #[allow(clippy::too_many_arguments)] 37 fn render_media_cache( 38 ui: &mut egui::Ui, 39 cache: &mut MediaCache, 40 gif_states: &mut GifStateMap, 41 url: &str, 42 img_type: ImageType, 43 cache_type: MediaCacheType, 44 show_waiting: impl FnOnce(&mut egui::Ui), 45 show_error: impl FnOnce(&mut egui::Ui, String), 46 show_success: impl FnOnce(&mut egui::Ui, &str, &mut TexturedImage, &mut GifStateMap), 47 ) -> egui::Response { 48 let m_cached_promise = cache.map().get(url); 49 50 if m_cached_promise.is_none() { 51 let res = crate::images::fetch_img(cache, ui.ctx(), url, img_type, cache_type.clone()); 52 cache.map_mut().insert(url.to_owned(), res); 53 } 54 55 egui::Frame::none() 56 .show(ui, |ui| { 57 match cache.map_mut().get_mut(url).and_then(|p| p.ready_mut()) { 58 None => show_waiting(ui), 59 Some(Err(err)) => { 60 let err = err.to_string(); 61 let no_pfp = crate::images::fetch_img( 62 cache, 63 ui.ctx(), 64 ProfilePic::no_pfp_url(), 65 ImageType::Profile(128), 66 cache_type, 67 ); 68 cache.map_mut().insert(url.to_owned(), no_pfp); 69 show_error(ui, err) 70 } 71 Some(Ok(renderable_media)) => show_success(ui, url, renderable_media, gif_states), 72 } 73 }) 74 .response 75 }