use core::borrow::Borrow;
use crate::{
resource::image::GBitMap,
sys,
ui::{
AsLayer,
graphics::{Colour, Rectangle, grect},
},
};
#[derive(Clone, Copy)]
#[repr(u8)]
pub enum Align {
Center = sys::GAlign_GAlignCenter,
TopLeft = sys::GAlign_GAlignTopLeft,
TopRight = sys::GAlign_GAlignTopRight,
Top = sys::GAlign_GAlignTop,
Left = sys::GAlign_GAlignLeft,
Bottom = sys::GAlign_GAlignBottom,
Right = sys::GAlign_GAlignRight,
BottomRight = sys::GAlign_GAlignBottomRight,
BottomLeft = sys::GAlign_GAlignBottomLeft,
}
pub struct BitmapLayer<B: Borrow<GBitMap> = GBitMap> {
ptr: *mut sys::BitmapLayer,
bitmap: Option<B>,
}
impl<B: Borrow<GBitMap>> BitmapLayer<B> {
pub fn new(frame: Rectangle) -> Option<Self> {
let ptr = unsafe { sys::bitmap_layer_create(grect(frame)).as_mut()? };
Some(Self { ptr, bitmap: None })
}
pub fn set_bitmap(&mut self, bitmap: B) -> &mut Self {
unsafe { sys::bitmap_layer_set_bitmap(self.ptr, bitmap.borrow().as_ptr()) };
self.bitmap = Some(bitmap);
self
}
pub fn bitmap(&self) -> Option<&GBitMap> {
self.bitmap.as_ref().map(Borrow::borrow)
}
pub fn set_alignment(&mut self, alignment: Align) -> &mut Self {
unsafe { sys::bitmap_layer_set_alignment(self.ptr, alignment as u8) };
self
}
pub fn set_background_colour(&mut self, colour: Colour) -> &mut Self {
unsafe { sys::bitmap_layer_set_background_color(self.ptr, colour.into()) };
self
}
}
unsafe impl<B: Borrow<GBitMap>> AsLayer for BitmapLayer<B> {
fn as_ptr(&self) -> *mut sys::Layer {
unsafe { sys::bitmap_layer_get_layer(self.ptr) }
}
}
impl<B: Borrow<GBitMap>> Drop for BitmapLayer<B> {
fn drop(&mut self) {
unsafe {
sys::layer_remove_child_layers(self.as_ptr());
sys::bitmap_layer_destroy(self.ptr);
}
}
}