mirror of
https://github.com/slint-ui/slint.git
synced 2025-08-04 02:39:28 +00:00
C++ ChangeTracker implementation
This commit is contained in:
parent
cadcd4caf4
commit
80f37a3acf
5 changed files with 179 additions and 19 deletions
|
@ -7,6 +7,10 @@
|
|||
|
||||
namespace slint::cbindgen_private {
|
||||
struct PropertyAnimation;
|
||||
struct ChangeTracker
|
||||
{
|
||||
void *inner;
|
||||
};
|
||||
}
|
||||
|
||||
#include "slint_properties_internal.h"
|
||||
|
@ -293,4 +297,41 @@ private:
|
|||
cbindgen_private::PropertyTrackerOpaque inner;
|
||||
};
|
||||
|
||||
struct ChangeTracker
|
||||
{
|
||||
ChangeTracker() { cbindgen_private::slint_change_tracker_construct(&inner); }
|
||||
~ChangeTracker() { cbindgen_private::slint_change_tracker_drop(&inner); }
|
||||
|
||||
template<typename Data, typename FnEval, typename FnNotify>
|
||||
void init(Data data, FnEval fn_eval, FnNotify fn_notify)
|
||||
{
|
||||
using Value = std::invoke_result_t<FnEval, Data>;
|
||||
struct Inner
|
||||
{
|
||||
Data data;
|
||||
FnEval fn_eval;
|
||||
FnNotify fn_notify;
|
||||
Value value;
|
||||
};
|
||||
auto data_ptr =
|
||||
new Inner { std::move(data), std::move(fn_eval), std::move(fn_notify), Value() };
|
||||
cbindgen_private::slint_change_tracker_init(
|
||||
&inner, data_ptr, [](void *d) { delete reinterpret_cast<Inner *>(d); },
|
||||
[](void *d) {
|
||||
auto inner = reinterpret_cast<Inner *>(d);
|
||||
auto v = inner->fn_eval(inner->data);
|
||||
bool r = v != inner->value;
|
||||
inner->value = v;
|
||||
return r;
|
||||
},
|
||||
[](void *d) {
|
||||
auto inner = reinterpret_cast<Inner *>(d);
|
||||
inner->fn_notify(inner->data, inner->value);
|
||||
});
|
||||
}
|
||||
|
||||
private:
|
||||
cbindgen_private::ChangeTracker inner;
|
||||
};
|
||||
|
||||
} // namespace slint::private_api
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue