Nenue@108: --- Devian - Devent.lua Nenue@108: -- @file-author@ Nenue@108: -- @project-revision@ @project-hash@ Nenue@108: -- @file-revision@ @file-hash@ Nenue@108: -- Created: 4/12/2017 5:07 PM Nenue@108: -- Event tracer Nenue@107: -- Nenue@107: local tooltip = GameTooltip Nenue@107: local traces = {} -- frames Nenue@107: local eventLog = {} -- events received Nenue@107: local selectedEvents = {} -- events selected Nenue@107: local print = function(...) print('Devent', ...) end Nenue@107: Nenue@107: --print('Devent script') Nenue@107: --print('Devent:OnLoad()') Nenue@107: SLASH_DTRACE1 = "/dtrace" Nenue@107: Nenue@107: SlashCmdList.DTRACE = function(args) Nenue@107: if #traces == 0 then Nenue@107: local trace = CreateFrame('Frame', 'DevianTraceLog'.. (#traces+1), UIParent, 'DevianEventTraceTemplate') Nenue@107: tinsert(traces, trace) Nenue@107: trace:Setup() Nenue@107: end Nenue@107: Nenue@107: traces[1]:Show() Nenue@107: end Nenue@107: DevianEventTraceMixin = { Nenue@107: events = {}, Nenue@107: selected = {}, Nenue@107: } Nenue@107: local tracer = DevianEventTraceMixin Nenue@107: Nenue@107: function tracer:OnLoad() Nenue@107: self:SetMaxResize(GetScreenWidth(), GetScreenHeight()) Nenue@107: self:SetMinResize(100, 24) Nenue@107: self:EnableMouse(true) Nenue@107: self:RegisterForDrag('LeftButton') Nenue@107: self:SetMovable(true) Nenue@107: self:SetResizable(true) Nenue@107: self:SetClampedToScreen(true) Nenue@107: self:SetFont("Interface\\Addons\\Devian\\font\\SourceCodePro-Regular.ttf", 13, 'NORMAL') Nenue@107: self:SetJustifyH('LEFT') Nenue@107: self:SetHyperlinksEnabled(true) Nenue@107: self:SetPoint('CENTER') Nenue@107: self:SetSize(400,400) Nenue@107: end Nenue@107: Nenue@107: function tracer:Setup(info) Nenue@107: if not info then Nenue@107: self:RegisterAllEvents() Nenue@107: return Nenue@107: end Nenue@107: Nenue@107: for _, event in ipairs(self.events) do Nenue@107: self:UnregisterEvent(event) Nenue@107: end Nenue@107: Nenue@107: for _, event in ipairs(info.events) do Nenue@107: self:RegisterEvent(event) Nenue@107: end Nenue@107: end Nenue@107: Nenue@107: function tracer:OnHyperlinkEnter(linkdata, link) Nenue@107: local messageID = tonumber(linkdata:match('%d+')) Nenue@107: if messageID and self.events[messageID] then Nenue@107: local data = self.events[messageID] Nenue@107: tooltip:SetOwner(self, 'ANCHOR_RIGHT') Nenue@107: tooltip:AddLine(data.event) Nenue@107: for i, arg in ipairs(data.args) do Nenue@107: local argtype = data.argtypes[i] Nenue@107: tooltip:AddLine('|cFFAAAAAA'..tostring(argtype)..'|r ' .. tostring(arg)) Nenue@107: end Nenue@107: tooltip:Show() Nenue@107: end Nenue@107: Nenue@107: end Nenue@107: Nenue@107: function tracer:OnHyperlinkLeave(linkdata, link) Nenue@107: end Nenue@107: Nenue@107: function tracer:OnHyperlinkClick(linkdata, link) Nenue@107: Nenue@107: local messageID = tonumber(linkdata:match('%d+')) Nenue@107: if messageID and self.events[messageID] then Nenue@107: local data = self.events[messageID] Nenue@107: Nenue@107: if self.selected[data.event] then Nenue@107: self.selected[data.event] = nil Nenue@107: else Nenue@107: self.selected[data.event] = true Nenue@107: end Nenue@107: end Nenue@107: self:Update() Nenue@107: end Nenue@107: Nenue@107: function tracer:OnLeave() Nenue@107: if tooltip:IsOwned(self) then Nenue@107: tooltip:Hide() Nenue@107: end Nenue@107: end Nenue@107: Nenue@107: function tracer:OnEvent(event, ...) Nenue@107: local entry = { Nenue@107: index = #self.events + 1, Nenue@107: ts = time(), Nenue@107: event = event, Nenue@107: args = {}, Nenue@107: argtypes = {} Nenue@107: } Nenue@107: for i = 1, select('#', ...) do Nenue@107: local arg = select(i,...) Nenue@107: entry.argtypes[i] = type(arg) Nenue@107: entry.args[i] = tostring(arg) Nenue@107: end Nenue@107: self.events[entry.index] = entry Nenue@107: self:Update() Nenue@107: end Nenue@107: Nenue@107: function tracer:Update() Nenue@107: local startingLine = self.CurrentLine or #self.events Nenue@107: local prevLine Nenue@107: for i = 0, 20 do Nenue@107: local index = startingLine - i Nenue@107: local line = self.lines[i] Nenue@107: if not line then Nenue@107: line = self:CreateFontString('EventLine'..i) Nenue@107: line:SetFont([[Fonts\ARIALN__.TTF]], 14, 'THIN') Nenue@107: line:SetTextColor(1,1,1) Nenue@107: self.lines[i] = line Nenue@107: end Nenue@107: local entry = self.events[index] Nenue@107: Nenue@107: if entry then Nenue@107: line:SetText('|Hdevent:'..entry.index..'|h'..entry.event..'|h') Nenue@107: line:ClearAllPoints() Nenue@107: if prevLine then Nenue@107: line:SetPoint('BOTTOMLEFT', prevLine, 'TOPLEFT', 0, 0) Nenue@107: else Nenue@107: line:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT') Nenue@107: end Nenue@107: line:Show() Nenue@107: prevLine = line Nenue@107: else Nenue@107: line:Hide() Nenue@107: end Nenue@107: end Nenue@107: Nenue@107: end