view Devent.lua @ 111:5c591d9b4029 tip

Added tag v8.0.1-20181807-1 for changeset 930922e1ec5b
author Nenue
date Wed, 18 Jul 2018 15:02:50 -0400
parents 7a36f5a92f0a
children
line wrap: on
line source
--- Devian - Devent.lua
-- @file-author@
-- @project-revision@ @project-hash@
-- @file-revision@ @file-hash@
-- Created: 4/12/2017 5:07 PM
-- Event tracer
--
local tooltip = GameTooltip
local traces = {}  -- frames
local eventLog = {} -- events received
local selectedEvents = {} -- events selected
local print = function(...) print('Devent', ...) end

--print('Devent script')
--print('Devent:OnLoad()')
SLASH_DTRACE1 = "/dtrace"

SlashCmdList.DTRACE = function(args)
  if #traces == 0 then
    local trace = CreateFrame('Frame', 'DevianTraceLog'.. (#traces+1), UIParent, 'DevianEventTraceTemplate')
    tinsert(traces, trace)
    trace:Setup()
  end

  traces[1]:Show()
end
DevianEventTraceMixin = {
  events = {},
  selected = {},
}
local tracer = DevianEventTraceMixin

function tracer:OnLoad()
  self:SetMaxResize(GetScreenWidth(), GetScreenHeight())
  self:SetMinResize(100, 24)
  self:EnableMouse(true)
  self:RegisterForDrag('LeftButton')
  self:SetMovable(true)
  self:SetResizable(true)
  self:SetClampedToScreen(true)
  self:SetFont("Interface\\Addons\\Devian\\font\\SourceCodePro-Regular.ttf", 13, 'NORMAL')
  self:SetJustifyH('LEFT')
  self:SetHyperlinksEnabled(true)
  self:SetPoint('CENTER')
  self:SetSize(400,400)
end

function tracer:Setup(info)
  if not info then
    self:RegisterAllEvents()
    return
  end

  for _, event in ipairs(self.events) do
    self:UnregisterEvent(event)
  end

  for _, event in ipairs(info.events) do
    self:RegisterEvent(event)
  end
end

function tracer:OnHyperlinkEnter(linkdata, link)
  local messageID = tonumber(linkdata:match('%d+'))
  if messageID and self.events[messageID] then
    local data = self.events[messageID]
    tooltip:SetOwner(self, 'ANCHOR_RIGHT')
    tooltip:AddLine(data.event)
    for i, arg in ipairs(data.args) do
      local argtype = data.argtypes[i]
      tooltip:AddLine('|cFFAAAAAA'..tostring(argtype)..'|r ' .. tostring(arg))
    end
    tooltip:Show()
  end

end

function tracer:OnHyperlinkLeave(linkdata, link)
end

function tracer:OnHyperlinkClick(linkdata, link)

  local messageID = tonumber(linkdata:match('%d+'))
  if messageID and self.events[messageID] then
    local data = self.events[messageID]

    if self.selected[data.event] then
      self.selected[data.event] = nil
    else
      self.selected[data.event] = true
    end
  end
  self:Update()
end

function tracer:OnLeave()
  if tooltip:IsOwned(self) then
    tooltip:Hide()
  end
end

function tracer:OnEvent(event, ...)
  local entry = {
    index = #self.events + 1,
    ts = time(),
    event = event,
    args = {},
    argtypes = {}
  }
    for i = 1, select('#', ...) do
    local arg = select(i,...)
      entry.argtypes[i] = type(arg)
      entry.args[i] = tostring(arg)
  end
  self.events[entry.index] = entry
  self:Update()
end

function tracer:Update()
  local startingLine = self.CurrentLine or #self.events
  local prevLine
  for i = 0, 20 do
    local index = startingLine - i
    local line = self.lines[i]
    if not line then
      line = self:CreateFontString('EventLine'..i)
      line:SetFont([[Fonts\ARIALN__.TTF]], 14, 'THIN')
      line:SetTextColor(1,1,1)
      self.lines[i] = line
    end
    local entry = self.events[index]

    if entry then
      line:SetText('|Hdevent:'..entry.index..'|h'..entry.event..'|h')
      line:ClearAllPoints()
      if prevLine then
        line:SetPoint('BOTTOMLEFT', prevLine, 'TOPLEFT', 0, 0)
      else
        line:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT')
      end
      line:Show()
      prevLine = line
    else
      line:Hide()
    end
  end

end