use ferroui_base::input::StandardCursorType;
use ferroui_base::media::imaging::Bitmap;
use ferroui_base::platform::{ICursorFactory, ICursorImpl};
use ferroui_base::PixelPoint;
use std::any::Any;
use std::rc::Rc;
#[derive(Default)]
pub struct CursorFactory;
struct CursorImpl;
ferroui_base::ferro_thread_local! {
static ZERO_CURSOR: Rc<CursorImpl> = Rc::new(CursorImpl);
}
impl CursorImpl {
fn zero_cursor() -> Rc<dyn ICursorImpl> {
ZERO_CURSOR.with(|cursor| cursor.clone())
}
}
impl ICursorImpl for CursorImpl {
fn dispose(&self) {}
fn as_any(&self) -> &dyn Any {
self
}
}
impl ICursorFactory for CursorFactory {
fn get_cursor(&self, _cursor_type: StandardCursorType) -> Rc<dyn ICursorImpl> {
CursorImpl::zero_cursor()
}
fn create_cursor(&self, _cursor: &Bitmap, _hot_spot: PixelPoint) -> Rc<dyn ICursorImpl> {
CursorImpl::zero_cursor()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_standard_cursor_is_the_same_cursor() {
let factory = CursorFactory;
let arrow = factory.get_cursor(StandardCursorType::Arrow);
let hand = factory.get_cursor(StandardCursorType::Hand);
assert!(std::ptr::addr_eq(Rc::as_ptr(&arrow), Rc::as_ptr(&hand)));
arrow.dispose();
}
}