cheat-engine/Cheat Engine/LuaMenu.pas
2014-02-24 11:59:59 +00:00

332 lines
9.0 KiB
ObjectPascal

unit LuaMenu;
{$mode delphi}
interface
uses
Classes, SysUtils,lua, lualib, lauxlib, LuaHandler,menus, LCLProc;
procedure initializeLuaMenu;
implementation
uses LuaCaller, LuaClass, LuaComponent;
function menu_getItems(L: PLua_State): integer; cdecl;
var
menu: TMenu;
begin
menu:=luaclass_getClassObject(L);
luaclass_newClass(L, menu.Items);
result:=1;
end;
function createMainMenu(L: Plua_State): integer; cdecl;
var parameters: integer;
f: TComponent;
m: TMainMenu;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=1 then
begin
f:=lua_ToCEUserData(L, 1);
m:=TMainMenu.Create(f);
luaclass_newClass(L, m);
result:=1;
end else lua_pop(L, lua_gettop(L));
end;
function createPopupMenu(L: Plua_State): integer; cdecl;
var parameters: integer;
f: TComponent;
m: TPopupMenu;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=1 then
begin
f:=lua_ToCEUserData(L, -1);
lua_pop(L, lua_gettop(L));
m:=TPopupMenu.Create(f);
luaclass_newClass(L, m);
result:=1;
end else lua_pop(L, lua_gettop(L));
end;
function createMenuItem(L: Plua_State): integer; cdecl;
var parameters: integer;
o: TMenu;
mi: TMenuitem;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=1 then
begin
o:=lua_ToCEUserData(L, -1);
lua_pop(L, lua_gettop(L));
mi:=TMenuItem.Create(o);
luaclass_newClass(L, mi);
result:=1;
end else lua_pop(L, lua_gettop(L));
end;
function menuItem_getCaption(L: PLua_State): integer; cdecl;
var
menuItem: TmenuItem;
begin
menuitem:=luaclass_getClassObject(L);
lua_pushstring(L, menuItem.Caption);
result:=1;
end;
function menuItem_setCaption(L: PLua_State): integer; cdecl;
var
parameters: integer;
menuItem: TmenuItem;
Caption: string;
begin
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
Caption:=Lua_ToString(L, -1);
menuItem.Caption:=Caption;
end;
result:=0;
end;
function menuItem_getShortcut(L: PLua_State): integer; cdecl;
var
menuItem: TmenuItem;
begin
menuitem:=luaclass_getClassObject(L);
lua_pushstring(L, ShortCutToText(menuItem.Shortcut));
result:=1;
end;
function menuItem_setShortcut(L: PLua_State): integer; cdecl;
var
parameters: integer;
menuItem: TmenuItem;
Shortcut: string;
begin
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
Shortcut:=Lua_ToString(L, -1);
menuItem.Shortcut:=TextToShortCut(shortcut);
end;
result:=0;
end;
function menuItem_getCount(L: PLua_State): integer; cdecl;
var
menuItem: TmenuItem;
begin
menuitem:=luaclass_getClassObject(L);
lua_pushinteger(L, menuItem.Count);
result:=1;
end;
function menuItem_getParent(L: PLua_State): integer; cdecl;
var
menuItem: TmenuItem;
begin
menuitem:=luaclass_getClassObject(L);
luaclass_newClass(L, menuItem.Parent);
result:=1;
end;
function menuItem_getMenu(L: PLua_State): integer; cdecl;
var
menuItem: TmenuItem;
begin
menuitem:=luaclass_getClassObject(L);
luaclass_newClass(L, menuItem.Menu);
result:=1;
end;
function menuItem_getItem(L: PLua_State): integer; cdecl;
var
menuitem: TMenuItem;
index: integer;
begin
result:=0;
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
index:=lua_toInteger(L,-1);
luaclass_newClass(L, menuitem.Items[index]);
result:=1;
end;
end;
function menuItem_add(L: PLua_State): integer; cdecl;
var
menuitem, menuitem2: TMenuItem;
begin
result:=0;
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
menuitem2:=lua_toceuserdata(L,-1);
menuitem.Add(menuitem2);
end;
end;
function menuItem_insert(L: PLua_State): integer; cdecl;
var
parameters: integer;
menuitem, menuitem2: TMenuItem;
index: integer;
begin
result:=0;
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=2 then
begin
index:=lua_tointeger(L, -2);
menuitem2:=lua_ToCEUserData(L,-1);
menuitem.Insert(index, menuitem2);
end;
end;
function menuItem_delete(L: PLua_State): integer; cdecl;
var
parameters: integer;
menuitem: TMenuItem;
index: integer;
begin
result:=0;
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
index:=lua_toInteger(L,-1);
menuitem.Delete(index);
end;
end;
function menuitem_getOnClick(L: PLua_State): integer; cdecl;
var
c: Tmenuitem;
begin
c:=luaclass_getClassObject(L);
LuaCaller_pushMethodProperty(L, TMethod(c.OnClick), 'TNotifyEvent');
result:=1;
end;
function menuitem_setOnClick(L: PLua_State): integer; cdecl; //for some reason the menuitem has it's own fonclick variable
var
control: Tmenuitem;
f: integer;
routine: string;
lc: TLuaCaller;
begin
result:=0;
control:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
CleanupLuaCall(tmethod(control.onClick));
control.onClick:=nil;
if lua_isfunction(L,-1) then
begin
routine:=Lua_ToString(L,-1);
f:=luaL_ref(L,LUA_REGISTRYINDEX);
lc:=TLuaCaller.create;
lc.luaroutineIndex:=f;
control.OnClick:=lc.NotifyEvent;
end
else
if lua_isstring(L,-1) then
begin
routine:=lua_tostring(L,-1);
lc:=TLuaCaller.create;
lc.luaroutine:=routine;
control.OnClick:=lc.NotifyEvent;
end;
end;
end;
function menuItem_doClick(L: PLua_State): integer; cdecl;
var
mi: TMenuItem;
begin
result:=0;
mi:=luaclass_getClassObject(L);
if assigned(mi.onclick) then
mi.OnClick(mi);
end;
procedure menu_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
begin
component_addMetaData(L, metatable, userdata);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getItems', menu_getItems);
luaclass_addPropertyToTable(L, metatable, userdata, 'Items', menu_getItems, nil);
end;
procedure menuitem_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
begin
component_addMetaData(L, metatable, userdata);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getCaption', menuItem_getCaption);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setCaption', menuItem_setCaption);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getShortcut', menuItem_getShortcut);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setShortcut', menuItem_setShortcut);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getCount', menuItem_getCount);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getItem', menuItem_getItem);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'add', menuItem_add);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'insert', menuItem_insert);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'delete', menuItem_delete);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setOnClick', menuItem_setOnClick);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getOnClick', menuItem_getOnClick);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'doClick', menuItem_doClick);
luaclass_addPropertyToTable(L, metatable, userdata, 'Caption', menuItem_getCaption, menuItem_setCaption);
luaclass_addPropertyToTable(L, metatable, userdata, 'Shortcut', menuItem_getShortcut, menuItem_setShortcut);
luaclass_addPropertyToTable(L, metatable, userdata, 'Parent', menuItem_getParent, nil);
luaclass_addPropertyToTable(L, metatable, userdata, 'Menu', menuItem_getMenu, nil);
luaclass_addPropertyToTable(L, metatable, userdata, 'Count', menuItem_getCount, nil);
luaclass_addArrayPropertyToTable(L, metatable, userdata, 'Item', menuItem_getItem);
luaclass_setDefaultArrayProperty(L, metatable, userdata, menuItem_getItem, nil);
luaclass_addPropertyToTable(L, metatable, userdata, 'OnClick', menuItem_getOnClick, menuItem_setOnClick);
end;
procedure initializeLuaMenu;
begin
lua_register(LuaVM, 'menu_getItems', menu_getItems);
lua_register(LuaVM, 'createMainMenu', createMainMenu);
lua_register(LuaVM, 'createPopupMenu', createPopupMenu);
lua_register(LuaVM, 'createMenuItem', createMenuItem);
lua_register(LuaVM, 'menuItem_getCaption', menuItem_getCaption);
lua_register(LuaVM, 'menuItem_setCaption', menuItem_setCaption);
lua_register(LuaVM, 'menuItem_getShortcut', menuItem_getShortcut);
lua_register(LuaVM, 'menuItem_setShortcut', menuItem_setShortcut);
lua_register(LuaVM, 'menuItem_getCount', menuItem_getCount);
lua_register(LuaVM, 'menuItem_getItem', menuItem_getItem);
lua_register(LuaVM, 'menuItem_add', menuItem_add);
lua_register(LuaVM, 'menuItem_insert', menuItem_insert);
lua_register(LuaVM, 'menuItem_delete', menuItem_delete);
lua_register(LuaVM, 'menuItem_onClick', menuItem_setOnClick);
lua_register(LuaVM, 'menuItem_doClick', menuItem_doClick);
end;
initialization
luaclass_register(TMenu, Menu_addMetaData);
luaclass_register(TMenuItem, MenuItem_addMetaData);
end.