add a variable value change trigger callback
parent
bab8633a05
commit
529e34d268
|
@ -261,7 +261,9 @@ protected:
|
||||||
|
|
||||||
struct LIBCUBESCRIPT_EXPORT integer_var: global_var {
|
struct LIBCUBESCRIPT_EXPORT integer_var: global_var {
|
||||||
integer_type get_value() const;
|
integer_type get_value() const;
|
||||||
void set_value(state &cs, integer_type val, bool do_write = true);
|
void set_value(
|
||||||
|
state &cs, integer_type val, bool do_write = true, bool trigger = true
|
||||||
|
);
|
||||||
void set_raw_value(integer_type val);
|
void set_raw_value(integer_type val);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -270,7 +272,9 @@ protected:
|
||||||
|
|
||||||
struct LIBCUBESCRIPT_EXPORT float_var: global_var {
|
struct LIBCUBESCRIPT_EXPORT float_var: global_var {
|
||||||
float_type get_value() const;
|
float_type get_value() const;
|
||||||
void set_value(state &cs, float_type val, bool do_write = true);
|
void set_value(
|
||||||
|
state &cs, float_type val, bool do_write = true, bool trigger = true
|
||||||
|
);
|
||||||
void set_raw_value(float_type val);
|
void set_raw_value(float_type val);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -279,7 +283,9 @@ protected:
|
||||||
|
|
||||||
struct LIBCUBESCRIPT_EXPORT string_var: global_var {
|
struct LIBCUBESCRIPT_EXPORT string_var: global_var {
|
||||||
string_ref get_value() const;
|
string_ref get_value() const;
|
||||||
void set_value(state &cs, string_ref val, bool do_write = true);
|
void set_value(
|
||||||
|
state &cs, string_ref val, bool do_write = true, bool trigger = true
|
||||||
|
);
|
||||||
void set_raw_value(string_ref val);
|
void set_raw_value(string_ref val);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -366,6 +372,7 @@ struct LIBCUBESCRIPT_EXPORT state {
|
||||||
var_type vtp = var_type::DEFAULT
|
var_type vtp = var_type::DEFAULT
|
||||||
);
|
);
|
||||||
void reset_var(std::string_view name);
|
void reset_var(std::string_view name);
|
||||||
|
void touch_var(std::string_view name);
|
||||||
|
|
||||||
template<typename F>
|
template<typename F>
|
||||||
command *new_command(
|
command *new_command(
|
||||||
|
|
|
@ -82,6 +82,17 @@ command_impl::command_impl(
|
||||||
p_cargs{args}, p_cb_cftv{std::move(f)}, p_numargs{nargs}
|
p_cargs{args}, p_cb_cftv{std::move(f)}, p_numargs{nargs}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
void var_changed(thread_state &ts, ident *id) {
|
||||||
|
auto *cid = ts.pstate->get_ident("//var_changed");
|
||||||
|
if (!cid || !cid->is_command()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto *cimp = static_cast<command_impl *>(cid);
|
||||||
|
any_value val{*ts.pstate};
|
||||||
|
val.set_ident(id);
|
||||||
|
cimp->call(*ts.pstate, std::span<any_value>{&val, 1}, val);
|
||||||
|
}
|
||||||
|
|
||||||
void ivar_impl::save_val() {
|
void ivar_impl::save_val() {
|
||||||
p_override = p_storage;
|
p_override = p_storage;
|
||||||
}
|
}
|
||||||
|
@ -351,7 +362,7 @@ LIBCUBESCRIPT_EXPORT integer_type integer_var::get_value() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT void integer_var::set_value(
|
LIBCUBESCRIPT_EXPORT void integer_var::set_value(
|
||||||
state &cs, integer_type val, bool do_write
|
state &cs, integer_type val, bool do_write, bool trigger
|
||||||
) {
|
) {
|
||||||
if (is_read_only()) {
|
if (is_read_only()) {
|
||||||
throw error{
|
throw error{
|
||||||
|
@ -363,6 +374,9 @@ LIBCUBESCRIPT_EXPORT void integer_var::set_value(
|
||||||
}
|
}
|
||||||
save(cs);
|
save(cs);
|
||||||
set_raw_value(val);
|
set_raw_value(val);
|
||||||
|
if (trigger) {
|
||||||
|
var_changed(*cs.thread_pointer(), this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT void integer_var::set_raw_value(integer_type val) {
|
LIBCUBESCRIPT_EXPORT void integer_var::set_raw_value(integer_type val) {
|
||||||
|
@ -374,7 +388,7 @@ LIBCUBESCRIPT_EXPORT float_type float_var::get_value() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT void float_var::set_value(
|
LIBCUBESCRIPT_EXPORT void float_var::set_value(
|
||||||
state &cs, float_type val, bool do_write
|
state &cs, float_type val, bool do_write, bool trigger
|
||||||
) {
|
) {
|
||||||
if (is_read_only()) {
|
if (is_read_only()) {
|
||||||
throw error{
|
throw error{
|
||||||
|
@ -386,6 +400,9 @@ LIBCUBESCRIPT_EXPORT void float_var::set_value(
|
||||||
}
|
}
|
||||||
save(cs);
|
save(cs);
|
||||||
set_raw_value(val);
|
set_raw_value(val);
|
||||||
|
if (trigger) {
|
||||||
|
var_changed(*cs.thread_pointer(), this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT void float_var::set_raw_value(float_type val) {
|
LIBCUBESCRIPT_EXPORT void float_var::set_raw_value(float_type val) {
|
||||||
|
@ -397,7 +414,7 @@ LIBCUBESCRIPT_EXPORT string_ref string_var::get_value() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT void string_var::set_value(
|
LIBCUBESCRIPT_EXPORT void string_var::set_value(
|
||||||
state &cs, string_ref val, bool do_write
|
state &cs, string_ref val, bool do_write, bool trigger
|
||||||
) {
|
) {
|
||||||
if (is_read_only()) {
|
if (is_read_only()) {
|
||||||
throw error{
|
throw error{
|
||||||
|
@ -409,6 +426,9 @@ LIBCUBESCRIPT_EXPORT void string_var::set_value(
|
||||||
}
|
}
|
||||||
save(cs);
|
save(cs);
|
||||||
set_raw_value(std::move(val));
|
set_raw_value(std::move(val));
|
||||||
|
if (trigger) {
|
||||||
|
var_changed(*cs.thread_pointer(), this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT void string_var::set_raw_value(string_ref val) {
|
LIBCUBESCRIPT_EXPORT void string_var::set_raw_value(string_ref val) {
|
||||||
|
|
|
@ -77,8 +77,12 @@ struct var_impl: ident_impl {
|
||||||
var_impl(ident_type tp, string_ref name, int flags);
|
var_impl(ident_type tp, string_ref name, int flags);
|
||||||
|
|
||||||
virtual void save_val() = 0;
|
virtual void save_val() = 0;
|
||||||
|
|
||||||
|
void changed(thread_state &ts);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void var_changed(thread_state &ts, ident *id);
|
||||||
|
|
||||||
struct ivar_impl: var_impl, integer_var {
|
struct ivar_impl: var_impl, integer_var {
|
||||||
ivar_impl(string_ref n, integer_type v, int flags);
|
ivar_impl(string_ref n, integer_type v, int flags);
|
||||||
|
|
||||||
|
|
|
@ -303,7 +303,7 @@ LIBCUBESCRIPT_EXPORT void state::clear_override(ident &id) {
|
||||||
case ident_type::IVAR: {
|
case ident_type::IVAR: {
|
||||||
ivar_impl &iv = static_cast<ivar_impl &>(id);
|
ivar_impl &iv = static_cast<ivar_impl &>(id);
|
||||||
iv.set_raw_value(iv.p_override);
|
iv.set_raw_value(iv.p_override);
|
||||||
//iv.changed(*this);
|
var_changed(*p_tstate, &id);
|
||||||
static_cast<ivar_impl *>(
|
static_cast<ivar_impl *>(
|
||||||
static_cast<integer_var *>(&iv)
|
static_cast<integer_var *>(&iv)
|
||||||
)->p_flags &= ~IDENT_FLAG_OVERRIDDEN;
|
)->p_flags &= ~IDENT_FLAG_OVERRIDDEN;
|
||||||
|
@ -312,7 +312,7 @@ LIBCUBESCRIPT_EXPORT void state::clear_override(ident &id) {
|
||||||
case ident_type::FVAR: {
|
case ident_type::FVAR: {
|
||||||
fvar_impl &fv = static_cast<fvar_impl &>(id);
|
fvar_impl &fv = static_cast<fvar_impl &>(id);
|
||||||
fv.set_raw_value(fv.p_override);
|
fv.set_raw_value(fv.p_override);
|
||||||
//fv.changed(*this);
|
var_changed(*p_tstate, &id);
|
||||||
static_cast<fvar_impl *>(
|
static_cast<fvar_impl *>(
|
||||||
static_cast<float_var *>(&fv)
|
static_cast<float_var *>(&fv)
|
||||||
)->p_flags &= ~IDENT_FLAG_OVERRIDDEN;
|
)->p_flags &= ~IDENT_FLAG_OVERRIDDEN;
|
||||||
|
@ -321,7 +321,7 @@ LIBCUBESCRIPT_EXPORT void state::clear_override(ident &id) {
|
||||||
case ident_type::SVAR: {
|
case ident_type::SVAR: {
|
||||||
svar_impl &sv = static_cast<svar_impl &>(id);
|
svar_impl &sv = static_cast<svar_impl &>(id);
|
||||||
sv.set_raw_value(sv.p_override);
|
sv.set_raw_value(sv.p_override);
|
||||||
//sv.changed(*this);
|
var_changed(*p_tstate, &id);
|
||||||
static_cast<svar_impl *>(
|
static_cast<svar_impl *>(
|
||||||
static_cast<string_var *>(&sv)
|
static_cast<string_var *>(&sv)
|
||||||
)->p_flags &= ~IDENT_FLAG_OVERRIDDEN;
|
)->p_flags &= ~IDENT_FLAG_OVERRIDDEN;
|
||||||
|
@ -401,6 +401,13 @@ LIBCUBESCRIPT_EXPORT void state::reset_var(std::string_view name) {
|
||||||
clear_override(*id);
|
clear_override(*id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LIBCUBESCRIPT_EXPORT void state::touch_var(std::string_view name) {
|
||||||
|
ident *id = get_ident(name);
|
||||||
|
if (id && id->is_var()) {
|
||||||
|
var_changed(*p_tstate, id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT void state::set_alias(
|
LIBCUBESCRIPT_EXPORT void state::set_alias(
|
||||||
std::string_view name, any_value v
|
std::string_view name, any_value v
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -380,6 +380,12 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
gcs.new_command("//var_changed", "$", [](auto &, auto args, auto &) {
|
||||||
|
std::printf(
|
||||||
|
"changed var trigger: %s\n", args[0].get_ident()->get_name().data()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
gcs.new_command("exec", "s", [](auto &css, auto args, auto &) {
|
gcs.new_command("exec", "s", [](auto &css, auto args, auto &) {
|
||||||
auto file = args[0].get_str();
|
auto file = args[0].get_str();
|
||||||
cs::any_value val{css};
|
cs::any_value val{css};
|
||||||
|
|
Loading…
Reference in New Issue