HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
box_constraints.hpp
1// Copyright Take Vos 2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "../geometry/module.hpp"
8#include "../utility/utility.hpp"
9#include "../macros.hpp"
10#include <cstdint>
11#include <limits>
12#include <concepts>
13
14
15
16namespace hi { inline namespace v1 {
17
26 extent2 minimum = {};
27 extent2 preferred = {};
28 extent2 maximum = {};
30 hi::margins padding = {};
31
33
34 constexpr box_constraints() noexcept = default;
35 constexpr box_constraints(box_constraints const&) noexcept = default;
36 constexpr box_constraints(box_constraints&&) noexcept = default;
37 constexpr box_constraints& operator=(box_constraints const&) noexcept = default;
38 constexpr box_constraints& operator=(box_constraints&&) noexcept = default;
39 [[nodiscard]] constexpr friend bool operator==(box_constraints const&, box_constraints const&) noexcept = default;
40
41 constexpr box_constraints(
42 extent2 minimum,
43 extent2 preferred,
44 extent2 maximum,
47 hi::margins padding = hi::margins{}) noexcept :
48 minimum(minimum), preferred(preferred), maximum(maximum), margins(margins), padding(padding), alignment(alignment)
49 {
50 hi_axiom(holds_invariant());
51 }
52
53 [[nodiscard]] constexpr box_constraints internalize_margins() const noexcept
54 {
55 auto r = *this;
56 r.padding += r.margins;
57
58 r.minimum.width() += r.margins.left() + r.margins.right();
59 r.preferred.width() += r.margins.left() + r.margins.right();
60 r.maximum.width() += r.margins.left() + r.margins.right();
61
62 r.minimum.height() += r.margins.bottom() + r.margins.top();
63 r.preferred.height() += r.margins.bottom() + r.margins.top();
64 r.maximum.height() += r.margins.bottom() + r.margins.top();
65
66 r.margins = 0;
67 hi_axiom(r.holds_invariant());
68 return r;
69 }
70
71 [[nodiscard]] constexpr box_constraints constrain(extent2 new_minimum, extent2 new_maximum) const noexcept
72 {
73 hi_assert(new_minimum <= new_maximum);
74
75 auto r = *this;
76
77 inplace_max(r.minimum, new_minimum);
78 inplace_min(r.maximum, new_maximum);
79
80 inplace_max(r.preferred, r.minimum);
81 inplace_max(r.maximum, r.preferred);
82 hi_axiom(r.holds_invariant());
83 return r;
84 }
85
86 constexpr box_constraints& operator+=(extent2 const& rhs) noexcept
87 {
88 minimum.width() += rhs.width();
89 preferred.width() += rhs.width();
90 maximum.width() += rhs.width();
91 minimum.height() += rhs.height();
92 preferred.height() += rhs.height();
93 maximum.height() += rhs.height();
94
95 hi_axiom(holds_invariant());
96 return *this;
97 }
98
99 [[nodiscard]] constexpr box_constraints operator+(extent2 const& rhs) const noexcept
100 {
101 auto r = *this;
102 r += rhs;
103 return r;
104 }
105
106 [[nodiscard]] constexpr bool holds_invariant() const noexcept
107 {
109 return false;
110 }
111 if (minimum > preferred or preferred > maximum) {
112 return false;
113 }
114 return true;
115 }
116
117 [[nodiscard]] friend constexpr box_constraints max(box_constraints const& lhs, extent2 const& rhs) noexcept
118 {
119 auto r = lhs;
120 inplace_max(r.minimum, rhs);
121 inplace_max(r.preferred, rhs);
122 inplace_max(r.maximum, rhs);
123
124 hi_axiom(r.holds_invariant());
125 return r;
126 }
127
135 [[nodiscard]] friend constexpr box_constraints max(box_constraints const& lhs, box_constraints const& rhs) noexcept
136 {
137 auto r = lhs;
138 inplace_max(r.minimum, rhs.minimum);
139 inplace_max(r.preferred, rhs.preferred);
140 inplace_max(r.maximum, rhs.maximum);
141 inplace_max(r.margins, rhs.margins);
142 inplace_max(r.padding, rhs.padding);
143
144 hi_axiom(r.holds_invariant());
145 return r;
146 }
147
148 template<std::convertible_to<box_constraints>... Args>
149 [[nodiscard]] friend constexpr box_constraints
150 max(box_constraints const& first, box_constraints const& second, box_constraints const& third, Args const&...args) noexcept
151 {
152 return max(first, max(second, third, args...));
153 }
154};
155
156}} // namespace hi::v1
@ flush
Align the text naturally based on the writing direction of each paragraph.
@ justified
Stretch the text to be flush to both sides.
DOXYGEN BUG.
Definition algorithm.hpp:16
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
Horizontal/Vertical alignment combination.
Definition alignment.hpp:242
A high-level geometric extent.
Definition extent2.hpp:29
constexpr float & width() noexcept
Access the x-as-width element from the extent.
Definition extent2.hpp:104
constexpr float & height() noexcept
Access the y-as-height element from the extent.
Definition extent2.hpp:115
The left, bottom, right and top margins.
Definition margins.hpp:23
2D constraints.
Definition box_constraints.hpp:25
friend constexpr box_constraints max(box_constraints const &lhs, box_constraints const &rhs) noexcept
Makes a constraint that encompasses both given constraints.
Definition box_constraints.hpp:135