summaryrefslogtreecommitdiff
path: root/plugins/MirLua/src/m_srmm.cpp
diff options
context:
space:
mode:
authoraunsane <aunsane@gmail.com>2017-09-26 23:32:12 +0300
committeraunsane <aunsane@gmail.com>2017-09-26 23:34:06 +0300
commit2258b1b2cf951347d167d01201f0dc4bbf9a4428 (patch)
tree1632e76ea7b29da80a24a1c204d5fce932ec5e15 /plugins/MirLua/src/m_srmm.cpp
parent8756de2ffe2d86c34c8a37f08d68aeeb51b487c3 (diff)
MirLua: refactoring
- respect metatables in print function - srmm module functions now return metatable - version bump
Diffstat (limited to 'plugins/MirLua/src/m_srmm.cpp')
-rw-r--r--plugins/MirLua/src/m_srmm.cpp141
1 files changed, 111 insertions, 30 deletions
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<BBButton>::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<BBButton>::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<BBButton>(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<CustomButtonClickData>(L, "CustomButtonClickData")
.Field(&CustomButtonClickData::pszModule, "Module", LUA_TSTRINGA)
.Field(&CustomButtonClickData::dwButtonId, "ButtonId", LUA_TINTEGER)