use egui::{vec2, Align, Layout, Slider, TextureId, Ui};
use radiance::{UiBgNodeProps, UiBgNodeState};
const PREVIEW_ASPECT_RATIO: f32 = 1.;
const NORMAL_HEIGHT: f32 = 320.;
const NORMAL_WIDTH: f32 = 240.;
pub struct UiBgNodeTile<'a> {
preview_image: TextureId,
opacity: &'a mut f32,
}
impl<'a> UiBgNodeTile<'a> {
pub fn min_input_heights(_props: &UiBgNodeProps) -> Vec<f32> {
(0..1).map(|_| NORMAL_HEIGHT).collect()
}
pub fn width_for_height(_props: &UiBgNodeProps, height: f32) -> f32 {
NORMAL_WIDTH.min(0.5 * height)
}
pub fn new(
props: &'a mut UiBgNodeProps,
_state: &'a UiBgNodeState,
preview_image: TextureId,
) -> Self {
UiBgNodeTile {
preview_image,
opacity: &mut props.opacity,
}
}
pub fn add_contents(self, ui: &mut Ui) {
let UiBgNodeTile {
preview_image,
opacity,
} = self;
ui.heading("UI BG");
ui.with_layout(
Layout::bottom_up(Align::Center).with_cross_justify(true),
|ui| {
ui.spacing_mut().slider_width = ui.available_width();
ui.add(Slider::new(opacity, 0.0..=1.0).show_value(false));
ui.centered_and_justified(|ui| {
let image_size = ui.available_size();
let image_size = (image_size * vec2(1., 1. / PREVIEW_ASPECT_RATIO)).min_elem()
* vec2(1., PREVIEW_ASPECT_RATIO);
ui.image((preview_image, image_size));
});
},
);
}
}