use crate::{draw_2d::ImageTrait, gui::impl_layout, types::Scale, util::macros::callback};
use nappgui_sys::{
imageview_OnClick, imageview_OnOverDraw, imageview_create, imageview_image, imageview_scale,
imageview_size,
};
pub trait ImageViewTrait {
fn as_ptr(&self) -> *mut nappgui_sys::ImageView;
fn size(&self, width: f32, height: f32) {
let size = nappgui_sys::S2Df { width, height };
unsafe {
imageview_size(self.as_ptr(), size);
}
}
fn scale(&self, scale: Scale) {
unsafe {
imageview_scale(self.as_ptr(), scale as _);
}
}
fn image<T>(&self, image: &T)
where
T: ImageTrait,
{
unsafe {
imageview_image(self.as_ptr(), image.as_ptr());
}
}
callback! {
on_click() => imageview_OnClick;
on_over_draw() => imageview_OnOverDraw;
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug)]
pub struct ImageView {
pub(crate) inner: *mut nappgui_sys::ImageView,
}
impl ImageViewTrait for ImageView {
fn as_ptr(&self) -> *mut nappgui_sys::ImageView {
self.inner
}
}
impl ImageView {
pub fn new(width: f32, height: f32) -> Self {
let imageview = unsafe { imageview_create() };
let imageview = Self { inner: imageview };
imageview.size(width, height);
imageview
}
}
impl_layout!(ImageView, ImageViewTrait, layout_imageview);