lutgen_studio/ui/
central.rs1use 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 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 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 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 self.apply();
51 }
52 self.state.show_original = false;
53 }
54
55 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 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 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 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}