note media: unnest full screen media
Signed-off-by: kernelkind <kernelkind@gmail.com>
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use egui::{Button, Color32, Image, Response, Sense, Window};
|
||||
use notedeck::{Images, MediaCacheType};
|
||||
use notedeck::{GifState, Images, MediaCacheType, TexturedImage};
|
||||
|
||||
use crate::{
|
||||
gif::{handle_repaint, retrieve_latest_texture},
|
||||
@@ -86,12 +88,19 @@ pub(crate) fn image_carousel(
|
||||
});
|
||||
|
||||
if show_popup {
|
||||
let current_image = current_image
|
||||
.as_ref()
|
||||
.expect("the image was actually clicked");
|
||||
let image = current_image.clone().0;
|
||||
let cache_type = current_image.clone().1;
|
||||
if let Some((image_url, cache_type)) = current_image {
|
||||
show_full_screen_media(ui, &image_url, cache_type, img_cache, carousel_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn show_full_screen_media(
|
||||
ui: &mut egui::Ui,
|
||||
image_url: &str,
|
||||
cache_type: MediaCacheType,
|
||||
img_cache: &mut Images,
|
||||
carousel_id: egui::Id,
|
||||
) {
|
||||
Window::new("image_popup")
|
||||
.title_bar(false)
|
||||
.fixed_size(ui.ctx().screen_rect().size())
|
||||
@@ -102,12 +111,26 @@ pub(crate) fn image_carousel(
|
||||
render_images(
|
||||
ui,
|
||||
img_cache,
|
||||
&image,
|
||||
image_url,
|
||||
ImageType::Content,
|
||||
cache_type,
|
||||
|_| {},
|
||||
|_, _| {},
|
||||
|ui, url, renderable_media, gifs| {
|
||||
render_full_screen_media(ui, renderable_media, gifs, url, carousel_id);
|
||||
},
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
fn render_full_screen_media(
|
||||
ui: &mut egui::Ui,
|
||||
renderable_media: &mut TexturedImage,
|
||||
gifs: &mut HashMap<String, GifState>,
|
||||
image_url: &str,
|
||||
carousel_id: egui::Id,
|
||||
) {
|
||||
let screen_rect = ui.ctx().screen_rect();
|
||||
|
||||
// escape
|
||||
@@ -118,11 +141,8 @@ pub(crate) fn image_carousel(
|
||||
}
|
||||
|
||||
// background
|
||||
ui.painter().rect_filled(
|
||||
screen_rect,
|
||||
0.0,
|
||||
Color32::from_black_alpha(230),
|
||||
);
|
||||
ui.painter()
|
||||
.rect_filled(screen_rect, 0.0, Color32::from_black_alpha(230));
|
||||
|
||||
// zoom init
|
||||
let zoom_id = carousel_id.with("zoom_level");
|
||||
@@ -132,16 +152,15 @@ pub(crate) fn image_carousel(
|
||||
|
||||
// pan init
|
||||
let pan_id = carousel_id.with("pan_offset");
|
||||
let mut pan_offset = ui.ctx().memory(|mem| {
|
||||
mem.data.get_temp(pan_id).unwrap_or(egui::Vec2::ZERO)
|
||||
});
|
||||
let mut pan_offset = ui
|
||||
.ctx()
|
||||
.memory(|mem| mem.data.get_temp(pan_id).unwrap_or(egui::Vec2::ZERO));
|
||||
|
||||
// zoom & scroll
|
||||
if ui.input(|i| i.pointer.hover_pos()).is_some() {
|
||||
let scroll_delta = ui.input(|i| i.smooth_scroll_delta);
|
||||
if scroll_delta.y != 0.0 {
|
||||
let zoom_factor =
|
||||
if scroll_delta.y > 0.0 { 1.05 } else { 0.95 };
|
||||
let zoom_factor = if scroll_delta.y > 0.0 { 1.05 } else { 0.95 };
|
||||
zoom *= zoom_factor;
|
||||
zoom = zoom.clamp(0.1, 5.0);
|
||||
|
||||
@@ -158,7 +177,7 @@ pub(crate) fn image_carousel(
|
||||
|
||||
let texture = handle_repaint(
|
||||
ui,
|
||||
retrieve_latest_texture(&image, gifs, renderable_media),
|
||||
retrieve_latest_texture(image_url, gifs, renderable_media),
|
||||
);
|
||||
|
||||
let texture_size = texture.size_vec2();
|
||||
@@ -192,10 +211,8 @@ pub(crate) fn image_carousel(
|
||||
);
|
||||
|
||||
let uv_min = egui::pos2(
|
||||
0.5 - (visible_width / scaled_size.x) / 2.0
|
||||
+ pan_offset.x / scaled_size.x,
|
||||
0.5 - (visible_height / scaled_size.y) / 2.0
|
||||
+ pan_offset.y / scaled_size.y,
|
||||
0.5 - (visible_width / scaled_size.x) / 2.0 + pan_offset.x / scaled_size.x,
|
||||
0.5 - (visible_height / scaled_size.y) / 2.0 + pan_offset.y / scaled_size.y,
|
||||
);
|
||||
|
||||
let uv_max = egui::pos2(
|
||||
@@ -253,12 +270,7 @@ pub(crate) fn image_carousel(
|
||||
});
|
||||
}
|
||||
|
||||
copy_link(url, response);
|
||||
},
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
copy_link(image_url, response);
|
||||
}
|
||||
|
||||
fn copy_link(url: &str, img_resp: Response) {
|
||||
|
||||
Reference in New Issue
Block a user