More development on the new API
This commit is contained in:
+16
@@ -0,0 +1,16 @@
|
||||
|
||||
core/parser - FF.lua
|
||||
core/parser_original.lua
|
||||
core/windows - Copy.lua
|
||||
functions/savedata - Copy.lua
|
||||
*.psd
|
||||
Libs/DF/all_addons.blp
|
||||
Libs/DF/all_addons.tga
|
||||
Libs/DF/background.blp
|
||||
Libs/DF/border_1.blp
|
||||
Libs/DF/border_2.blp
|
||||
Libs/DF/border_3.blp
|
||||
Libs/DF/cooltip_background.blp
|
||||
Libs/DF/feedback_sites.blp
|
||||
Libs/DF/icons.blp
|
||||
Libs/DF/mail.blp
|
||||
@@ -10,6 +10,7 @@ local _
|
||||
window:SetPoint ("center", UIParent, "center")
|
||||
window:SetResizable (true)
|
||||
window:SetMovable (true)
|
||||
window:SetClampedToScreen (true)
|
||||
tinsert (UISpecialFrames, "DetailsFrameworkImageEdit")
|
||||
window:SetFrameStrata ("TOOLTIP")
|
||||
window:SetMaxResize (650, 500)
|
||||
|
||||
@@ -63,6 +63,55 @@
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--> core
|
||||
|
||||
--from weakauras, list of functions to block on scripts
|
||||
--source https://github.com/WeakAuras/WeakAuras2/blob/520951a4b49b64cb49d88c1a8542d02bbcdbe412/WeakAuras/AuraEnvironment.lua#L66
|
||||
local blockedFunctions = {
|
||||
-- Lua functions that may allow breaking out of the environment
|
||||
getfenv = true,
|
||||
getfenv = true,
|
||||
loadstring = true,
|
||||
pcall = true,
|
||||
xpcall = true,
|
||||
getglobal = true,
|
||||
|
||||
-- blocked WoW API
|
||||
SendMail = true,
|
||||
SetTradeMoney = true,
|
||||
AddTradeMoney = true,
|
||||
PickupTradeMoney = true,
|
||||
PickupPlayerMoney = true,
|
||||
TradeFrame = true,
|
||||
MailFrame = true,
|
||||
EnumerateFrames = true,
|
||||
RunScript = true,
|
||||
AcceptTrade = true,
|
||||
SetSendMailMoney = true,
|
||||
EditMacro = true,
|
||||
SlashCmdList = true,
|
||||
DevTools_DumpCommand = true,
|
||||
hash_SlashCmdList = true,
|
||||
CreateMacro = true,
|
||||
SetBindingMacro = true,
|
||||
GuildDisband = true,
|
||||
GuildUninvite = true,
|
||||
securecall = true,
|
||||
|
||||
--additional
|
||||
setmetatable = true,
|
||||
}
|
||||
|
||||
local functionFilter = setmetatable ({}, {__index = function (env, key)
|
||||
if (key == "_G") then
|
||||
return env
|
||||
|
||||
elseif (blockedFunctions [key]) then
|
||||
return nil
|
||||
|
||||
else
|
||||
return _G [key]
|
||||
end
|
||||
end})
|
||||
|
||||
function atributo_custom:GetCombatContainerIndex (attribute)
|
||||
return combat_containers [attribute]
|
||||
end
|
||||
@@ -113,6 +162,7 @@
|
||||
local errortext
|
||||
func, errortext = loadstring (custom_object.script)
|
||||
if (func) then
|
||||
setfenv (func, functionFilter)
|
||||
_detalhes.custom_function_cache [instance.customName] = func
|
||||
else
|
||||
_detalhes:Msg ("|cFFFF9900error compiling code for custom display " .. (instance.customName or "") .. " |r:", errortext)
|
||||
@@ -121,6 +171,7 @@
|
||||
if (custom_object.tooltip) then
|
||||
local tooltip_script, errortext = loadstring (custom_object.tooltip)
|
||||
if (tooltip_script) then
|
||||
setfenv (tooltip_script, functionFilter)
|
||||
_detalhes.custom_function_cache [instance.customName .. "Tooltip"] = tooltip_script
|
||||
else
|
||||
_detalhes:Msg ("|cFFFF9900error compiling tooltip code for custom display " .. (instance.customName or "") .. " |r:", errortext)
|
||||
@@ -130,6 +181,7 @@
|
||||
if (custom_object.total_script) then
|
||||
local total_script, errortext = loadstring (custom_object.total_script)
|
||||
if (total_script) then
|
||||
setfenv (total_script, functionFilter)
|
||||
_detalhes.custom_function_cache [instance.customName .. "Total"] = total_script
|
||||
else
|
||||
_detalhes:Msg ("|cFFFF9900error compiling total code for custom display " .. (instance.customName or "") .. " |r:", errortext)
|
||||
@@ -139,6 +191,7 @@
|
||||
if (custom_object.percent_script) then
|
||||
local percent_script, errortext = loadstring (custom_object.percent_script)
|
||||
if (percent_script) then
|
||||
setfenv (percent_script, functionFilter)
|
||||
_detalhes.custom_function_cache [instance.customName .. "Percent"] = percent_script
|
||||
else
|
||||
_detalhes:Msg ("|cFFFF9900error compiling percent code for custom display " .. (instance.customName or "") .. " |r:", errortext)
|
||||
|
||||
+55
-1
@@ -462,6 +462,55 @@
|
||||
|
||||
--------end of ToK functions----
|
||||
|
||||
--from weakauras, list of functions to block on scripts
|
||||
--source https://github.com/WeakAuras/WeakAuras2/blob/520951a4b49b64cb49d88c1a8542d02bbcdbe412/WeakAuras/AuraEnvironment.lua#L66
|
||||
local blockedFunctions = {
|
||||
-- Lua functions that may allow breaking out of the environment
|
||||
getfenv = true,
|
||||
getfenv = true,
|
||||
loadstring = true,
|
||||
pcall = true,
|
||||
xpcall = true,
|
||||
getglobal = true,
|
||||
|
||||
-- blocked WoW API
|
||||
SendMail = true,
|
||||
SetTradeMoney = true,
|
||||
AddTradeMoney = true,
|
||||
PickupTradeMoney = true,
|
||||
PickupPlayerMoney = true,
|
||||
TradeFrame = true,
|
||||
MailFrame = true,
|
||||
EnumerateFrames = true,
|
||||
RunScript = true,
|
||||
AcceptTrade = true,
|
||||
SetSendMailMoney = true,
|
||||
EditMacro = true,
|
||||
SlashCmdList = true,
|
||||
DevTools_DumpCommand = true,
|
||||
hash_SlashCmdList = true,
|
||||
CreateMacro = true,
|
||||
SetBindingMacro = true,
|
||||
GuildDisband = true,
|
||||
GuildUninvite = true,
|
||||
securecall = true,
|
||||
|
||||
--additional
|
||||
setmetatable = true,
|
||||
}
|
||||
|
||||
local functionFilter = setmetatable ({}, {__index = function (env, key)
|
||||
if (key == "_G") then
|
||||
return env
|
||||
|
||||
elseif (blockedFunctions [key]) then
|
||||
return nil
|
||||
|
||||
else
|
||||
return _G [key]
|
||||
end
|
||||
end})
|
||||
|
||||
--> replacing data for custom texts
|
||||
_detalhes.string = {}
|
||||
|
||||
@@ -474,9 +523,14 @@
|
||||
end
|
||||
local run_function = function (str)
|
||||
--> cache functions
|
||||
local func = function_cache [str]
|
||||
local func, errortext = function_cache [str]
|
||||
if (not func) then
|
||||
func = loadstring (str)
|
||||
if (not func) then
|
||||
_detalhes:Msg ("|cFFFF9900error compiling script on custom text|r: ", errortext)
|
||||
return 0
|
||||
end
|
||||
setfenv (func, functionFilter)
|
||||
function_cache [str] = func
|
||||
end
|
||||
|
||||
|
||||
+403
-9
@@ -4641,11 +4641,62 @@
|
||||
cancel_script_button:SetPoint ("topleft", code_editor, "bottomleft", 0, button_y)
|
||||
|
||||
--> create run now button
|
||||
|
||||
--from weakauras, list of functions to block on scripts
|
||||
--source https://github.com/WeakAuras/WeakAuras2/blob/520951a4b49b64cb49d88c1a8542d02bbcdbe412/WeakAuras/AuraEnvironment.lua#L66
|
||||
local blockedFunctions = {
|
||||
-- Lua functions that may allow breaking out of the environment
|
||||
getfenv = true,
|
||||
getfenv = true,
|
||||
loadstring = true,
|
||||
pcall = true,
|
||||
xpcall = true,
|
||||
getglobal = true,
|
||||
|
||||
-- blocked WoW API
|
||||
SendMail = true,
|
||||
SetTradeMoney = true,
|
||||
AddTradeMoney = true,
|
||||
PickupTradeMoney = true,
|
||||
PickupPlayerMoney = true,
|
||||
TradeFrame = true,
|
||||
MailFrame = true,
|
||||
EnumerateFrames = true,
|
||||
RunScript = true,
|
||||
AcceptTrade = true,
|
||||
SetSendMailMoney = true,
|
||||
EditMacro = true,
|
||||
SlashCmdList = true,
|
||||
DevTools_DumpCommand = true,
|
||||
hash_SlashCmdList = true,
|
||||
CreateMacro = true,
|
||||
SetBindingMacro = true,
|
||||
GuildDisband = true,
|
||||
GuildUninvite = true,
|
||||
securecall = true,
|
||||
|
||||
--additional
|
||||
setmetatable = true,
|
||||
}
|
||||
|
||||
local functionFilter = setmetatable ({}, {__index = function (env, key)
|
||||
if (key == "_G") then
|
||||
return env
|
||||
|
||||
elseif (blockedFunctions [key]) then
|
||||
return nil
|
||||
|
||||
else
|
||||
return _G [key]
|
||||
end
|
||||
end})
|
||||
|
||||
local execute_script = function()
|
||||
local script = code_editor:GetText()
|
||||
local func, errortext = loadstring (script, "Q")
|
||||
|
||||
if (func) then
|
||||
setfenv (func, functionFilter)
|
||||
gump:QuickDispatch (func)
|
||||
else
|
||||
errortext_frame:Flash (0.2, 0.2, 0.4, true, nil, nil, "NONE")
|
||||
@@ -4673,21 +4724,24 @@
|
||||
-- ~API
|
||||
|
||||
function _detalhes:InitializeAPIWindow()
|
||||
local DetailsAPIPanel = gump:CreateSimplePanel (UIParent, 700, 480, "Details! API", "DetailsAPIPanel")
|
||||
DetailsAPIPanel.Frame = DetailsAPIPanel
|
||||
DetailsAPIPanel.__name = "API"
|
||||
DetailsAPIPanel.real_name = "DETAILS_APIWINDOW"
|
||||
DetailsAPIPanel.__icon = [[Interface\AddOns\Details\images\icons]]
|
||||
DetailsAPIPanel.__iconcoords = {449/512, 480/512, 62/512, 83/512}
|
||||
DetailsAPIPanel.__iconcolor = "DETAILS_API_ICON"
|
||||
DetailsPluginContainerWindow.EmbedPlugin (DetailsAPIPanel, DetailsAPIPanel, true)
|
||||
local DetailsAPI2Frame = gump:CreateSimplePanel (UIParent, 700, 480, "Details! API", "DetailsAPI2Frame")
|
||||
DetailsAPI2Frame.Frame = DetailsAPI2Frame
|
||||
DetailsAPI2Frame.__name = "API"
|
||||
DetailsAPI2Frame.real_name = "DETAILS_APIWINDOW"
|
||||
DetailsAPI2Frame.__icon = [[Interface\AddOns\Details\images\icons]]
|
||||
DetailsAPI2Frame.__iconcoords = {449/512, 480/512, 62/512, 83/512}
|
||||
DetailsAPI2Frame.__iconcolor = "DETAILS_API_ICON"
|
||||
DetailsPluginContainerWindow.EmbedPlugin (DetailsAPI2Frame, DetailsAPI2Frame, true)
|
||||
|
||||
function DetailsAPIPanel.RefreshWindow()
|
||||
function DetailsAPI2Frame.RefreshWindow()
|
||||
_detalhes.OpenAPI()
|
||||
end
|
||||
end
|
||||
|
||||
function _detalhes.OpenAPI()
|
||||
|
||||
|
||||
--[=[
|
||||
if (not DetailsAPIPanel or not DetailsAPIPanel.Initialized) then
|
||||
|
||||
local f = DetailsAPIPanel or gump:CreateSimplePanel (UIParent, 700, 480, "Details! API", "DetailsAPIPanel")
|
||||
@@ -4742,6 +4796,333 @@
|
||||
|
||||
--DetailsAPIPanel:Show()
|
||||
DetailsPluginContainerWindow.OpenPlugin (DetailsAPIPanel)
|
||||
|
||||
--]=]
|
||||
|
||||
if (not DetailsAPI2Frame or not DetailsAPI2Frame.Initialized) then
|
||||
|
||||
--menu settings
|
||||
|
||||
DetailsAPI2Frame.Initialized = true
|
||||
|
||||
local panelWidth = 800
|
||||
local panelHeight = 610
|
||||
local scrollWidth = 200
|
||||
local scrollHeight = 570
|
||||
local lineHeight = 20
|
||||
local lineAmount = 20
|
||||
local backdropColor = {.2, .2, .2, 0.2}
|
||||
local backdropColorOnEnter = {.8, .8, .8, 0.4}
|
||||
local backdropColorSelected = {1, 1, .8, 0.4}
|
||||
local yStart = -30
|
||||
local xAnchorPoint = 250
|
||||
local parametersAmount = 10
|
||||
local returnAmount = 10
|
||||
|
||||
--local Api2Frame = DetailsFramework:CreateSimplePanel (UIParent, panelWidth, panelHeight, "Details! API 2.0", "DetailsAPI2Frame")
|
||||
local Api2Frame = DetailsAPI2Frame
|
||||
|
||||
Api2Frame:SetFrameStrata ("FULLSCREEN")
|
||||
Api2Frame:SetPoint ("center")
|
||||
DetailsFramework:ApplyStandardBackdrop (Api2Frame, false, 1.2)
|
||||
|
||||
--store
|
||||
local apiFunctionNames = {}
|
||||
local parametersLines = {}
|
||||
local returnLines = {}
|
||||
local currentSelected = 1
|
||||
|
||||
--on select api on the menu
|
||||
local onSelectAPI = function (self)
|
||||
local apiName = apiFunctionNames [self.index]
|
||||
if (not apiName) then
|
||||
Details:Msg ("API name not found:", apiName)
|
||||
return
|
||||
end
|
||||
|
||||
--fill the box in the right with information about the API
|
||||
local apiInfo = Details.API_Description [self.index]
|
||||
if (not apiInfo) then
|
||||
Details:Msg ("API information for api not found", apiName)
|
||||
return
|
||||
end
|
||||
|
||||
currentSelected = self.index
|
||||
|
||||
--update name and desc
|
||||
Api2Frame.ApiFunctionName.text = apiName
|
||||
Api2Frame.ApiFunctionDesc.text = apiInfo.desc
|
||||
|
||||
--update the copy line text box
|
||||
local parameters = ""
|
||||
for parameterIndex, parameterInfo in ipairs (apiInfo.parameters) do
|
||||
if (parameterInfo.required) then
|
||||
parameters = parameters .. parameterInfo.name .. ", "
|
||||
end
|
||||
end
|
||||
parameters = parameters:gsub (", $", "")
|
||||
|
||||
local returnValues = "local "
|
||||
for returnIndex, returnInfo in ipairs (apiInfo.returnValues) do
|
||||
returnValues = returnValues .. returnInfo.name .. ", "
|
||||
end
|
||||
returnValues = returnValues:gsub (", $", "")
|
||||
returnValues = returnValues .. " = "
|
||||
|
||||
if (parameters ~= "") then
|
||||
Api2Frame.ApiCopy.text = returnValues .. apiName .. "( " .. parameters .. " )"
|
||||
else
|
||||
Api2Frame.ApiCopy.text = returnValues .. apiName .. "()"
|
||||
end
|
||||
|
||||
Api2Frame.ApiCopy:SetFocus (true)
|
||||
Api2Frame.ApiCopy:HighlightText()
|
||||
|
||||
--parameters
|
||||
for i = 1, #parametersLines do
|
||||
local parameterLine = parametersLines [i]
|
||||
local parameterInfo = apiInfo.parameters [i]
|
||||
|
||||
if (parameterInfo) then
|
||||
parameterLine:Show()
|
||||
parameterLine.index = i
|
||||
parameterLine.name.text = parameterInfo.name
|
||||
parameterLine.typeData.text = parameterInfo.type
|
||||
parameterLine.required.text = parameterInfo.required and "yes" or "no"
|
||||
parameterLine.default.text = parameterInfo.default or ""
|
||||
else
|
||||
parameterLine:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
--return values
|
||||
for i = 1, #returnLines do
|
||||
local returnLine = returnLines [i]
|
||||
local returnInfo = apiInfo.returnValues [i]
|
||||
|
||||
if (returnInfo) then
|
||||
returnLine:Show()
|
||||
returnLine.index = i
|
||||
returnLine.name.text = returnInfo.name
|
||||
returnLine.typeData.text = returnInfo.type
|
||||
returnLine.desc.text = returnInfo.desc
|
||||
|
||||
else
|
||||
returnLine:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
--refresh the scroll box
|
||||
Api2Frame.scrollMenu:Refresh()
|
||||
end
|
||||
|
||||
--menu scroll
|
||||
local apiMenuScrollRefresh = function (self, data, offset, total_lines)
|
||||
for i = 1, total_lines do
|
||||
local index = i + offset
|
||||
local apiName = data [index]
|
||||
if (apiName) then
|
||||
local line = self:GetLine (i)
|
||||
line.text:SetText (apiName)
|
||||
line.index = index
|
||||
|
||||
if (currentSelected == index) then
|
||||
line:SetBackdropColor (unpack (backdropColorSelected))
|
||||
else
|
||||
line:SetBackdropColor (unpack (backdropColor))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for apiIndex, apiDesc in ipairs (Details.API_Description) do
|
||||
tinsert (apiFunctionNames, apiDesc.name)
|
||||
end
|
||||
|
||||
local api2ScrollMenu = DetailsFramework:CreateScrollBox (Api2Frame, "$parentApi2MenuScroll", apiMenuScrollRefresh, apiFunctionNames, scrollWidth, scrollHeight, lineAmount, lineHeight)
|
||||
DetailsFramework:ReskinSlider (api2ScrollMenu)
|
||||
api2ScrollMenu:SetPoint ("topleft", Api2Frame, "topleft", 10, yStart)
|
||||
Api2Frame.scrollMenu = api2ScrollMenu
|
||||
|
||||
local lineOnEnter = function (self)
|
||||
self:SetBackdropColor (unpack (backdropColorOnEnter))
|
||||
end
|
||||
|
||||
local lineOnLeave = function (self)
|
||||
if (currentSelected == self.index) then
|
||||
self:SetBackdropColor (unpack (backdropColorSelected))
|
||||
else
|
||||
self:SetBackdropColor (unpack (backdropColor))
|
||||
end
|
||||
end
|
||||
|
||||
--create lines
|
||||
for i = 1, lineAmount do
|
||||
api2ScrollMenu:CreateLine (function (self, index)
|
||||
local line = CreateFrame ("button", "$parentLine" .. index, self)
|
||||
line:SetPoint ("topleft", self, "topleft", 1, -((index-1)*(lineHeight+1)) - 1)
|
||||
line:SetSize (scrollWidth - 2, lineHeight)
|
||||
line.index = index
|
||||
|
||||
line:SetScript ("OnEnter", lineOnEnter)
|
||||
line:SetScript ("OnLeave", lineOnLeave)
|
||||
|
||||
line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
|
||||
line:SetBackdropColor (unpack (backdropColor))
|
||||
|
||||
line.text = DetailsFramework:CreateLabel (line)
|
||||
line.text:SetPoint ("left", line, "left", 2, 0)
|
||||
|
||||
line:SetScript ("OnMouseDown", onSelectAPI)
|
||||
|
||||
return line
|
||||
end)
|
||||
end
|
||||
|
||||
--info box
|
||||
local infoWidth = panelWidth - xAnchorPoint - 10
|
||||
--api name
|
||||
Api2Frame.ApiFunctionName = DetailsFramework:CreateLabel (Api2Frame, "", 14, "orange")
|
||||
Api2Frame.ApiFunctionName:SetPoint ("topleft", Api2Frame, "topleft", xAnchorPoint, yStart)
|
||||
--api desc
|
||||
Api2Frame.ApiFunctionDesc = DetailsFramework:CreateLabel (Api2Frame)
|
||||
Api2Frame.ApiFunctionDesc:SetPoint ("topleft", Api2Frame.ApiFunctionName, "bottomleft", 0, -2)
|
||||
--api func to copy
|
||||
local apiCopyString = DetailsFramework:CreateLabel (Api2Frame, "Copy String", 12, "orange")
|
||||
apiCopyString:SetPoint ("topleft", Api2Frame.ApiFunctionDesc, "bottomleft", 0, -20)
|
||||
Api2Frame.ApiCopy = DetailsFramework:CreateTextEntry (Api2Frame, function() end, infoWidth, 20)
|
||||
Api2Frame.ApiCopy:SetPoint ("topleft", apiCopyString, "bottomleft", 0, -2)
|
||||
Api2Frame.ApiCopy:SetTemplate (DetailsFramework:GetTemplate ("button", "DETAILS_CUSTOMDISPLAY_CODE_BOX"))
|
||||
|
||||
--parameters
|
||||
local parametersYStart = yStart - 100
|
||||
local parametersString = DetailsFramework:CreateLabel (Api2Frame, "Parameters", 12, "orange")
|
||||
parametersString:SetPoint ("topleft", Api2Frame, "topleft", xAnchorPoint, parametersYStart)
|
||||
|
||||
parametersYStart = parametersYStart - 20
|
||||
|
||||
local space1, space2, space3 = 100, 200, 300
|
||||
local parametersHeader = CreateFrame ("frame", nil, Api2Frame)
|
||||
parametersHeader:SetSize (infoWidth, 20)
|
||||
parametersHeader:SetPoint ("topleft", Api2Frame, "topleft", xAnchorPoint, parametersYStart)
|
||||
parametersHeader:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
|
||||
parametersHeader:SetBackdropColor (unpack (backdropColor))
|
||||
parametersHeader.name = DetailsFramework:CreateLabel (parametersHeader, "Name", 12, "yellow")
|
||||
parametersHeader.typeData = DetailsFramework:CreateLabel (parametersHeader, "Type", 12, "yellow")
|
||||
parametersHeader.required = DetailsFramework:CreateLabel (parametersHeader, "Is Required", 12, "yellow")
|
||||
parametersHeader.default = DetailsFramework:CreateLabel (parametersHeader, "Default Value", 12, "yellow")
|
||||
parametersHeader.name:SetPoint ("left", parametersHeader, "left", 2, 0)
|
||||
parametersHeader.typeData:SetPoint ("left", parametersHeader, "left", space1, 0)
|
||||
parametersHeader.required:SetPoint ("left", parametersHeader, "left", space2, 0)
|
||||
parametersHeader.default:SetPoint ("left", parametersHeader, "left", space3, 0)
|
||||
|
||||
local parameterOnEnter = function (self)
|
||||
GameCooltip2:Preset(2)
|
||||
GameCooltip2:SetOwner (self)
|
||||
|
||||
--fill the box in the right with information about the API
|
||||
local apiInfo = Details.API_Description [currentSelected]
|
||||
if (not apiInfo) then
|
||||
return
|
||||
end
|
||||
GameCooltip2:AddLine (apiInfo.parameters [self.index].desc)
|
||||
GameCooltip2:ShowCooltip()
|
||||
|
||||
self:SetBackdropColor (unpack (backdropColorOnEnter))
|
||||
end
|
||||
local parameterOnLeave = function (self)
|
||||
GameCooltip2:Hide()
|
||||
self:SetBackdropColor (unpack (backdropColor))
|
||||
end
|
||||
|
||||
for i = 1, parametersAmount do
|
||||
local parameterLine = {}
|
||||
local f = CreateFrame ("frame", nil, Api2Frame)
|
||||
f:SetSize (infoWidth, 20)
|
||||
f:SetScript ("OnEnter", parameterOnEnter)
|
||||
f:SetScript ("OnLeave", parameterOnLeave)
|
||||
f:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
|
||||
f:SetBackdropColor (unpack (backdropColor))
|
||||
f:Hide()
|
||||
|
||||
f.name = DetailsFramework:CreateLabel (f)
|
||||
f.typeData = DetailsFramework:CreateLabel (f)
|
||||
f.required = DetailsFramework:CreateLabel (f)
|
||||
f.default = DetailsFramework:CreateLabel (f)
|
||||
|
||||
f:SetPoint ("topleft", Api2Frame, "topleft", xAnchorPoint, parametersYStart + (-i * 20))
|
||||
|
||||
f.name:SetPoint ("left", f, "left", 2, 0)
|
||||
f.typeData:SetPoint ("left", f, "left", space1, 0)
|
||||
f.required:SetPoint ("left", f, "left", space2, 0)
|
||||
f.default:SetPoint ("left", f, "left", space3, 0)
|
||||
|
||||
tinsert (parametersLines, f)
|
||||
end
|
||||
|
||||
--return value box
|
||||
local returnYStart = yStart - 260
|
||||
local returnString = DetailsFramework:CreateLabel (Api2Frame, "Return Values", 12, "orange")
|
||||
returnString:SetPoint ("topleft", Api2Frame, "topleft", xAnchorPoint, returnYStart)
|
||||
|
||||
returnYStart = returnYStart - 20
|
||||
|
||||
local space1 = 200
|
||||
local returnHeader = CreateFrame ("frame", nil, Api2Frame)
|
||||
returnHeader:SetSize (infoWidth, 20)
|
||||
returnHeader:SetPoint ("topleft", Api2Frame, "topleft", xAnchorPoint, returnYStart)
|
||||
returnHeader:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
|
||||
returnHeader:SetBackdropColor (unpack (backdropColor))
|
||||
returnHeader.name = DetailsFramework:CreateLabel (returnHeader, "Name", 12, "yellow")
|
||||
returnHeader.typeData = DetailsFramework:CreateLabel (returnHeader, "Type", 12, "yellow")
|
||||
returnHeader.name:SetPoint ("left", returnHeader, "left", 2, 0)
|
||||
returnHeader.typeData:SetPoint ("left", returnHeader, "left", space1, 0)
|
||||
|
||||
local returnOnEnter = function (self)
|
||||
self:SetBackdropColor (unpack (backdropColorOnEnter))
|
||||
end
|
||||
local returnOnLeave = function (self)
|
||||
self:SetBackdropColor (unpack (backdropColor))
|
||||
end
|
||||
|
||||
for i = 1, returnAmount do
|
||||
local parameterLine = {}
|
||||
local f = CreateFrame ("frame", nil, Api2Frame)
|
||||
f:SetSize (infoWidth, 20)
|
||||
f:SetScript ("OnEnter", returnOnEnter)
|
||||
f:SetScript ("OnLeave", returnOnLeave)
|
||||
f:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
|
||||
f:SetBackdropColor (unpack (backdropColor))
|
||||
f:Hide()
|
||||
|
||||
f.name = DetailsFramework:CreateLabel (f)
|
||||
f.typeData = DetailsFramework:CreateLabel (f)
|
||||
|
||||
f.desc = DetailsFramework:CreateLabel (f, "", 10, "gray")
|
||||
f.desc.width = infoWidth
|
||||
f.desc.height = 60
|
||||
f.desc.valign = "top"
|
||||
|
||||
f:SetPoint ("topleft", Api2Frame, "topleft", xAnchorPoint, returnYStart + (-i * 20))
|
||||
|
||||
f.name:SetPoint ("left", f, "left", 2, 0)
|
||||
f.typeData:SetPoint ("left", f, "left", space1, 0)
|
||||
|
||||
f.desc:SetPoint ("topleft", f.name, "bottomleft", 0, -5)
|
||||
|
||||
tinsert (returnLines, f)
|
||||
end
|
||||
|
||||
function Api2Frame.Refresh()
|
||||
onSelectAPI (api2ScrollMenu.Frames [1])
|
||||
end
|
||||
end
|
||||
|
||||
DetailsAPI2Frame:Show()
|
||||
DetailsAPI2Frame.Refresh()
|
||||
|
||||
DetailsPluginContainerWindow.OpenPlugin (DetailsAPI2Frame)
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -7052,3 +7433,16 @@ function _detalhes:ShowImportWindow (defaultText, confirmFunc, titleText)
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--> api2 window
|
||||
|
||||
function Details:ShowApi2()
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+38
-20
@@ -48,7 +48,8 @@ Details.API_Description = {}
|
||||
--[=[
|
||||
Details.SegmentElapsedTime (segment)
|
||||
--=]=]
|
||||
Details.API_Description.SegmentElapsedTime = {
|
||||
tinsert (Details.API_Description, {
|
||||
name = "SegmentElapsedTime",
|
||||
desc = "Return the total elapsed time of a segment.",
|
||||
parameters = {
|
||||
{
|
||||
@@ -65,7 +66,8 @@ Details.API_Description.SegmentElapsedTime = {
|
||||
desc = "Number representing the elapsed time of a combat.",
|
||||
}
|
||||
},
|
||||
}
|
||||
type = 1, --damage
|
||||
})
|
||||
|
||||
function Details.SegmentElapsedTime (segment)
|
||||
segment = segment or 0
|
||||
@@ -81,7 +83,8 @@ end
|
||||
--[=[
|
||||
Details.UnitDamage (unitId, segment)
|
||||
--=]=]
|
||||
Details.API_Description.UnitDamage = {
|
||||
tinsert (Details.API_Description, {
|
||||
name = "UnitDamage",
|
||||
desc = "Query the damage of a unit.",
|
||||
parameters = {
|
||||
{
|
||||
@@ -104,7 +107,8 @@ Details.API_Description.UnitDamage = {
|
||||
desc = "Number representing the unit damage.",
|
||||
}
|
||||
},
|
||||
}
|
||||
type = 1, --damage
|
||||
})
|
||||
|
||||
function Details.UnitDamage (unitId, segment)
|
||||
segment = segment or 0
|
||||
@@ -128,7 +132,8 @@ end
|
||||
--[=[
|
||||
Details.UnitSpellDamage (unitId, spellId, segment)
|
||||
--=]=]
|
||||
Details.API_Description.UnitSpellDamage = {
|
||||
tinsert (Details.API_Description, {
|
||||
name = "UnitSpellDamage",
|
||||
desc = "Query the total damage done of a spell casted by the unit.",
|
||||
parameters = {
|
||||
{
|
||||
@@ -157,7 +162,8 @@ Details.API_Description.UnitSpellDamage = {
|
||||
desc = "Number representing the spell damage done.",
|
||||
}
|
||||
},
|
||||
}
|
||||
type = 1, --damage
|
||||
})
|
||||
|
||||
function Details.UnitSpellDamage (unitId, spellId, segment)
|
||||
segment = segment or 0
|
||||
@@ -198,7 +204,8 @@ end
|
||||
--[=[
|
||||
Details.UnitSpells (unitId, segment)
|
||||
--=]=]
|
||||
Details.API_Description.UnitSpells = {
|
||||
tinsert (Details.API_Description, {
|
||||
name = "UnitDamageSpells",
|
||||
desc = "Return a numeric table with spells IDs used by the unit.",
|
||||
parameters = {
|
||||
{
|
||||
@@ -221,9 +228,10 @@ Details.API_Description.UnitSpells = {
|
||||
desc = "Number representing the spell damage done.",
|
||||
}
|
||||
},
|
||||
}
|
||||
type = 1, --damage
|
||||
})
|
||||
|
||||
function Details.UnitSpells (unitId, segment)
|
||||
function Details.UnitDamageSpells (unitId, segment)
|
||||
segment = segment or 0
|
||||
local combatObject = getCombatObject (segment)
|
||||
|
||||
@@ -251,7 +259,8 @@ end
|
||||
--[=[
|
||||
Details.UnitDamageTaken (unitId, segment)
|
||||
--=]=]
|
||||
Details.API_Description.UnitDamageTaken = {
|
||||
tinsert (Details.API_Description, {
|
||||
name = "UnitDamageTaken",
|
||||
desc = "Query the unit damage taken.",
|
||||
parameters = {
|
||||
{
|
||||
@@ -274,7 +283,8 @@ Details.API_Description.UnitDamageTaken = {
|
||||
desc = "Number representing the damage taken by the unit.",
|
||||
}
|
||||
},
|
||||
}
|
||||
type = 1, --damage
|
||||
})
|
||||
|
||||
function Details.UnitDamageTaken (unitId, segment)
|
||||
segment = segment or 0
|
||||
@@ -297,7 +307,8 @@ end
|
||||
--[=[
|
||||
Details.UnitDamageOnUnit (unitId, targetUnitId, segment)
|
||||
--=]=]
|
||||
Details.API_Description.UnitDamageOnUnit = {
|
||||
tinsert (Details.API_Description, {
|
||||
name = "UnitDamageOnUnit",
|
||||
desc = "Query the unit damage done on another unit.",
|
||||
parameters = {
|
||||
{
|
||||
@@ -326,7 +337,8 @@ Details.API_Description.UnitDamageOnUnit = {
|
||||
desc = "Number representing the damage done by the unit on the target unit.",
|
||||
}
|
||||
},
|
||||
}
|
||||
type = 1, --damage
|
||||
})
|
||||
|
||||
function Details.UnitDamageOnUnit (unitId, targetUnitId, segment)
|
||||
segment = segment or 0
|
||||
@@ -350,7 +362,8 @@ end
|
||||
--[=[
|
||||
Details.UnitDamageTakenFromSpell (unitId, spellId, segment)
|
||||
--=]=]
|
||||
Details.API_Description.UnitDamageTakenFromSpell = {
|
||||
tinsert (Details.API_Description, {
|
||||
name = "UnitDamageTakenFromSpell",
|
||||
desc = "Query the unit damage taken from a spell.",
|
||||
parameters = {
|
||||
{
|
||||
@@ -379,7 +392,8 @@ Details.API_Description.UnitDamageTakenFromSpell = {
|
||||
desc = "Number representing the damage taken by the unit from a spell.",
|
||||
}
|
||||
},
|
||||
}
|
||||
type = 1, --damage
|
||||
})
|
||||
|
||||
function Details.UnitDamageTakenFromSpell (unitId, spellId, segment)
|
||||
segment = segment or 0
|
||||
@@ -413,7 +427,8 @@ end
|
||||
--[=[
|
||||
Details.UnitDamageInfo (unitId, segment)
|
||||
--=]=]
|
||||
Details.API_Description.UnitDamageInfo = {
|
||||
tinsert (Details.API_Description, {
|
||||
name = "UnitDamageInfo",
|
||||
desc = "Return a table with damage information.",
|
||||
parameters = {
|
||||
{
|
||||
@@ -436,7 +451,8 @@ Details.API_Description.UnitDamageInfo = {
|
||||
desc = "Table containing damage information, keys are: .total, .totalWithoutPet, .damageAbsorbed, .damageTaken, .friendlyFire and .activityTime",
|
||||
}
|
||||
},
|
||||
}
|
||||
type = 1, --damage
|
||||
})
|
||||
|
||||
function Details.UnitDamageInfo (unitId, segment)
|
||||
segment = segment or 0
|
||||
@@ -476,7 +492,8 @@ end
|
||||
--[=[
|
||||
Details.UnitSpellInfo (unitId, spellId, segment)
|
||||
--=]=]
|
||||
Details.API_Description.UnitSpellInfo = {
|
||||
tinsert (Details.API_Description, {
|
||||
name = "UnitDamageSpellInfo",
|
||||
desc = "Return a table with the spell damage information.",
|
||||
parameters = {
|
||||
{
|
||||
@@ -505,9 +522,10 @@ Details.API_Description.UnitSpellInfo = {
|
||||
desc = "Table containing damage information, keys are: '.total', '.spellId', '.count', '.name', '.casted', '.regularMin', '.regularMax', '.regularAmount', '.regularDamage', '.criticalMin', '.criticalMax', '.criticalAmount', '.criticalDamage'",
|
||||
}
|
||||
},
|
||||
}
|
||||
type = 1, --damage
|
||||
})
|
||||
|
||||
function Details.UnitSpellInfo (unitId, spellId, segment)
|
||||
function Details.UnitDamageSpellInfo (unitId, spellId, segment)
|
||||
segment = segment or 0
|
||||
local combatObject = getCombatObject (segment)
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ function SlashCmdList.DETAILS (msg, editbox)
|
||||
|
||||
elseif (command == "api") then
|
||||
_detalhes.OpenAPI()
|
||||
|
||||
|
||||
|
||||
elseif (command == Loc ["STRING_SLASH_NEW"] or command == "new") then
|
||||
_detalhes:CriarInstancia (nil, true)
|
||||
|
||||
+56
-2
@@ -168,6 +168,55 @@
|
||||
|
||||
local tick_time = 0
|
||||
|
||||
--from weakauras, list of functions to block on scripts
|
||||
--source https://github.com/WeakAuras/WeakAuras2/blob/520951a4b49b64cb49d88c1a8542d02bbcdbe412/WeakAuras/AuraEnvironment.lua#L66
|
||||
local blockedFunctions = {
|
||||
-- Lua functions that may allow breaking out of the environment
|
||||
getfenv = true,
|
||||
getfenv = true,
|
||||
loadstring = true,
|
||||
pcall = true,
|
||||
xpcall = true,
|
||||
getglobal = true,
|
||||
|
||||
-- blocked WoW API
|
||||
SendMail = true,
|
||||
SetTradeMoney = true,
|
||||
AddTradeMoney = true,
|
||||
PickupTradeMoney = true,
|
||||
PickupPlayerMoney = true,
|
||||
TradeFrame = true,
|
||||
MailFrame = true,
|
||||
EnumerateFrames = true,
|
||||
RunScript = true,
|
||||
AcceptTrade = true,
|
||||
SetSendMailMoney = true,
|
||||
EditMacro = true,
|
||||
SlashCmdList = true,
|
||||
DevTools_DumpCommand = true,
|
||||
hash_SlashCmdList = true,
|
||||
CreateMacro = true,
|
||||
SetBindingMacro = true,
|
||||
GuildDisband = true,
|
||||
GuildUninvite = true,
|
||||
securecall = true,
|
||||
|
||||
--additional
|
||||
setmetatable = true,
|
||||
}
|
||||
|
||||
local functionFilter = setmetatable ({}, {__index = function (env, key)
|
||||
if (key == "_G") then
|
||||
return env
|
||||
|
||||
elseif (blockedFunctions [key]) then
|
||||
return nil
|
||||
|
||||
else
|
||||
return _G [key]
|
||||
end
|
||||
end})
|
||||
|
||||
--> starting a combat
|
||||
function _detalhes:TimeDataCreateCombatTables()
|
||||
|
||||
@@ -189,13 +238,18 @@
|
||||
|
||||
if (type (t [INDEX_FUNCTION]) == "string") then
|
||||
--> user
|
||||
local func = loadstring (t [INDEX_FUNCTION])
|
||||
local func, errortext = loadstring (t [INDEX_FUNCTION])
|
||||
if (func) then
|
||||
setfenv (func, functionFilter)
|
||||
tinsert (exec, { func = func, data = data, attributes = table_deepcopy (t [INDEX_MATRIX]), is_user = true })
|
||||
else
|
||||
_detalhes:Msg ("|cFFFF9900error compiling script for time data (charts)|r: ", errortext)
|
||||
end
|
||||
else
|
||||
--> plugin
|
||||
tinsert (exec, { func = t [INDEX_FUNCTION], data = data, attributes = table_deepcopy (t [INDEX_MATRIX]) })
|
||||
local func = t [INDEX_FUNCTION]
|
||||
setfenv (func, functionFilter)
|
||||
tinsert (exec, { func = func, data = data, attributes = table_deepcopy (t [INDEX_MATRIX]) })
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -6848,6 +6848,57 @@ function _detalhes:RefreshMicroDisplays()
|
||||
_detalhes.StatusBar:UpdateOptions (self)
|
||||
end
|
||||
|
||||
|
||||
--from weakauras, list of functions to block on scripts
|
||||
--source https://github.com/WeakAuras/WeakAuras2/blob/520951a4b49b64cb49d88c1a8542d02bbcdbe412/WeakAuras/AuraEnvironment.lua#L66
|
||||
local blockedFunctions = {
|
||||
-- Lua functions that may allow breaking out of the environment
|
||||
getfenv = true,
|
||||
getfenv = true,
|
||||
loadstring = true,
|
||||
pcall = true,
|
||||
xpcall = true,
|
||||
getglobal = true,
|
||||
|
||||
-- blocked WoW API
|
||||
SendMail = true,
|
||||
SetTradeMoney = true,
|
||||
AddTradeMoney = true,
|
||||
PickupTradeMoney = true,
|
||||
PickupPlayerMoney = true,
|
||||
TradeFrame = true,
|
||||
MailFrame = true,
|
||||
EnumerateFrames = true,
|
||||
RunScript = true,
|
||||
AcceptTrade = true,
|
||||
SetSendMailMoney = true,
|
||||
EditMacro = true,
|
||||
SlashCmdList = true,
|
||||
DevTools_DumpCommand = true,
|
||||
hash_SlashCmdList = true,
|
||||
CreateMacro = true,
|
||||
SetBindingMacro = true,
|
||||
GuildDisband = true,
|
||||
GuildUninvite = true,
|
||||
securecall = true,
|
||||
|
||||
--additional
|
||||
setmetatable = true,
|
||||
}
|
||||
|
||||
--function filter
|
||||
local functionFilter = setmetatable ({}, {__index = function (env, key)
|
||||
if (key == "_G") then
|
||||
return env
|
||||
|
||||
elseif (blockedFunctions [key]) then
|
||||
return nil
|
||||
|
||||
else
|
||||
return _G [key]
|
||||
end
|
||||
end})
|
||||
|
||||
function _detalhes:ChangeSkin (skin_name)
|
||||
|
||||
if (not skin_name) then
|
||||
@@ -7128,22 +7179,39 @@ function _detalhes:ChangeSkin (skin_name)
|
||||
--> set the scale
|
||||
self:SetWindowScale()
|
||||
|
||||
-->: refresh lock buttons
|
||||
--> refresh lock buttons
|
||||
self:RefreshLockedState()
|
||||
|
||||
--> clear any control sscript running in this instance
|
||||
self.bgframe:SetScript ("OnUpdate", nil)
|
||||
self.bgframe.skin_script = nil
|
||||
|
||||
--> check if the skin has control scripts to run
|
||||
if (not just_updating or _detalhes.initializing) then
|
||||
if (this_skin.callback) then
|
||||
this_skin:callback (self, just_updating)
|
||||
local callbackFunc = this_skin.callback
|
||||
if (callbackFunc) then
|
||||
setfenv (callbackFunc, functionFilter)
|
||||
local okey, result = pcall (callbackFunc, this_skin, self, just_updating)
|
||||
if (not okey) then
|
||||
_detalhes:Msg ("|cFFFF9900error on skin callback function|r:", result)
|
||||
end
|
||||
end
|
||||
|
||||
if (this_skin.control_script) then
|
||||
if (this_skin.control_script_on_start) then
|
||||
this_skin:control_script_on_start (self)
|
||||
local onStartScript = this_skin.control_script_on_start
|
||||
if (onStartScript) then
|
||||
setfenv (onStartScript, functionFilter)
|
||||
local okey, result = pcall (onStartScript, this_skin, self)
|
||||
if (not okey) then
|
||||
_detalhes:Msg ("|cFFFF9900error on skin control on start function|r:", result)
|
||||
end
|
||||
end
|
||||
self.bgframe:SetScript ("OnUpdate", this_skin.control_script)
|
||||
|
||||
local controlFunc = this_skin.control_script
|
||||
setfenv (controlFunc, functionFilter)
|
||||
self.bgframe:SetScript ("OnUpdate", controlFunc)
|
||||
self.bgframe.skin_script = true
|
||||
self.bgframe.skin = this_skin
|
||||
--self.bgframe.skin_script_instance = true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
+53
-1
@@ -1623,7 +1623,9 @@ function _G._detalhes:Start()
|
||||
|
||||
--> open welcome
|
||||
if (self.is_first_run) then
|
||||
_detalhes:OpenWelcomeWindow()
|
||||
C_Timer.After (1, function() --wait details full load the rest of the systems before executing the welcome window
|
||||
_detalhes:OpenWelcomeWindow()
|
||||
end)
|
||||
end
|
||||
|
||||
--> load broadcaster tools
|
||||
@@ -1733,11 +1735,61 @@ function _G._detalhes:Start()
|
||||
local codeTable = _detalhes.run_code
|
||||
_detalhes.AutoRunCode = {}
|
||||
|
||||
--from weakauras, list of functions to block on scripts
|
||||
--source https://github.com/WeakAuras/WeakAuras2/blob/520951a4b49b64cb49d88c1a8542d02bbcdbe412/WeakAuras/AuraEnvironment.lua#L66
|
||||
local blockedFunctions = {
|
||||
-- Lua functions that may allow breaking out of the environment
|
||||
getfenv = true,
|
||||
getfenv = true,
|
||||
loadstring = true,
|
||||
pcall = true,
|
||||
xpcall = true,
|
||||
getglobal = true,
|
||||
|
||||
-- blocked WoW API
|
||||
SendMail = true,
|
||||
SetTradeMoney = true,
|
||||
AddTradeMoney = true,
|
||||
PickupTradeMoney = true,
|
||||
PickupPlayerMoney = true,
|
||||
TradeFrame = true,
|
||||
MailFrame = true,
|
||||
EnumerateFrames = true,
|
||||
RunScript = true,
|
||||
AcceptTrade = true,
|
||||
SetSendMailMoney = true,
|
||||
EditMacro = true,
|
||||
SlashCmdList = true,
|
||||
DevTools_DumpCommand = true,
|
||||
hash_SlashCmdList = true,
|
||||
CreateMacro = true,
|
||||
SetBindingMacro = true,
|
||||
GuildDisband = true,
|
||||
GuildUninvite = true,
|
||||
securecall = true,
|
||||
|
||||
--additional
|
||||
setmetatable = true,
|
||||
}
|
||||
|
||||
local functionFilter = setmetatable ({}, {__index = function (env, key)
|
||||
if (key == "_G") then
|
||||
return env
|
||||
|
||||
elseif (blockedFunctions [key]) then
|
||||
return nil
|
||||
|
||||
else
|
||||
return _G [key]
|
||||
end
|
||||
end})
|
||||
|
||||
--> compile and store code
|
||||
function _detalhes:RecompileAutoRunCode()
|
||||
for codeKey, code in pairs (codeTable) do
|
||||
local func, errorText = loadstring (code)
|
||||
if (func) then
|
||||
setfenv (func, functionFilter)
|
||||
_detalhes.AutoRunCode [codeKey] = func
|
||||
else
|
||||
--> if the code didn't pass, create a dummy function for it without triggering errors
|
||||
|
||||
Reference in New Issue
Block a user