Skip to main content

lutgen_studio/ui/
central.rs

1use crate::ui::scene::Scene;
2use crate::App;
3
4impl App {
5    fn show_image(&mut self, mut size: egui::Vec2, ui: &mut egui::Ui) {
6        if self.state.edited_texture.is_none() && self.state.image_texture.is_none() {
7            // no image loaded
8            if self.inline_layout {
9                size.y /= 4.;
10            }
11            let (rect, res) = ui.allocate_exact_size(size, egui::Sense::click());
12            ui.painter().text(
13                rect.center(),
14                egui::Align2::CENTER_CENTER,
15                "Load image ...",
16                egui::FontId::default(),
17                egui::Color32::GRAY,
18            );
19            if res.clicked() {
20                self.open_picker.trigger(None);
21            }
22        } else {
23            let rect = if !self.state.show_original
24                && let Some(texture) = &self.state.edited_texture
25            {
26                // display edited image
27                let res = ui.add(
28                    egui::Image::from_texture(texture)
29                        .texture_options(egui::TextureOptions::NEAREST)
30                        .max_size(size)
31                        .corner_radius(4.0)
32                        .sense(egui::Sense::click()),
33                );
34                if res.clicked() {
35                    self.state.show_original = true;
36                }
37                res.rect
38            } else if let Some(texture) = &self.state.image_texture {
39                // display original image
40                let res = ui.add(
41                    egui::Image::from_texture(texture)
42                        .texture_options(egui::TextureOptions::NEAREST)
43                        .max_size(size)
44                        .corner_radius(4.0)
45                        .sense(egui::Sense::click()),
46                );
47                if res.clicked() {
48                    if self.state.edited_texture.is_none() {
49                        // apply if there's no edited texture to show
50                        self.apply();
51                    }
52                    self.state.show_original = false;
53                }
54
55                // draw "original" indicator
56                let painter = ui.painter();
57                let pos = res.rect.min + egui::Vec2::splat(8.);
58                let galley = painter.layout_no_wrap(
59                    "Original".to_string(),
60                    egui::TextStyle::Body.resolve(ui.style()),
61                    egui::Color32::WHITE,
62                );
63                let text_rect = egui::Rect::from_min_size(pos, galley.size());
64                let padding = egui::Vec2::splat(6.0);
65                let bg_rect = text_rect.expand2(padding);
66                painter.rect_filled(
67                    bg_rect,
68                    2.0,
69                    egui::Color32::from_rgba_unmultiplied(0x16, 0x16, 0x16, 172),
70                );
71                painter.galley(pos, galley, egui::Color32::WHITE);
72
73                res.rect
74            } else {
75                unreachable!();
76            };
77
78            // paint border
79            ui.painter().rect_stroke(
80                rect,
81                4.0,
82                egui::Stroke::new(1.0, egui::Color32::GRAY),
83                egui::StrokeKind::Middle,
84            );
85
86            // show spinner if processing
87            if self.state.processing {
88                ui.painter()
89                    .rect_filled(rect, 4.0, egui::Color32::from_black_alpha(64));
90                egui::Spinner::new().paint_at(
91                    ui,
92                    egui::Rect::from_center_size(rect.center(), egui::Vec2::splat(30.)),
93                );
94            }
95        }
96    }
97
98    /// Main app panel
99    pub fn show_central_panel(&mut self, ctx: &egui::Context) {
100        egui::CentralPanel::default().show(ctx, |ui| {
101            let size = ui.available_size();
102            if !self.inline_layout {
103                let mut rect = self.scene_rect;
104                Scene::new()
105                    .zoom_range(0.95..=f32::INFINITY)
106                    .constrain_panning(true)
107                    .show(ui, &mut rect, |ui| {
108                        self.show_image(size, ui);
109                    });
110                self.scene_rect = rect;
111            } else {
112                egui::ScrollArea::new([false, true]).show(ui, |ui| {
113                    self.show_image(size, ui);
114                    self.show_sidebar_inner(ui);
115                });
116            }
117
118            ui.with_layout(egui::Layout::bottom_up(egui::Align::RIGHT), |ui| {
119                egui::warn_if_debug_build(ui);
120            });
121        });
122    }
123}