use std::fmt::Debug;
use cgmath::Vector2;
use wgpu::util::DeviceExt;
use crate::{primitives::textures::Texture, render::render_engine::RenderEngine, utils::resources::Handle};
use super::{style::Style, UIEngine};
#[derive(Debug, Default)]
pub enum ElementInfo {
#[default]
Container,
Image(Handle<Texture>),
Text(glyphon::Buffer, glyphon::Color)
}
#[derive(Debug)]
pub struct UIElement {
pub style: Style,
pub info: ElementInfo,
pub buffer: wgpu::Buffer,
pub children: Vec<UIElement>
}
fn ui_buffer(render_engine: &RenderEngine) -> wgpu::Buffer {
render_engine.device.create_buffer_init(
&wgpu::util::BufferInitDescriptor {
label: Some("Instance Buffer"),
contents: bytemuck::cast_slice(&[[0.0; 4]; 7]),
usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST
}
)
}
impl UIElement {
pub fn min_size(&self, display_size: &Vector2<f32>) -> Vector2<f32> { self.style.min_size(display_size) }
pub fn container(render_engine: &RenderEngine, style: Style) -> Self { Self { style, info: ElementInfo::Container, buffer: ui_buffer(render_engine), children: Vec::new() } }
pub fn image(render_engine: &RenderEngine, style: Style, texture: Handle<Texture>) -> Self { Self { style, info: ElementInfo::Image(texture), buffer: ui_buffer(render_engine), children: Vec::new() } }
pub fn text(
render_engine: &RenderEngine,
ui_engine: &mut UIEngine,
style: Style,
text: impl Into<String>,
attrs: glyphon::Attrs,
color: glyphon::Color,
metrics: glyphon::Metrics
) -> Self {
let mut buffer = glyphon::Buffer::new(&mut ui_engine.font_system, metrics);
buffer.set_size(&mut ui_engine.font_system, render_engine.size.width as f32, render_engine.size.height as f32);
buffer.set_text(&mut ui_engine.font_system, &text.into(), attrs, glyphon::Shaping::Advanced);
buffer.shape_until_scroll(&mut ui_engine.font_system);
Self {
style,
info: ElementInfo::Text(buffer, color),
buffer: ui_buffer(render_engine),
children: Vec::new()
}
}
}