From 0ed4d6db1d42c52ab01832132fe08d9fc09b7536 Mon Sep 17 00:00:00 2001 From: Petr G Date: Sat, 11 Jun 2016 05:32:24 +0300 Subject: [PATCH] Bugfix after meatatable name changed --- README.md | 2 ++ ViragDevTool.lua | 66 ++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index abc7750..598cf6b 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,8 @@ http://mods.curse.com/addons/wow/varrendevtool > Inspired by Rover addon from Wildstar > http://mods.curse.com/ws-addons/wildstar/220043-rover +ViragDevTool is Rover for WoW + [demo]: http://legacy.curseforge.com/media/images/89/812/1844ef88f22d780658b2150f0cc20c19.png "Logo Title Text 2" [GDemo]: http://i.gyazo.com/e0287b175965c790b229e4b99418203d.png [eventsDemo]: https://i.gyazo.com/1093752a1a066e7143b8cfcf1926d8da.png diff --git a/ViragDevTool.lua b/ViragDevTool.lua index 583ddbc..319618d 100644 --- a/ViragDevTool.lua +++ b/ViragDevTool.lua @@ -8,6 +8,8 @@ HybridScrollFrame_CreateButtons, HybridScrollFrame_GetOffset, HybridScrollFrame_ ViragDevTool = { --static constant useed for metatable name METATABLE_NAME = "$metatable", + METATABLE_NAME2 = "$metatable.__index", + ADDON_NAME = "ViragDevTool", -- you can use /vdt find somestr parentname(can be in format _G.Frame.Button) @@ -99,6 +101,7 @@ ViragDevTool = { end }, + -- stores arguments for fcunction calls --todo implement tArgs = {}, @@ -127,13 +130,17 @@ ViragDevTool = { "startswith Virag", "ViragDevTool.settings.history", }, - logs = {--{ + logs = { + --{ -- fnName = "functionNameHere", -- parentTableName = "ViragDevTool.sometable", -- active = false --}, }, + -- this table is for storing arguments if we want to call function with some + + -- events to monitor -- format ({event = "EVENT_NAME", unit = "player", active = true}, ...) -- default events inactive @@ -372,6 +379,8 @@ function ViragDevTool:ClearData() self:UpdateMainTableUI() end + + function ViragDevTool:ExpandCell(info) local nodeList = {} @@ -413,13 +422,16 @@ end function ViragDevTool:NewMetatableNode(mt, padding, info) if mt then if self:tablelength(mt) == 1 and mt.__index then - return self.list:NewNode(mt.__index, self.METATABLE_NAME .. ".__index", padding, info) + return self.list:NewNode(mt.__index, self.METATABLE_NAME2, padding, info) else return self.list:NewNode(mt, self.METATABLE_NAME, padding, info) end end end +function ViragDevTool:IsMetaTableNode(info) + return info.name == self.METATABLE_NAME or info.name == self.METATABLE_NAME2 +end function ViragDevTool:SortFnForCells(nodeList) @@ -576,7 +588,7 @@ function ViragDevTool:UIUpdateMainTableButton(node, info, id) if not color then color = self.colors.default end if valueType == "table" then - if name ~= self.METATABLE_NAME and name ~= self.METATABLE_NAME .. ".__index" then + if not self:IsMetaTableNode(info) then local objectType, optionalFrameName = self:GetObjectTypeFromWoWAPI(value) if objectType then if optionalFrameName and optionalFrameName ~= name then @@ -753,10 +765,9 @@ function ViragDevTool:TryCallFunction(info) local parent, ok local fn = info.value local args = self:shallowcopyargs(self.tArgs) - local results = {} -- lets try safe call first - ok, results[1], results[2], results[3], results[4], results[5] = pcall(fn, unpack(args, 1, 10)) + local ok, results = self:TryCallFunctionWithArgs(fn, args) if not ok then -- if safe call failed we probably could try to find self and call self:fn() @@ -770,19 +781,45 @@ function ViragDevTool:TryCallFunction(info) if parent then - if parent.name == self.METATABLE_NAME then + if self:IsMetaTableNode(parent) then -- metatable has real object 1 level higher parent = parent.parent end fn = parent.value[info.name] table.insert(args, 1, parent.value) - ok, results[1], results[2], results[3], results[4], results[5] = pcall(fn, unpack(args, 1, 10)) + ok, results = self:TryCallFunctionWithArgs(fn, args) end end self:ProcessCallFunctionData(ok, info, parent, args, results) end + +function ViragDevTool:GetParentTable(info) + local parent = info.parent + if parent and parent.value == _G then + -- this fn is in global namespace so no parent + parent = nil + end + + if parent then + if self:IsMetaTableNode(parent) then + -- metatable has real object 1 level higher + parent = parent.parent + end + end + + return parent +end + +function ViragDevTool:TryCallFunctionWithArgs(fn, args) + local results = {} + local ok + ok, results[1], results[2], results[3], results[4], results[5] = pcall(fn, unpack(args, 1, 10)) + + return ok, results +end + -- this function is kinda hard to read but it just adds new items to list and prints log in chat. -- will add 1 row for call result(ok or error) and 1 row for each return value function ViragDevTool:ProcessCallFunctionData(ok, info, parent, args, results) @@ -795,8 +832,8 @@ function ViragDevTool:ProcessCallFunctionData(ok, info, parent, args, results) local padding = info.padding + 1 local stateStr = function(state) - if state then return self.ok .. "OK" end - return self.error .. "ERROR" + if state then return C.ok .. "OK" end + return C.error .. "ERROR" end --constract collored full function call name @@ -834,6 +871,17 @@ function ViragDevTool:ProcessCallFunctionData(ok, info, parent, args, results) self:print(stateStr(ok) .. " " .. fnNameWitArgs .. C.gray .. " returns:" .. returnFormatedStr) end +-- type can be string or int or bool -- not table or userdata or function for now +function ViragDevTool:SetSavedArg(arg, position, type) + if type == "number" then arg = tonumber(arg) + elseif type == "boolean" then arg = toboolean(arg) + elseif type == "nil" then arg = nil + elseif type == "string" then arg = tostring(arg) + else return end -- cant handle this type of args + + self.tArgs[position] = arg +end + ----------------------------------------------------------------------------------------------- -- HISTORY ----------------------------------------------------------------------------------------------- -- 1.7.9.5