Skip to main content

dais_ui/audience/
display.rs

1//! Audience slide rendering with letterboxing.
2//!
3//! Renders the audience-facing slide (centered, letterboxed/pillarboxed).
4
5use crate::widgets::SlideThumbnail;
6use dais_document::page::RenderedPage;
7
8/// The audience display — renders a single slide centered with letterboxing.
9pub struct AudienceDisplay {
10    thumbnail: SlideThumbnail,
11    /// Stored image rect for overlay coordinate mapping.
12    last_image_rect: egui::Rect,
13}
14
15impl AudienceDisplay {
16    pub fn new() -> Self {
17        Self { thumbnail: SlideThumbnail::new(), last_image_rect: egui::Rect::NOTHING }
18    }
19
20    /// Update with the audience page's rendered data.
21    pub fn update(&mut self, ctx: &egui::Context, page: &RenderedPage, page_index: usize) {
22        self.thumbnail.update(ctx, page, page_index);
23    }
24
25    /// Render the slide in the full available area, returning the image rect.
26    /// If `zoom_region` is provided, render only that sub-region magnified.
27    pub fn show(
28        &mut self,
29        ui: &mut egui::Ui,
30        zoom_region: Option<((f32, f32), f32)>,
31    ) -> egui::Rect {
32        let available = ui.available_size();
33        let response = if let Some((center, factor)) = zoom_region {
34            self.thumbnail.show_zoomed(ui, available, center, factor)
35        } else {
36            self.thumbnail.show(ui, available)
37        };
38        self.last_image_rect = response.rect;
39
40        self.last_image_rect
41    }
42
43    pub fn image_rect(&self) -> egui::Rect {
44        self.last_image_rect
45    }
46}
47
48impl Default for AudienceDisplay {
49    fn default() -> Self {
50        Self::new()
51    }
52}