fix: weird placeholder images

This commit is contained in:
kieran 2025-01-20 11:40:23 +00:00
parent 62a7933de0
commit e66e7e938e
No known key found for this signature in database
GPG Key ID: DE71CEB3925BE941
6 changed files with 32 additions and 21 deletions

View File

@ -1,4 +1,3 @@
- [Login] Proper key storage
- [NDB] Handle PRE's - [NDB] Handle PRE's
- [UX] Render non-ascii chars with better font - [UX] Render non-ascii chars with better font
- [egui-video] Handle mobile DPI for video player - [egui-video] Handle mobile DPI for video player

View File

@ -3,7 +3,7 @@ use crate::services::ffmpeg_loader::FfmpegLoader;
use crate::widgets::PlaceholderRect; use crate::widgets::PlaceholderRect;
use anyhow::{anyhow, bail}; use anyhow::{anyhow, bail};
use egui::load::SizedTexture; use egui::load::SizedTexture;
use egui::{Context, Id, Image, ImageSource, TextureHandle, Ui, Vec2}; use egui::{vec2, Context, Id, Image, ImageSource, TextureHandle, Ui, Vec2};
use egui_video::ffmpeg_rs_raw::Transcoder; use egui_video::ffmpeg_rs_raw::Transcoder;
use ehttp::Response; use ehttp::Response;
use enostr::EventClientMessage; use enostr::EventClientMessage;
@ -195,24 +195,24 @@ pub fn image_from_cache<'a>(
ui: &Ui, ui: &Ui,
url: &str, url: &str,
size: Option<Vec2>, size: Option<Vec2>,
) -> Image<'a> { ) -> Option<Image<'a>> {
if url.len() == 0 {
return None;
}
let cache_key = if let Some(s) = size { let cache_key = if let Some(s) = size {
format!("{}:{}", url, s) format!("{}:{}", url, s)
} else { } else {
url.to_string() url.to_string()
}; };
if url.len() == 0 {
return Image::from_bytes(cache_key, LOGO_BYTES);
}
if let Some(promise) = img_cache.map().get(&cache_key) { if let Some(promise) = img_cache.map().get(&cache_key) {
match promise.poll() { match promise.poll() {
Poll::Ready(Ok(t)) => Image::new(SizedTexture::from_handle(t)), Poll::Ready(Ok(t)) => Some(Image::new(SizedTexture::from_handle(t))),
_ => Image::from_bytes(url.to_string(), LOGO_BYTES), _ => None,
} }
} else { } else {
let fetch = fetch_img(img_cache, ui.ctx(), url, size); let fetch = fetch_img(img_cache, ui.ctx(), url, size);
img_cache.map_mut().insert(cache_key.clone(), fetch); img_cache.map_mut().insert(cache_key.clone(), fetch);
Image::from_bytes(cache_key, LOGO_BYTES) None
} }
} }
@ -229,7 +229,11 @@ fn fetch_img(
Promise::spawn_thread("load_from_disk", move || { Promise::spawn_thread("load_from_disk", move || {
info!("Loading image from disk: {}", dst_path.display()); info!("Loading image from disk: {}", dst_path.display());
match FfmpegLoader::new().load_image(dst_path, size) { match FfmpegLoader::new().load_image(dst_path, size) {
Ok(img) => Ok(ctx.load_texture(&name, img, Default::default())), Ok(img) => {
ctx.request_repaint();
ctx.forget_image(&name);
Ok(ctx.load_texture(&name, img, Default::default()))
}
Err(e) => Err(notedeck::Error::Generic(e.to_string())), Err(e) => Err(notedeck::Error::Generic(e.to_string())),
} }
}) })
@ -248,6 +252,7 @@ fn fetch_img(
match FfmpegLoader::new().load_image(dst_path, size) { match FfmpegLoader::new().load_image(dst_path, size) {
Ok(img) => { Ok(img) => {
ctx.request_repaint(); ctx.request_repaint();
ctx.forget_image(&name);
Ok(ctx.load_texture(&name, img, Default::default())) Ok(ctx.load_texture(&name, img, Default::default()))
} }
Err(e) => Err(notedeck::Error::Generic(e.to_string())), Err(e) => Err(notedeck::Error::Generic(e.to_string())),

View File

@ -35,14 +35,16 @@ impl NostrWidget for ProfilePage {
ui.spacing_mut().item_spacing.y = 8.0; ui.spacing_mut().item_spacing.y = 8.0;
if let Some(banner) = profile.map(|p| p.banner()).flatten() { if let Some(banner) = profile.map(|p| p.banner()).flatten() {
image_from_cache( if let Some(img) = image_from_cache(
&mut services.ctx.img_cache, &mut services.ctx.img_cache,
ui, ui,
banner, banner,
Some(vec2(ui.available_width(), 360.0)), Some(vec2(ui.available_width(), 360.0)),
) ) {
.rounding(ROUNDING_DEFAULT) img.rounding(ROUNDING_DEFAULT).ui(ui);
.ui(ui); } else {
PlaceholderRect.ui(ui);
}
} else { } else {
ui.add(PlaceholderRect); ui.add(PlaceholderRect);
} }

View File

@ -54,8 +54,11 @@ impl Avatar {
if !ui.is_rect_visible(ui.cursor()) { if !ui.is_rect_visible(ui.cursor()) {
return Self::placeholder(ui, size_v); return Self::placeholder(ui, size_v);
} }
match &self.image { match self
Some(img) => image_from_cache(img_cache, ui, img, Some(size)) .image
.and_then(|i| image_from_cache(img_cache, ui, &i, Some(size)))
{
Some(img) => img
.rounding(Rounding::same(size_v)) .rounding(Rounding::same(size_v))
.sense(Sense::click()) .sense(Sense::click())
.ui(ui), .ui(ui),

View File

@ -28,7 +28,7 @@ impl Header {
Layout::left_to_right(Align::Center), Layout::left_to_right(Align::Center),
|ui| { |ui| {
ui.style_mut().spacing.item_spacing.x = 16.; ui.style_mut().spacing.item_spacing.x = 16.;
if Image::from_bytes("logo.svg", logo_bytes) if Image::from_bytes("header_logo.svg", logo_bytes)
.max_height(24.) .max_height(24.)
.sense(Sense::click()) .sense(Sense::click())
.ui(ui) .ui(ui)

View File

@ -33,10 +33,12 @@ impl<'a> StreamEvent<'a> {
let (response, painter) = ui.allocate_painter(Vec2::new(w, h), Sense::click()); let (response, painter) = ui.allocate_painter(Vec2::new(w, h), Sense::click());
let cover = if ui.is_rect_visible(response.rect) { let cover = if ui.is_rect_visible(response.rect) {
self.event.image().map(|p| { self.event
image_from_cache(services.ctx.img_cache, ui, p, Some(Vec2::new(w, h))) .image()
.rounding(ROUNDING_DEFAULT) .and_then(|p| {
}) image_from_cache(services.ctx.img_cache, ui, p, Some(Vec2::new(w, h)))
})
.map(|i| i.rounding(ROUNDING_DEFAULT))
} else { } else {
None None
}; };