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
- [UX] Render non-ascii chars with better font
- [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 anyhow::{anyhow, bail};
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 ehttp::Response;
use enostr::EventClientMessage;
@ -195,24 +195,24 @@ pub fn image_from_cache<'a>(
ui: &Ui,
url: &str,
size: Option<Vec2>,
) -> Image<'a> {
) -> Option<Image<'a>> {
if url.len() == 0 {
return None;
}
let cache_key = if let Some(s) = size {
format!("{}:{}", url, s)
} else {
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) {
match promise.poll() {
Poll::Ready(Ok(t)) => Image::new(SizedTexture::from_handle(t)),
_ => Image::from_bytes(url.to_string(), LOGO_BYTES),
Poll::Ready(Ok(t)) => Some(Image::new(SizedTexture::from_handle(t))),
_ => None,
}
} else {
let fetch = fetch_img(img_cache, ui.ctx(), url, size);
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 || {
info!("Loading image from disk: {}", dst_path.display());
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())),
}
})
@ -248,6 +252,7 @@ fn fetch_img(
match FfmpegLoader::new().load_image(dst_path, size) {
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())),

View File

@ -35,14 +35,16 @@ impl NostrWidget for ProfilePage {
ui.spacing_mut().item_spacing.y = 8.0;
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,
ui,
banner,
Some(vec2(ui.available_width(), 360.0)),
)
.rounding(ROUNDING_DEFAULT)
.ui(ui);
) {
img.rounding(ROUNDING_DEFAULT).ui(ui);
} else {
PlaceholderRect.ui(ui);
}
} else {
ui.add(PlaceholderRect);
}

View File

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

View File

@ -28,7 +28,7 @@ impl Header {
Layout::left_to_right(Align::Center),
|ui| {
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.)
.sense(Sense::click())
.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 cover = if ui.is_rect_visible(response.rect) {
self.event.image().map(|p| {
image_from_cache(services.ctx.img_cache, ui, p, Some(Vec2::new(w, h)))
.rounding(ROUNDING_DEFAULT)
})
self.event
.image()
.and_then(|p| {
image_from_cache(services.ctx.img_cache, ui, p, Some(Vec2::new(w, h)))
})
.map(|i| i.rounding(ROUNDING_DEFAULT))
} else {
None
};