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#include "widget_baseline.hpp"
10
11namespace hi::inline v1 {
12
14public:
15 extent2 minimum;
16 extent2 preferred;
17 extent2 maximum;
19 widget_baseline baseline;
20
21 constexpr widget_constraints() noexcept : minimum(), preferred(), maximum(), margins(), baseline() {}
22 constexpr widget_constraints(widget_constraints const&) noexcept = default;
23 constexpr widget_constraints(widget_constraints&&) noexcept = default;
24 constexpr widget_constraints& operator=(widget_constraints const&) noexcept = default;
25 constexpr widget_constraints& operator=(widget_constraints&&) noexcept = default;
26 constexpr widget_constraints(
27 extent2 minimum,
28 extent2 preferred,
29 extent2 maximum,
30 hi::margins margins = hi::margins{},
31 widget_baseline baseline = hi::widget_baseline{}) noexcept :
32 minimum(minimum), preferred(preferred), maximum(maximum), margins(margins), baseline(baseline)
33 {
34 hi_axiom(holds_invariant());
35 }
36
37 [[nodiscard]] constexpr bool holds_invariant() noexcept
38 {
39 return minimum <= preferred and preferred <= maximum;
40 }
41
42 [[nodiscard]] friend constexpr widget_constraints operator+(widget_constraints const& lhs, extent2 const& rhs) noexcept
43 {
44 return widget_constraints{lhs.minimum + rhs, lhs.preferred + rhs, lhs.maximum + rhs, lhs.margins, lhs.baseline};
45 }
46
47 [[nodiscard]] friend constexpr bool
48 operator==(widget_constraints const& lhs, widget_constraints const& rhs) noexcept = default;
49
50 [[nodiscard]] friend constexpr widget_constraints max(widget_constraints const& lhs, widget_constraints const& rhs) noexcept
51 {
52 return widget_constraints{
53 max(lhs.minimum, rhs.minimum),
54 max(lhs.preferred, rhs.preferred),
55 max(lhs.maximum, rhs.maximum),
56 max(lhs.margins, rhs.margins),
57 std::max(lhs.baseline, rhs.baseline)};
58 }
59
60 [[nodiscard]] friend constexpr widget_constraints max(widget_constraints const& lhs, extent2 const& rhs) noexcept
61 {
62 return widget_constraints{max(lhs.minimum, rhs), max(lhs.preferred, rhs), max(lhs.maximum, rhs), lhs.margins, lhs.baseline};
63 }
64
65 template<typename... Args>
66 [[nodiscard]] friend constexpr widget_constraints max(widget_constraints const& first, Args const&...args) noexcept
67 requires(sizeof...(Args) >= 2)
68 {
69 return max(first, max(args...));
70 }
71};
72
73} // namespace hi::inline v1
Definition margins.hpp:11
The base-line of a widget on which to set the text and graphics.
Definition widget_baseline.hpp:13
Definition widget_constraints.hpp:13
T max(T... args)