notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

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 }