Skip to main content

grafix_toolbox/gui/
surface.rs

1use super::*;
2
3#[derive_as_trivial]
4pub struct Surf {
5	pub pos: Vec2,
6	pub size: Vec2,
7}
8impl Surf {
9	pub fn new(pos: Vec2, size: Vec2) -> Self {
10		let s = Self { pos, size };
11		debug_assert!({
12			s.b_box();
13			true
14		});
15		s
16	}
17	pub fn clamp_to_screen(&mut self, r: &RenderLock) {
18		let a = r.aspect();
19		let (lb, ru) = (Vec2(-1).div(a), Vec2(1).div(a));
20		let Self { pos, size } = self;
21		*size = size.clmp(0, ru.mul(2));
22		*pos = pos.clmp(lb, ru.sub(size));
23	}
24	pub fn b_box(self) -> Geom {
25		let Self { pos, size } = self;
26		ASSERT!(size.min_comp() >= 0., "Surface has negative size {size:?}");
27		(pos, pos.sum(size))
28	}
29	pub fn scale(mut self, mult: Vec2) -> Self {
30		self.size = self.size.mul(mult);
31		self.clmp_size()
32	}
33	pub fn pos(self, pos: Vec2) -> Self {
34		Self { pos, ..self }
35	}
36	pub fn xy(self, offset: Vec2) -> Self {
37		Self { pos: self.pos.sum(offset), ..self }
38	}
39	pub fn x(self, offset: f32) -> Self {
40		self.xy((offset, 0.))
41	}
42	pub fn y(self, offset: f32) -> Self {
43		self.xy((0., offset))
44	}
45	pub fn xr(self, offset: f32) -> Self {
46		self.x(self.size.x() - offset)
47	}
48	pub fn yt(self, offset: f32) -> Self {
49		self.y(self.size.y() - offset)
50	}
51	pub fn x_self<A>(self, mult: A) -> Self
52	where
53		f32: Cast<A>,
54	{
55		self.x(self.size.x() * f32(mult))
56	}
57	pub fn y_self<A>(self, mult: A) -> Self
58	where
59		f32: Cast<A>,
60	{
61		self.y(self.size.y() * f32(mult))
62	}
63	pub fn size(self, size: Vec2) -> Self {
64		Self { size, ..self }.clmp_size()
65	}
66	pub fn w(self, new: f32) -> Self {
67		self.size((new, self.size.y()))
68	}
69	pub fn h(self, new: f32) -> Self {
70		self.size((self.size.x(), new))
71	}
72	pub fn w_scale<A>(self, mult: A) -> Self
73	where
74		f32: Cast<A>,
75	{
76		self.scale((f32(mult), 1.))
77	}
78	pub fn h_scale<A>(self, mult: A) -> Self
79	where
80		f32: Cast<A>,
81	{
82		self.scale((1., f32(mult)))
83	}
84	pub fn size_sub(self, shrink: Vec2) -> Self {
85		Self { size: self.size.sub(shrink), ..self }.clmp_size()
86	}
87	pub fn w_sub(self, shrink: f32) -> Self {
88		self.w(self.size.x() - shrink).clmp_size()
89	}
90	pub fn h_sub(self, shrink: f32) -> Self {
91		self.h(self.size.y() - shrink).clmp_size()
92	}
93	fn clmp_size(mut self) -> Self {
94		self.size = self.size.fmax(0);
95		self
96	}
97}
98impl From<Geom> for Surf {
99	fn from((pos, size): Geom) -> Self {
100		Self { pos, size }
101	}
102}