grafix_toolbox/gui/
surface.rs1use 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}