1.10
value.h
1/*
2 * Copyright (C) 2018 Microchip Technology Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6#ifndef EGT_VALUE_H
7#define EGT_VALUE_H
8
9#include <cassert>
10#include <egt/animation.h>
11#include <egt/detail/math.h>
12#include <egt/object.h>
13#include <egt/signal.h>
14
15namespace egt
16{
17inline namespace v1
18{
19
23template<class T>
24class Value : public Object
25{
26public:
27
39 explicit Value(T value = {}) noexcept
40 : m_value(value)
41 {
42 }
43
45 explicit operator T() const
46 {
47 return m_value;
48 }
49
52 {
53 value(value);
54 return *this;
55 }
56
58 T value() const { return m_value; }
59
66 bool value(T value)
67 {
68 if (detail::change_if_diff<T>(m_value, value))
69 {
71 return true;
72 }
73
74 return false;
75 }
76
77protected:
78
81};
82
86template<class T>
87class RangeValue : public Object
88{
89public:
90
104 RangeValue(T start, T end, T value = {}) noexcept
105 : m_start(start),
106 m_end(end)
107 {
108 if (m_start < m_end)
109 value = detail::clamp<T>(value, m_start, m_end);
110 else
111 value = detail::clamp<T>(value, m_end, m_start);
112
113 m_value = value;
114 }
115
117 explicit operator T() const
118 {
119 return m_value;
120 }
121
124 {
125 value(value);
126 return *this;
127 }
128
130 EGT_NODISCARD T value() const { return m_value; }
131
141 bool value(T value)
142 {
143 if (m_start < m_end)
144 value = detail::clamp<T>(value, m_start, m_end);
145 else
146 value = detail::clamp<T>(value, m_end, m_start);
147
148 if (detail::change_if_diff<T>(m_value, value))
149 {
151 return true;
152 }
153
154 return false;
155 }
156
158 EGT_NODISCARD T start() const { return m_start; }
159
165 void start(T start)
166 {
167 if (detail::change_if_diff<>(m_start, start))
168 value(m_value);
169 }
170
172 EGT_NODISCARD T end() const { return m_end; }
173
179 void end(T end)
180 {
181 if (detail::change_if_diff<>(m_end, end))
182 value(m_value);
183 }
184
185protected:
186
189
191 T m_end{};
192
195};
196
197}
198}
199
200#endif
Base object class with fundamental properties.
Definition object.h:32
Manages a value in a range.
Definition value.h:88
void start(T start)
Set the start value.
Definition value.h:165
T m_start
The start value.
Definition value.h:188
EGT_NODISCARD T start() const
Get the start value.
Definition value.h:158
EGT_NODISCARD T end() const
Get the end value.
Definition value.h:172
RangeValue(T start, T end, T value={}) noexcept
Definition value.h:104
Signal on_value_changed
Event signal.
Definition value.h:96
RangeValue< T > & operator=(T value)
Assign the current value.
Definition value.h:123
EGT_NODISCARD T value() const
Get the current value.
Definition value.h:130
void end(T end)
Set the end value.
Definition value.h:179
bool value(T value)
Set value.
Definition value.h:141
T m_end
The end value.
Definition value.h:191
T m_value
The current value.
Definition value.h:194
Signal class used for defining a signal and dispatching events.
Definition signal.h:30
void invoke(Args... args)
Invoke all handlers with the specified args.
Definition signal.h:85
Manages a single value.
Definition value.h:25
Value(T value={}) noexcept
Definition value.h:39
Value< T > & operator=(T value)
Assign new value.
Definition value.h:51
Signal on_value_changed
Event signal.
Definition value.h:33
T value() const
Get the current value.
Definition value.h:58
bool value(T value)
Set value.
Definition value.h:66
T m_value
The current value.
Definition value.h:80
EGT framework namespace.
Definition animation.h:24