media/viewer: click anywhere to close

this should help mobile ...

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2025-07-28 12:10:00 -07:00
parent 3d18db8fd2
commit 590ffa0680
2 changed files with 29 additions and 28 deletions

View File

@@ -400,9 +400,13 @@ fn fullscreen_media_viewer_ui(
return; return;
} }
MediaViewer::new(viewer_state) let resp = MediaViewer::new(viewer_state)
.fullscreen(true) .fullscreen(true)
.ui(img_cache, ui); .ui(img_cache, ui);
if resp.clicked() {
options.set(AppOptions::FullscreenMedia, false);
}
} }
/* /*

View File

@@ -6,16 +6,17 @@ use notedeck::{ImageType, Images};
#[derive(Default)] #[derive(Default)]
pub struct MediaViewerState { pub struct MediaViewerState {
pub urls: Vec<String>, pub urls: Vec<String>,
pub scene_rect: Option<Rect>,
} }
/// A panning, scrolling, optionally fullscreen, and tiling media viewer /// A panning, scrolling, optionally fullscreen, and tiling media viewer
pub struct MediaViewer<'a> { pub struct MediaViewer<'a> {
state: &'a MediaViewerState, state: &'a mut MediaViewerState,
fullscreen: bool, fullscreen: bool,
} }
impl<'a> MediaViewer<'a> { impl<'a> MediaViewer<'a> {
pub fn new(state: &'a MediaViewerState) -> Self { pub fn new(state: &'a mut MediaViewerState) -> Self {
let fullscreen = false; let fullscreen = false;
Self { state, fullscreen } Self { state, fullscreen }
} }
@@ -25,40 +26,46 @@ impl<'a> MediaViewer<'a> {
self self
} }
pub fn ui(&self, images: &mut Images, ui: &mut egui::Ui) { pub fn ui(&mut self, images: &mut Images, ui: &mut egui::Ui) -> egui::Response {
if self.fullscreen { if self.fullscreen {
egui::Window::new("Media Viewer") egui::Window::new("Media Viewer")
.title_bar(false) .title_bar(false)
.fixed_size(ui.ctx().screen_rect().size()) .fixed_size(ui.ctx().screen_rect().size())
.fixed_pos(ui.ctx().screen_rect().min) .fixed_pos(ui.ctx().screen_rect().min)
.frame(egui::Frame::NONE) .frame(egui::Frame::NONE)
.show(ui.ctx(), |ui| self.ui_content(images, ui)); .show(ui.ctx(), |ui| self.ui_content(images, ui))
.unwrap() // SAFETY: we are always open
.inner
.unwrap()
} else { } else {
self.ui_content(images, ui); self.ui_content(images, ui)
} }
} }
fn ui_content(&self, images: &mut Images, ui: &mut egui::Ui) { fn ui_content(&mut self, images: &mut Images, ui: &mut egui::Ui) -> egui::Response {
let avail_rect = ui.available_rect_before_wrap(); let avail_rect = ui.available_rect_before_wrap();
//let id = ui.id().with("media_viewer");
// TODO: id_salt let mut scene_rect = if let Some(scene_rect) = self.state.scene_rect {
let id = ui.id().with("media_viewer"); scene_rect
let mut scene_rect = ui.ctx().data(|d| d.get_temp(id)).unwrap_or(avail_rect); } else {
let prev = scene_rect; self.state.scene_rect = Some(avail_rect);
avail_rect
};
// Draw background // Draw background
ui.painter() ui.painter()
.rect_filled(avail_rect, 0.0, egui::Color32::from_black_alpha(128)); .rect_filled(avail_rect, 0.0, egui::Color32::from_black_alpha(128));
egui::Scene::new() let resp = egui::Scene::new()
.zoom_range(0.0..=10.0) // enhance 🔬 .zoom_range(0.0..=10.0) // enhance 🔬
.show(ui, &mut scene_rect, |ui| { .show(ui, &mut scene_rect, |ui| {
self.render_image_tiles(images, ui); self.render_image_tiles(images, ui);
}); });
if scene_rect != prev { self.state.scene_rect = Some(scene_rect);
ui.ctx().data_mut(|d| d.insert_temp(id, scene_rect));
} resp.response
} }
/// ///
@@ -89,21 +96,11 @@ impl<'a> MediaViewer<'a> {
let uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0)); let uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
// image actions // image actions
/* //let response = ui.interact(render_rect, carousel_id.with("img"), Sense::click());
let response = ui.interact(
render_rect,
carousel_id.with("img"),
Sense::click(),
);
/*
if response.clicked() { if response.clicked() {
ui.data_mut(|data| { } else if background_response.clicked() {
data.insert_temp(carousel_id.with("show_popup"), true);
});
} else if background_response.clicked() || response.clicked_elsewhere() {
ui.data_mut(|data| {
data.insert_temp(carousel_id.with("show_popup"), false);
});
} }
*/ */