From ddc376fc36def31c9ed59ed0aebb33eed833e82f Mon Sep 17 00:00:00 2001 From: Petr Grabovoy Date: Tue, 31 May 2016 10:02:43 +0300 Subject: [PATCH] Small fixes and cleanup --- ViragDevTool.lua | 211 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 109 insertions(+), 102 deletions(-) diff --git a/ViragDevTool.lua b/ViragDevTool.lua index 2839706..3132a92 100644 --- a/ViragDevTool.lua +++ b/ViragDevTool.lua @@ -9,6 +9,69 @@ local ViragDevTool = ViragDevTool local pairs, tostring, type, print, string, getmetatable, table, pcall = pairs, tostring, type, print, string, getmetatable, table, pcall local HybridScrollFrame_CreateButtons, HybridScrollFrame_GetOffset, HybridScrollFrame_Update = HybridScrollFrame_CreateButtons, HybridScrollFrame_GetOffset, HybridScrollFrame_Update +----------------------------------------------------------------------------------------------- +-- ViragDevTool_Colors == ViragDevTool.colors +----------------------------------------------------------------------------------------------- + +--todo refactore this +local ViragDevTool_Colors = { + white = "|cFFFFFFFF", + gray = "|cFFBEB9B5", + lightblue = "|cFF96C0CE", + red = "|cFFFF0000", + green = "|cFF00FF00", + darkred = "|cFFC25B56", + parent = "|cFFBEB9B5", + error = "|cFFFF0000", + ok = "|cFF00FF00", +} +ViragDevTool.colors = ViragDevTool_Colors + +function ViragDevTool_Colors:forState(state) + if state then return self.ok end + return self.error +end + +function ViragDevTool_Colors:stateStr(state) + if state then return self.ok .. "OK" end + return self.error .. "ERROR" +end + +function ViragDevTool_Colors:errorText() + return self:stateStr(false) .. self.white .. " function call failed" +end + +function ViragDevTool_Colors:FNNameToString(name, args) + -- Create function call string like myFunction(arg1, arg2, arg3) + local fnNameWitArgs = "" + local delimiter = "" + local found = false + for i = 10, 1, -1 do + if args[i] ~= nil then found = true end + + if found then + fnNameWitArgs = tostring(args[i]) .. delimiter .. fnNameWitArgs + delimiter = ", " + end + end + + return name .. "(" .. fnNameWitArgs .. ")" +end + +function ViragDevTool_Colors:functionStr(parent, name, args) + local resultStr = self:FNNameToString(name, args) + + if parent then + return self.parent .. parent.name .. ":" .. self.white .. resultStr + else + return self.white .. resultStr + end +end + +----------------------------------------------------------------------------------------------- +-- ViragDevToolLinkedList == ViragDevTool.list +----------------------------------------------------------------------------------------------- + --- Linked List -- @field size -- @field first @@ -22,11 +85,9 @@ local HybridScrollFrame_CreateButtons, HybridScrollFrame_GetOffset, HybridScroll -- @field parent - parent node after it expanded -- @field expanded - true/false/nil -local ViragDevToolLinkedList = { - size = 0; - first = nil, - last = nil -} + +local ViragDevToolLinkedList = {} +ViragDevToolLinkedList.size = 0 ViragDevTool.list = ViragDevToolLinkedList function ViragDevToolLinkedList:GetInfoAtPosition(position) @@ -114,6 +175,10 @@ function ViragDevToolLinkedList:Clear() self.last = nil end +----------------------------------------------------------------------------------------------- +-- ViragDevTool main +----------------------------------------------------------------------------------------------- + --- -- Main (and the only) function you can use in ViragDevTool API -- Will add data to the list so you can explore its values in UI list @@ -179,6 +244,9 @@ function ViragDevTool:ColapseCell(info) self:UpdateUI() end +----------------------------------------------------------------------------------------------- +-- UI +----------------------------------------------------------------------------------------------- function ViragDevTool:UpdateUI() local scrollFrame = self.wndRef.scrollFrame @@ -237,14 +305,9 @@ function ViragDevTool:UIUpdateListItem(node, info, id) local color = "ViragDevToolBaseFont" if valueType == "table" then if name ~= self.METATABLE_NAME then - if value.GetObjectType and value.IsForbidden then - local ok, forbidden = pcall(value.IsForbidden, value) - if ok and not forbidden then - local ok, result = pcall(value.GetObjectType, value) - if ok then - valueButton:SetText(result .. " " .. tostring(value)) - end - end + local objectType = self:GetObjectTypeFromWoWAPI(value) + if objectType then + valueButton:SetText(objectType .. " " .. tostring(value)) end color = "ViragDevToolTableFont"; else @@ -300,6 +363,18 @@ function ViragDevTool:UIUpdateListItem(node, info, id) end end +function ViragDevTool:GetObjectTypeFromWoWAPI(value) + if value.GetObjectType and value.IsForbidden then + local ok, forbidden = pcall(value.IsForbidden, value) + if ok and not forbidden then + local ok, result = pcall(value.GetObjectType, value) + if ok then + return result + end + end + end +end + function ViragDevTool:TryCallFunction(info) -- info.value is just our function to call local parent, ok @@ -335,122 +410,54 @@ function ViragDevTool:TryCallFunction(info) self:ProcessCallFunctionData(ok, info, parent, args, results) end ---todo refactore this -local ViragDevTool_Colors = { - white = "|cFFFFFFFF", - gray = "|cFFBEB9B5", - - lightblue = "|cFF96C0CE", - red = "|cFFFF0000", - green = "|cFF00FF00", - darkred = "|cFFC25B56", - - parent = "|cFFBEB9B5", - error = "|cFFC25B56", - - ok = "|cFF00FF00", -} - -function ViragDevTool_Colors:forState(state) - if state then return self.ok end - return self.darkred -end - -function ViragDevTool_Colors:stateStr(state) - if state then return self.ok .. "OK" end - return self.red .. "ERROR" -end - -function ViragDevTool_Colors:errorText() - return self:stateStr(false) .. self.error .. " function call failed" -end - -function ViragDevTool_Colors:FNNameToString(name, args) - -- Create function call string like myFunction(arg1, arg2, arg3) - local fnNameWitArgs = "" - local delimiter = "" - local found = false - for i = 10, 1, -1 do - if args[i] ~= nil then found = true end - - if found then - fnNameWitArgs = tostring(args[i]) .. delimiter .. fnNameWitArgs - delimiter = ", " - end - end - - return name .. "(" .. fnNameWitArgs .. ")" -end - -function ViragDevTool_Colors:functionStr(parent, name, args) - local resultStr = self:FNNameToString(name, args) - - if parent then - return self.parent .. parent.name .. ":" .. self.white .. resultStr - else - return self.white .. resultStr - end -end - -ViragDevTool.colors = ViragDevTool_Colors - -- 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) local nodes = {} + + self:ColapseCell(info) -- if we already called this fn remove old results + local C = self.colors local list = self.list + local padding = info.padding + 1 --constract full function call name local fnNameWitArgs = C:functionStr(parent, info.name, args) local returnFormatedStr = "" - if not ok then - -- if function call was unsuccessful - nodes[1] = list:NewNode(tostring(results[1]), C:errorText(), info.padding + 1) - returnFormatedStr = string.format(" %s%s", C.white, tostring(results[1])) - else - -- itterate backwords because we want to include every meaningfull nil result - -- for example 1, 2, nil, 4 should return only this 4 values nothing more nothing less. - local found = false - for i = 10, 1, -1 do - if results[i] ~= nil then found = true end + -- itterate backwords because we want to include every meaningfull nil result + -- and with default itteration like pairs() we will just skip them so + -- for example 1, 2, nil, 4 should return only this 4 values nothing more, nothing less. + local found = false + for i = 10, 1, -1 do + if results[i] ~= nil then found = true end - if found or i == 1 then - nodes[i] = list:NewNode(results[i], string.format(" ret: %d", i), info.padding + 1) + if found or i == 1 then -- if found some return or if return is nil + nodes[i] = list:NewNode(results[i], string.format(" return: %d", i), padding) - returnFormatedStr = string.format(" %s%s %s(%s)%s", C.white, tostring(results[i]), - C.lightblue, type(results[i]), returnFormatedStr) - end + returnFormatedStr = string.format(" %s%s %s(%s)%s", C.white, tostring(results[i]), + C.lightblue, type(results[i]), returnFormatedStr) end end -- create fist node of result info no need for now. will use debug - local titleNode = list:NewNode( + table.insert(nodes, 1, list:NewNode( string.format("%s - %s", C:stateStr(ok), fnNameWitArgs), -- node value - C:forState(ok) .. date("%X") .. " function call results:", -- node name - info.padding + 1) -- node padding + C.white .. date("%X") .. " function call results:", padding)) - table.insert(nodes, 1, titleNode) -- adds call result to our UI list - list:AddNodesAfter(nodes, info) self:UpdateUI() --print info to chat local resultInfoStr = C:stateStr(ok) .. " " .. fnNameWitArgs .. C.gray .. " returns:" .. returnFormatedStr print(C.darkred .. "[Virag's DT]: " .. C.white .. resultInfoStr) - - -- if everything faild, just show default Blizzard error - -- if not ok then - -- fn(args) - -- end end ---- +----------------------------------------------------------------------------------------------- -- LIFECICLE --- +----------------------------------------------------------------------------------------------- function ViragDevTool:OnLoad(this) self.wndRef = this @@ -465,7 +472,7 @@ function ViragDevTool:OnLoad(this) -- register slash cmd SLASH_VIRAGDEVTOOLS1 = '/vdt'; function SlashCmdList.VIRAGDEVTOOLS(msg, editbox) -- 4. - ViragDevTool_AddData(_G[strGlobalName], strGlobalName) + ViragDevTool_AddData(_G[strGlobalName], strGlobalName) end end @@ -477,9 +484,9 @@ function ViragDevTool:OnEvent(this, event, arg1, arg2, arg3) end end ---- +----------------------------------------------------------------------------------------------- -- UTILS --- +----------------------------------------------------------------------------------------------- function ViragDevTool:print(table) print(tostring(table)) for k, v in pairs(table or {}) do -- 1.7.9.5