Make onChange callbacks more predictable

This commit is contained in:
lampysprites 2021-10-04 12:17:25 +07:00
parent a90853f765
commit bf53fa26cd
2 changed files with 14 additions and 18 deletions

View File

@ -135,18 +135,18 @@ int Site_set_onChange(lua_State* L)
auto site = get_obj<Site>(L, 1);
auto obs = ScriptSiteObserver::instance();
if (lua_isnil(L, 2) && obs->callbackRef()) {
luaL_unref(L, LUA_REGISTRYINDEX, obs->callbackRef());
obs->setCallbackRef(0);
App::instance()->context()->remove_observer(obs);
}
else if (lua_isfunction(L, 2)) {
if (lua_isfunction(L, 2)) {
int onchangeRef = luaL_ref(L, LUA_REGISTRYINDEX);
if (!obs->callbackRef()) {
App::instance()->context()->add_observer(obs);
}
obs->setCallbackRef(onchangeRef);
}
else if (obs->callbackRef()) {
luaL_unref(L, LUA_REGISTRYINDEX, obs->callbackRef());
obs->setCallbackRef(0);
App::instance()->context()->remove_observer(obs);
}
return 0;
}

View File

@ -176,11 +176,6 @@ int Sprite_gc(lua_State* L)
{
auto sprite = get_docobj<Sprite>(L, 1);
auto doc = static_cast<Doc*>(sprite->document());
if (ScriptDocObserver* obs = script_observers[sprite->id()]) {
doc->undoHistory()->remove_observer(obs);
script_observers.erase(sprite->id());
}
return 0;
}
@ -659,13 +654,7 @@ int Sprite_set_onChange(lua_State* L)
auto doc = static_cast<Doc*>(sprite->document());
ScriptDocObserver* obs = script_observers[sprite->id()];
if (lua_isnil(L, 2) && obs) {
doc->undoHistory()->remove_observer(obs);
script_observers.erase(sprite->id());
luaL_unref(L, LUA_REGISTRYINDEX, obs->callbackRef());
delete obs;
}
else if (lua_isfunction(L, 2)) {
if (lua_isfunction(L, 2)) {
int callbackRef = luaL_ref(L, LUA_REGISTRYINDEX);
if (obs) {
obs->setCallbackRef(callbackRef);
@ -676,6 +665,13 @@ int Sprite_set_onChange(lua_State* L)
script_observers[sprite->id()] = obs;
}
}
else if (obs) {
doc->undoHistory()->remove_observer(obs);
script_observers.erase(sprite->id());
luaL_unref(L, LUA_REGISTRYINDEX, obs->callbackRef());
delete obs;
}
return 0;
}