notedeck

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

commit 8306003f6f1d5f54083bbda2702d87c7430e5aed
parent 96ab4ee681aa32453dbe46b7ba7ccc81dd53475d
Author: Fernando López Guevara <fernando.lguevara@gmail.com>
Date:   Thu, 24 Jul 2025 15:54:11 -0300

fix(media): edge-to-edge image display on narrow screen

Diffstat:
Mcrates/notedeck_ui/src/note/media.rs | 43+++++++++++++++++++++++++++++--------------
1 file changed, 29 insertions(+), 14 deletions(-)

diff --git a/crates/notedeck_ui/src/note/media.rs b/crates/notedeck_ui/src/note/media.rs @@ -6,8 +6,8 @@ use egui::{ }; use notedeck::{ fonts::get_font_size, note::MediaAction, show_one_error_message, supported_mime_hosted_at_url, - tr, GifState, GifStateMap, Images, JobPool, Localization, MediaCache, MediaCacheType, - NotedeckTextStyle, TexturedImage, TexturesCache, UrlMimes, + tr, ui::is_narrow, GifState, GifStateMap, Images, JobPool, Localization, MediaCache, + MediaCacheType, NotedeckTextStyle, TexturedImage, TexturesCache, UrlMimes, }; use crate::{ @@ -751,7 +751,7 @@ fn render_media( } } ObfuscatedTexture::Default => { - ui.add(texture_to_image(image.get_first_texture(), height)); + ui.add(texture_to_image(ui, image.get_first_texture(), height)); Some(MediaUIAction::DoneLoading) } }, @@ -774,7 +774,9 @@ fn render_media( MediaRenderState::Obfuscated(obfuscated_texture) => { let resp = match obfuscated_texture { ObfuscatedTexture::Blur(texture_handle) => { - let resp = ui.add(texture_to_image(texture_handle, height)); + let img = texture_to_image(ui, texture_handle, height); + + let resp = ui.add(img); render_blur_text(ui, i18n, url, resp.rect) } ObfuscatedTexture::Default => render_default_blur(ui, i18n, height, url), @@ -889,7 +891,12 @@ fn render_default_blur( } fn render_default_blur_bg(ui: &mut egui::Ui, height: f32, url: &str, shimmer: bool) -> egui::Rect { - let (rect, _) = ui.allocate_exact_size(egui::vec2(height, height), egui::Sense::click()); + let width = if is_narrow(ui.ctx()) { + ui.available_width() + } else { + height + }; + let (rect, _) = ui.allocate_exact_size(egui::vec2(width, height), egui::Sense::click()); let painter = ui.painter_at(rect); @@ -977,7 +984,8 @@ fn render_success_media( i18n: &mut Localization, ) -> Response { let texture = handle_repaint(ui, retrieve_latest_texture(url, gifs, tex)); - let img = texture_to_image(texture, height); + let img = texture_to_image(ui, texture, height); + let img_resp = ui.add(Button::image(img).frame(false)); copy_link(i18n, url, &img_resp); @@ -985,11 +993,17 @@ fn render_success_media( img_resp } -fn texture_to_image(tex: &TextureHandle, max_height: f32) -> egui::Image { - Image::new(tex) +fn texture_to_image<'a>(ui: &egui::Ui, tex: &TextureHandle, max_height: f32) -> egui::Image<'a> { + let mut img = Image::new(tex) .max_height(max_height) .corner_radius(5.0) - .maintain_aspect_ratio(true) + .maintain_aspect_ratio(true); + + if is_narrow(ui.ctx()) { + img = img.max_width(ui.available_width()); + } + + img } static BLUR_SHIMMER_ID: fn(&str) -> egui::Id = |url| egui::Id::new(("blur_shimmer", url)); @@ -1012,7 +1026,7 @@ fn shimmer_blurhash(tex: &TextureHandle, ui: &mut egui::Ui, url: &str, max_heigh let cur_alpha = get_blur_current_alpha(ui, url); let scaled = ScaledTexture::new(tex, max_height); - let img = scaled.get_image(); + let img = scaled.get_image(ui); show_blurhash_with_alpha(ui, img, cur_alpha); } @@ -1040,7 +1054,8 @@ fn render_blur_transition( ) -> FinishedTransition { let scaled_texture = ScaledTexture::new(image_texture, max_height); - let blur_img = texture_to_image(blur_texture, max_height); + let blur_img = texture_to_image(ui, blur_texture, max_height); + match get_blur_transition_state(ui.ctx(), url) { BlurTransitionState::StoppingShimmer { cur_alpha } => { show_blurhash_with_alpha(ui, blur_img, cur_alpha); @@ -1077,8 +1092,8 @@ impl<'a> ScaledTexture<'a> { } } - pub fn get_image(&self) -> Image { - texture_to_image(self.tex, self.max_height) + pub fn get_image(&self, ui: &egui::Ui) -> Image { + texture_to_image(ui, self.tex, self.max_height) .max_size(self.scaled_size) .shrink_to_fit() } @@ -1099,7 +1114,7 @@ fn render_blur_fade( .animate() }; - let img = image_texture.get_image(); + let img = image_texture.get_image(ui); let blur_img = blur_img.tint(fade_color(cur_alpha));