From 594ea0b42de63faf28b050cef0dc673cdb7f2617 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Wed, 19 Feb 2025 17:39:46 -0500 Subject: [PATCH] Use TexturedImage in MediaCache Signed-off-by: kernelkind --- crates/notedeck/src/imgcache.rs | 6 +++- crates/notedeck/src/lib.rs | 2 +- crates/notedeck_columns/src/images.rs | 17 +++++++---- .../notedeck_columns/src/ui/note/contents.rs | 30 ++++++++++--------- crates/notedeck_columns/src/ui/note/post.rs | 28 ++++++++++------- .../src/ui/profile/picture.rs | 12 ++++++-- 6 files changed, 61 insertions(+), 34 deletions(-) diff --git a/crates/notedeck/src/imgcache.rs b/crates/notedeck/src/imgcache.rs index 6fdb7aaf..d54adee3 100644 --- a/crates/notedeck/src/imgcache.rs +++ b/crates/notedeck/src/imgcache.rs @@ -13,9 +13,13 @@ use std::path; use std::path::PathBuf; use tracing::warn; -pub type MediaCacheValue = Promise>; +pub type MediaCacheValue = Promise>; pub type MediaCacheMap = HashMap; +pub enum TexturedImage { + Static(TextureHandle), +} + pub struct MediaCache { pub cache_dir: path::PathBuf, url_imgs: MediaCacheMap, diff --git a/crates/notedeck/src/lib.rs b/crates/notedeck/src/lib.rs index 034f11c3..3b0a6003 100644 --- a/crates/notedeck/src/lib.rs +++ b/crates/notedeck/src/lib.rs @@ -31,7 +31,7 @@ pub use context::AppContext; pub use error::{Error, FilterError}; pub use filter::{FilterState, FilterStates, UnifiedSubscription}; pub use fonts::NamedFontFamily; -pub use imgcache::MediaCache; +pub use imgcache::{MediaCache, TexturedImage}; pub use muted::{MuteFun, Muted}; pub use note::{NoteRef, RootIdError, RootNoteId, RootNoteIdBuf}; pub use notecache::{CachedNote, NoteCache}; diff --git a/crates/notedeck_columns/src/images.rs b/crates/notedeck_columns/src/images.rs index 87ae5b35..8752246c 100644 --- a/crates/notedeck_columns/src/images.rs +++ b/crates/notedeck_columns/src/images.rs @@ -1,7 +1,8 @@ -use egui::{pos2, Color32, ColorImage, Rect, Sense, SizeHint, TextureHandle}; +use egui::{pos2, Color32, ColorImage, Rect, Sense, SizeHint}; use image::imageops::FilterType; use notedeck::MediaCache; use notedeck::Result; +use notedeck::TexturedImage; use poll_promise::Promise; use std::path; use std::path::PathBuf; @@ -177,7 +178,7 @@ fn fetch_img_from_disk( ctx: &egui::Context, url: &str, path: &path::Path, -) -> Promise> { +) -> Promise> { let ctx = ctx.clone(); let url = url.to_owned(); let path = path.to_owned(); @@ -195,7 +196,11 @@ fn fetch_img_from_disk( flat_samples.as_slice(), ); - Ok(ctx.load_texture(&url, img, Default::default())) + Ok(TexturedImage::Static(ctx.load_texture( + &url, + img, + Default::default(), + ))) }) } @@ -217,7 +222,7 @@ pub fn fetch_img( ctx: &egui::Context, url: &str, imgtyp: ImageType, -) -> Promise> { +) -> Promise> { let key = MediaCache::key(url); let path = img_cache.cache_dir.join(key); @@ -235,7 +240,7 @@ fn fetch_img_from_net( ctx: &egui::Context, url: &str, imgtyp: ImageType, -) -> Promise> { +) -> Promise> { let (sender, promise) = Promise::new(); let request = ehttp::Request::get(url); let ctx = ctx.clone(); @@ -251,7 +256,7 @@ fn fetch_img_from_net( // write to disk std::thread::spawn(move || MediaCache::write(&cache_path, &cloned_url, img)); - texture_handle + TexturedImage::Static(texture_handle) }); sender.send(handle); // send the results back to the UI thread. diff --git a/crates/notedeck_columns/src/ui/note/contents.rs b/crates/notedeck_columns/src/ui/note/contents.rs index 0ccf4efd..3010df85 100644 --- a/crates/notedeck_columns/src/ui/note/contents.rs +++ b/crates/notedeck_columns/src/ui/note/contents.rs @@ -329,20 +329,22 @@ fn image_carousel( //ui.add(egui::Spinner::new().size(spinsz)); } // Use the previously resolved image - Some(Ok(img)) => { - let img_resp = ui.add( - Image::new(img) - .max_height(height) - .rounding(5.0) - .fit_to_original_size(1.0), - ); - img_resp.context_menu(|ui| { - if ui.button("Copy Link").clicked() { - ui.ctx().copy_text(image); - ui.close_menu(); - } - }); - } + Some(Ok(img)) => match img { + notedeck::TexturedImage::Static(texture_handle) => { + let img_resp = ui.add( + Image::new(texture_handle) + .max_height(height) + .rounding(5.0) + .fit_to_original_size(1.0), + ); + img_resp.context_menu(|ui| { + if ui.button("Copy Link").clicked() { + ui.ctx().copy_text(image); + ui.close_menu(); + } + }); + } + }, } } }) diff --git a/crates/notedeck_columns/src/ui/note/post.rs b/crates/notedeck_columns/src/ui/note/post.rs index b766b792..0dd47ac0 100644 --- a/crates/notedeck_columns/src/ui/note/post.rs +++ b/crates/notedeck_columns/src/ui/note/post.rs @@ -407,18 +407,26 @@ impl<'a> PostView<'a> { media_size }; - let img_resp = ui.add(egui::Image::new(texture).max_size(size).rounding(12.0)); + match texture { + notedeck::TexturedImage::Static(texture_handle) => { + let img_resp = ui.add( + egui::Image::new(texture_handle) + .max_size(size) + .rounding(12.0), + ); - let remove_button_rect = { - let top_left = img_resp.rect.left_top(); - let spacing = 13.0; - let center = Pos2::new(top_left.x + spacing, top_left.y + spacing); - egui::Rect::from_center_size(center, egui::vec2(26.0, 26.0)) - }; - if show_remove_upload_button(ui, remove_button_rect).clicked() { - to_remove.push(i); + let remove_button_rect = { + let top_left = img_resp.rect.left_top(); + let spacing = 13.0; + let center = Pos2::new(top_left.x + spacing, top_left.y + spacing); + egui::Rect::from_center_size(center, egui::vec2(26.0, 26.0)) + }; + if show_remove_upload_button(ui, remove_button_rect).clicked() { + to_remove.push(i); + } + ui.advance_cursor_after_rect(img_resp.rect); + } } - ui.advance_cursor_after_rect(img_resp.rect); } Some(Err(e)) => { self.draft.upload_errors.push(e.to_string()); diff --git a/crates/notedeck_columns/src/ui/profile/picture.rs b/crates/notedeck_columns/src/ui/profile/picture.rs index d8455a65..74fc889d 100644 --- a/crates/notedeck_columns/src/ui/profile/picture.rs +++ b/crates/notedeck_columns/src/ui/profile/picture.rs @@ -119,10 +119,18 @@ fn render_pfp( //error!("Image load error: {:?}", e); paint_circle(ui, ui_size, border) } - Some(Ok(img)) => pfp_image(ui, img, ui_size, border), + Some(Ok(img)) => match img { + notedeck::TexturedImage::Static(texture_handle) => { + pfp_image(ui, texture_handle, ui_size, border) + } + }, } } - Some(Ok(img)) => pfp_image(ui, img, ui_size, border), + Some(Ok(img)) => match img { + notedeck::TexturedImage::Static(texture_handle) => { + pfp_image(ui, texture_handle, ui_size, border) + } + }, } }