From 2258b1b2cf951347d167d01201f0dc4bbf9a4428 Mon Sep 17 00:00:00 2001 From: aunsane Date: Tue, 26 Sep 2017 23:32:12 +0300 Subject: MirLua: refactoring - respect metatables in print function - srmm module functions now return metatable - version bump --- plugins/MirLua/src/m_srmm.cpp | 141 +++++++++++++++++++++++++++++++++--------- 1 file changed, 111 insertions(+), 30 deletions(-) (limited to 'plugins/MirLua/src/m_srmm.cpp') diff --git a/plugins/MirLua/src/m_srmm.cpp b/plugins/MirLua/src/m_srmm.cpp index a1b7240cec..c28f2de4ce 100644 --- a/plugins/MirLua/src/m_srmm.cpp +++ b/plugins/MirLua/src/m_srmm.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" +#define MT_BBBUTTON "BBButton" + static void MakeBBButton(lua_State *L, BBButton &bbb) { bbb.dwDefPos = 100; @@ -29,56 +31,114 @@ static void MakeBBButton(lua_State *L, BBButton &bbb) lua_pop(L, 1); } +/***********************************************/ + static int lua_AddButton(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); - BBButton bbb; - MakeBBButton(L, bbb); + BBButton *bbb = (BBButton*)mir_calloc(sizeof(BBButton)); + MakeBBButton(L, *bbb); int hScriptLangpack = CMLuaScript::GetScriptIdFromEnviroment(L); - - INT_PTR res = Srmm_AddButton(&bbb, hScriptLangpack); - lua_pushboolean(L, res == 0); - - mir_free((void*)bbb.pszModuleName); - mir_free((void*)bbb.pwszText); - mir_free((void*)bbb.pwszTooltip); + if (Srmm_AddButton(bbb, hScriptLangpack)) + { + lua_pushnil(L); + return 1; + } + + MT::Apply(L, bbb); return 1; } static int lua_ModifyButton(lua_State *L) { - if (lua_type(L, 1) != LUA_TTABLE) + switch (lua_type(L, 1)) { - lua_pushlightuserdata(L, 0); - return 1; + case LUA_TTABLE: + { + BBButton bbb; + MakeBBButton(L, bbb); + INT_PTR res = Srmm_ModifyButton(&bbb); + mir_free((void*)bbb.pszModuleName); + mir_free((void*)bbb.pwszText); + mir_free((void*)bbb.pwszTooltip); + lua_pushboolean(L, !res); + break; + } + case LUA_TUSERDATA: + { + BBButton *bbb = *(BBButton**)luaL_checkudata(L, 1, MT_BBBUTTON); + luaL_checktype(L, 2, LUA_TTABLE); + { + if (lua_getfield(L, -1, "Text")) + { + mir_free((void*)bbb->pwszText); + bbb->pwszText = mir_utf8decodeW(lua_tostring(L, -1)); + } + lua_pop(L, 1); + + if (lua_getfield(L, -1, "Tooltip")) + { + mir_free((void*)bbb->pwszTooltip); + bbb->pwszTooltip = mir_utf8decodeW(lua_tostring(L, -1)); + } + lua_pop(L, 1); + + if (lua_getfield(L, -1, "Flags")) + bbb->bbbFlags = luaL_optinteger(L, -1, BBBF_ISIMBUTTON); + lua_pop(L, 1); + + if (lua_getfield(L, -1, "Icon")) + bbb->hIcon = (HANDLE)lua_touserdata(L, -1); + lua_pop(L, 1); + } + INT_PTR res = Srmm_ModifyButton(bbb); + lua_pushvalue(L, 1); + break; + } + default: + luaL_argerror(L, 1, luaL_typename(L, 1)); } - - BBButton bbb; - MakeBBButton(L, bbb); - - INT_PTR res = Srmm_ModifyButton(&bbb); - lua_pushinteger(L, res); - - mir_free((void*)bbb.pszModuleName); - mir_free((void*)bbb.pwszText); - mir_free((void*)bbb.pwszTooltip); return 1; } static int lua_RemoveButton(lua_State *L) { - ptrA szModuleName(mir_utf8decodeA(luaL_checkstring(L, 1))); - - BBButton mbb = {}; - mbb.pszModuleName = szModuleName; - mbb.dwButtonID = luaL_checkinteger(L, 2); - - INT_PTR res = Srmm_RemoveButton(&mbb); - lua_pushinteger(L, res); + switch (lua_type(L, 1)) + { + case LUA_TSTRING: + { + BBButton bbb; + bbb.pszModuleName = mir_utf8decodeA(lua_tostring(L, 1)); + bbb.dwButtonID = luaL_checkinteger(L, 2); + INT_PTR res = Srmm_RemoveButton(&bbb); + mir_free((void*)bbb.pszModuleName); + lua_pushboolean(L, !res); + break; + } + case LUA_TTABLE: + { + BBButton bbb; + bbb.pszModuleName = mir_utf8decodeA(luaL_checkstring(L, 1)); + bbb.dwButtonID = luaL_checkinteger(L, 2); + INT_PTR res = Srmm_RemoveButton(&bbb); + mir_free((void*)bbb.pszModuleName); + lua_pushboolean(L, !res); + break; + } + case LUA_TUSERDATA: + { + BBButton *bbb = *(BBButton**)luaL_checkudata(L, 1, MT_BBBUTTON); + INT_PTR res = Srmm_RemoveButton(bbb); + lua_pushboolean(L, !res); + break; + } + default: + luaL_argerror(L, 1, luaL_typename(L, 1)); + } return 1; } @@ -94,10 +154,31 @@ static luaL_Reg srmmApi[] = /***********************************************/ +template <> +void MT::Free(lua_State*, BBButton **bbb) +{ + mir_free((void*)(*bbb)->pszModuleName); + mir_free((void*)(*bbb)->pwszText); + mir_free((void*)(*bbb)->pwszTooltip); + mir_free(*bbb); +} + +/***********************************************/ + LUAMOD_API int luaopen_m_srmm(lua_State *L) { luaL_newlib(L, srmmApi); + MT(L, MT_BBBUTTON) + .Field(&BBButton::pszModuleName, "Module", LUA_TSTRINGA) + .Field(&BBButton::dwButtonID, "ButtonId", LUA_TINTEGER) + .Field(&BBButton::pwszText, "Text", LUA_TSTRINGW) + .Field(&BBButton::pwszTooltip, "Tooltip", LUA_TSTRINGW) + .Field(&BBButton::bbbFlags, "Flags", LUA_TINTEGER) + .Field(&BBButton::hIcon, "Icon", LUA_TLIGHTUSERDATA) + .Field(lua_ModifyButton, "Modify") + .Field(lua_RemoveButton, "Remove"); + MT(L, "CustomButtonClickData") .Field(&CustomButtonClickData::pszModule, "Module", LUA_TSTRINGA) .Field(&CustomButtonClickData::dwButtonId, "ButtonId", LUA_TINTEGER) -- cgit v1.2.3