HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
widget_constraints.hpp
Go to the documentation of this file.
1// Copyright Take Vos 2021-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
9#pragma once
10
11#include "../geometry/extent.hpp"
12#include "../geometry/margins.hpp"
13#include "widget_baseline.hpp"
14
15namespace hi { inline namespace v1 {
16
27public:
28 extent2 minimum;
29 extent2 preferred;
30 extent2 maximum;
31 margins margins;
32 widget_baseline baseline;
33
34 constexpr widget_constraints() noexcept : minimum(), preferred(), maximum(), margins(), baseline() {}
35 constexpr widget_constraints(widget_constraints const&) noexcept = default;
36 constexpr widget_constraints(widget_constraints&&) noexcept = default;
37 constexpr widget_constraints& operator=(widget_constraints const&) noexcept = default;
38 constexpr widget_constraints& operator=(widget_constraints&&) noexcept = default;
39 constexpr widget_constraints(
40 extent2 minimum,
41 extent2 preferred,
42 extent2 maximum,
43 hi::margins margins = hi::margins{},
44 widget_baseline baseline = hi::widget_baseline{}) noexcept :
45 minimum(minimum), preferred(preferred), maximum(maximum), margins(margins), baseline(baseline)
46 {
47 hi_axiom(holds_invariant());
48 }
49
50 [[nodiscard]] constexpr bool holds_invariant() noexcept
51 {
52 return minimum <= preferred and preferred <= maximum;
53 }
54
55 [[nodiscard]] friend constexpr widget_constraints operator+(widget_constraints const& lhs, extent2 const& rhs) noexcept
56 {
57 return widget_constraints{lhs.minimum + rhs, lhs.preferred + rhs, lhs.maximum + rhs, lhs.margins, lhs.baseline};
58 }
59
60 [[nodiscard]] friend constexpr bool
61 operator==(widget_constraints const& lhs, widget_constraints const& rhs) noexcept = default;
62
63 [[nodiscard]] friend constexpr widget_constraints max(widget_constraints const& lhs, widget_constraints const& rhs) noexcept
64 {
65 return widget_constraints{
66 max(lhs.minimum, rhs.minimum),
67 max(lhs.preferred, rhs.preferred),
68 max(lhs.maximum, rhs.maximum),
69 max(lhs.margins, rhs.margins),
70 std::max(lhs.baseline, rhs.baseline)};
71 }
72
73 [[nodiscard]] friend constexpr widget_constraints max(widget_constraints const& lhs, extent2 const& rhs) noexcept
74 {
75 return widget_constraints{
76 max(lhs.minimum, rhs), max(lhs.preferred, rhs), max(lhs.maximum, rhs), lhs.margins, lhs.baseline};
77 }
78
79 template<typename... Args>
80 [[nodiscard]] friend constexpr widget_constraints max(widget_constraints const& first, Args const&...args) noexcept
81 requires(sizeof...(Args) >= 2)
82 {
83 return max(first, max(args...));
84 }
85};
86
87}} // namespace hi::v1
#define hi_axiom(expression)
Specify an axiom; an expression that is true.
Definition assert.hpp:133
Defines widget_baseline.
DOXYGEN BUG.
Definition algorithm.hpp:15
The HikoGUI namespace.
Definition ascii.hpp:19
The base-line of a widget on which to set the text and graphics.
Definition widget_baseline.hpp:19
The constraints of a widget.
Definition widget_constraints.hpp:26
T max(T... args)