From 03b3b8ae80559745f98ef94569b421adddeb441f Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 25 Mar 2019 23:46:59 +0800 Subject: *misc --- source/tests/02-luax/main.cpp | 67 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) (limited to 'source/tests/02-luax/main.cpp') diff --git a/source/tests/02-luax/main.cpp b/source/tests/02-luax/main.cpp index cd718ac..ebb9df8 100644 --- a/source/tests/02-luax/main.cpp +++ b/source/tests/02-luax/main.cpp @@ -140,7 +140,7 @@ int Boy::l_Speak(lua_State* L) LUAX_STATE(L); Boy* self = state.CheckUserdata(1); - self->PushMemberRef(state, self->mCallbak); + self->PushLuaxMemberRef(state, self->mCallbak); state.Call(0, 1); return 1; } @@ -150,7 +150,7 @@ int Boy::l_Write(lua_State* L) LUAX_STATE(L); // self, func Boy* self = state.CheckUserdata(1); - self->SetMemberRef(state, self->mCallbak, 2); + self->SetLuaxMemberRef(state, self->mCallbak, 2); return 0; } @@ -187,9 +187,70 @@ void Boy::RegisterLuaxPostprocess(LuaxState& state) } //---------------------------------------------------------------------------------------------------------------- +/// +/// 响应signal的闭包 +/// +class Slot +{ +public: + Slot(LuaxState& state, Boy* widget, int refID) + : mState(state) + , mRefID(refID) + , mWidget(widget) + { + } + + void operator()() + { + ASSERT(mState); + ASSERT(mWidget); + + mWidget->PushLuaxMemberRef(mState, mRefID); + if (lua_isfunction(mState, -1)) // callback + { + mState.Call(0, 0); + } + } -class Girl : public LuaxNativeClass +private: + LuaxState & mState; // + Boy* mWidget; // 响应的控件 + int mRefID; // 控件 + +}; +/// +/// 控件事件 +/// +class Signal { +public: + Signal(); + + /// + /// Fire将事件发给connect的监听者,触发(调用)connect的函数。 + /// + void operator()() + { + for (auto callback : mCallbacks) + callback(); + } + + /// + /// 注册回调函数。 + /// + void Connect(const Slot& callback) + { + mCallbacks.push_back(callback); + } + + /// + /// + /// + void Disconnect(); + +private: + std::vector mCallbacks; // 监听函数 + }; //---------------------------------------------------------------------------------------------------------------- -- cgit v1.1-26-g67d0