HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
widget_constraints.hpp
1// Copyright Take Vos 2021.
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/extent.hpp"
8#include "../geometry/margins.hpp"
9
10namespace hi::inline v1 {
11
13public:
14 extent2 minimum;
15 extent2 preferred;
16 extent2 maximum;
18
19 constexpr widget_constraints() noexcept : minimum(), preferred(), maximum(), margins() {}
20 constexpr widget_constraints(widget_constraints const &) noexcept = default;
21 constexpr widget_constraints(widget_constraints &&) noexcept = default;
22 constexpr widget_constraints &operator=(widget_constraints const &) noexcept = default;
23 constexpr widget_constraints &operator=(widget_constraints &&) noexcept = default;
24 constexpr widget_constraints(extent2 minimum, extent2 preferred, extent2 maximum, hi::margins margins = hi::margins{}) noexcept :
25 minimum(minimum), preferred(preferred), maximum(maximum), margins(margins)
26 {
27 hi_axiom(holds_invariant());
28 }
29
30 [[nodiscard]] constexpr bool holds_invariant() noexcept
31 {
32 return minimum <= preferred and preferred <= maximum;
33 }
34
35 [[nodiscard]] friend constexpr widget_constraints operator+(widget_constraints const &lhs, extent2 const &rhs) noexcept
36 {
37 return widget_constraints{lhs.minimum + rhs, lhs.preferred + rhs, lhs.maximum + rhs, lhs.margins};
38 }
39
40 [[nodiscard]] friend constexpr bool
41 operator==(widget_constraints const &lhs, widget_constraints const &rhs) noexcept = default;
42
43 [[nodiscard]] friend constexpr widget_constraints max(widget_constraints const &lhs, widget_constraints const &rhs) noexcept
44 {
45 return widget_constraints{
46 max(lhs.minimum, rhs.minimum),
47 max(lhs.preferred, rhs.preferred),
48 max(lhs.maximum, rhs.maximum),
49 max(lhs.margins, rhs.margins)};
50 }
51
52 [[nodiscard]] friend constexpr widget_constraints max(widget_constraints const &lhs, extent2 const &rhs) noexcept
53 {
54 return widget_constraints{max(lhs.minimum, rhs), max(lhs.preferred, rhs), max(lhs.maximum, rhs), lhs.margins};
55 }
56
57 template<typename... Args>
58 [[nodiscard]] friend constexpr widget_constraints max(widget_constraints const &first, Args const &...args) noexcept
59 requires(sizeof...(Args) >= 2)
60 {
61 return max(first, max(args...));
62 }
63};
64
65} // namespace hi::inline v1
Definition margins.hpp:11
Definition widget_constraints.hpp:12