use ratatui_core::layout::{Position, Rect};
use crate::{ref_count, RefCount};
#[derive(Clone, Debug)]
pub struct RefRect {
rect: RefCount<Rect>,
}
impl RefRect {
pub fn new(rect: Rect) -> Self {
Self { rect: ref_count(rect) }
}
pub fn get(&self) -> Rect {
#[cfg(feature = "sendable")]
{
*self.rect.lock().unwrap()
}
#[cfg(not(feature = "sendable"))]
{
*self.rect.borrow()
}
}
pub fn set(&self, rect: Rect) {
#[cfg(feature = "sendable")]
{
*self.rect.lock().unwrap() = rect;
}
#[cfg(not(feature = "sendable"))]
{
*self.rect.borrow_mut() = rect;
}
}
pub fn contains(&self, position: Position) -> bool {
#[cfg(feature = "sendable")]
{
self.rect.lock().unwrap().contains(position)
}
#[cfg(not(feature = "sendable"))]
{
self.rect.borrow().contains(position)
}
}
pub fn top(&self) -> u16 {
#[cfg(feature = "sendable")]
{
self.rect.lock().unwrap().top()
}
#[cfg(not(feature = "sendable"))]
{
self.rect.borrow().top()
}
}
pub fn bottom(&self) -> u16 {
#[cfg(feature = "sendable")]
{
self.rect.lock().unwrap().bottom()
}
#[cfg(not(feature = "sendable"))]
{
self.rect.borrow().bottom()
}
}
pub fn left(&self) -> u16 {
#[cfg(feature = "sendable")]
{
self.rect.lock().unwrap().left()
}
#[cfg(not(feature = "sendable"))]
{
self.rect.borrow().left()
}
}
pub fn right(&self) -> u16 {
#[cfg(feature = "sendable")]
{
self.rect.lock().unwrap().right()
}
#[cfg(not(feature = "sendable"))]
{
self.rect.borrow().right()
}
}
}
impl Default for RefRect {
fn default() -> Self {
Self::new(Rect::default())
}
}
#[cfg(test)]
mod tests {
use ratatui_core::layout::{Position, Rect};
use super::*;
#[test]
fn test_ref_rect_new_and_get() {
let rect = Rect::new(10, 20, 30, 40);
let ref_rect = RefRect::new(rect);
assert_eq!(ref_rect.get(), rect);
}
#[test]
fn test_ref_rect_set() {
let initial_rect = Rect::new(10, 20, 30, 40);
let new_rect = Rect::new(5, 15, 25, 35);
let ref_rect = RefRect::new(initial_rect);
assert_eq!(ref_rect.get(), initial_rect);
ref_rect.set(new_rect);
assert_eq!(ref_rect.get(), new_rect);
}
#[test]
fn test_ref_rect_clone_shares_state() {
let initial_rect = Rect::new(10, 20, 30, 40);
let new_rect = Rect::new(5, 15, 25, 35);
let ref_rect1 = RefRect::new(initial_rect);
let ref_rect2 = ref_rect1.clone();
assert_eq!(ref_rect1.get(), initial_rect);
assert_eq!(ref_rect2.get(), initial_rect);
ref_rect1.set(new_rect);
assert_eq!(ref_rect1.get(), new_rect);
assert_eq!(ref_rect2.get(), new_rect);
let third_rect = Rect::new(1, 2, 3, 4);
ref_rect2.set(third_rect);
assert_eq!(ref_rect1.get(), third_rect);
assert_eq!(ref_rect2.get(), third_rect);
}
#[test]
fn test_ref_rect_contains() {
let rect = Rect::new(10, 20, 30, 40);
let ref_rect = RefRect::new(rect);
assert!(ref_rect.contains(Position::new(15, 25)));
assert!(ref_rect.contains(Position::new(10, 20))); assert!(ref_rect.contains(Position::new(39, 59)));
assert!(!ref_rect.contains(Position::new(5, 15)));
assert!(!ref_rect.contains(Position::new(40, 60)));
assert!(!ref_rect.contains(Position::new(15, 70)));
}
#[test]
fn test_ref_rect_default() {
let ref_rect = RefRect::default();
assert_eq!(ref_rect.get(), Rect::default());
}
#[test]
fn test_ref_rect_edge_methods() {
let rect = Rect::new(10, 20, 30, 40);
let ref_rect = RefRect::new(rect);
assert_eq!(ref_rect.top(), 20);
assert_eq!(ref_rect.bottom(), 60); assert_eq!(ref_rect.left(), 10);
assert_eq!(ref_rect.right(), 40); }
}