commit dc91b6ffae5d0e638842b2db4a7e63b3ba14c71a
parent 28bd13d11069f24f8b5729d61702c809ee15ef99
Author: kernelkind <kernelkind@gmail.com>
Date: Mon, 11 Aug 2025 10:36:59 -0400
extract a pub `render_media` from image_carousel
Signed-off-by: kernelkind <kernelkind@gmail.com>
Diffstat:
1 file changed, 71 insertions(+), 42 deletions(-)
diff --git a/crates/notedeck_ui/src/note/media.rs b/crates/notedeck_ui/src/note/media.rs
@@ -2,7 +2,8 @@ use std::path::Path;
use bitflags::bitflags;
use egui::{
- vec2, Button, Color32, Context, CornerRadius, FontId, Image, Response, TextureHandle, Vec2,
+ vec2, Button, Color32, Context, CornerRadius, FontId, Image, InnerResponse, Response,
+ TextureHandle, Vec2,
};
use notedeck::{
compute_blurhash, fonts::get_font_size, show_one_error_message, tr, BlurhashParams,
@@ -61,54 +62,25 @@ pub fn image_carousel(
let mut media_action: Option<(usize, MediaUIAction)> = None;
for (i, media) in medias.iter().enumerate() {
- let RenderableMedia {
- url,
- media_type,
- obfuscation_type: blur_type,
- } = media;
-
- let cache = match media_type {
- MediaCacheType::Image => &mut img_cache.static_imgs,
- MediaCacheType::Gif => &mut img_cache.gifs,
- };
- let media_state = get_content_media_render_state(
+ let media_response = render_media(
ui,
+ img_cache,
job_pool,
jobs,
+ media,
trusted_media,
- size,
- &mut cache.textures_cache,
- url,
- *media_type,
- &cache.cache_dir,
- blur_type,
- );
-
- let animation_mode = if note_options.contains(NoteOptions::NoAnimations)
- {
- AnimationMode::NoAnimation
- } else {
- // if animations aren't disabled, we cap it at 24fps for gifs in carousels
- let fps = match media_type {
- MediaCacheType::Gif => Some(24.0),
- MediaCacheType::Image => None,
- };
- AnimationMode::Continuous { fps }
- };
-
- let media_response = render_media(
- ui,
- &mut img_cache.gif_states,
- media_state,
- url,
- size,
i18n,
+ size,
+ if note_options.contains(NoteOptions::NoAnimations) {
+ Some(AnimationMode::NoAnimation)
+ } else {
+ None
+ },
if note_options.contains(NoteOptions::Wide) {
ScaledTextureFlags::SCALE_TO_WIDTH
} else {
ScaledTextureFlags::empty()
},
- animation_mode,
);
if let Some(action) = media_response.inner {
@@ -117,7 +89,7 @@ pub fn image_carousel(
let rect = media_response.response.rect;
media_infos.push(MediaInfo {
- url: url.clone(),
+ url: media.url.clone(),
original_position: rect,
})
}
@@ -143,7 +115,64 @@ pub fn image_carousel(
action
}
-enum MediaUIAction {
+#[allow(clippy::too_many_arguments)]
+pub fn render_media(
+ ui: &mut egui::Ui,
+ img_cache: &mut Images,
+ job_pool: &mut JobPool,
+ jobs: &mut JobsCache,
+ media: &RenderableMedia,
+ trusted_media: bool,
+ i18n: &mut Localization,
+ size: Vec2,
+ animation_mode: Option<AnimationMode>,
+ scale_flags: ScaledTextureFlags,
+) -> InnerResponse<Option<MediaUIAction>> {
+ let RenderableMedia {
+ url,
+ media_type,
+ obfuscation_type: blur_type,
+ } = media;
+
+ let cache = match media_type {
+ MediaCacheType::Image => &mut img_cache.static_imgs,
+ MediaCacheType::Gif => &mut img_cache.gifs,
+ };
+ let media_state = get_content_media_render_state(
+ ui,
+ job_pool,
+ jobs,
+ trusted_media,
+ size,
+ &mut cache.textures_cache,
+ url,
+ *media_type,
+ &cache.cache_dir,
+ blur_type,
+ );
+
+ let animation_mode = animation_mode.unwrap_or_else(|| {
+ // if animations aren't disabled, we cap it at 24fps for gifs in carousels
+ let fps = match media_type {
+ MediaCacheType::Gif => Some(24.0),
+ MediaCacheType::Image => None,
+ };
+ AnimationMode::Continuous { fps }
+ });
+
+ render_media_internal(
+ ui,
+ &mut img_cache.gif_states,
+ media_state,
+ url,
+ size,
+ i18n,
+ scale_flags,
+ animation_mode,
+ )
+}
+
+pub enum MediaUIAction {
Unblur,
Error,
DoneLoading,
@@ -335,7 +364,7 @@ fn copy_link(i18n: &mut Localization, url: &str, img_resp: &Response) {
}
#[allow(clippy::too_many_arguments)]
-fn render_media(
+fn render_media_internal(
ui: &mut egui::Ui,
gifs: &mut GifStateMap,
render_state: MediaRenderState,