slint/api/sixtyfps-cpp/include/sixtyfps_signals.h
Olivier Goffart 5f38f03a1b Test setting signal handler and a few fix to make it work
We were not parsing CodeBlock node from the signal handler correctly,
we wer eonly taking the first expression instead of the whole codeblock

In JS, emitting signal before the show() did not update the GLOBAL_CONTEXT
needed to emit signals defined in JS
2020-08-03 15:01:10 +02:00

35 lines
878 B
C++

#pragma once
#include <string_view>
#include "sixtyfps_properties_internal.h"
namespace sixtyfps {
// template<typename... Args>
struct Signal
{
Signal() { internal::sixtyfps_signal_init(&inner); }
~Signal() { internal::sixtyfps_signal_drop(&inner); }
Signal(const Signal &) = delete;
Signal(Signal &&) = delete;
Signal &operator=(const Signal &) = delete;
template<typename F>
void set_handler(F binding)
{
internal::sixtyfps_signal_set_handler(
&inner,
[](void *user_data) {
(*reinterpret_cast<F *>(user_data))();
},
new F(std::move(binding)), [](void *user_data) { delete reinterpret_cast<F *>(user_data); });
}
void emit() const
{
internal::sixtyfps_signal_emit(&inner);
}
private:
internal::SignalOpaque inner;
};
}