From a1cc847bc38b0f18846c8715080910b0414c53d9 Mon Sep 17 00:00:00 2001 From: Petr G Date: Sat, 11 Jun 2016 03:52:36 +0300 Subject: [PATCH] metatable fixes --- ViragDevTool.lua | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/ViragDevTool.lua b/ViragDevTool.lua index 30078e1..d258844 100644 --- a/ViragDevTool.lua +++ b/ViragDevTool.lua @@ -402,26 +402,33 @@ function ViragDevTool:ExpandCell(info) local nodeList = {} local padding = info.padding + 1 local counter = 1 + local mt for k, v in pairs(info.value) do if type(v) ~= "userdata" then nodeList[counter] = self.list:NewNode(v, tostring(k), padding, info) else - local mt = getmetatable(info.value) - mt = mt or getmetatable(v) - + local mt = getmetatable(v) if mt then - nodeList[counter] = self.list:NewNode(mt.__index, self.METATABLE_NAME, padding, info) + nodeList[counter] = self.list:NewNode(mt, self.METATABLE_NAME .. " for " .. tostring(k), padding, info) else - nodeList[counter] = self.list:NewNode(v, self.METATABLE_NAME .. " not found for " .. tostring(k), padding, info) + if k == 0 then counter = counter - 1 else + nodeList[counter] = self.list:NewNode(v, self.METATABLE_NAME .. " not found for " .. tostring(k), padding, info) + end end end counter = counter + 1 end - if type(info.value) == "table" and getmetatable(info.value) then - nodeList[counter] = self.list:NewNode(getmetatable(info.value), self.METATABLE_NAME, padding, info) + local mt = getmetatable(info.value) + if mt then + nodeList[counter] = self:NewMetatableNode(mt, padding, info) + else end + -- if we have metatable but had no userdata, we would like to add this metatable + --if type(info.value) == "table" and mt == nil and getmetatable(info.value) then + -- nodeList[counter] = self.list:NewNode(getmetatable(info.value), self.METATABLE_NAME, padding, info) + --end table.sort(nodeList, self:SortFnForCells(nodeList)) @@ -432,6 +439,17 @@ function ViragDevTool:ExpandCell(info) ViragDevTool:UpdateMainTableUI() 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) + else + return self.list:NewNode(mt, self.METATABLE_NAME, padding, info) + end + end +end + + function ViragDevTool:SortFnForCells(nodeList) local cmpFn = function(a, b) @@ -588,7 +606,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 then + if name ~= self.METATABLE_NAME and name ~= self.METATABLE_NAME..".__index" then local objectType, optionalFrameName = self:GetObjectTypeFromWoWAPI(value) if objectType then if optionalFrameName and optionalFrameName ~= name then @@ -1257,7 +1275,7 @@ function ViragDevTool:GetObjectTypeFromWoWAPI(value) -- Example in if ACP and value == ACP.L then return end local mt = getmetatable(value) if mt and type(mt.__index) == "function" then return end - + if value.GetObjectType and value.IsForbidden then local ok, forbidden = pcall(value.IsForbidden, value) if ok and not forbidden then -- 1.7.9.5