use std::marker::PhantomData;
use std::os::raw::c_void;
use crate::render::renderer::TextureId;
use crate::sys;
use crate::Ui;
#[must_use]
pub struct Image<'ui> {
texture_id: TextureId,
size: [f32; 2],
uv0: [f32; 2],
uv1: [f32; 2],
tint_col: [f32; 4],
border_col: [f32; 4],
_phantom: PhantomData<&'ui Ui<'ui>>,
}
impl<'ui> Image<'ui> {
pub fn new(_: &Ui<'ui>, texture_id: TextureId, size: [f32; 2]) -> Self {
const DEFAULT_UV0: [f32; 2] = [0.0, 0.0];
const DEFAULT_UV1: [f32; 2] = [1.0, 1.0];
const DEFAULT_TINT_COL: [f32; 4] = [1.0, 1.0, 1.0, 1.0];
const DEFAULT_BORDER_COL: [f32; 4] = [0.0, 0.0, 0.0, 0.0];
Image {
texture_id,
size,
uv0: DEFAULT_UV0,
uv1: DEFAULT_UV1,
tint_col: DEFAULT_TINT_COL,
border_col: DEFAULT_BORDER_COL,
_phantom: PhantomData,
}
}
pub fn size(mut self, size: [f32; 2]) -> Self {
self.size = size;
self
}
pub fn uv0(mut self, uv0: [f32; 2]) -> Self {
self.uv0 = uv0;
self
}
pub fn uv1(mut self, uv1: [f32; 2]) -> Self {
self.uv1 = uv1;
self
}
pub fn tint_col(mut self, tint_col: [f32; 4]) -> Self {
self.tint_col = tint_col;
self
}
pub fn border_col(mut self, border_col: [f32; 4]) -> Self {
self.border_col = border_col;
self
}
pub fn build(self) {
unsafe {
sys::igImage(
self.texture_id.id() as *mut c_void,
self.size.into(),
self.uv0.into(),
self.uv1.into(),
self.tint_col.into(),
self.border_col.into(),
);
}
}
}
#[must_use]
pub struct ImageButton<'ui> {
texture_id: TextureId,
size: [f32; 2],
uv0: [f32; 2],
uv1: [f32; 2],
frame_padding: i32,
bg_col: [f32; 4],
tint_col: [f32; 4],
_phantom: PhantomData<&'ui Ui<'ui>>,
}
impl<'ui> ImageButton<'ui> {
pub fn new(_: &Ui<'ui>, texture_id: TextureId, size: [f32; 2]) -> Self {
const DEFAULT_UV0: [f32; 2] = [0.0, 0.0];
const DEFAULT_UV1: [f32; 2] = [1.0, 1.0];
const DEFAULT_FRAME_PADDING: i32 = -1;
const DEFAULT_BG_COL: [f32; 4] = [0.0, 0.0, 0.0, 0.0];
const DEFAULT_TINT_COL: [f32; 4] = [1.0, 1.0, 1.0, 1.0];
ImageButton {
texture_id,
size: size,
uv0: DEFAULT_UV0,
uv1: DEFAULT_UV1,
frame_padding: DEFAULT_FRAME_PADDING,
bg_col: DEFAULT_BG_COL,
tint_col: DEFAULT_TINT_COL,
_phantom: PhantomData,
}
}
pub fn size(mut self, size: [f32; 2]) -> Self {
self.size = size;
self
}
pub fn uv0(mut self, uv0: [f32; 2]) -> Self {
self.uv0 = uv0;
self
}
pub fn uv1(mut self, uv1: [f32; 2]) -> Self {
self.uv1 = uv1;
self
}
pub fn frame_padding(mut self, frame_padding: i32) -> Self {
self.frame_padding = frame_padding.into();
self
}
pub fn tint_col(mut self, tint_col: [f32; 4]) -> Self {
self.tint_col = tint_col;
self
}
pub fn background_col(mut self, bg_col: [f32; 4]) -> Self {
self.bg_col = bg_col;
self
}
pub fn build(self) -> bool {
unsafe {
sys::igImageButton(
self.texture_id.id() as *mut c_void,
self.size.into(),
self.uv0.into(),
self.uv1.into(),
self.frame_padding,
self.bg_col.into(),
self.tint_col.into(),
)
}
}
}