local _detalhes = _G._detalhes local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) local libwindow = LibStub ("LibWindow-1.1") ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> local pointers local _math_floor = math.floor --lua local local _type = type --lua local local _math_abs = math.abs --lua local local _math_min = math.min local _math_max = math.max local _ipairs = ipairs --lua local local _GetScreenWidth = GetScreenWidth --wow api local local _GetScreenHeight = GetScreenHeight --wow api local local _UIParent = UIParent --wow api local local gump = _detalhes.gump --details local local _ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> constants local end_window_spacement = 0 --prefix used on sync statistics local CONST_GUILD_SYNC = "GS" --> settings local animation_speed = 33 local animation_speed_hightravel_trigger = 5 local animation_speed_hightravel_maxspeed = 3 local animation_speed_lowtravel_minspeed = 0.33 local animation_func_left local animation_func_right gump:NewColor ("DETAILS_API_ICON", .5, .4, .3, 1) gump:NewColor ("DETAILS_STATISTICS_ICON", .8, .8, .8, 1) ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> core function _detalhes:AnimarSplit (barra, goal) barra.inicio = barra.split.barra:GetValue() barra.fim = goal barra.proximo_update = 0 barra.tem_animacao = true barra:SetScript ("OnUpdate", self.FazerAnimacaoSplit) end function _detalhes:FazerAnimacaoSplit (elapsed) local velocidade = 0.8 if (self.fim > self.inicio) then self.inicio = self.inicio+velocidade self.split.barra:SetValue (self.inicio) self.split.div:SetPoint ("left", self.split.barra, "left", self.split.barra:GetValue()* (self.split.barra:GetWidth()/100) - 4, 0) if (self.inicio+1 >= self.fim) then self.tem_animacao = false self:SetScript ("OnUpdate", nil) end else self.inicio = self.inicio-velocidade self.split.barra:SetValue (self.inicio) self.split.div:SetPoint ("left", self.split.barra, "left", self.split.barra:GetValue()* (self.split.barra:GetWidth()/100) - 4, 0) if (self.inicio-1 <= self.fim) then self.tem_animacao = false self:SetScript ("OnUpdate", nil) end end self.proximo_update = 0 end function _detalhes:fazer_animacoes (amt_barras) if (self.bars_sort_direction == 2) then for i = _math_min (self.rows_fit_in_window, amt_barras) - 1, 1, -1 do local row = self.barras [i] local row_proxima = self.barras [i-1] if (row_proxima and not row.animacao_ignorar) then local v = row.statusbar.value local v_proxima = row_proxima.statusbar.value if (v_proxima > v) then if (row.animacao_fim >= v_proxima) then row:SetValue (v_proxima) else row:SetValue (row.animacao_fim) row_proxima.statusbar:SetValue (row.animacao_fim) end end end end for i = 1, self.rows_fit_in_window -1 do local row = self.barras [i] if (row.animacao_ignorar) then row.animacao_ignorar = nil if (row.tem_animacao) then row.tem_animacao = false row:SetScript ("OnUpdate", nil) end else if (row.animacao_fim ~= row.animacao_fim2) then _detalhes:AnimarBarra (row, row.animacao_fim) row.animacao_fim2 = row.animacao_fim end end end else for i = 2, self.rows_fit_in_window do local row = self.barras [i] local row_proxima = self.barras [i+1] if (row_proxima and not row.animacao_ignorar) then local v = row.statusbar.value local v_proxima = row_proxima.statusbar.value if (v_proxima > v) then if (row.animacao_fim >= v_proxima) then row:SetValue (v_proxima) else row:SetValue (row.animacao_fim) row_proxima.statusbar:SetValue (row.animacao_fim) end end end end for i = 2, self.rows_fit_in_window do local row = self.barras [i] if (row.animacao_ignorar) then row.animacao_ignorar = nil if (row.tem_animacao) then row.tem_animacao = false row:SetScript ("OnUpdate", nil) end else if (row.animacao_fim ~= row.animacao_fim2) then _detalhes:AnimarBarra (row, row.animacao_fim) row.animacao_fim2 = row.animacao_fim end end end end end --> simple left and right animations by delta time local animation_left_simple = function (self, deltaTime) self.inicio = self.inicio - (animation_speed * deltaTime) self:SetValue (self.inicio) if (self.inicio-1 <= self.fim) then self.tem_animacao = false self:SetScript ("OnUpdate", nil) end end local animation_right_simple = function (self, deltaTime) self.inicio = self.inicio + (animation_speed * deltaTime) self:SetValue (self.inicio) if (self.inicio+0.1 >= self.fim) then self.tem_animacao = false self:SetScript ("OnUpdate", nil) end end --> animation with acceleration local animation_left_with_accel = function (self, deltaTime) local distance = self.inicio - self.fim -- DefaultSpeed * max of ( min of (Distance / TriggerSpeed , MaxSpeed) , LowSpeed ) local calcAnimationSpeed = animation_speed * _math_max (_math_min (distance/animation_speed_hightravel_trigger, animation_speed_hightravel_maxspeed), animation_speed_lowtravel_minspeed) self.inicio = self.inicio - (calcAnimationSpeed * deltaTime) self:SetValue (self.inicio) if (self.inicio-0.1 <= self.fim) then self.tem_animacao = false self:SetScript ("OnUpdate", nil) end end local animation_right_with_accel = function (self, deltaTime) local distance = self.fim - self.inicio local calcAnimationSpeed = animation_speed * _math_max (_math_min (distance/animation_speed_hightravel_trigger, animation_speed_hightravel_maxspeed), animation_speed_lowtravel_minspeed) self.inicio = self.inicio + (calcAnimationSpeed * deltaTime) self:SetValue (self.inicio) if (self.inicio+0.1 >= self.fim) then self.tem_animacao = false self:SetScript ("OnUpdate", nil) end end --> initiate with defaults animation_func_left = animation_left_simple animation_func_right = animation_right_simple function _detalhes:AnimarBarra (esta_barra, fim) esta_barra.inicio = esta_barra.statusbar.value esta_barra.fim = fim esta_barra.tem_animacao = true if (esta_barra.fim > esta_barra.inicio) then esta_barra:SetScript ("OnUpdate", animation_func_right) else esta_barra:SetScript ("OnUpdate", animation_func_left) end end function _detalhes:RefreshAnimationFunctions() if (_detalhes.streamer_config.use_animation_accel) then animation_func_left = animation_left_with_accel animation_func_right = animation_right_with_accel else animation_func_left = animation_left_simple animation_func_right = animation_right_simple end animation_speed = _detalhes.animation_speed animation_speed_hightravel_trigger = _detalhes.animation_speed_triggertravel animation_speed_hightravel_maxspeed = _detalhes.animation_speed_maxtravel animation_speed_lowtravel_minspeed = _detalhes.animation_speed_mintravel end --deprecated function _detalhes:FazerAnimacao_Esquerda (deltaTime) self.inicio = self.inicio - (animation_speed * deltaTime) self:SetValue (self.inicio) if (self.inicio-1 <= self.fim) then self.tem_animacao = false self:SetScript ("OnUpdate", nil) end end function _detalhes:FazerAnimacao_Direita (deltaTime) self.inicio = self.inicio + (animation_speed * deltaTime) self:SetValue (self.inicio) if (self.inicio+0.1 >= self.fim) then self.tem_animacao = false self:SetScript ("OnUpdate", nil) end end function _detalhes:AtualizaPontos() local _x, _y = self:GetPositionOnScreen() if (not _x) then return end local _w, _h = self:GetRealSize() local metade_largura = _w/2 local metade_altura = _h/2 local statusbar_y_mod = 0 if (not self.show_statusbar) then statusbar_y_mod = 14 * self.baseframe:GetScale() end if (not self.ponto1) then self.ponto1 = {x = _x - metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topleft self.ponto2 = {x = _x - metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomleft self.ponto3 = {x = _x + metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomright self.ponto4 = {x = _x + metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topright else self.ponto1.x = _x - metade_largura self.ponto1.y = _y + metade_altura + (statusbar_y_mod*-1) self.ponto2.x = _x - metade_largura self.ponto2.y = _y - metade_altura + statusbar_y_mod self.ponto3.x = _x + metade_largura self.ponto3.y = _y - metade_altura + statusbar_y_mod self.ponto4.x = _x + metade_largura self.ponto4.y = _y + metade_altura + (statusbar_y_mod*-1) end end -------------------------------------------------------------------------------------------------------- --> LibWindow-1.1 by Mikk http://www.wowace.com/profiles/mikk/ --> this is the restore function from Libs\LibWindow-1.1\LibWindow-1.1.lua. --> we can't schedule a new save after restoring, we save it inside the instance without frame references and always attach to UIparent. function _detalhes:RestoreLibWindow() local frame = self.baseframe if (frame) then if (self.libwindow.x) then local x = self.libwindow.x local y = self.libwindow.y local point = self.libwindow.point local s = self.libwindow.scale if s then (frame.lw11origSetScale or frame.SetScale)(frame,s) else s = frame:GetScale() end if not x or not y then -- nothing stored in config yet, smack it in the center x=0; y=0; point="CENTER" end x = x/s y = y/s frame:ClearAllPoints() if not point and y==0 then -- errr why did i do this check again? must have been a reason, but i can't remember it =/ point="CENTER" end --> Details: using UIParent always in order to not break the positioning when using AddonSkin with ElvUI. if not point then -- we have position, but no point, which probably means we're going from data stored by the addon itself before LibWindow was added to it. It was PROBABLY topleft->bottomleft anchored. Most do it that way. frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", x, y) --frame:SetPoint("TOPLEFT", frame:GetParent(), "BOTTOMLEFT", x, y) -- make it compute a better attachpoint (on next update) --_detalhes:ScheduleTimer ("SaveLibWindow", 0.05, self) return end frame:SetPoint(point, UIParent, point, x, y) end end end --> LibWindow-1.1 by Mikk http://www.wowace.com/profiles/mikk/ --> this is the save function from Libs\LibWindow-1.1\LibWindow-1.1.lua. --> we need to make it save inside the instance object without frame references and also we must always use UIParent due to embed settings for ElvUI and LUI. function _detalhes:SaveLibWindow() local frame = self.baseframe if (frame) then local left = frame:GetLeft() if (not left) then return _detalhes:ScheduleTimer ("SaveLibWindow", 0.05, self) end --> Details: we are always using UIParent here or the addon break when using Embeds. local parent = UIParent --local parent = frame:GetParent() or nilParent -- No, this won't work very well with frames that aren't parented to nil or UIParent local s = frame:GetScale() local left,top = frame:GetLeft()*s, frame:GetTop()*s local right,bottom = frame:GetRight()*s, frame:GetBottom()*s local pwidth, pheight = parent:GetWidth(), parent:GetHeight() local x,y,point; if left < (pwidth-right) and left < abs((left+right)/2 - pwidth/2) then x = left; point="LEFT"; elseif (pwidth-right) < abs((left+right)/2 - pwidth/2) then x = right-pwidth; point="RIGHT"; else x = (left+right)/2 - pwidth/2; point=""; end if bottom < (pheight-top) and bottom < abs((bottom+top)/2 - pheight/2) then y = bottom; point="BOTTOM"..point; elseif (pheight-top) < abs((bottom+top)/2 - pheight/2) then y = top-pheight; point="TOP"..point; else y = (bottom+top)/2 - pheight/2; -- point=""..point; end if point=="" then point = "CENTER" end ---------------------------------------- --> save inside the instance object self.libwindow.x = x self.libwindow.y = y self.libwindow.point = point self.libwindow.scale = s end end --> end for libwindow-1.1 -------------------------------------------------------------------------------------------------------- function _detalhes:SaveMainWindowSize() local baseframe_width = self.baseframe:GetWidth() if (not baseframe_width) then return _detalhes:ScheduleTimer ("SaveMainWindowSize", 1, self) end local baseframe_height = self.baseframe:GetHeight() --> calc position local _x, _y = self:GetPositionOnScreen() if (not _x) then return _detalhes:ScheduleTimer ("SaveMainWindowSize", 1, self) end --> save the position local _w = baseframe_width local _h = baseframe_height local mostrando = self.mostrando self.posicao[mostrando].x = _x self.posicao[mostrando].y = _y self.posicao[mostrando].w = _w self.posicao[mostrando].h = _h --> update the 4 points for window groups local metade_largura = _w/2 local metade_altura = _h/2 local statusbar_y_mod = 0 if (not self.show_statusbar) then statusbar_y_mod = 14 * self.baseframe:GetScale() end if (not self.ponto1) then self.ponto1 = {x = _x - metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topleft self.ponto2 = {x = _x - metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomleft self.ponto3 = {x = _x + metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomright self.ponto4 = {x = _x + metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topright else self.ponto1.x = _x - metade_largura self.ponto1.y = _y + metade_altura + (statusbar_y_mod*-1) self.ponto2.x = _x - metade_largura self.ponto2.y = _y - metade_altura + statusbar_y_mod self.ponto3.x = _x + metade_largura self.ponto3.y = _y - metade_altura + statusbar_y_mod self.ponto4.x = _x + metade_largura self.ponto4.y = _y + metade_altura + (statusbar_y_mod*-1) end self.baseframe.BoxBarrasAltura = self.baseframe:GetHeight() - end_window_spacement --> espa�o para o final da janela return {altura = self.baseframe:GetHeight(), largura = self.baseframe:GetWidth(), x = _x, y = _y} end function _detalhes:SaveMainWindowPosition (instance) if (instance) then self = instance end local mostrando = self.mostrando --> get sizes local baseframe_width = self.baseframe:GetWidth() if (not baseframe_width) then return _detalhes:ScheduleTimer ("SaveMainWindowPosition", 1, self) end local baseframe_height = self.baseframe:GetHeight() --> calc position local _x, _y = self:GetPositionOnScreen() if (not _x) then return _detalhes:ScheduleTimer ("SaveMainWindowPosition", 1, self) end if (self.mostrando ~= "solo") then self:SaveLibWindow() end --> save the position local _w = baseframe_width local _h = baseframe_height self.posicao[mostrando].x = _x self.posicao[mostrando].y = _y self.posicao[mostrando].w = _w self.posicao[mostrando].h = _h --> update the 4 points for window groups local metade_largura = _w/2 local metade_altura = _h/2 local statusbar_y_mod = 0 if (not self.show_statusbar) then statusbar_y_mod = 14 * self.baseframe:GetScale() end if (not self.ponto1) then self.ponto1 = {x = _x - metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topleft self.ponto2 = {x = _x - metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomleft self.ponto3 = {x = _x + metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomright self.ponto4 = {x = _x + metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topright else self.ponto1.x = _x - metade_largura self.ponto1.y = _y + metade_altura + (statusbar_y_mod*-1) self.ponto2.x = _x - metade_largura self.ponto2.y = _y - metade_altura + statusbar_y_mod self.ponto3.x = _x + metade_largura self.ponto3.y = _y - metade_altura + statusbar_y_mod self.ponto4.x = _x + metade_largura self.ponto4.y = _y + metade_altura + (statusbar_y_mod*-1) end self.baseframe.BoxBarrasAltura = self.baseframe:GetHeight() - end_window_spacement --> espa�o para o final da janela return {altura = self.baseframe:GetHeight(), largura = self.baseframe:GetWidth(), x = _x, y = _y} end function _detalhes:RestoreMainWindowPosition (pre_defined) if (not pre_defined and self.libwindow.x and self.mostrando == "normal" and not _detalhes.instances_no_libwindow) then local s = self.window_scale self.baseframe:SetScale (s) self.rowframe:SetScale (s) self.baseframe:SetWidth (self.posicao[self.mostrando].w) self.baseframe:SetHeight (self.posicao[self.mostrando].h) self:RestoreLibWindow() self.baseframe.BoxBarrasAltura = self.baseframe:GetHeight() - end_window_spacement --> espa�o para o final da janela return end local s = self.window_scale self.baseframe:SetScale (s) self.rowframe:SetScale (s) local _scale = self.baseframe:GetEffectiveScale() local _UIscale = _UIParent:GetScale() local novo_x = self.posicao[self.mostrando].x*_UIscale/_scale local novo_y = self.posicao[self.mostrando].y*_UIscale/_scale if (pre_defined and pre_defined.x) then --> overwrite novo_x = pre_defined.x*_UIscale/_scale novo_y = pre_defined.y*_UIscale/_scale self.posicao[self.mostrando].w = pre_defined.largura self.posicao[self.mostrando].h = pre_defined.altura elseif (pre_defined and not pre_defined.x) then _detalhes:Msg ("invalid pre_defined table for resize, please rezise the window manually.") end self.baseframe:SetWidth (self.posicao[self.mostrando].w) self.baseframe:SetHeight (self.posicao[self.mostrando].h) self.baseframe:ClearAllPoints() self.baseframe:SetPoint ("CENTER", _UIParent, "CENTER", novo_x, novo_y) end function _detalhes:RestoreMainWindowPositionNoResize (pre_defined, x, y) x = x or 0 y = y or 0 local _scale = self.baseframe:GetEffectiveScale() local _UIscale = _UIParent:GetScale() local novo_x = self.posicao[self.mostrando].x*_UIscale/_scale local novo_y = self.posicao[self.mostrando].y*_UIscale/_scale if (pre_defined) then --> overwrite novo_x = pre_defined.x*_UIscale/_scale novo_y = pre_defined.y*_UIscale/_scale self.posicao[self.mostrando].w = pre_defined.largura self.posicao[self.mostrando].h = pre_defined.altura end self.baseframe:ClearAllPoints() self.baseframe:SetPoint ("CENTER", _UIParent, "CENTER", novo_x + x, novo_y + y) self.baseframe.BoxBarrasAltura = self.baseframe:GetHeight() - end_window_spacement --> espa�o para o final da janela end function _detalhes:CreatePositionTable() local t = {pos_table = true} if (self.libwindow) then t.x = self.libwindow.x t.y = self.libwindow.y t.scale = self.libwindow.scale t.point = self.libwindow.point end --> old way to save positions t.x_legacy = self.posicao.normal.x t.y_legacy = self.posicao.normal.y --> size t.w = self.posicao.normal.w t.h = self.posicao.normal.h return t end function _detalhes:RestorePositionFromPositionTable (t) if (not t.pos_table) then return end if (t.x) then self.libwindow.x = t.x self.libwindow.y = t.y self.libwindow.scale = t.scale self.libwindow.point = t.point end self.posicao.normal.x = t.x_legacy self.posicao.normal.y = t.y_legacy self.posicao.normal.w = t.w self.posicao.normal.h = t.h return self:RestoreMainWindowPosition() end function _detalhes:ResetaGump (instancia, tipo, segmento) if (not instancia or _type (instancia) == "boolean") then segmento = tipo tipo = instancia instancia = self end if (tipo and tipo == 0x1) then --> entrando em combate if (instancia.segmento == -1) then --> esta mostrando a tabela overall return end end if (segmento and instancia.segmento ~= segmento) then return end instancia.barraS = {nil, nil} --> zera o iterator instancia.rows_showing = 0 --> resetou, ent�o n�o esta mostranho nenhuma barra for i = 1, instancia.rows_created, 1 do --> limpa a refer�ncia do que estava sendo mostrado na barra local esta_barra= instancia.barras[i] esta_barra.minha_tabela = nil esta_barra.animacao_fim = 0 esta_barra.animacao_fim2 = 0 end if (instancia.rolagem) then instancia:EsconderScrollBar() --> hida a scrollbar end instancia.need_rolagem = false instancia.bar_mod = nil end function _detalhes:ReajustaGump() if (self.mostrando == "normal") then --> somente alterar o tamanho das barras se tiver mostrando o gump normal if (not self.baseframe.isStretching and self.stretchToo and #self.stretchToo > 0) then if (self.eh_horizontal or self.eh_tudo or (self.verticalSnap and not self.eh_vertical)) then for _, instancia in _ipairs (self.stretchToo) do instancia.baseframe:SetWidth (self.baseframe:GetWidth()) local mod = (self.baseframe:GetWidth() - instancia.baseframe._place.largura) / 2 instancia:RestoreMainWindowPositionNoResize (instancia.baseframe._place, mod, nil) instancia:BaseFrameSnap() end end if ( (self.eh_vertical or self.eh_tudo or not self.eh_horizontal) and (not self.verticalSnap or self.eh_vertical)) then for _, instancia in _ipairs (self.stretchToo) do if (instancia.baseframe) then --> esta criada instancia.baseframe:SetHeight (self.baseframe:GetHeight()) local mod if (self.eh_vertical) then mod = (self.baseframe:GetHeight() - instancia.baseframe._place.altura) / 2 else mod = - (self.baseframe:GetHeight() - instancia.baseframe._place.altura) / 2 end instancia:RestoreMainWindowPositionNoResize (instancia.baseframe._place, nil, mod) instancia:BaseFrameSnap() end end end elseif (self.baseframe.isStretching and self.stretchToo and #self.stretchToo > 0) then if (self.baseframe.stretch_direction == "top") then for _, instancia in _ipairs (self.stretchToo) do instancia.baseframe:SetHeight (self.baseframe:GetHeight()) local mod = (self.baseframe:GetHeight() - instancia.baseframe._place.altura) / 2 instancia:RestoreMainWindowPositionNoResize (instancia.baseframe._place, nil, mod) end elseif (self.baseframe.stretch_direction == "bottom") then for _, instancia in _ipairs (self.stretchToo) do instancia.baseframe:SetHeight (self.baseframe:GetHeight()) local mod = (self.baseframe:GetHeight() - instancia.baseframe._place.altura) / 2 mod = mod * -1 instancia:RestoreMainWindowPositionNoResize (instancia.baseframe._place, nil, mod) end end end if (self.stretch_button_side == 2) then self:StretchButtonAnchor (2) end --> reajusta o freeze if (self.freezed) then _detalhes:Freeze (self) end -- -4 difere a precis�o de quando a barra ser� adicionada ou apagada da barra self.baseframe.BoxBarrasAltura = (self.baseframe:GetHeight()) - end_window_spacement local T = self.rows_fit_in_window if (not T) then --> primeira vez que o gump esta sendo reajustado T = _math_floor (self.baseframe.BoxBarrasAltura / self.row_height) end --> reajustar o local do rel�gio local meio = self.baseframe:GetWidth() / 2 local novo_local = meio - 25 self.rows_fit_in_window = _math_floor ( self.baseframe.BoxBarrasAltura / self.row_height) --> verifica se precisa criar mais barras if (self.rows_fit_in_window > #self.barras) then--> verifica se precisa criar mais barras for i = #self.barras+1, self.rows_fit_in_window, 1 do gump:CriaNovaBarra (self, i) --> cria nova barra end self.rows_created = #self.barras end --> faz um cache do tamanho das barras self.cached_bar_width = self.barras[1] and self.barras[1]:GetWidth() or 0 --> seta a largura das barras if (self.bar_mod and self.bar_mod ~= 0) then for index = 1, self.rows_fit_in_window do self.barras [index]:SetWidth (self.baseframe:GetWidth()+self.bar_mod) end else for index = 1, self.rows_fit_in_window do self.barras [index]:SetWidth (self.baseframe:GetWidth()+self.row_info.space.right) end end --> verifica se precisa esconder ou mostrar alguma barra local A = self.barraS[1] if (not A) then --> primeira vez que o resize esta sendo usado, no caso no startup do addon ou ao criar uma nova inst�ncia --> hida as barras n�o usadas for i = 1, self.rows_created, 1 do gump:Fade (self.barras [i], 1) self.barras [i].on = false end return end local X = self.rows_showing local C = self.rows_fit_in_window --> novo iterator local barras_diff = C - T --> aqui pega a quantidade de barras, se aumentou ou diminuiu if (barras_diff > 0) then --> ganhou barras_diff novas barras local fim_iterator = self.barraS[2] --> posi��o atual fim_iterator = fim_iterator+barras_diff --> nova posi��o local excedeu_iterator = fim_iterator - X --> total que ta sendo mostrado - fim do iterator if (excedeu_iterator > 0) then --> extrapolou fim_iterator = X --> seta o fim do iterator pra ser na ultima barra self.barraS[2] = fim_iterator --> fim do iterator setado local inicio_iterator = self.barraS[1] if (inicio_iterator-excedeu_iterator > 0) then --> se as barras que sobraram preenchem o inicio do iterator inicio_iterator = inicio_iterator-excedeu_iterator --> pega o novo valor do iterator self.barraS[1] = inicio_iterator else self.barraS[1] = 1 --> se ganhou mais barras pra cima, ignorar elas e mover o iterator para a poci��o inicial end else --> se n�o extrapolou esta okey e esta mostrando a quantidade de barras correta self.barraS[2] = fim_iterator end for index = T+1, C do local barra = self.barras[index] if (barra) then if (index <= X) then --gump:Fade (barra, 0) gump:Fade (barra, "out") else --if (self.baseframe.isStretching or self.auto_resize) then gump:Fade (barra, 1) --else -- gump:Fade (barra, 1) --end end end end elseif (barras_diff < 0) then --> perdeu barras_diff barras local fim_iterator = self.barraS[2] --> posi��o atual if (not (fim_iterator == X and fim_iterator < C)) then --> calcula primeiro as barras que foram perdidas s�o barras que n�o estavam sendo usadas --> perdi X barras, diminui X posi��es no iterator local perdeu = _math_abs (barras_diff) if (fim_iterator == X) then --> se o iterator tiver na ultima posi��o perdeu = perdeu - (C - X) end fim_iterator = fim_iterator - perdeu if (fim_iterator < C) then fim_iterator = C end self.barraS[2] = fim_iterator for index = T, C+1, -1 do local barra = self.barras[index] if (barra) then if (self.baseframe.isStretching or self.auto_resize) then gump:Fade (barra, 1) else --gump:Fade (barra, "in", 0.1) gump:Fade (barra, 1) end end end end end if (X <= C) then --> desligar a rolagem if (self.rolagem and not self.baseframe.isStretching) then self:EsconderScrollBar() end self.need_rolagem = false else --> ligar ou atualizar a rolagem if (not self.rolagem and not self.baseframe.isStretching) then self:MostrarScrollBar() end self.need_rolagem = true end --> verificar o tamanho dos nomes local qual_barra = 1 for i = self.barraS[1], self.barraS[2], 1 do local esta_barra = self.barras [qual_barra] local tabela = esta_barra.minha_tabela if (tabela) then --> a barra esta mostrando alguma coisa if (tabela._custom) then tabela (esta_barra, self) elseif (tabela._refresh_window) then tabela:_refresh_window (esta_barra, self) else tabela:RefreshBarra (esta_barra, self, true) end end qual_barra = qual_barra+1 end --> for�a o pr�ximo refresh self.showing[self.atributo].need_refresh = true end end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> panels --> cooltip presets local preset3_backdrop = {bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], edgeFile = [[Interface\AddOns\Details\images\border_3]], tile=true, edgeSize = 16, tileSize = 64, insets = {left = 3, right = 3, top = 4, bottom = 4}} _detalhes.cooltip_preset3_backdrop = preset3_backdrop local white_table = {1, 1, 1, 1} local black_table = {0, 0, 0, 1} local gray_table = {0.37, 0.37, 0.37, 0.95} local preset2_backdrop = {bgFile = [[Interface\AddOns\Details\images\background]], edgeFile = [[Interface\Buttons\WHITE8X8]], tile=true, edgeSize = 1, tileSize = 64, insets = {left = 0, right = 0, top = 0, bottom = 0}} _detalhes.cooltip_preset2_backdrop = preset2_backdrop --"Details BarBorder 3" function _detalhes:CooltipPreset (preset) local GameCooltip = GameCooltip GameCooltip:Reset() if (preset == 1) then GameCooltip:SetOption ("TextFont", "Friz Quadrata TT") GameCooltip:SetOption ("TextColor", "orange") GameCooltip:SetOption ("TextSize", 12) GameCooltip:SetOption ("ButtonsYMod", -4) GameCooltip:SetOption ("YSpacingMod", -4) GameCooltip:SetOption ("IgnoreButtonAutoHeight", true) GameCooltip:SetColor (1, 0.5, 0.5, 0.5, 0.5) elseif (preset == 2) then GameCooltip:SetOption ("TextFont", "Friz Quadrata TT") GameCooltip:SetOption ("TextColor", "orange") GameCooltip:SetOption ("TextSize", 12) GameCooltip:SetOption ("FixedWidth", 220) GameCooltip:SetOption ("ButtonsYMod", -4) GameCooltip:SetOption ("YSpacingMod", -4) GameCooltip:SetOption ("IgnoreButtonAutoHeight", true) GameCooltip:SetColor (1, 0, 0, 0, 0) GameCooltip:SetOption ("LeftBorderSize", -5) GameCooltip:SetOption ("RightBorderSize", 5) GameCooltip:SetBackdrop (1, preset2_backdrop, gray_table, black_table) elseif (preset == 2.1) then GameCooltip:SetOption ("TextFont", "Friz Quadrata TT") GameCooltip:SetOption ("TextColor", "orange") GameCooltip:SetOption ("TextSize", 10) GameCooltip:SetOption ("FixedWidth", 220) GameCooltip:SetOption ("ButtonsYMod", 0) GameCooltip:SetOption ("YSpacingMod", -4) GameCooltip:SetOption ("IgnoreButtonAutoHeight", true) GameCooltip:SetColor (1, 0, 0, 0, 0) GameCooltip:SetBackdrop (1, preset2_backdrop, gray_table, black_table) elseif (preset == 3) then GameCooltip:SetOption ("TextFont", "Friz Quadrata TT") GameCooltip:SetOption ("TextColor", "orange") GameCooltip:SetOption ("TextSize", 12) GameCooltip:SetOption ("FixedWidth", 220) GameCooltip:SetOption ("ButtonsYMod", -4) GameCooltip:SetOption ("YSpacingMod", -4) GameCooltip:SetOption ("IgnoreButtonAutoHeight", true) GameCooltip:SetColor (1, 0.5, 0.5, 0.5, 0.5) GameCooltip:SetBackdrop (1, preset3_backdrop, nil, white_table) end end --> yes no panel do _detalhes.yesNo = _detalhes.gump:NewPanel (UIParent, _, "DetailsYesNoWindow", _, 500, 80) _detalhes.yesNo:SetPoint ("center", UIParent, "center") _detalhes.gump:NewLabel (_detalhes.yesNo, _, "$parentAsk", "ask", "") _detalhes.yesNo ["ask"]:SetPoint ("center", _detalhes.yesNo, "center", 0, 25) _detalhes.yesNo ["ask"]:SetWidth (480) _detalhes.yesNo ["ask"]:SetJustifyH ("center") _detalhes.yesNo ["ask"]:SetHeight (22) _detalhes.gump:NewButton (_detalhes.yesNo, _, "$parentNo", "no", 100, 30, function() _detalhes.yesNo:Hide() end, nil, nil, nil, Loc ["STRING_NO"]) _detalhes.gump:NewButton (_detalhes.yesNo, _, "$parentYes", "yes", 100, 30, nil, nil, nil, nil, Loc ["STRING_YES"]) _detalhes.yesNo ["no"]:SetPoint (10, -45) _detalhes.yesNo ["yes"]:SetPoint (390, -45) _detalhes.yesNo ["no"]:InstallCustomTexture() _detalhes.yesNo ["yes"]:InstallCustomTexture() _detalhes.yesNo ["yes"]:SetHook ("OnMouseUp", function() _detalhes.yesNo:Hide() end) function _detalhes:Ask (msg, func, ...) _detalhes.yesNo ["ask"].text = msg local p1, p2 = ... _detalhes.yesNo ["yes"]:SetClickFunction (func, p1, p2) _detalhes.yesNo:Show() end _detalhes.yesNo:Hide() end --> cria o frame de wait for plugin function _detalhes:CreateWaitForPlugin() local WaitForPluginFrame = CreateFrame ("frame", "DetailsWaitForPluginFrame" .. self.meu_id, UIParent) local WaitTexture = WaitForPluginFrame:CreateTexture (nil, "overlay") WaitTexture:SetTexture ("Interface\\UNITPOWERBARALT\\Mechanical_Circular_Frame") WaitTexture:SetPoint ("center", WaitForPluginFrame) WaitTexture:SetWidth (180) WaitTexture:SetHeight (180) WaitForPluginFrame.wheel = WaitTexture local RotateAnimGroup = WaitForPluginFrame:CreateAnimationGroup() local rotate = RotateAnimGroup:CreateAnimation ("Rotation") rotate:SetDegrees (360) rotate:SetDuration (60) RotateAnimGroup:SetLooping ("repeat") local bgpanel = gump:NewPanel (UIParent, UIParent, "DetailsWaitFrameBG"..self.meu_id, nil, 120, 30, false, false, false) bgpanel:SetPoint ("center", WaitForPluginFrame, "center") bgpanel:SetBackdrop ({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"}) bgpanel:SetBackdropColor (.2, .2, .2, 1) local label = gump:NewLabel (UIParent, UIParent, nil, nil, Loc ["STRING_WAITPLUGIN"]) --> localize-me label.color = "silver" label:SetPoint ("center", WaitForPluginFrame, "center") label:SetJustifyH ("center") label:Hide() WaitForPluginFrame:Hide() self.wait_for_plugin_created = true function self:WaitForPlugin() self:ChangeIcon ([[Interface\GossipFrame\ActiveQuestIcon]]) if (WaitForPluginFrame:IsShown() and WaitForPluginFrame:GetParent() == self.baseframe) then self.waiting_pid = self:ScheduleTimer ("ExecDelayedPlugin1", 5, self) end WaitForPluginFrame:SetParent (self.baseframe) WaitForPluginFrame:SetAllPoints (self.baseframe) local size = math.max (self.baseframe:GetHeight()* 0.35, 100) WaitForPluginFrame.wheel:SetWidth (size) WaitForPluginFrame.wheel:SetHeight (size) WaitForPluginFrame:Show() label:Show() bgpanel:Show() RotateAnimGroup:Play() self.waiting_raid_plugin = true self.waiting_pid = self:ScheduleTimer ("ExecDelayedPlugin1", 5, self) end function self:CancelWaitForPlugin() RotateAnimGroup:Stop() WaitForPluginFrame:Hide() label:Hide() bgpanel:Hide() end function self:ExecDelayedPlugin1() self.waiting_raid_plugin = nil self.waiting_pid = nil RotateAnimGroup:Stop() WaitForPluginFrame:Hide() label:Hide() bgpanel:Hide() if (self.meu_id == _detalhes.solo) then _detalhes.SoloTables:switch (nil, _detalhes.SoloTables.Mode) elseif (self.modo == _detalhes._detalhes_props["MODO_RAID"]) then _detalhes.RaidTables:EnableRaidMode (self) end end end do local WaitForPluginFrame = CreateFrame ("frame", "DetailsWaitForPluginFrame", UIParent) local WaitTexture = WaitForPluginFrame:CreateTexture (nil, "overlay") WaitTexture:SetTexture ("Interface\\UNITPOWERBARALT\\Mechanical_Circular_Frame") WaitTexture:SetPoint ("center", WaitForPluginFrame) WaitTexture:SetWidth (180) WaitTexture:SetHeight (180) WaitForPluginFrame.wheel = WaitTexture local RotateAnimGroup = WaitForPluginFrame:CreateAnimationGroup() local rotate = RotateAnimGroup:CreateAnimation ("Rotation") rotate:SetDegrees (360) rotate:SetDuration (60) RotateAnimGroup:SetLooping ("repeat") local bgpanel = gump:NewPanel (UIParent, UIParent, "DetailsWaitFrameBG", nil, 120, 30, false, false, false) bgpanel:SetPoint ("center", WaitForPluginFrame, "center") bgpanel:SetBackdrop ({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"}) bgpanel:SetBackdropColor (.2, .2, .2, 1) local label = gump:NewLabel (UIParent, UIParent, nil, nil, Loc ["STRING_WAITPLUGIN"]) --> localize-me label.color = "silver" label:SetPoint ("center", WaitForPluginFrame, "center") label:SetJustifyH ("center") label:Hide() WaitForPluginFrame:Hide() function _detalhes:WaitForSoloPlugin (instancia) instancia:ChangeIcon ([[Interface\GossipFrame\ActiveQuestIcon]]) if (WaitForPluginFrame:IsShown() and WaitForPluginFrame:GetParent() == instancia.baseframe) then return _detalhes:ScheduleTimer ("ExecDelayedPlugin", 5, instancia) end WaitForPluginFrame:SetParent (instancia.baseframe) WaitForPluginFrame:SetAllPoints (instancia.baseframe) local size = math.max (instancia.baseframe:GetHeight()* 0.35, 100) WaitForPluginFrame.wheel:SetWidth (size) WaitForPluginFrame.wheel:SetHeight (size) WaitForPluginFrame:Show() label:Show() bgpanel:Show() RotateAnimGroup:Play() return _detalhes:ScheduleTimer ("ExecDelayedPlugin", 5, instancia) end function _detalhes:CancelWaitForPlugin() RotateAnimGroup:Stop() WaitForPluginFrame:Hide() label:Hide() bgpanel:Hide() end function _detalhes:ExecDelayedPlugin (instancia) RotateAnimGroup:Stop() WaitForPluginFrame:Hide() label:Hide() bgpanel:Hide() if (instancia.meu_id == _detalhes.solo) then _detalhes.SoloTables:switch (nil, _detalhes.SoloTables.Mode) elseif (instancia.meu_id == _detalhes.raid) then _detalhes.RaidTables:switch (nil, _detalhes.RaidTables.Mode) end end end --> tutorial bookmark (removed) function _detalhes:TutorialBookmark (instance) _detalhes:SetTutorialCVar ("ATTRIBUTE_SELECT_TUTORIAL1", true) end --> translate window function _detalhes:OpenTranslateWindow() end --> raid history window ~history ~statistics function _detalhes:InitializeRaidHistoryWindow() local DetailsRaidHistoryWindow = CreateFrame ("frame", "DetailsRaidHistoryWindow", UIParent) DetailsRaidHistoryWindow.Frame = DetailsRaidHistoryWindow DetailsRaidHistoryWindow.__name = Loc ["STRING_STATISTICS"] DetailsRaidHistoryWindow.real_name = "DETAILS_STATISTICS" DetailsRaidHistoryWindow.__icon = [[Interface\AddOns\Details\images\icons]] DetailsRaidHistoryWindow.__iconcoords = {278/512, 314/512, 43/512, 76/512} DetailsRaidHistoryWindow.__iconcolor = "DETAILS_STATISTICS_ICON" DetailsPluginContainerWindow.EmbedPlugin (DetailsRaidHistoryWindow, DetailsRaidHistoryWindow, true) function DetailsRaidHistoryWindow.RefreshWindow() _detalhes:OpenRaidHistoryWindow() end end function _detalhes:OpenRaidHistoryWindow (_raid, _boss, _difficulty, _role, _guild, _player_base, _player_name, _history_type) if (not DetailsRaidHistoryWindow or not DetailsRaidHistoryWindow.Initialized) then local db = _detalhes.storage:OpenRaidStorage() if (not db) then return _detalhes:Msg (Loc ["STRING_GUILDDAMAGERANK_DATABASEERROR"]) end DetailsRaidHistoryWindow.Initialized = true local f = DetailsRaidHistoryWindow or CreateFrame ("frame", "DetailsRaidHistoryWindow", UIParent) --, "ButtonFrameTemplate" f:SetPoint ("center", UIParent, "center") f:SetFrameStrata ("HIGH") f:SetToplevel (true) f:SetMovable (true) f:SetWidth (850) f:SetHeight (500) tinsert (UISpecialFrames, "DetailsRaidHistoryWindow") f.Mode = 2 f.bg1 = f:CreateTexture (nil, "background") f.bg1:SetTexture ([[Interface\AddOns\Details\images\background]], true) f.bg1:SetAlpha (0.7) f.bg1:SetVertexColor (0.27, 0.27, 0.27) f.bg1:SetVertTile (true) f.bg1:SetHorizTile (true) f.bg1:SetSize (790, 454) f.bg1:SetAllPoints() f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) f:SetBackdropColor (.5, .5, .5, .5) f:SetBackdropBorderColor (0, 0, 0, 1) --> menu title bar local titlebar = CreateFrame ("frame", nil, f) titlebar:SetPoint ("topleft", f, "topleft", 2, -3) titlebar:SetPoint ("topright", f, "topright", -2, -3) titlebar:SetHeight (20) titlebar:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) titlebar:SetBackdropColor (.5, .5, .5, 1) titlebar:SetBackdropBorderColor (0, 0, 0, 1) --> menu title local titleLabel = _detalhes.gump:NewLabel (titlebar, titlebar, nil, "titulo", "Details! " .. Loc ["STRING_STATISTICS"], "GameFontNormal", 12) --{227/255, 186/255, 4/255} titleLabel:SetPoint ("center", titlebar , "center") titleLabel:SetPoint ("top", titlebar , "top", 0, -4) --> close button f.Close = CreateFrame ("button", "$parentCloseButton", f) f.Close:SetPoint ("right", titlebar, "right", -2, 0) f.Close:SetSize (16, 16) f.Close:SetNormalTexture (_detalhes.gump.folder .. "icons") f.Close:SetHighlightTexture (_detalhes.gump.folder .. "icons") f.Close:SetPushedTexture (_detalhes.gump.folder .. "icons") f.Close:GetNormalTexture():SetTexCoord (0, 16/128, 0, 1) f.Close:GetHighlightTexture():SetTexCoord (0, 16/128, 0, 1) f.Close:GetPushedTexture():SetTexCoord (0, 16/128, 0, 1) f.Close:SetAlpha (0.7) f.Close:SetScript ("OnClick", function() f:Hide() end) if (not _detalhes:GetTutorialCVar ("HISTORYPANEL_TUTORIAL")) then local tutorialFrame = CreateFrame ("frame", "$parentTutorialFrame", f) tutorialFrame:SetPoint ("center", f, "center") tutorialFrame:SetFrameStrata ("DIALOG") tutorialFrame:SetSize (400, 300) tutorialFrame:SetBackdrop ({bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}, edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize=1}) tutorialFrame:SetBackdropColor (0, 0, 0, 1) tutorialFrame.Title = _detalhes.gump:CreateLabel (tutorialFrame, "Statistics" , 12, "orange") --curse localization isn't adding new strings (and I deleted the old one) tutorialFrame.Title:SetPoint ("top", tutorialFrame, "top", 0, -5) tutorialFrame.Desc = _detalhes.gump:CreateLabel (tutorialFrame, Loc ["STRING_GUILDDAMAGERANK_TUTORIAL_DESC"], 12) tutorialFrame.Desc.width = 370 tutorialFrame.Desc:SetPoint ("topleft", tutorialFrame, "topleft", 10, -45) --[[ tutorialFrame.Example:SetPoint ("topleft", tutorialFrame, "topleft", 10, -110) tutorialFrame.Example = _detalhes.gump:CreateLabel (tutorialFrame, Loc ["STRING_FORGE_TUTORIAL_VIDEO"], 12) local editBox = _detalhes.gump:CreateTextEntry (tutorialFrame, function()end, 375, 20, nil, nil, nil, entry_template, label_template) editBox:SetPoint ("topleft", tutorialFrame.Example, "bottomleft", 0, -10) editBox:SetText () editBox:SetTemplate (_detalhes.gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")) --]] local closeButton = _detalhes.gump:CreateButton (tutorialFrame, function() _detalhes:SetTutorialCVar ("HISTORYPANEL_TUTORIAL", true); tutorialFrame:Hide() end, 80, 20, Loc ["STRING_OPTIONS_CHART_CLOSE"]) closeButton:SetPoint ("bottom", tutorialFrame, "bottom", 0, 10) closeButton:SetTemplate (_detalhes.gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")) end --wallpaper local background = f:CreateTexture (nil, "border") background:SetAlpha (0.3) background:SetPoint ("topleft", f, "topleft", 6, -65) background:SetPoint ("bottomright", f, "bottomright", -10, 28) --separate menu and main list local div = f:CreateTexture (nil, "artwork") div:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-Achievement-MetalBorder-Left]]) div:SetAlpha (0.1) div:SetPoint ("topleft", f, "topleft", 180, -64) div:SetHeight (574) --gradient --[=[ local blackdiv = f:CreateTexture (nil, "artwork") blackdiv:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-Achievement-HorizontalShadow]]) blackdiv:SetVertexColor (0, 0, 0) blackdiv:SetAlpha (1) blackdiv:SetPoint ("topleft", f, "topleft", 187, -65) blackdiv:SetHeight (507) blackdiv:SetWidth (200) local blackdiv = f:CreateTexture (nil, "artwork") blackdiv:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-Achievement-HorizontalShadow]]) blackdiv:SetVertexColor (0, 0, 0) blackdiv:SetAlpha (0.7) blackdiv:SetPoint ("topleft", f, "topleft", 0, 0) blackdiv:SetPoint ("bottomleft", f, "bottomleft", 0, 0) blackdiv:SetWidth (200) --]=] --select history or guild rank local options_switch_template = _detalhes.gump:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") local options_text_template = _detalhes.gump:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") local options_button_template = _detalhes.gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") local select_history = function() f.GuildRankCheckBox:SetValue (false) f.HistoryCheckBox:SetValue (true) f.Mode = 1 _G.DetailsRaidHistoryWindow:Refresh() f.ReportButton:Hide() end local select_guildrank = function() f.HistoryCheckBox:SetValue (false) f.GuildRankCheckBox:SetValue (true) DetailsRaidHistoryWindow.select_player:Select (1, true) f.select_player2:Hide() f.select_player2_label:Hide() f.Mode = 2 _G.DetailsRaidHistoryWindow:Refresh() f.ReportButton:Show() end local HistoryCheckBox, HistoryLabel = _detalhes.gump:CreateSwitch (f, select_history, false, 18, 18, "", "", "HistoryCheckBox", nil, nil, nil, nil, Loc ["STRING_GUILDDAMAGERANK_SHOWHISTORY"], options_switch_template) --, options_text_template HistoryLabel:ClearAllPoints() HistoryCheckBox:ClearAllPoints() HistoryCheckBox:SetPoint ("topleft", f, "topleft", 100, -34) HistoryLabel:SetPoint ("left", HistoryCheckBox, "right", 2, 0) HistoryCheckBox:SetAsCheckBox() local GuildRankCheckBox, GuildRankLabel = _detalhes.gump:CreateSwitch (f, select_guildrank, true, 18, 18, "", "", "GuildRankCheckBox", nil, nil, nil, nil, Loc ["STRING_GUILDDAMAGERANK_SHOWRANK"], options_switch_template) --, options_text_template GuildRankLabel:ClearAllPoints() GuildRankCheckBox:ClearAllPoints() GuildRankCheckBox:SetPoint ("topleft", f, "topleft", 240, -34) GuildRankLabel:SetPoint ("left", GuildRankCheckBox, "right", 2, 0) GuildRankCheckBox:SetAsCheckBox() local guild_sync = function() f.RequestedAmount = 0 f.DownloadedAmount = 0 f.EstimateSize = 0 f.DownloadedSize = 0 f.SyncStartTime = time() _detalhes.storage:DBGuildSync() f.GuildSyncButton:Disable() if (not f.SyncTexture) then local workingFrame = CreateFrame ("frame", nil, f) f.WorkingFrame = workingFrame workingFrame:SetSize (1, 1) f.SyncTextureBackground = workingFrame:CreateTexture (nil, "border") f.SyncTextureBackground:SetPoint ("bottomright", f, "bottomright", -5, -1) f.SyncTextureBackground:SetTexture ([[Interface\COMMON\StreamBackground]]) f.SyncTextureBackground:SetSize (32, 32) f.SyncTextureCircle = workingFrame:CreateTexture (nil, "artwork") f.SyncTextureCircle:SetPoint ("center", f.SyncTextureBackground, "center", 0, 0) f.SyncTextureCircle:SetTexture ([[Interface\COMMON\StreamCircle]]) f.SyncTextureCircle:SetSize (32, 32) f.SyncTextureGrade = workingFrame:CreateTexture (nil, "overlay") f.SyncTextureGrade:SetPoint ("center", f.SyncTextureBackground, "center", 0, 0) f.SyncTextureGrade:SetTexture ([[Interface\COMMON\StreamFrame]]) f.SyncTextureGrade:SetSize (32, 32) local animationHub = _detalhes.gump:CreateAnimationHub (workingFrame) animationHub:SetLooping ("Repeat") f.WorkingAnimation = animationHub local rotation = _detalhes.gump:CreateAnimation (animationHub, "ROTATION", 1, 3, -360) rotation:SetTarget (f.SyncTextureCircle) --_detalhes.gump:CreateAnimation (animationHub, "ALPHA", 1, 0.5, 0, 1) f.SyncText = workingFrame:CreateFontString (nil, "border", "GameFontNormal") f.SyncText:SetPoint ("right", f.SyncTextureBackground, "left", 0, 0) f.SyncText:SetText ("working") local endAnimationHub = _detalhes.gump:CreateAnimationHub (workingFrame, nil, function() workingFrame:Hide() end) _detalhes.gump:CreateAnimation (endAnimationHub, "ALPHA", 1, 0.5, 1, 0) f.EndAnimationHub = endAnimationHub end f.WorkingFrame:Show() f.WorkingAnimation:Play() C_Timer.NewTicker (10, function (self) if (not _detalhes.LastGuildSyncReceived) then f.GuildSyncButton:Enable() f.EndAnimationHub:Play() elseif (_detalhes.LastGuildSyncReceived+10 < GetTime()) then f.GuildSyncButton:Enable() f.EndAnimationHub:Play() self:Cancel() end end) end local GuildSyncButton = _detalhes.gump:CreateButton (f, guild_sync, 130, 20, Loc ["STRING_GUILDDAMAGERANK_SYNCBUTTONTEXT"], nil, nil, nil, "GuildSyncButton", nil, nil, options_button_template, options_text_template) GuildSyncButton:SetPoint ("topright", f, "topright", -20, -34) GuildSyncButton:SetIcon ([[Interface\GLUES\CharacterSelect\RestoreButton]], 12, 12, "overlay", {0.2, .8, 0.2, .8}, nil, 4) --> listen to comm events local eventListener = _detalhes:CreateEventListener() function eventListener:OnCommReceived (event, length, prefix, playerName, realmName, detailsVersion, guildSyncID, data) if (prefix == CONST_GUILD_SYNC) then --received a list of encounter IDs if (guildSyncID == "L") then --received one encounter table elseif (guildSyncID == "A") then f.DownloadedAmount = f.DownloadedAmount + 1 --size = 1 byte per characters in the string f.EstimateSize = length * f.RequestedAmount > f.EstimateSize and length * f.RequestedAmount or f.RequestedAmount f.DownloadedSize = f.DownloadedSize + length local downloadSpeed = f.DownloadedSize / (time() - f.SyncStartTime) f.SyncText:SetText ("working [downloading " .. f.DownloadedAmount .. "/" .. f.RequestedAmount .. ", " .. format ("%.2f", downloadSpeed/1024) .. "Kbps]") end end end function eventListener:OnCommSent (event, length, prefix, playerName, realmName, detailsVersion, guildSyncID, missingIDs, arg8, arg9) if (prefix == CONST_GUILD_SYNC) then --requested a list of encounters if (guildSyncID == "R") then --requested to download a selected list of encounter tables elseif (guildSyncID == "G") then f.RequestedAmount = f.RequestedAmount + #missingIDs f.SyncText:SetText ("working [downloading " .. f.DownloadedAmount .. "/" .. f.RequestedAmount .. "]") end end end eventListener:RegisterEvent ("COMM_EVENT_RECEIVED", "OnCommReceived") eventListener:RegisterEvent ("COMM_EVENT_SENT", "OnCommSent") function f.BuildReport() if (f.LatestResourceTable) then local reportFunc = function (IsCurrent, IsReverse, AmtLines) local bossName = f.select_boss.label:GetText() local bossDiff = f.select_diff.label:GetText() local guildName = f.select_guild.label:GetText() local reportTable = {"Details!: DPS Rank for: " .. (bossDiff or "") .. " " .. (bossName or "--x--x--") .. " <" .. (guildName or "") .. ">"} local result = {} for i = 1, AmtLines do if (f.LatestResourceTable[i]) then local playerName = f.LatestResourceTable[i][1] playerName = playerName:gsub ("%|c%x%x%x%x%x%x%x%x", "") playerName = playerName:gsub ("%|r", "") playerName = playerName:gsub (".*%s", "") tinsert (result, {playerName, f.LatestResourceTable[i][2]}) else break end end _detalhes:FormatReportLines (reportTable, result) Details:SendReportLines (reportTable) end Details:SendReportWindow (reportFunc, nil, nil, true) end end local ReportButton = _detalhes.gump:CreateButton (f, f.BuildReport, 130, 20, Loc ["STRING_OPTIONS_REPORT_ANCHOR"]:gsub (":", ""), nil, nil, nil, "ReportButton", nil, nil, options_button_template, options_text_template) ReportButton:SetPoint ("right", GuildSyncButton, "left", -2, 0) ReportButton:SetIcon ([[Interface\GLUES\CharacterSelect\RestoreButton]], 12, 12, "overlay", {0.2, .8, 0.2, .8}, nil, 4) -- function f:SetBackgroundImage (encounterId) local instanceId = _detalhes:GetInstanceIdFromEncounterId (encounterId) if (instanceId) then local file, L, R, T, B = _detalhes:GetRaidBackground (instanceId) background:SetTexture (file) background:SetTexCoord (L, R, T, B) end end f:SetScript ("OnMouseDown", function(self, button) if (self.isMoving) then return end if (button == "RightButton") then self:Hide() else self:StartMoving() self.isMoving = true end end) f:SetScript ("OnMouseUp", function(self, button) if (self.isMoving and button == "LeftButton") then self:StopMovingOrSizing() self.isMoving = nil end end) f:SetScript ("OnHide", function() --> save latest shown state f.LatestSelection = f.LatestSelection or {} f.LatestSelection.Raid = DetailsRaidHistoryWindow.select_raid.value f.LatestSelection.Boss = DetailsRaidHistoryWindow.select_boss.value f.LatestSelection.Diff = DetailsRaidHistoryWindow.select_diff.value f.LatestSelection.Role = DetailsRaidHistoryWindow.select_role.value f.LatestSelection.Guild = DetailsRaidHistoryWindow.select_guild.value f.LatestSelection.PlayerBase = DetailsRaidHistoryWindow.select_player.value f.LatestSelection.PlayerName = DetailsRaidHistoryWindow.select_player2.value end) --f.TitleText:SetText ("Details! Raid Ranking") --f.portrait:SetTexture ([[Interface\AddOns\Details\images\icons2]]) --f.portrait:SetTexture ([[Interface\PVPFrame\PvPPrestigeIcons]]) --f.portrait:SetTexCoord (270/1024, 384/1024, 128/512, 256/512) --f.portrait:SetTexCoord (192/512, 258/512, 322/512, 388/512) local dropdown_size = 160 local icon = [[Interface\FriendsFrame\battlenet-status-offline]] local diff_list = {} local raid_list = {} local boss_list = {} local guild_list = {} local sort_alphabetical = function(a,b) return a[1] < b[1] end local sort_alphabetical2 = function(a,b) return a.value < b.value end local on_select = function() if (f.Refresh) then f:Refresh() end end --> select raid: local on_raid_select = function (_, _, raid) _detalhes.rank_window.last_raid = raid f:UpdateDropdowns (true) on_select() end local build_raid_list = function() return raid_list end local raid_dropdown = gump:CreateDropDown (f, build_raid_list, 1, dropdown_size, 20, "select_raid") local raid_string = gump:CreateLabel (f, Loc ["STRING_GUILDDAMAGERANK_RAID"] .. ":", _, _, "GameFontNormal", "select_raid_label") raid_dropdown:SetTemplate (gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) --> select boss: local on_boss_select = function (_, _, boss) on_select() end local build_boss_list = function() return boss_list end local boss_dropdown = gump:CreateDropDown (f, build_boss_list, 1, dropdown_size, 20, "select_boss") local boss_string = gump:CreateLabel (f, Loc ["STRING_GUILDDAMAGERANK_BOSS"] .. ":", _, _, "GameFontNormal", "select_boss_label") boss_dropdown:SetTemplate (gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) --> select difficulty: local on_diff_select = function (_, _, diff) _detalhes.rank_window.last_difficulty = diff on_select() end local build_diff_list = function() return diff_list end local diff_dropdown = gump:CreateDropDown (f, build_diff_list, 1, dropdown_size, 20, "select_diff") local diff_string = gump:CreateLabel (f, Loc ["STRING_GUILDDAMAGERANK_DIFF"] .. ":", _, _, "GameFontNormal", "select_diff_label") diff_dropdown:SetTemplate (gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) --> select role: local on_role_select = function (_, _, role) on_select() end local build_role_list = function() return { {value = "damage", label = "Damager", icon = icon, onclick = on_role_select}, {value = "healing", label = "Healer", icon = icon, onclick = on_role_select} } end local role_dropdown = gump:CreateDropDown (f, build_role_list, 1, dropdown_size, 20, "select_role") local role_string = gump:CreateLabel (f, Loc ["STRING_GUILDDAMAGERANK_ROLE"] .. ":", _, _, "GameFontNormal", "select_role_label") role_dropdown:SetTemplate (gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) --> select guild: local on_guild_select = function (_, _, guild) on_select() end local build_guild_list = function() return guild_list end local guild_dropdown = gump:CreateDropDown (f, build_guild_list, 1, dropdown_size, 20, "select_guild") local guild_string = gump:CreateLabel (f, Loc ["STRING_GUILDDAMAGERANK_GUILD"] .. ":", _, _, "GameFontNormal", "select_guild_label") guild_dropdown:SetTemplate (gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) --> select playerbase: local on_player_select = function (_, _, player) on_select() end local build_player_list = function() return { {value = 1, label = Loc ["STRING_GUILDDAMAGERANK_PLAYERBASE_RAID"], icon = icon, onclick = on_player_select}, {value = 2, label = Loc ["STRING_GUILDDAMAGERANK_PLAYERBASE_INDIVIDUAL"], icon = icon, onclick = on_player_select}, } end local player_dropdown = gump:CreateDropDown (f, build_player_list, 1, dropdown_size, 20, "select_player") local player_string = gump:CreateLabel (f, Loc ["STRING_GUILDDAMAGERANK_PLAYERBASE"] .. ":", _, _, "GameFontNormal", "select_player_label") player_dropdown:SetTemplate (gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) --> select player: local on_player2_select = function (_, _, player) f.latest_player_selected = player f:BuildPlayerTable (player) end local build_player2_list = function() local encounterTable, guild, role = unpack (f.build_player2_data or {}) local t = {} local already_listed = {} if (encounterTable) then for encounterIndex, encounter in ipairs (encounterTable) do if (encounter.guild == guild) then local roleTable = encounter [role] for playerName, _ in pairs (roleTable) do if (not already_listed [playerName]) then tinsert (t, {value = playerName, label = playerName, icon = icon, onclick = on_player2_select}) already_listed [playerName] = true end end end end end table.sort (t, sort_alphabetical2) return t end local player2_dropdown = gump:CreateDropDown (f, build_player2_list, 1, dropdown_size, 20, "select_player2") local player2_string = gump:CreateLabel (f, Loc ["STRING_GUILDDAMAGERANK_PLAYERBASE_PLAYER"] .. ":", _, _, "GameFontNormal", "select_player2_label") player2_dropdown:SetTemplate (gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) function f:UpdateDropdowns (DoNotSelectRaid) local currentGuild = guild_dropdown.value --difficulty wipe (diff_list) wipe (boss_list) wipe (raid_list) wipe (guild_list) local boss_repeated = {} local raid_repeated = {} local guild_repeated = {} local raidSelected = DetailsRaidHistoryWindow.select_raid:GetValue() for difficulty, encounterIdTable in pairs (db) do if (type (difficulty) == "number") then if (difficulty == 14) then --tinsert (diff_list, {value = 14, label = "Normal", icon = icon, onclick = on_diff_select}) --print ("has normal encounter") elseif (difficulty == 15) then local alreadyHave = false for i, t in ipairs (diff_list) do if (t.label == "Heroic") then alreadyHave = true end end if (not alreadyHave) then tinsert (diff_list, 1, {value = 15, label = "Heroic", icon = icon, onclick = on_diff_select}) end elseif (difficulty == 16) then local alreadyHave = false for i, t in ipairs (diff_list) do if (t.label == "Mythic") then alreadyHave = true end end if (not alreadyHave) then tinsert (diff_list, {value = 16, label = "Mythic", icon = icon, onclick = on_diff_select}) end end for encounterId, encounterTable in pairs (encounterIdTable) do if (not boss_repeated [encounterId]) then local encounter, instance = _detalhes:GetBossEncounterDetailsFromEncounterId (_, encounterId) if (encounter) then local InstanceID = _detalhes:GetInstanceIdFromEncounterId (encounterId) if (raidSelected == InstanceID) then --[=[ local bossIndex = _detalhes:GetBossIndex (InstanceID, encounterId) if (bossIndex) then local l, r, t, b, texturePath = _detalhes:GetBossIcon (InstanceID, bossIndex) if (texturePath) then tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = texturePath, texcoord = {l, r, t, b}, onclick = on_boss_select}) else tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = icon, onclick = on_boss_select}) end else tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = icon, onclick = on_boss_select}) end --]=] tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = icon, onclick = on_boss_select}) boss_repeated [encounterId] = true end if (not raid_repeated [instance.name]) then tinsert (raid_list, {value = instance.id, label = instance.name, icon = icon, onclick = on_raid_select}) raid_repeated [instance.name] = true end end end for index, encounter in ipairs (encounterTable) do local guild = encounter.guild if (not guild_repeated [guild]) then tinsert (guild_list, {value = guild, label = guild, icon = icon, onclick = on_guild_select}) guild_repeated [guild] = true end end end end end table.sort (boss_list, function (t1, t2) return t1.label < t2.label end) diff_dropdown:Refresh() diff_dropdown:Select (1, true) boss_dropdown:Refresh() boss_dropdown:Select (1, true) if (not DoNotSelectRaid) then raid_dropdown:Refresh() raid_dropdown:Select (1, true) end guild_dropdown:Refresh() if (currentGuild) then guild_dropdown:Select (currentGuild) else guild_dropdown:Select (1, true) end end function f.UpdateBossDropdown() local raidSelected = DetailsRaidHistoryWindow.select_raid:GetValue() local boss_repeated = {} wipe (boss_list) for difficulty, encounterIdTable in pairs (db) do if (type (difficulty) == "number") then if (difficulty == 14) then --tinsert (diff_list, {value = 14, label = "Normal", icon = icon, onclick = on_diff_select}) --print ("has normal encounter") elseif (difficulty == 15) then local alreadyHave = false for i, t in ipairs (diff_list) do if (t.label == "Heroic") then alreadyHave = true end end if (not alreadyHave) then tinsert (diff_list, 1, {value = 15, label = "Heroic", icon = icon, onclick = on_diff_select}) end elseif (difficulty == 16) then local alreadyHave = false for i, t in ipairs (diff_list) do if (t.label == "Mythic") then alreadyHave = true end end if (not alreadyHave) then tinsert (diff_list, {value = 16, label = "Mythic", icon = icon, onclick = on_diff_select}) end end for encounterId, encounterTable in pairs (encounterIdTable) do if (not boss_repeated [encounterId]) then local encounter, instance = _detalhes:GetBossEncounterDetailsFromEncounterId (_, encounterId) if (encounter) then local InstanceID = _detalhes:GetInstanceIdFromEncounterId (encounterId) if (raidSelected == InstanceID) then --[=[ local bossIndex = _detalhes:GetBossIndex (InstanceID, encounterId) if (bossIndex) then local l, r, t, b, texturePath = _detalhes:GetBossIcon (InstanceID, bossIndex) if (texturePath) then tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = texturePath, texcoord = {l, r, t, b}, onclick = on_boss_select}) else tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = icon, onclick = on_boss_select}) end else tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = icon, onclick = on_boss_select}) end --]=] tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = icon, onclick = on_boss_select}) boss_repeated [encounterId] = true end end end end end end table.sort (boss_list, function (t1, t2) return t1.label < t2.label end) boss_dropdown:Refresh() end --> anchors: raid_string:SetPoint ("topleft", f, "topleft", 10, -70) raid_dropdown:SetPoint ("topleft", f, "topleft", 10, -85) boss_string:SetPoint ("topleft", f, "topleft", 10, -110) boss_dropdown:SetPoint ("topleft", f, "topleft", 10, -125) diff_string:SetPoint ("topleft", f, "topleft", 10, -150) diff_dropdown:SetPoint ("topleft", f, "topleft", 10, -165) role_string:SetPoint ("topleft", f, "topleft", 10, -190) role_dropdown:SetPoint ("topleft", f, "topleft", 10, -205) guild_string:SetPoint ("topleft", f, "topleft", 10, -230) guild_dropdown:SetPoint ("topleft", f, "topleft", 10, -245) player_string:SetPoint ("topleft", f, "topleft", 10, -270) player_dropdown:SetPoint ("topleft", f, "topleft", 10, -285) player2_string:SetPoint ("topleft", f, "topleft", 10, -310) player2_dropdown:SetPoint ("topleft", f, "topleft", 10, -325) player2_string:Hide() player2_dropdown:Hide() --> refresh the window: function f:BuildPlayerTable (playerName) local encounterTable, guild, role = unpack (f.build_player2_data or {}) local data = {} if (type (playerName) == "string" and string.len (playerName) > 1) then for encounterIndex, encounter in ipairs (encounterTable) do if (encounter.guild == guild) then local roleTable = encounter [role] local date = encounter.date date = date:gsub (".*%s", "") date = date:sub (1, -4) local player = roleTable [playerName] if (player) then --tinsert (data, {text = date, value = player[1], data = player, fulldate = encounter.date, elapsed = encounter.elapsed}) tinsert (data, {text = date, value = player[1]/encounter.elapsed, utext = _detalhes:ToK2 (player[1]/encounter.elapsed), data = player, fulldate = encounter.date, elapsed = encounter.elapsed}) end end end --> update graphic if (not f.gframe) then local onenter = function (self) GameCooltip:Reset() GameCooltip:SetType ("tooltip") GameCooltip:Preset (2) GameCooltip:AddLine ("Total Done:", _detalhes:ToK2 (self.data.value), 1, "white") GameCooltip:AddLine ("Dps:", _detalhes:ToK2 (self.data.value / self.data.elapsed), 1, "white") GameCooltip:AddLine ("Item Level:", floor (self.data.data [2]), 1, "white") GameCooltip:AddLine ("Date:", self.data.fulldate:gsub (".*%s", ""), 1, "white") GameCooltip:SetOwner (self.ball.tooltip_anchor) GameCooltip:Show() end local onleave = function (self) GameCooltip:Hide() end f.gframe = gump:CreateGFrame (f, 650, 400, 35, onenter, onleave, "gframe", "$parentGF") f.gframe:SetPoint ("topleft", f, "topleft", 190, -65) end f.gframe:Reset() f.gframe:UpdateLines (data) end end local fillpanel = gump:NewFillPanel (f, {}, "$parentFP", "fillpanel", 710, 501, false, false, true, nil) fillpanel:SetPoint ("topleft", f, "topleft", 195, -65) function f:BuildGuildRankTable (encounterTable, guild, role) local header = {{name = "Player Name", type = "text"}, {name = "Per Second", type = "text"}, {name = "Total", type = "text"}, {name = "Length", type = "text"}, {name = "Item Level", type = "text"}, {name = "Date", type = "text"}} local players = {} local players_index = {} local playerScore = {} --get the best of each player for encounterIndex, encounter in ipairs (encounterTable) do if (encounter.guild == guild) then local roleTable = encounter [role] local date = encounter.date date = date:gsub (".*%s", "") date = date:sub (1, -4) for playerName, playerTable in pairs (roleTable) do if (not playerScore [playerName]) then playerScore [playerName] = { total = 0, ps = 0, ilvl = 0, date = 0, class = 0, length = 0, } end local total = playerTable [1] local dps = total / encounter.elapsed --if (total > playerScore [playerName].total) then if (dps > playerScore [playerName].ps) then playerScore [playerName].total = total playerScore [playerName].ps = total / encounter.elapsed playerScore [playerName].ilvl = playerTable [2] playerScore [playerName].length = encounter.elapsed playerScore [playerName].date = date playerScore [playerName].class = playerTable [3] end end end end local sortTable = {} for playerName, t in pairs (playerScore) do local className = select (2, GetClassInfo (t.class or 0)) local classColor = "FFFFFFFF" if (className) then classColor = RAID_CLASS_COLORS [className] and RAID_CLASS_COLORS [className].colorStr end tinsert (sortTable, { "|c" .. classColor .. playerName .. "|r", _detalhes:comma_value (t.ps), _detalhes:ToK2 (t.total), _detalhes.gump:IntegerToTimer (t.length), floor (t.ilvl), t.date, t.total, t.ps, }) end table.sort (sortTable, function(a, b) return a[8] > b[8] end) --> add the number before the player name for i = 1, #sortTable do local t = sortTable [i] t [1] = i .. ". " .. t [1] end fillpanel:SetFillFunction (function (index) return sortTable [index] end) fillpanel:SetTotalFunction (function() return #sortTable end) fillpanel:UpdateRows (header) fillpanel:Refresh() f.LatestResourceTable = sortTable end function f:BuildRaidTable (encounterTable, guild, role) if (f.Mode == 2) then f:BuildGuildRankTable (encounterTable, guild, role) return end local header = {{name = "Player Name", type = "text"}} -- , width = 90 local players = {} local players_index = {} local player_class = {} local amt_encounters = 0 for encounterIndex, encounter in ipairs (encounterTable) do if (encounter.guild == guild) then local roleTable = encounter [role] local date = encounter.date date = date:gsub (".*%s", "") date = date:sub (1, -4) amt_encounters = amt_encounters + 1 tinsert (header, {name = date, type = "text"}) for playerName, playerTable in pairs (roleTable) do local index = players_index [playerName] local player if (not index) then player = {playerName} player_class [playerName] = playerTable [3] for i = 1, amt_encounters-1 do tinsert (player, "") end tinsert (player, _detalhes:ToK2 (playerTable [1] / encounter.elapsed)) tinsert (players, player) players_index [playerName] = #players --print ("not index", playerName, amt_encounters, date, 2, amt_encounters-1) else player = players [index] for i = #player+1, amt_encounters-1 do tinsert (player, "") end tinsert (player, _detalhes:ToK2 (playerTable [1] / encounter.elapsed)) end end end end --> sort alphabetical table.sort (players, function(a, b) return a[1] < b[1] end) for index, playerTable in ipairs (players) do for i = #playerTable, amt_encounters do tinsert (playerTable, "") end local className = select (2, GetClassInfo (player_class [playerTable [1]] or 0)) if (className) then local classColor = RAID_CLASS_COLORS [className] and RAID_CLASS_COLORS [className].colorStr playerTable [1] = "|c" .. classColor .. playerTable [1] .. "|r" end end fillpanel:SetFillFunction (function (index) return players [index] end) fillpanel:SetTotalFunction (function() return #players end) fillpanel:UpdateRows (header) fillpanel:Refresh() fillpanel:SetPoint ("topleft", f, "topleft", 200, -65) end function f:Refresh (player_name) --> build the main table local diff = diff_dropdown.value local boss = boss_dropdown.value local role = role_dropdown.value local guild = guild_dropdown.value local player = player_dropdown.value local diffTable = db [diff] f:SetBackgroundImage (boss) --_detalhes:OpenRaidHistoryWindow (_raid, _boss, _difficulty, _role, _guild, _player_base, _player_name) if (diffTable) then local encounters = diffTable [boss] if (encounters) then if (player == 1) then --> raid fillpanel:Show() if (f.gframe) then f.gframe:Hide() end player2_string:Hide() player2_dropdown:Hide() f:BuildRaidTable (encounters, guild, role) elseif (player == 2) then --> only one player fillpanel:Hide() if (f.gframe) then f.gframe:Show() end player2_string:Show() player2_dropdown:Show() f.build_player2_data = {encounters, guild, role} player2_dropdown:Refresh() player_name = f.latest_player_selected or player_name if (player_name) then player2_dropdown:Select (player_name) else player2_dropdown:Select (1, true) end f:BuildPlayerTable (player2_dropdown.value) end else if (player == 1) then --> raid fillpanel:Show() if (f.gframe) then f.gframe:Hide() end player2_string:Hide() player2_dropdown:Hide() f:BuildRaidTable ({}, guild, role) elseif (player == 2) then --> only one player fillpanel:Hide() if (f.gframe) then f.gframe:Show() end player2_string:Show() player2_dropdown:Show() f.build_player2_data = {{}, guild, role} player2_dropdown:Refresh() player2_dropdown:Select (1, true) f:BuildPlayerTable (player2_dropdown.value) end end end end f.FirstRun = true end --> table means some button send the request - nil for other ways if (type (_raid) == "table" or (not _raid and not _boss and not _difficulty and not _role and not _guild and not _player_base and not _player_name)) then local f = _G.DetailsRaidHistoryWindow if (f.LatestSelection) then _raid = f.LatestSelection.Raid _boss = f.LatestSelection.Boss _difficulty = f.LatestSelection.Diff _role = f.LatestSelection.Role _guild = f.LatestSelection.Guild _player_base = f.LatestSelection.PlayerBase _player_name = f.LatestSelection.PlayerBase end end if (_G.DetailsRaidHistoryWindow.FirstRun) then _difficulty = _detalhes.rank_window.last_difficulty or _difficulty if (IsInGuild()) then local guildName = GetGuildInfo ("player") if (guildName) then _guild = guildName end end if (_detalhes.rank_window.last_raid ~= "") then _raid = _detalhes.rank_window.last_raid or _raid end _G.DetailsRaidHistoryWindow.FirstRun = nil end _G.DetailsRaidHistoryWindow:UpdateDropdowns() _G.DetailsRaidHistoryWindow:UpdateDropdowns() _G.DetailsRaidHistoryWindow:Refresh() _G.DetailsRaidHistoryWindow:Show() if (_history_type == 1 or _history_type == 2) then DetailsRaidHistoryWindow.Mode = _history_type if (DetailsRaidHistoryWindow.Mode == 1) then --overall DetailsRaidHistoryWindow.HistoryCheckBox:SetValue (true) DetailsRaidHistoryWindow.GuildRankCheckBox:SetValue (false) elseif (DetailsRaidHistoryWindow.Mode == 2) then --guild rank DetailsRaidHistoryWindow.GuildRankCheckBox:SetValue (true) DetailsRaidHistoryWindow.HistoryCheckBox:SetValue (false) end end if (_raid) then DetailsRaidHistoryWindow.select_raid:Select (_raid) _G.DetailsRaidHistoryWindow:Refresh() DetailsRaidHistoryWindow.UpdateBossDropdown() end if (_boss) then DetailsRaidHistoryWindow.select_boss:Select (_boss) _G.DetailsRaidHistoryWindow:Refresh() end if (_difficulty) then DetailsRaidHistoryWindow.select_diff:Select (_difficulty) _G.DetailsRaidHistoryWindow:Refresh() end if (_role) then DetailsRaidHistoryWindow.select_role:Select (_role) _G.DetailsRaidHistoryWindow:Refresh() end if (_guild) then if (type (_guild) == "boolean") then _guild = GetGuildInfo ("player") end DetailsRaidHistoryWindow.select_guild:Select (_guild) _G.DetailsRaidHistoryWindow:Refresh() end if (_player_base) then DetailsRaidHistoryWindow.select_player:Select (_player_base) _G.DetailsRaidHistoryWindow:Refresh() end if (_player_name) then DetailsRaidHistoryWindow.select_player2:Refresh() DetailsRaidHistoryWindow.select_player2:Select (_player_name) _G.DetailsRaidHistoryWindow:Refresh (_player_name) end DetailsPluginContainerWindow.OpenPlugin (DetailsRaidHistoryWindow) end --> feedback window function _detalhes:OpenFeedbackWindow() if (not _G.DetailsFeedbackPanel) then gump:CreateSimplePanel (UIParent, 340, 300, Loc ["STRING_FEEDBACK_SEND_FEEDBACK"], "DetailsFeedbackPanel") local panel = _G.DetailsFeedbackPanel local label = gump:CreateLabel (panel, Loc ["STRING_FEEDBACK_PREFERED_SITE"]) label:SetPoint ("topleft", panel, "topleft", 15, -60) local wowi = gump:NewImage (panel, [[Interface\AddOns\Details\images\icons2]], 101, 34, "artwork", {0/512, 101/512, 163/512, 200/512}) local curse = gump:NewImage (panel, [[Interface\AddOns\Details\images\icons2]], 101, 34, "artwork", {0/512, 101/512, 201/512, 242/512}) local mmoc = gump:NewImage (panel, [[Interface\AddOns\Details\images\icons2]], 101, 34, "artwork", {0/512, 101/512, 243/512, 285/512}) wowi:SetDesaturated (true) curse:SetDesaturated (true) mmoc:SetDesaturated (true) wowi:SetPoint ("topleft", panel, "topleft", 17, -100) curse:SetPoint ("topleft", panel, "topleft", 17, -160) mmoc:SetPoint ("topleft", panel, "topleft", 17, -220) local wowi_title = gump:CreateLabel (panel, "Wow Interface:", nil, nil, "GameFontNormal") local wowi_desc = gump:CreateLabel (panel, Loc ["STRING_FEEDBACK_WOWI_DESC"], nil, "silver") wowi_desc:SetWidth (202) wowi_title:SetPoint ("topleft", wowi, "topright", 5, 0) wowi_desc:SetPoint ("topleft", wowi_title, "bottomleft", 0, -1) -- local curse_title = gump:CreateLabel (panel, "Curse:", nil, nil, "GameFontNormal") local curse_desc = gump:CreateLabel (panel, Loc ["STRING_FEEDBACK_CURSE_DESC"], nil, "silver") curse_desc:SetWidth (202) curse_title:SetPoint ("topleft", curse, "topright", 5, 0) curse_desc:SetPoint ("topleft", curse_title, "bottomleft", 0, -1) -- local mmoc_title = gump:CreateLabel (panel, "MMO-Champion:", nil, nil, "GameFontNormal") local mmoc_desc = gump:CreateLabel (panel, Loc ["STRING_FEEDBACK_MMOC_DESC"], nil, "silver") mmoc_desc:SetWidth (202) mmoc_title:SetPoint ("topleft", mmoc, "topright", 5, 0) mmoc_desc:SetPoint ("topleft", mmoc_title, "bottomleft", 0, -1) local on_enter = function (self, capsule) capsule.image:SetDesaturated (false) end local on_leave = function (self, capsule) capsule.image:SetDesaturated (true) end local on_click = function (_, _, website) if (website == 1) then _detalhes:CopyPaste ([[http://www.wowinterface.com/downloads/addcomment.php?action=addcomment&fileid=23056]]) elseif (website == 2) then _detalhes:CopyPaste ([[http://www.curse.com/addons/wow/details]]) elseif (website == 3) then _detalhes:CopyPaste ([[http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks]]) end end local wowi_button = gump:CreateButton (panel, on_click, 103, 34, "", 1) wowi_button:SetPoint ("topleft", wowi, "topleft", -1, 0) wowi_button:InstallCustomTexture (nil, nil, nil, nil, true) wowi_button.image = wowi wowi_button:SetHook ("OnEnter", on_enter) wowi_button:SetHook ("OnLeave", on_leave) local curse_button = gump:CreateButton (panel, on_click, 103, 34, "", 2) curse_button:SetPoint ("topleft", curse, "topleft", -1, 0) curse_button:InstallCustomTexture (nil, nil, nil, nil, true) curse_button.image = curse curse_button:SetHook ("OnEnter", on_enter) curse_button:SetHook ("OnLeave", on_leave) local mmoc_button = gump:CreateButton (panel, on_click, 103, 34, "", 3) mmoc_button:SetPoint ("topleft", mmoc, "topleft", -1, 0) mmoc_button:InstallCustomTexture (nil, nil, nil, nil, true) mmoc_button.image = mmoc mmoc_button:SetHook ("OnEnter", on_enter) mmoc_button:SetHook ("OnLeave", on_leave) end _G.DetailsFeedbackPanel:Show() end --> config class colors function _detalhes:OpenClassColorsConfig() if (not _G.DetailsClassColorManager) then gump:CreateSimplePanel (UIParent, 300, 280, Loc ["STRING_OPTIONS_CLASSCOLOR_MODIFY"], "DetailsClassColorManager") local panel = _G.DetailsClassColorManager _detalhes.gump:ApplyStandardBackdrop (panel) local upper_panel = CreateFrame ("frame", nil, panel) upper_panel:SetAllPoints (panel) upper_panel:SetFrameLevel (panel:GetFrameLevel()+3) local y = -50 local callback = function (button, r, g, b, a, self) self.MyObject.my_texture:SetVertexColor (r, g, b) _detalhes.class_colors [self.MyObject.my_class][1] = r _detalhes.class_colors [self.MyObject.my_class][2] = g _detalhes.class_colors [self.MyObject.my_class][3] = b _detalhes:AtualizaGumpPrincipal (-1, true) end local set_color = function (self, button, class, index) local current_class_color = _detalhes.class_colors [class] local r, g, b = unpack (current_class_color) _detalhes.gump:ColorPick (self, r, g, b, 1, callback) end local reset_color = function (self, button, class, index) local color_table = RAID_CLASS_COLORS [class] local r, g, b = color_table.r, color_table.g, color_table.b self.MyObject.my_texture:SetVertexColor (r, g, b) _detalhes.class_colors [self.MyObject.my_class][1] = r _detalhes.class_colors [self.MyObject.my_class][2] = g _detalhes.class_colors [self.MyObject.my_class][3] = b _detalhes:AtualizaGumpPrincipal (-1, true) end local on_enter = function (self, capsule) --_detalhes:CooltipPreset (1) --GameCooltip:AddLine ("right click to reset") --GameCooltip:Show (self) end local on_leave = function (self, capsule) --GameCooltip:Hide() end local reset = gump:NewLabel (panel, panel, nil, nil, "|TInterface\\TUTORIALFRAME\\UI-TUTORIAL-FRAME:" .. 20 .. ":" .. 20 .. ":0:1:512:512:8:70:328:409|t " .. Loc ["STRING_OPTIONS_CLASSCOLOR_RESET"]) reset:SetPoint ("bottomright", panel, "bottomright", -23, 08) local reset_texture = gump:CreateImage (panel, [[Interface\MONEYFRAME\UI-MONEYFRAME-BORDER]], 138, 45, "border") reset_texture:SetPoint ("center", reset, "center", 0, -7) reset_texture:SetDesaturated (true) panel.buttons = {} for index, class_name in ipairs (CLASS_SORT_ORDER) do local icon = gump:CreateImage (upper_panel, [[Interface\Glues\CHARACTERCREATE\UI-CHARACTERCREATE-CLASSES]], 32, 32, nil, CLASS_ICON_TCOORDS [class_name], "icon_" .. class_name) if (index%2 ~= 0) then icon:SetPoint (10, y) else icon:SetPoint (150, y) y = y - 33 end local bg_texture = gump:CreateImage (panel, [[Interface\AddOns\Details\images\bar_skyline]], 135, 30, "artwork") bg_texture:SetPoint ("left", icon, "right", -32, 0) local button = gump:CreateButton (panel, set_color, 135, 30, "set color", class_name, index) button:SetPoint ("left", icon, "right", -32, 0) button:InstallCustomTexture (nil, nil, nil, nil, true) button:SetFrameLevel (panel:GetFrameLevel()+1) button.my_icon = icon button.my_texture = bg_texture button.my_class = class_name button:SetHook ("OnEnter", on_enter) button:SetHook ("OnLeave", on_leave) button:SetClickFunction (reset_color, nil, nil, "RightClick") panel.buttons [class_name] = button end end for class, button in pairs (_G.DetailsClassColorManager.buttons) do button.my_texture:SetVertexColor (unpack (_detalhes.class_colors [class])) end _G.DetailsClassColorManager:Show() end --> config bookmarks function _detalhes:OpenBookmarkConfig() if (not _G.DetailsBookmarkManager) then gump:CreateSimplePanel (UIParent, 465, 460, Loc ["STRING_OPTIONS_MANAGE_BOOKMARKS"], "DetailsBookmarkManager") local panel = _G.DetailsBookmarkManager _detalhes.gump:ApplyStandardBackdrop (panel) panel.blocks = {} local clear_func = function (self, button, id) if (_detalhes.switch.table [id]) then _detalhes.switch.table [id].atributo = nil _detalhes.switch.table [id].sub_atributo = nil panel:Refresh() _detalhes.switch:Update() end end local select_attribute = function (_, _, _, attribute, sub_atribute) if (not sub_atribute) then return end _detalhes.switch.table [panel.selecting_slot].atributo = attribute _detalhes.switch.table [panel.selecting_slot].sub_atributo = sub_atribute panel:Refresh() _detalhes.switch:Update() end local cooltip_color = {.1, .1, .1, .3} local set_att = function (self, button, id) panel.selecting_slot = id GameCooltip:Reset() GameCooltip:SetType (3) GameCooltip:SetOwner (self) _detalhes:MontaAtributosOption (_detalhes:GetInstance(1), select_attribute) GameCooltip:SetColor (1, cooltip_color) GameCooltip:SetColor (2, cooltip_color) GameCooltip:SetOption ("HeightAnchorMod", -7) GameCooltip:SetOption ("TextSize", _detalhes.font_sizes.menus) GameCooltip:SetBackdrop (1, _detalhes.tooltip_backdrop, nil, _detalhes.tooltip_border_color) GameCooltip:SetBackdrop (2, _detalhes.tooltip_backdrop, nil, _detalhes.tooltip_border_color) GameCooltip:ShowCooltip() end local button_backdrop = {bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 64, insets = {left=0, right=0, top=0, bottom=0}} local set_onenter = function (self, capsule) self:SetBackdropColor (1, 1, 1, 0.9) capsule.icon:SetBlendMode ("ADD") end local set_onleave = function (self, capsule) self:SetBackdropColor (0, 0, 0, 0.5) capsule.icon:SetBlendMode ("BLEND") end for i = 1, 40 do local clear = gump:CreateButton (panel, clear_func, 16, 16, nil, i, nil, [[Interface\Glues\LOGIN\Glues-CheckBox-Check]]) if (i%2 ~= 0) then --impar clear:SetPoint (15, (( i*10 ) * -1) - 35) --left else --par local o = i-1 clear:SetPoint (250, (( o*10 ) * -1) - 35) --right end local set = gump:CreateButton (panel, set_att, 16, 16, nil, i) set:SetPoint ("left", clear, "right") set:SetPoint ("right", clear, "right", 180, 0) set:SetBackdrop (button_backdrop) set:SetBackdropColor (0, 0, 0, 0.5) set:SetHook ("OnEnter", set_onenter) set:SetHook ("OnLeave", set_onleave) --set:InstallCustomTexture (nil, nil, nil, nil, true) set:SetTemplate (gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")) local bg_texture = gump:CreateImage (set, [[Interface\AddOns\Details\images\bar_skyline]], 135, 30, "background") bg_texture:SetAllPoints() set.bg = bg_texture local icon = gump:CreateImage (set, nil, 16, 16, nil, nil, "icon") icon:SetPoint ("left", clear, "right", 4, 0) local label = gump:CreateLabel (set, "") label:SetPoint ("left", icon, "right", 2, 0) tinsert (panel.blocks, {icon = icon, label = label, bg = set.bg, button = set}) end local normal_coords = {0, 1, 0, 1} local unknown_coords = {157/512, 206/512, 39/512, 89/512} function panel:Refresh() local bookmarks = _detalhes.switch.table for i = 1, 40 do local bookmark = bookmarks [i] local this_block = panel.blocks [i] if (bookmark and bookmark.atributo and bookmark.sub_atributo) then if (bookmark.atributo == 5) then --> custom local CustomObject = _detalhes.custom [bookmark.sub_atributo] if (not CustomObject) then --> ele j� foi deletado this_block.label.text = "-- x -- x --" this_block.icon.texture = "Interface\\ICONS\\Ability_DualWield" this_block.icon.texcoord = normal_coords this_block.bg:SetVertexColor (.4, .1, .1, .12) else this_block.label.text = CustomObject.name this_block.icon.texture = CustomObject.icon this_block.icon.texcoord = normal_coords this_block.bg:SetVertexColor (.4, .4, .4, .6) end else bookmark.atributo = bookmark.atributo or 1 bookmark.sub_atributo = bookmark.sub_atributo or 1 this_block.label.text = _detalhes.sub_atributos [bookmark.atributo].lista [bookmark.sub_atributo] this_block.icon.texture = _detalhes.sub_atributos [bookmark.atributo].icones [bookmark.sub_atributo] [1] this_block.icon.texcoord = _detalhes.sub_atributos [bookmark.atributo].icones [bookmark.sub_atributo] [2] this_block.bg:SetVertexColor (.4, .4, .4, .6) end this_block.button:SetAlpha (1) else this_block.label.text = "-- x -- x --" this_block.icon.texture = [[Interface\AddOns\Details\images\icons]] this_block.icon.texcoord = unknown_coords this_block.bg:SetVertexColor (.1, .1, .1, .12) this_block.button:SetAlpha (0.3) end end end end _G.DetailsBookmarkManager:Show() _G.DetailsBookmarkManager:Refresh() end --> create bubble do local f = CreateFrame ("frame", "DetailsBubble", UIParent) f:SetPoint ("center", UIParent, "center") f:SetSize (100, 100) f:SetFrameStrata ("TOOLTIP") f.isHorizontalFlipped = false f.isVerticalFlipped = false local t = f:CreateTexture (nil, "artwork") t:SetTexture ([[Interface\AddOns\Details\images\icons]]) t:SetSize (131 * 1.2, 81 * 1.2) --377 328 508 409 0.0009765625 t:SetTexCoord (0.7373046875, 0.9912109375, 0.6416015625, 0.7978515625) t:SetPoint ("center", f, "center") local line1 = f:CreateFontString (nil, "overlay", "GameFontHighlightSmall") line1:SetPoint ("topleft", t, "topleft", 24, -10) _detalhes:SetFontSize (line1, 9) line1:SetTextColor (.9, .9, .9, 1) line1:SetSize (110, 12) line1:SetJustifyV ("center") line1:SetJustifyH ("center") local line2 = f:CreateFontString (nil, "overlay", "GameFontHighlightSmall") line2:SetPoint ("topleft", t, "topleft", 11, -20) _detalhes:SetFontSize (line2, 9) line2:SetTextColor (.9, .9, .9, 1) line2:SetSize (140, 12) line2:SetJustifyV ("center") line2:SetJustifyH ("center") local line3 = f:CreateFontString (nil, "overlay", "GameFontHighlightSmall") line3:SetPoint ("topleft", t, "topleft", 7, -30) _detalhes:SetFontSize (line3, 9) line3:SetTextColor (.9, .9, .9, 1) line3:SetSize (144, 12) line3:SetJustifyV ("center") line3:SetJustifyH ("center") local line4 = f:CreateFontString (nil, "overlay", "GameFontHighlightSmall") line4:SetPoint ("topleft", t, "topleft", 11, -40) _detalhes:SetFontSize (line4, 9) line4:SetTextColor (.9, .9, .9, 1) line4:SetSize (140, 12) line4:SetJustifyV ("center") line4:SetJustifyH ("center") local line5 = f:CreateFontString (nil, "overlay", "GameFontHighlightSmall") line5:SetPoint ("topleft", t, "topleft", 24, -50) _detalhes:SetFontSize (line5, 9) line5:SetTextColor (.9, .9, .9, 1) line5:SetSize (110, 12) line5:SetJustifyV ("center") line5:SetJustifyH ("center") f.lines = {line1, line2, line3, line4, line5} function f:FlipHorizontal() if (not f.isHorizontalFlipped) then if (f.isVerticalFlipped) then t:SetTexCoord (0.9912109375, 0.7373046875, 0.7978515625, 0.6416015625) else t:SetTexCoord (0.9912109375, 0.7373046875, 0.6416015625, 0.7978515625) end f.isHorizontalFlipped = true else if (f.isVerticalFlipped) then t:SetTexCoord (0.7373046875, 0.9912109375, 0.7978515625, 0.6416015625) else t:SetTexCoord (0.7373046875, 0.9912109375, 0.6416015625, 0.7978515625) end f.isHorizontalFlipped = false end end function f:FlipVertical() if (not f.isVerticalFlipped) then if (f.isHorizontalFlipped) then t:SetTexCoord (0.7373046875, 0.9912109375, 0.7978515625, 0.6416015625) else t:SetTexCoord (0.9912109375, 0.7373046875, 0.7978515625, 0.6416015625) end f.isVerticalFlipped = true else if (f.isHorizontalFlipped) then t:SetTexCoord (0.7373046875, 0.9912109375, 0.6416015625, 0.7978515625) else t:SetTexCoord (0.9912109375, 0.7373046875, 0.6416015625, 0.7978515625) end f.isVerticalFlipped = false end end function f:TextConfig (fontsize, fontface, fontcolor) for i = 1, 5 do local line = f.lines [i] _detalhes:SetFontSize (line, fontsize or 9) _detalhes:SetFontFace (line, fontface or [[Fonts\FRIZQT__.TTF]]) _detalhes:SetFontColor (line, fontcolor or {.9, .9, .9, 1}) end end function f:SetBubbleText (line1, line2, line3, line4, line5) if (not line1) then for _, line in ipairs (f.lines) do line:SetText ("") end return end if (line1:find ("\n")) then line1, line2, line3, line4, line5 = strsplit ("\n", line1) end f.lines[1]:SetText (line1) f.lines[2]:SetText (line2) f.lines[3]:SetText (line3) f.lines[4]:SetText (line4) f.lines[5]:SetText (line5) end function f:SetOwner (frame, myPoint, hisPoint, x, y, alpha) f:ClearAllPoints() f:TextConfig() f:SetBubbleText (nil) t:SetTexCoord (0.7373046875, 0.9912109375, 0.6416015625, 0.7978515625) f.isHorizontalFlipped = false f.isVerticalFlipped = false f:SetPoint (myPoint or "bottom", frame, hisPoint or "top", x or 0, y or 0) t:SetAlpha (alpha or 1) end function f:ShowBubble() f:Show() end function f:HideBubble() f:Hide() end f:SetBubbleText (nil) f:Hide() end --> feed back request function _detalhes:ShowFeedbackRequestWindow() local feedback_frame = CreateFrame ("FRAME", "DetailsFeedbackWindow", UIParent, "ButtonFrameTemplate") tinsert (UISpecialFrames, "DetailsFeedbackWindow") feedback_frame:SetPoint ("center", UIParent, "center") feedback_frame:SetSize (512, 200) feedback_frame.portrait:SetTexture ([[Interface\CHARACTERFRAME\TEMPORARYPORTRAIT-FEMALE-GNOME]]) feedback_frame.TitleText:SetText ("Help Details! to Improve!") feedback_frame.uppertext = feedback_frame:CreateFontString (nil, "artwork", "GameFontNormal") feedback_frame.uppertext:SetText ("Tell us about your experience using Details!, what you liked most, where we could improve, what things you want to see in the future?") feedback_frame.uppertext:SetPoint ("topleft", feedback_frame, "topleft", 60, -32) local font, _, flags = feedback_frame.uppertext:GetFont() feedback_frame.uppertext:SetFont (font, 10, flags) feedback_frame.uppertext:SetTextColor (1, 1, 1, .8) feedback_frame.uppertext:SetWidth (440) local editbox = _detalhes.gump:NewTextEntry (feedback_frame, nil, "$parentTextEntry", "text", 387, 14) editbox:SetPoint (20, -106) editbox:SetAutoFocus (false) editbox:SetHook ("OnEditFocusGained", function() editbox.text = "http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks" editbox:HighlightText() end) editbox:SetHook ("OnEditFocusLost", function() editbox.text = "http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks" editbox:HighlightText() end) editbox:SetHook ("OnChar", function() editbox.text = "http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks" editbox:HighlightText() end) editbox.text = "http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks" feedback_frame.midtext = feedback_frame:CreateFontString (nil, "artwork", "GameFontNormal") feedback_frame.midtext:SetText ("visit the link above and let's make Details! stronger!") feedback_frame.midtext:SetPoint ("center", editbox.widget, "center") feedback_frame.midtext:SetPoint ("top", editbox.widget, "bottom", 0, -2) feedback_frame.midtext:SetJustifyH ("center") local font, _, flags = feedback_frame.midtext:GetFont() feedback_frame.midtext:SetFont (font, 10, flags) --feedback_frame.midtext:SetTextColor (1, 1, 1, 1) feedback_frame.midtext:SetWidth (440) feedback_frame.gnoma = feedback_frame:CreateTexture (nil, "artwork") feedback_frame.gnoma:SetPoint ("topright", feedback_frame, "topright", -1, -59) feedback_frame.gnoma:SetTexture ("Interface\\AddOns\\Details\\images\\icons2") feedback_frame.gnoma:SetSize (105*1.05, 107*1.05) feedback_frame.gnoma:SetTexCoord (0.2021484375, 0, 0.7919921875, 1) feedback_frame.close = CreateFrame ("Button", "DetailsFeedbackWindowCloseButton", feedback_frame, "OptionsButtonTemplate") feedback_frame.close:SetPoint ("bottomleft", feedback_frame, "bottomleft", 8, 4) feedback_frame.close:SetText ("Close") feedback_frame.close:SetScript ("OnClick", function (self) editbox:ClearFocus() feedback_frame:Hide() end) feedback_frame.postpone = CreateFrame ("Button", "DetailsFeedbackWindowPostPoneButton", feedback_frame, "OptionsButtonTemplate") feedback_frame.postpone:SetPoint ("bottomright", feedback_frame, "bottomright", -10, 4) feedback_frame.postpone:SetText ("Remind-me Later") feedback_frame.postpone:SetScript ("OnClick", function (self) editbox:ClearFocus() feedback_frame:Hide() _detalhes.tutorial.feedback_window1 = false end) feedback_frame.postpone:SetWidth (130) feedback_frame:SetScript ("OnHide", function() editbox:ClearFocus() end) --0.0009765625 512 function _detalhes:FeedbackSetFocus() DetailsFeedbackWindow:Show() DetailsFeedbackWindowTextEntry.MyObject:SetFocus() DetailsFeedbackWindowTextEntry.MyObject:HighlightText() end _detalhes:ScheduleTimer ("FeedbackSetFocus", 5) end --> interface menu local f = CreateFrame ("frame", "DetailsInterfaceOptionsPanel", UIParent) f.name = "Details" f.logo = f:CreateTexture (nil, "overlay") f.logo:SetPoint ("center", f, "center", 0, 0) f.logo:SetPoint ("top", f, "top", 25, 56) f.logo:SetTexture ([[Interface\AddOns\Details\images\logotipo]]) f.logo:SetSize (256, 128) InterfaceOptions_AddCategory (f) --> open options panel f.options_button = CreateFrame ("button", nil, f, "OptionsButtonTemplate") f.options_button:SetText (Loc ["STRING_INTERFACE_OPENOPTIONS"]) f.options_button:SetPoint ("topleft", f, "topleft", 10, -100) f.options_button:SetWidth (170) f.options_button:SetScript ("OnClick", function (self) local lower_instance = _detalhes:GetLowerInstanceNumber() if (not lower_instance) then --> no window opened? local instance1 = _detalhes.tabela_instancias [1] if (instance1) then instance1:Enable() return _detalhes:OpenOptionsWindow (instance1) else instance1 = _detalhes:CriarInstancia (_, true) if (instance1) then return _detalhes:OpenOptionsWindow (instance1) else _detalhes:Msg ("couldn't open options panel: no window available.") end end end _detalhes:OpenOptionsWindow (_detalhes:GetInstance (lower_instance)) end) --> create new window f.new_window_button = CreateFrame ("button", nil, f, "OptionsButtonTemplate") f.new_window_button:SetText (Loc ["STRING_MINIMAPMENU_NEWWINDOW"]) f.new_window_button:SetPoint ("topleft", f, "topleft", 10, -125) f.new_window_button:SetWidth (170) f.new_window_button:SetScript ("OnClick", function (self) _detalhes:CriarInstancia (_, true) end) function _detalhes:CreateWelcomePanel (name, parent, width, height, make_movable) local f = CreateFrame ("frame", name, parent or UIParent) --f:SetBackdrop ({bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 128, insets = {left=3, right=3, top=3, bottom=3}, edgeFile = [[Interface\AddOns\Details\images\border_welcome]], edgeSize = 16}) f:SetBackdrop ({bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 128, insets = {left=0, right=0, top=0, bottom=0}, edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1}) f:SetBackdropColor (1, 1, 1, 0.75) f:SetBackdropBorderColor (0, 0, 0, 1) f:SetSize (width or 1, height or 1) if (make_movable) then f:SetScript ("OnMouseDown", function(self, button) if (self.isMoving) then return end if (button == "RightButton") then self:Hide() else self:StartMoving() self.isMoving = true end end) f:SetScript ("OnMouseUp", function(self, button) if (self.isMoving and button == "LeftButton") then self:StopMovingOrSizing() self.isMoving = nil end end) f:SetToplevel (true) f:SetMovable (true) end return f end function _detalhes:OpenBrokerTextEditor() if (not DetailsWindowOptionsBrokerTextEditor) then local panel = _detalhes:CreateWelcomePanel ("DetailsWindowOptionsBrokerTextEditor", nil, 650, 210, true) panel:SetPoint ("center", UIParent, "center") panel:Hide() panel:SetFrameStrata ("FULLSCREEN") local textentry = _detalhes.gump:NewSpecialLuaEditorEntry (panel, 450, 185, "editbox", "$parentEntry", true) textentry:SetPoint ("topleft", panel, "topleft", 10, -12) textentry.editbox:SetScript ("OnTextChanged", function() local text = panel.editbox:GetText() _detalhes.data_broker_text = text _detalhes:BrokerTick() if (_G.DetailsOptionsWindow) then _G.DetailsOptionsWindow19BrokerEntry.MyObject:SetText (_detalhes.data_broker_text) end end) local option_selected = 1 local onclick= function (_, _, value) option_selected = value end local AddOptions = { {label = Loc ["STRING_OPTIONS_DATABROKER_TEXT_ADD1"], value = 1, onclick = onclick}, {label = Loc ["STRING_OPTIONS_DATABROKER_TEXT_ADD2"], value = 2, onclick = onclick}, {label = Loc ["STRING_OPTIONS_DATABROKER_TEXT_ADD3"], value = 3, onclick = onclick}, {label = Loc ["STRING_OPTIONS_DATABROKER_TEXT_ADD4"], value = 4, onclick = onclick}, {label = Loc ["STRING_OPTIONS_DATABROKER_TEXT_ADD5"], value = 5, onclick = onclick}, {label = Loc ["STRING_OPTIONS_DATABROKER_TEXT_ADD6"], value = 6, onclick = onclick}, {label = Loc ["STRING_OPTIONS_DATABROKER_TEXT_ADD7"], value = 7, onclick = onclick}, {label = Loc ["STRING_OPTIONS_DATABROKER_TEXT_ADD8"], value = 8, onclick = onclick}, {label = Loc ["STRING_OPTIONS_DATABROKER_TEXT_ADD9"], value = 9, onclick = onclick}, } local buildAddMenu = function() return AddOptions end local d = _detalhes.gump:NewDropDown (panel, _, "$parentTextOptionsDropdown", "TextOptionsDropdown", 150, 20, buildAddMenu, 1) d:SetPoint ("topright", panel, "topright", -12, -14) --d:SetFrameStrata ("TOOLTIP") local optiontable = {"{dmg}", "{dps}", "{dpos}", "{ddiff}", "{heal}", "{hps}", "{hpos}", "{hdiff}", "{time}"} local add_button = _detalhes.gump:NewButton (panel, nil, "$parentAddButton", nil, 20, 20, function() textentry.editbox:Insert (optiontable [option_selected]) end, nil, nil, nil, "<-") add_button:SetPoint ("right", d, "left", -2, 0) add_button:InstallCustomTexture() -- code author Saiket from http://www.wowinterface.com/forums/showpost.php?p=245759&postcount=6 --- @return StartPos, EndPos of highlight in this editbox. local function GetTextHighlight ( self ) local Text, Cursor = self:GetText(), self:GetCursorPosition(); self:Insert( "" ); -- Delete selected text local TextNew, CursorNew = self:GetText(), self:GetCursorPosition(); -- Restore previous text self:SetText( Text ); self:SetCursorPosition( Cursor ); local Start, End = CursorNew, #Text - ( #TextNew - CursorNew ); self:HighlightText( Start, End ); return Start, End; end local StripColors; do local CursorPosition, CursorDelta; --- Callback for gsub to remove unescaped codes. local function StripCodeGsub ( Escapes, Code, End ) if ( #Escapes % 2 == 0 ) then -- Doesn't escape Code if ( CursorPosition and CursorPosition >= End - 1 ) then CursorDelta = CursorDelta - #Code; end return Escapes; end end --- Removes a single escape sequence. local function StripCode ( Pattern, Text, OldCursor ) CursorPosition, CursorDelta = OldCursor, 0; return Text:gsub( Pattern, StripCodeGsub ), OldCursor and CursorPosition + CursorDelta; end --- Strips Text of all color escape sequences. -- @param Cursor Optional cursor position to keep track of. -- @return Stripped text, and the updated cursor position if Cursor was given. function StripColors ( Text, Cursor ) Text, Cursor = StripCode( "(|*)(|c%x%x%x%x%x%x%x%x)()", Text, Cursor ); return StripCode( "(|*)(|r)()", Text, Cursor ); end end local COLOR_END = "|r"; --- Wraps this editbox's selected text with the given color. local function ColorSelection ( self, ColorCode ) local Start, End = GetTextHighlight( self ); local Text, Cursor = self:GetText(), self:GetCursorPosition(); if ( Start == End ) then -- Nothing selected --Start, End = Cursor, Cursor; -- Wrap around cursor return; -- Wrapping the cursor in a color code and hitting backspace crashes the client! end -- Find active color code at the end of the selection local ActiveColor; if ( End < #Text ) then -- There is text to color after the selection local ActiveEnd; local CodeEnd, _, Escapes, Color = 0; while ( true ) do _, CodeEnd, Escapes, Color = Text:find( "(|*)(|c%x%x%x%x%x%x%x%x)", CodeEnd + 1 ); if ( not CodeEnd or CodeEnd > End ) then break; end if ( #Escapes % 2 == 0 ) then -- Doesn't escape Code ActiveColor, ActiveEnd = Color, CodeEnd; end end if ( ActiveColor ) then -- Check if color gets terminated before selection ends CodeEnd = 0; while ( true ) do _, CodeEnd, Escapes = Text:find( "(|*)|r", CodeEnd + 1 ); if ( not CodeEnd or CodeEnd > End ) then break; end if ( CodeEnd > ActiveEnd and #Escapes % 2 == 0 ) then -- Terminates ActiveColor ActiveColor = nil; break; end end end end local Selection = Text:sub( Start + 1, End ); -- Remove color codes from the selection local Replacement, CursorReplacement = StripColors( Selection, Cursor - Start ); self:SetText( ( "" ):join( Text:sub( 1, Start ), ColorCode, Replacement, COLOR_END, ActiveColor or "", Text:sub( End + 1 ) ) ); -- Restore cursor and highlight, adjusting for wrapper text Cursor = Start + CursorReplacement; if ( CursorReplacement > 0 ) then -- Cursor beyond start of color code Cursor = Cursor + #ColorCode; end if ( CursorReplacement >= #Replacement ) then -- Cursor beyond end of color Cursor = Cursor + #COLOR_END; end self:SetCursorPosition( Cursor ); -- Highlight selection and wrapper self:HighlightText( Start, #ColorCode + ( #Replacement - #Selection ) + #COLOR_END + End ); end local color_func = function (_, r, g, b, a) local hex = _detalhes:hex (a*255).._detalhes:hex (r*255).._detalhes:hex (g*255).._detalhes:hex (b*255) ColorSelection ( textentry.editbox, "|c" .. hex) end local color_button = _detalhes.gump:NewColorPickButton (panel, "$parentButton5", nil, color_func) color_button:SetSize (80, 20) color_button:SetPoint ("topright", panel, "topright", -12, -102) color_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_COLOR_TOOLTIP"] local done = function() local text = panel.editbox:GetText() _detalhes.data_broker_text = text if (_G.DetailsOptionsWindow) then _G.DetailsOptionsWindow19BrokerEntry.MyObject:SetText (_detalhes.data_broker_text) end _detalhes:BrokerTick() panel:Hide() end local ok_button = _detalhes.gump:NewButton (panel, nil, "$parentButtonOk", nil, 80, 20, done, nil, nil, nil, Loc ["STRING_OPTIONS_TEXTEDITOR_DONE"], 1) ok_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_DONE_TOOLTIP"] ok_button:InstallCustomTexture() ok_button:SetPoint ("topright", panel, "topright", -12, -174) local reset_button = _detalhes.gump:NewButton (panel, nil, "$parentDefaultOk", nil, 80, 20, function() textentry.editbox:SetText ("") end, nil, nil, nil, "Reset", 1) reset_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_RESET_TOOLTIP"] reset_button:InstallCustomTexture() reset_button:SetPoint ("topright", panel, "topright", -100, -152) local cancel_button = _detalhes.gump:NewButton (panel, nil, "$parentDefaultCancel", nil, 80, 20, function() textentry.editbox:SetText (panel.default_text); done(); end, nil, nil, nil, Loc ["STRING_OPTIONS_TEXTEDITOR_CANCEL"], 1) cancel_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_CANCEL_TOOLTIP"] cancel_button:InstallCustomTexture() cancel_button:SetPoint ("topright", panel, "topright", -100, -174) end local panel = DetailsWindowOptionsBrokerTextEditor local text = _detalhes.data_broker_text:gsub ("||", "|") panel.default_text = text panel.editbox:SetText (text) panel:Show() end --> row text editor local panel = _detalhes:CreateWelcomePanel ("DetailsWindowOptionsBarTextEditor", nil, 650, 230, true) panel:SetPoint ("center", UIParent, "center") panel:Hide() panel:SetFrameStrata ("FULLSCREEN") Details.gump:ApplyStandardBackdrop (panel) Details.gump:CreateTitleBar (panel, "Details! Custom Line Text Editor") function panel:Open (text, callback, host, default) if (host) then panel:SetPoint ("center", host, "center") end text = text:gsub ("||", "|") panel.default_text = text panel.editbox:SetText (text) panel.callback = callback panel.default = default or "" panel:Show() end local y = -32 local buttonTemplate = Details.gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") local textentry = _detalhes.gump:NewSpecialLuaEditorEntry (panel, 450, 185, "editbox", "$parentEntry", true) textentry:SetPoint ("topleft", panel, "topleft", 10, y) Details.gump:ApplyStandardBackdrop (textentry) Details.gump:SetFontSize (textentry.editbox, 14) Details.gump:ReskinSlider (textentry.scroll) local arg1_button = _detalhes.gump:NewButton (panel, nil, "$parentButton1", nil, 80, 20, function() textentry.editbox:Insert ("{data1}") end, nil, nil, nil, string.format (Loc ["STRING_OPTIONS_TEXTEDITOR_DATA"], "1"), 1) local arg2_button = _detalhes.gump:NewButton (panel, nil, "$parentButton2", nil, 80, 20, function() textentry.editbox:Insert ("{data2}") end, nil, nil, nil, string.format (Loc ["STRING_OPTIONS_TEXTEDITOR_DATA"], "2"), 1) local arg3_button = _detalhes.gump:NewButton (panel, nil, "$parentButton3", nil, 80, 20, function() textentry.editbox:Insert ("{data3}") end, nil, nil, nil, string.format (Loc ["STRING_OPTIONS_TEXTEDITOR_DATA"], "3"), 1) arg1_button:SetPoint ("topright", panel, "topright", -12, y) arg2_button:SetPoint ("topright", panel, "topright", -12, y - (20*1)) arg3_button:SetPoint ("topright", panel, "topright", -12, y - (20*2)) arg1_button:SetTemplate (buttonTemplate) arg2_button:SetTemplate (buttonTemplate) arg3_button:SetTemplate (buttonTemplate) arg1_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_DATA_TOOLTIP"] arg2_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_DATA_TOOLTIP"] arg3_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_DATA_TOOLTIP"] -- code author Saiket from http://www.wowinterface.com/forums/showpost.php?p=245759&postcount=6 --- @return StartPos, EndPos of highlight in this editbox. local function GetTextHighlight ( self ) local Text, Cursor = self:GetText(), self:GetCursorPosition(); self:Insert( "" ); -- Delete selected text local TextNew, CursorNew = self:GetText(), self:GetCursorPosition(); -- Restore previous text self:SetText( Text ); self:SetCursorPosition( Cursor ); local Start, End = CursorNew, #Text - ( #TextNew - CursorNew ); self:HighlightText( Start, End ); return Start, End; end local StripColors; do local CursorPosition, CursorDelta; --- Callback for gsub to remove unescaped codes. local function StripCodeGsub ( Escapes, Code, End ) if ( #Escapes % 2 == 0 ) then -- Doesn't escape Code if ( CursorPosition and CursorPosition >= End - 1 ) then CursorDelta = CursorDelta - #Code; end return Escapes; end end --- Removes a single escape sequence. local function StripCode ( Pattern, Text, OldCursor ) CursorPosition, CursorDelta = OldCursor, 0; return Text:gsub( Pattern, StripCodeGsub ), OldCursor and CursorPosition + CursorDelta; end --- Strips Text of all color escape sequences. -- @param Cursor Optional cursor position to keep track of. -- @return Stripped text, and the updated cursor position if Cursor was given. function StripColors ( Text, Cursor ) Text, Cursor = StripCode( "(|*)(|c%x%x%x%x%x%x%x%x)()", Text, Cursor ); return StripCode( "(|*)(|r)()", Text, Cursor ); end end local COLOR_END = "|r"; --- Wraps this editbox's selected text with the given color. local function ColorSelection ( self, ColorCode ) local Start, End = GetTextHighlight( self ); local Text, Cursor = self:GetText(), self:GetCursorPosition(); if ( Start == End ) then -- Nothing selected --Start, End = Cursor, Cursor; -- Wrap around cursor return; -- Wrapping the cursor in a color code and hitting backspace crashes the client! end -- Find active color code at the end of the selection local ActiveColor; if ( End < #Text ) then -- There is text to color after the selection local ActiveEnd; local CodeEnd, _, Escapes, Color = 0; while ( true ) do _, CodeEnd, Escapes, Color = Text:find( "(|*)(|c%x%x%x%x%x%x%x%x)", CodeEnd + 1 ); if ( not CodeEnd or CodeEnd > End ) then break; end if ( #Escapes % 2 == 0 ) then -- Doesn't escape Code ActiveColor, ActiveEnd = Color, CodeEnd; end end if ( ActiveColor ) then -- Check if color gets terminated before selection ends CodeEnd = 0; while ( true ) do _, CodeEnd, Escapes = Text:find( "(|*)|r", CodeEnd + 1 ); if ( not CodeEnd or CodeEnd > End ) then break; end if ( CodeEnd > ActiveEnd and #Escapes % 2 == 0 ) then -- Terminates ActiveColor ActiveColor = nil; break; end end end end local Selection = Text:sub( Start + 1, End ); -- Remove color codes from the selection local Replacement, CursorReplacement = StripColors( Selection, Cursor - Start ); self:SetText( ( "" ):join( Text:sub( 1, Start ), ColorCode, Replacement, COLOR_END, ActiveColor or "", Text:sub( End + 1 ) ) ); -- Restore cursor and highlight, adjusting for wrapper text Cursor = Start + CursorReplacement; if ( CursorReplacement > 0 ) then -- Cursor beyond start of color code Cursor = Cursor + #ColorCode; end if ( CursorReplacement >= #Replacement ) then -- Cursor beyond end of color Cursor = Cursor + #COLOR_END; end self:SetCursorPosition( Cursor ); -- Highlight selection and wrapper self:HighlightText( Start, #ColorCode + ( #Replacement - #Selection ) + #COLOR_END + End ); end local color_func = function (_, r, g, b, a) local hex = _detalhes:hex (a*255).._detalhes:hex (r*255).._detalhes:hex (g*255).._detalhes:hex (b*255) ColorSelection ( textentry.editbox, "|c" .. hex) end local func_button = _detalhes.gump:NewButton (panel, nil, "$parentButton4", nil, 80, 20, function() textentry.editbox:Insert ("{func local player, combat = ...; return 0;}") end, nil, nil, nil, Loc ["STRING_OPTIONS_TEXTEDITOR_FUNC"], 1) local color_button = _detalhes.gump:NewColorPickButton (panel, "$parentButton5", nil, color_func) color_button:SetSize (80, 20) color_button:SetTemplate (buttonTemplate) func_button:SetPoint ("topright", panel, "topright", -12, y - (20*3)) color_button:SetPoint ("topright", panel, "topright", -12, y - (20*4)) func_button:SetTemplate (buttonTemplate) color_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_COLOR_TOOLTIP"] func_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_FUNC_TOOLTIP"] local done = function() local text = panel.editbox:GetText() panel.callback (text) panel:Hide() end local ok_button = _detalhes.gump:NewButton (panel, nil, "$parentButtonOk", nil, 80, 20, done, nil, nil, nil, Loc ["STRING_OPTIONS_TEXTEDITOR_DONE"], 1) ok_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_DONE_TOOLTIP"] ok_button:SetTemplate (buttonTemplate) ok_button:SetPoint ("topright", panel, "topright", -12, -194) local reset_button = _detalhes.gump:NewButton (panel, nil, "$parentDefaultOk", nil, 80, 20, function() textentry.editbox:SetText (panel.default) end, nil, nil, nil, Loc ["STRING_OPTIONS_TEXTEDITOR_RESET"], 1) reset_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_RESET_TOOLTIP"] reset_button:SetTemplate (buttonTemplate) reset_button:SetPoint ("topright", panel, "topright", -100, -172) local cancel_button = _detalhes.gump:NewButton (panel, nil, "$parentDefaultCancel", nil, 80, 20, function() textentry.editbox:SetText (panel.default_text); done(); end, nil, nil, nil, Loc ["STRING_OPTIONS_TEXTEDITOR_CANCEL"], 1) cancel_button.tooltip = Loc ["STRING_OPTIONS_TEXTEDITOR_CANCEL_TOOLTIP"] cancel_button:SetTemplate (buttonTemplate) cancel_button:SetPoint ("topright", panel, "topright", -100, -194) --update window function _detalhes:OpenUpdateWindow() if (not _G.DetailsUpdateDialog) then local updatewindow_frame = CreateFrame ("frame", "DetailsUpdateDialog", UIParent, "ButtonFrameTemplate") updatewindow_frame:SetFrameStrata ("LOW") tinsert (UISpecialFrames, "DetailsUpdateDialog") updatewindow_frame:SetPoint ("center", UIParent, "center") updatewindow_frame:SetSize (512, 200) updatewindow_frame.portrait:SetTexture ([[Interface\CHARACTERFRAME\TEMPORARYPORTRAIT-FEMALE-GNOME]]) updatewindow_frame.TitleText:SetText ("A New Version Is Available!") updatewindow_frame.midtext = updatewindow_frame:CreateFontString (nil, "artwork", "GameFontNormal") updatewindow_frame.midtext:SetText ("Good news everyone!\nA new version has been forged and is waiting to be looted.") updatewindow_frame.midtext:SetPoint ("topleft", updatewindow_frame, "topleft", 10, -90) updatewindow_frame.midtext:SetJustifyH ("center") updatewindow_frame.midtext:SetWidth (370) updatewindow_frame.gnoma = updatewindow_frame:CreateTexture (nil, "artwork") updatewindow_frame.gnoma:SetPoint ("topright", updatewindow_frame, "topright", -3, -59) updatewindow_frame.gnoma:SetTexture ("Interface\\AddOns\\Details\\images\\icons2") updatewindow_frame.gnoma:SetSize (105*1.05, 107*1.05) updatewindow_frame.gnoma:SetTexCoord (0.2021484375, 0, 0.7919921875, 1) local editbox = _detalhes.gump:NewTextEntry (updatewindow_frame, nil, "$parentTextEntry", "text", 387, 14) editbox:SetPoint (20, -136) editbox:SetAutoFocus (false) editbox:SetHook ("OnEditFocusGained", function() editbox.text = "http://www.curse.com/addons/wow/details" editbox:HighlightText() end) editbox:SetHook ("OnEditFocusLost", function() editbox.text = "http://www.curse.com/addons/wow/details" editbox:HighlightText() end) editbox:SetHook ("OnChar", function() editbox.text = "http://www.curse.com/addons/wow/details" editbox:HighlightText() end) editbox.text = "http://www.curse.com/addons/wow/details" updatewindow_frame.close = CreateFrame ("Button", "DetailsUpdateDialogCloseButton", updatewindow_frame, "OptionsButtonTemplate") updatewindow_frame.close:SetPoint ("bottomleft", updatewindow_frame, "bottomleft", 8, 4) updatewindow_frame.close:SetText ("Close") updatewindow_frame.close:SetScript ("OnClick", function (self) DetailsUpdateDialog:Hide() editbox:ClearFocus() end) updatewindow_frame:SetScript ("OnHide", function() editbox:ClearFocus() end) function _detalhes:UpdateDialogSetFocus() DetailsUpdateDialog:Show() DetailsUpdateDialogTextEntry.MyObject:SetFocus() DetailsUpdateDialogTextEntry.MyObject:HighlightText() end _detalhes:ScheduleTimer ("UpdateDialogSetFocus", 1) end end function _detalhes:OpenProfiler() --> isn't first run, so just quit if (not _detalhes.character_first_run) then return elseif (_detalhes.is_first_run) then return elseif (_detalhes.always_use_profile) then -- and type (_detalhes.always_use_profile) == "string" return else --> check is this is the first run of the addon (after being installed) local amount = 0 for name, profile in pairs (_detalhes_global.__profiles) do amount = amount + 1 end if (amount == 1) then return end end local f = _detalhes:CreateWelcomePanel (nil, nil, 250, 300, true) f:SetPoint ("right", UIParent, "right", -5, 0) local logo = f:CreateTexture (nil, "artwork") logo:SetTexture ([[Interface\AddOns\Details\images\logotipo]]) logo:SetSize (256*0.8, 128*0.8) logo:SetPoint ("center", f, "center", 0, 0) logo:SetPoint ("top", f, "top", 20, 20) local string_profiler = f:CreateFontString (nil, "artwork", "GameFontNormal") string_profiler:SetPoint ("top", logo, "bottom", -20, 10) string_profiler:SetText ("Profiler!") local string_profiler = f:CreateFontString (nil, "artwork", "GameFontNormal") string_profiler:SetPoint ("topleft", f, "topleft", 10, -130) string_profiler:SetText (Loc ["STRING_OPTIONS_PROFILE_SELECTEXISTING"]) string_profiler:SetWidth (230) _detalhes:SetFontSize (string_profiler, 11) _detalhes:SetFontColor (string_profiler, "white") --> get the new profile name local current_profile = _detalhes:GetCurrentProfileName() local on_select_profile = function (_, _, profilename) if (profilename ~= _detalhes:GetCurrentProfileName()) then _detalhes:ApplyProfile (profilename) if (_G.DetailsOptionsWindow and _G.DetailsOptionsWindow:IsShown()) then _detalhes:OpenOptionsWindow (_G.DetailsOptionsWindow.instance) end end end local texcoord = {5/32, 30/32, 4/32, 28/32} local fill_dropdown = function() local t = { {value = current_profile, label = Loc ["STRING_OPTIONS_PROFILE_USENEW"], onclick = on_select_profile, icon = [[Interface\FriendsFrame\UI-Toast-FriendRequestIcon]], texcoord = {4/32, 30/32, 4/32, 28/32}, iconcolor = "orange"} } for _, profilename in ipairs (_detalhes:GetProfileList()) do if (profilename ~= current_profile) then t[#t+1] = {value = profilename, label = profilename, onclick = on_select_profile, icon = [[Interface\FriendsFrame\UI-Toast-FriendOnlineIcon]], texcoord = texcoord, iconcolor = "yellow"} end end return t end local dropdown = _detalhes.gump:NewDropDown (f, f, "DetailsProfilerProfileSelectorDropdown", "dropdown", 220, 20, fill_dropdown, 1) dropdown:SetPoint (15, -190) local confirm_func = function() if (current_profile ~= _detalhes:GetCurrentProfileName()) then _detalhes:EraseProfile (current_profile) end f:Hide() end local confirm = _detalhes.gump:NewButton (f, f, "DetailsProfilerProfileConfirmButton", "button", 150, 20, confirm_func, nil, nil, nil, "okey!") confirm:SetPoint (50, -250) confirm:InstallCustomTexture() end --> minimap icon and hotcorner function _detalhes:RegisterMinimap() local LDB = LibStub ("LibDataBroker-1.1", true) local LDBIcon = LDB and LibStub ("LibDBIcon-1.0", true) if LDB then local databroker = LDB:NewDataObject ("Details", { type = "data source", icon = [[Interface\AddOns\Details\images\minimap]], text = "0", HotCornerIgnore = true, OnClick = function (self, button) if (button == "LeftButton") then --> 1 = open options panel if (_detalhes.minimap.onclick_what_todo == 1) then local lower_instance = _detalhes:GetLowerInstanceNumber() if (not lower_instance) then local instance = _detalhes:GetInstance (1) _detalhes.CriarInstancia (_, _, 1) _detalhes:OpenOptionsWindow (instance) else _detalhes:OpenOptionsWindow (_detalhes:GetInstance (lower_instance)) end --> 2 = reset data elseif (_detalhes.minimap.onclick_what_todo == 2) then _detalhes.tabela_historico:resetar() --> 3 = show hide windows elseif (_detalhes.minimap.onclick_what_todo == 3) then local opened = _detalhes:GetOpenedWindowsAmount() if (opened == 0) then _detalhes:ReabrirTodasInstancias() else _detalhes:ShutDownAllInstances() end end elseif (button == "RightButton") then GameTooltip:Hide() local GameCooltip = GameCooltip GameCooltip:Reset() GameCooltip:SetType ("menu") GameCooltip:SetOption ("ButtonsYMod", -5) GameCooltip:SetOption ("HeighMod", 5) GameCooltip:SetOption ("TextSize", 10) --344 427 200 268 0.0009765625 --0.672851, 0.833007, 0.391601, 0.522460 --GameCooltip:SetBannerImage (1, [[Interface\AddOns\Details\images\icons]], 83*.5, 68*.5, {"bottomleft", "topleft", 1, -4}, {0.672851, 0.833007, 0.391601, 0.522460}, nil) --GameCooltip:SetBannerImage (2, "Interface\\PetBattles\\Weather-Windy", 512*.35, 128*.3, {"bottomleft", "topleft", -25, -4}, {0, 1, 1, 0}) --GameCooltip:SetBannerText (1, "Mini Map Menu", {"left", "right", 2, -5}, "white", 10) --> reset GameCooltip:AddMenu (1, _detalhes.tabela_historico.resetar, true, nil, nil, Loc ["STRING_ERASE_DATA"], nil, true) GameCooltip:AddIcon ([[Interface\COMMON\VOICECHAT-MUTED]], 1, 1, 14, 14) GameCooltip:AddLine ("$div") --> nova instancia GameCooltip:AddMenu (1, _detalhes.CriarInstancia, true, nil, nil, Loc ["STRING_MINIMAPMENU_NEWWINDOW"], nil, true) --GameCooltip:AddIcon ([[Interface\Buttons\UI-AttributeButton-Encourage-Up]], 1, 1, 10, 10, 4/16, 12/16, 4/16, 12/16) GameCooltip:AddIcon ([[Interface\AddOns\Details\images\icons]], 1, 1, 12, 11, 462/512, 473/512, 1/512, 11/512) --> reopen all windows GameCooltip:AddMenu (1, _detalhes.ReabrirTodasInstancias, true, nil, nil, Loc ["STRING_MINIMAPMENU_REOPENALL"], nil, true) GameCooltip:AddIcon ([[Interface\Buttons\UI-MicroStream-Green]], 1, 1, 14, 14, 0.1875, 0.8125, 0.84375, 0.15625) --> close all windows GameCooltip:AddMenu (1, _detalhes.ShutDownAllInstances, true, nil, nil, Loc ["STRING_MINIMAPMENU_CLOSEALL"], nil, true) GameCooltip:AddIcon ([[Interface\Buttons\UI-MicroStream-Red]], 1, 1, 14, 14, 0.1875, 0.8125, 0.15625, 0.84375) GameCooltip:AddLine ("$div") --> lock GameCooltip:AddMenu (1, _detalhes.TravasInstancias, true, nil, nil, Loc ["STRING_MINIMAPMENU_LOCK"], nil, true) GameCooltip:AddIcon ([[Interface\PetBattles\PetBattle-LockIcon]], 1, 1, 14, 14, 0.0703125, 0.9453125, 0.0546875, 0.9453125) GameCooltip:AddMenu (1, _detalhes.DestravarInstancias, true, nil, nil, Loc ["STRING_MINIMAPMENU_UNLOCK"], nil, true) GameCooltip:AddIcon ([[Interface\PetBattles\PetBattle-LockIcon]], 1, 1, 14, 14, 0.0703125, 0.9453125, 0.0546875, 0.9453125, "gray") GameCooltip:AddLine ("$div") --> disable minimap icon local disable_minimap = function() _detalhes.minimap.hide = not value LDBIcon:Refresh ("Details", _detalhes.minimap) if (_detalhes.minimap.hide) then LDBIcon:Hide ("Details") else LDBIcon:Show ("Details") end end GameCooltip:AddMenu (1, disable_minimap, true, nil, nil, Loc ["STRING_MINIMAPMENU_HIDEICON"], nil, true) GameCooltip:AddIcon ([[Interface\Buttons\UI-Panel-HideButton-Disabled]], 1, 1, 14, 14, 7/32, 24/32, 8/32, 24/32, "gray") -- GameCooltip:SetBackdrop (1, _detalhes.tooltip_backdrop, nil, _detalhes.tooltip_border_color) GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0.64453125, 0}, {.8, .8, .8, 0.2}, true) GameCooltip:SetOwner (self, "topright", "bottomleft") GameCooltip:ShowCooltip() end end, OnTooltipShow = function (tooltip) tooltip:AddLine ("Details!", 1, 1, 1) if (_detalhes.minimap.onclick_what_todo == 1) then tooltip:AddLine (Loc ["STRING_MINIMAP_TOOLTIP1"]) elseif (_detalhes.minimap.onclick_what_todo == 2) then tooltip:AddLine (Loc ["STRING_MINIMAP_TOOLTIP11"]) elseif (_detalhes.minimap.onclick_what_todo == 3) then tooltip:AddLine (Loc ["STRING_MINIMAP_TOOLTIP12"]) end tooltip:AddLine (Loc ["STRING_MINIMAP_TOOLTIP2"]) end, }) if (databroker and not LDBIcon:IsRegistered ("Details")) then LDBIcon:Register ("Details", databroker, self.minimap) end _detalhes.databroker = databroker end end function _detalhes:DoRegisterHotCorner() --register lib-hotcorners local on_click_on_hotcorner_button = function (frame, button) if (_detalhes.hotcorner_topleft.onclick_what_todo == 1) then local lower_instance = _detalhes:GetLowerInstanceNumber() if (not lower_instance) then local instance = _detalhes:GetInstance (1) _detalhes.CriarInstancia (_, _, 1) _detalhes:OpenOptionsWindow (instance) else _detalhes:OpenOptionsWindow (_detalhes:GetInstance (lower_instance)) end elseif (_detalhes.hotcorner_topleft.onclick_what_todo == 2) then _detalhes.tabela_historico:resetar() end end local quickclick_func1 = function (frame, button) _detalhes.tabela_historico:resetar() end local quickclick_func2 = function (frame, button) local lower_instance = _detalhes:GetLowerInstanceNumber() if (not lower_instance) then local instance = _detalhes:GetInstance (1) _detalhes.CriarInstancia (_, _, 1) _detalhes:OpenOptionsWindow (instance) else _detalhes:OpenOptionsWindow (_detalhes:GetInstance (lower_instance)) end end local tooltip_hotcorner = function() GameTooltip:AddLine ("Details!", 1, 1, 1, 1) if (_detalhes.hotcorner_topleft.onclick_what_todo == 1) then GameTooltip:AddLine ("|cFF00FF00Left Click:|r open options panel.", 1, 1, 1, 1) elseif (_detalhes.hotcorner_topleft.onclick_what_todo == 2) then GameTooltip:AddLine ("|cFF00FF00Left Click:|r clear all segments.", 1, 1, 1, 1) end end if (_G.HotCorners) then _G.HotCorners:RegisterHotCornerButton ( --> absolute name "Details", --> corner "TOPLEFT", --> config table _detalhes.hotcorner_topleft, --> frame _G name "DetailsLeftCornerButton", --> icon [[Interface\AddOns\Details\images\minimap]], --> tooltip tooltip_hotcorner, --> click function on_click_on_hotcorner_button, --> menus nil, --> quick click { {func = quickclick_func1, name = "Details! - Reset Data"}, {func = quickclick_func2, name = "Details! - Open Options"} }, --> onenter nil, --> onleave nil, --> is install true ) end end function _detalhes:TestBarsUpdate() local current_combat = _detalhes:GetCombat ("current") for index, actor in current_combat[1]:ListActors() do actor.total = actor.total + (actor.total / 100 * math.random (1, 10)) actor.total = actor.total - (actor.total / 100 * math.random (1, 10)) end for index, actor in current_combat[2]:ListActors() do actor.total = actor.total + (actor.total / 100 * math.random (1, 10)) actor.total = actor.total - (actor.total / 100 * math.random (1, 10)) end current_combat[1].need_refresh = true current_combat[2].need_refresh = true end function _detalhes:StartTestBarUpdate() if (_detalhes.test_bar_update) then _detalhes:CancelTimer (_detalhes.test_bar_update) end _detalhes.test_bar_update = _detalhes:ScheduleRepeatingTimer ("TestBarsUpdate", 0.1) end function _detalhes:StopTestBarUpdate() if (_detalhes.test_bar_update) then _detalhes:CancelTimer (_detalhes.test_bar_update) end _detalhes.test_bar_update = nil end function _detalhes:CreateTestBars (alphabet) local current_combat = _detalhes:GetCombat ("current") local pclass = select (2, UnitClass ("player")) local actors_name = { {"Ragnaros", "MAGE", 63}, {"The Lich King", "DEATHKNIGHT", }, {"Your Neighbor", "SHAMAN", }, {"Your Raid Leader", "MONK", }, {"Huffer", "HUNTER", }, {"Your Internet Girlfriend", "SHAMAN", }, {"Mr. President", "WARRIOR", }, {"Antonidas", "MAGE"}, {"Your Math Teacher", "SHAMAN", }, {"King Djoffrey", "PALADIN", }, {UnitName ("player") .. " Snow", pclass, }, {"A Drunk Dawrf", "MONK", }, {"Low Dps Guy", "MONK", }, {"Helvis Phresley", "DEATHKNIGHT", }, {"Stormwind Guard", "WARRIOR", }, {"A PvP Player", "ROGUE", 260}, {"Bolvar Fordragon", "PALADIN", }, {"Malygos", "MAGE", }, {"Akama", "ROGUE", }, {"Nozdormu", "MAGE", }, {"Lady Blaumeux", "DEATHKNIGHT", }, {"Cairne Bloodhoof", "WARRIOR", }, {"Borivar", "ROGUE", 260}, {"C'Thun", "WARLOCK", }, {"Drek'Thar", "DEATHKNIGHT", }, {"Durotan", "WARRIOR", }, {"Eonar", "DRUID", }, {"Malfurion Stormrage", "DRUID", }, {"Footman Malakai", "WARRIOR", }, {"Bolvar Fordragon", "PALADIN", }, {"Fritz Fizzlesprocket", "HUNTER", }, {"Lisa Gallywix", "ROGUE", }, {"M'uru", "WARLOCK", }, {"Priestess MacDonnell", "PRIEST", }, {"Elune", "PRIEST", }, {"Nazgrel", "WARRIOR", }, {"Ner'zhul", "WARLOCK", }, {"Saria Nightwatcher", "PALADIN", }, {"Kael'thas Sunstrider", "MAGE", 63}, {"Velen", "PRIEST"}, {"Tyrande Whisperwind", "PRIEST", 257}, {"Sargeras", "WARLOCK", 267}, {"Arthas", "PALADIN", }, {"Orman of Stromgarde", "WARRIOR", }, {"General Rajaxx", "WARRIOR", }, {"Baron Rivendare", "DEATHKNIGHT", }, {"Roland", "MAGE", }, {"Archmage Trelane", "MAGE", }, {"Lilian Voss", "ROGUE", }, } local russian_actors_name = { --arial narrow {"Экспортировать", "MAGE", 63}, {"Готово", "DEATHKNIGHT", }, {"Создать", "SHAMAN", }, {"Текущий", "MONK", }, {"список команд", "HUNTER", }, {"центр", "SHAMAN", }, {"Разное", "WARRIOR", }, } local tw_actor_name = { --GBK {"造成傷害目標", "ROGUE", }, {"怒氣生�", "DEATHKNIGHT", }, {"承受治療", "WARLOCK", }, {"格檔", "PRIEST", }, {"中央", "MAGE", }, {"傷害", "SHAMAN", }, {"建立", "MONK", }, {"編輯", "WARRIOR", }, {"儲存變更", "ROGUE", }, {"刪除", "DEATHKNIGHT", }, {"從", "WARLOCK", }, {"吸收", "PRIEST", }, {"加到書籤", "MAGE", }, {"最大化", "SHAMAN", }, {"未命中", "MONK", }, {"�進階", "WARRIOR", }, } local cn_actor_name = { --GBK {"打断", "PRIEST"}, {"恢复", "PRIEST", 257}, {"自动射击", "WARLOCK", 267}, {"平均", "PALADIN", }, {"团队", "WARRIOR", }, {"当前", "WARRIOR", }, {"完毕", "DEATHKNIGHT", }, {"存储变更", "MAGE", }, {"闪避", "MAGE", }, {"空的片段", "ROGUE", }, {"删除", "ROGUE", }, {"治疗暴击", "ROGUE", }, } local korean_actor_name = { --2002 {"적이 받은 피해", "ROGUE", }, {"초과 치유", "DEATHKNIGHT", }, {"자동 사격", "WARLOCK", }, {"시전", "PRIEST", }, {"현재", "MAGE", }, {"취소", "SHAMAN", }, {"내보내기", "MONK", }, {"(사용자 설정)", "WARRIOR", }, {"방어", "ROGUE", }, {"예제", "DEATHKNIGHT", }, {"특화", "WARLOCK", }, {"최소", "PRIEST", }, {"미러 이미지", "MAGE", }, {"가장자리", "SHAMAN", }, {"외형", "MONK", }, {"아바타 선택", "WARRIOR", }, } if (not alphabet or alphabet == "en") then actors_name = actors_name elseif (alphabet == "ru") then actors_name = russian_actors_name elseif (alphabet == "cn") then actors_name = cn_actor_name elseif (alphabet == "ko") then actors_name = korean_actor_name elseif (alphabet == "tw") then actors_name = tw_actor_name end local actors_classes = CLASS_SORT_ORDER local total_damage = 0 local total_heal = 0 for i = 1, 10 do local who = actors_name [math.random (1, #actors_name)] local robot = current_combat[1]:PegarCombatente ("0x0000-0000-0000", who[1], 0x114, true) robot.grupo = true robot.classe = who [2] if (who[3]) then robot.spec = who[3] elseif (robot.classe == "DEATHKNIGHT") then local specs = {250, 251, 252} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "DRUID") then local specs = {102, 103, 104, 105} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "HUNTER") then local specs = {253, 254, 255} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "MAGE") then local specs = {62, 63, 64} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "MONK") then local specs = {268, 269, 270} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "PALADIN") then local specs = {65, 66, 70} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "PRIEST") then local specs = {256, 257, 258} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "ROGUE") then local specs = {259, 260, 261} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "SHAMAN") then local specs = {262, 263, 264} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "WARLOCK") then local specs = {265, 266, 267} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "WARRIOR") then local specs = {71, 72, 73} robot.spec = specs [math.random (1, #specs)] end robot.total = math.random (10000000, 60000000) robot.damage_taken = math.random (10000000, 60000000) robot.friendlyfire_total = math.random (10000000, 60000000) total_damage = total_damage + robot.total if (robot.nome == "King Djoffrey") then local robot_death = current_combat[4]:PegarCombatente ("0x0000-0000-0000", robot.nome, 0x114, true) robot_death.grupo = true robot_death.classe = robot.classe local esta_morte = {{true, 96648, 100000, time(), 0, "Lady Holenna"}, {true, 96648, 100000, time()-52, 100000, "Lady Holenna"}, {true, 96648, 100000, time()-86, 200000, "Lady Holenna"}, {true, 96648, 100000, time()-101, 300000, "Lady Holenna"}, {false, 55296, 400000, time()-54, 400000, "King Djoffrey"}, {true, 14185, 0, time()-59, 400000, "Lady Holenna"}, {false, 87351, 400000, time()-154, 400000, "King Djoffrey"}, {false, 56236, 400000, time()-158, 400000, "King Djoffrey"} } local t = {esta_morte, time(), robot.nome, robot.classe, 400000, "52m 12s", ["dead"] = true} table.insert (current_combat.last_events_tables, #current_combat.last_events_tables+1, t) elseif (robot.nome == "Mr. President") then rawset (_detalhes.spellcache, 56488, {"Nuke", 56488, [[Interface\ICONS\inv_gizmo_supersappercharge]]}) robot.spells:PegaHabilidade (56488, true, "SPELL_DAMAGE") robot.spells._ActorTable [56488].total = robot.total end local who = actors_name [math.random (1, #actors_name)] local robot = current_combat[2]:PegarCombatente ("0x0000-0000-0000", who[1], 0x114, true) robot.grupo = true robot.classe = who[2] if (who[3]) then robot.spec = who[3] elseif (robot.classe == "DEATHKNIGHT") then local specs = {250, 251, 252} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "DRUID") then local specs = {102, 103, 104, 105} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "HUNTER") then local specs = {253, 254, 255} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "MAGE") then local specs = {62, 63, 64} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "MONK") then local specs = {268, 269, 270} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "PALADIN") then local specs = {65, 66, 70} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "PRIEST") then local specs = {256, 257, 258} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "ROGUE") then local specs = {259, 260, 261} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "SHAMAN") then local specs = {262, 263, 264} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "WARLOCK") then local specs = {265, 266, 267} robot.spec = specs [math.random (1, #specs)] elseif (robot.classe == "WARRIOR") then local specs = {71, 72, 73} robot.spec = specs [math.random (1, #specs)] end robot.total = math.random (10000000, 60000000) robot.totalover = math.random (10000000, 60000000) robot.totalabsorb = math.random (10000000, 60000000) robot.healing_taken = math.random (10000000, 60000000) total_heal = total_heal + robot.total end --current_combat.start_time = time()-360 current_combat.start_time = GetTime() - 360 --current_combat.end_time = time() current_combat.end_time = GetTime() current_combat.totals_grupo [1] = total_damage current_combat.totals_grupo [2] = total_heal current_combat.totals [1] = total_damage current_combat.totals [2] = total_heal for _, instance in ipairs (_detalhes.tabela_instancias) do if (instance:IsEnabled()) then instance:InstanceReset() end end current_combat.enemy = "Illidan Stormrage" end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- ~macros function _detalhes:InitializeMacrosWindow() local DetailsMacrosPanel = gump:CreateSimplePanel (UIParent, 700, 480, "Details! Useful Macros", "DetailsMacrosPanel") DetailsMacrosPanel.Frame = DetailsMacrosPanel DetailsMacrosPanel.__name = "Macros" DetailsMacrosPanel.real_name = "DETAILS_MACROSWINDOW" DetailsMacrosPanel.__icon = [[Interface\MacroFrame\MacroFrame-Icon]] DetailsMacrosPanel.__iconcoords = {0, 1, 0, 1} DetailsMacrosPanel.__iconcolor = "white" DetailsPluginContainerWindow.EmbedPlugin (DetailsMacrosPanel, DetailsMacrosPanel, true) function DetailsMacrosPanel.RefreshWindow() _detalhes.OpenMacrosWindow() end DetailsMacrosPanel:Hide() end function _detalhes.OpenMacrosWindow() if (not DetailsMacrosPanel or not DetailsMacrosPanel.Initialized) then local DF = DetailsFramework DetailsMacrosPanel.Initialized = true local f = DetailsMacrosPanel or gump:CreateSimplePanel (UIParent, 700, 480, "Details! Useful Macros", "DetailsMacrosPanel") local scrollbox_line_backdrop_color = {0, 0, 0, 0.2} local scrollbox_line_backdrop_color_onenter = {.3, .3, .3, 0.5} local scrollbox_lines = 7 local scrollbox_line_height = 79.5 local scrollbox_size = {890, 563} f.bg1 = f:CreateTexture (nil, "background") f.bg1:SetTexture ([[Interface\AddOns\Details\images\background]], true) f.bg1:SetAlpha (0.8) f.bg1:SetVertexColor (0.27, 0.27, 0.27) f.bg1:SetVertTile (true) f.bg1:SetHorizTile (true) f.bg1:SetSize (790, 454) f.bg1:SetAllPoints() f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) f:SetBackdropColor (.5, .5, .5, .7) f:SetBackdropBorderColor (0, 0, 0, 1) local macrosAvailable = _detalhes.MacroList local OnEnterMacroButton = function (self) self:SetBackdropColor (unpack (scrollbox_line_backdrop_color_onenter)) end local onLeaveMacroButton = function (self) self:SetBackdropColor (unpack (scrollbox_line_backdrop_color)) end local updateMacroLine = function (self, index, title, desc, macroText) self.Title:SetText (title) self.Desc:SetText (desc) self.MacroTextEntry:SetText (macroText) end local textEntryOnFocusGained = function (self) self:HighlightText() end local textEntryOnFocusLost = function (self) self:HighlightText (0, 0) end local refreshMacroScrollbox = function (self, data, offset, totalLines) for i = 1, totalLines do local index = i + offset local macro = macrosAvailable [index] if (macro) then local line = self:GetLine (i) line:UpdateLine (index, macro.Name, macro.Desc, macro.MacroText) end end end local macroListCreateLine = function (self, index) --create a new line local line = CreateFrame ("button", "$parentLine" .. index, self) --set its parameters line:SetPoint ("topleft", self, "topleft", 0, -((index-1) * (scrollbox_line_height+1))) line:SetSize (scrollbox_size[1], scrollbox_line_height) line:SetScript ("OnEnter", OnEnterMacroButton) line:SetScript ("OnLeave", onLeaveMacroButton) line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true, edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1}) line:SetBackdropColor (unpack (scrollbox_line_backdrop_color)) line:SetBackdropBorderColor (0, 0, 0, 0.3) local titleLabel = DF:CreateLabel (line, "", DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")) titleLabel.textsize = 14 titleLabel.textcolor = "yellow" local descLabel = DF:CreateLabel (line, "", DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")) descLabel.textsize = 12 local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") options_dropdown_template = DF.table.copy ({}, options_dropdown_template) options_dropdown_template.backdropcolor = {.51, .51, .51, .3} options_dropdown_template.onenterbordercolor = {.51, .51, .51, .2} local textEntry = DF:CreateTextEntry (line, function()end, scrollbox_size[1] - 10, 40, "MacroTextEntry", _, _, options_dropdown_template) textEntry:SetHook ("OnEditFocusGained", textEntryOnFocusGained) textEntry:SetHook ("OnEditFocusLost", textEntryOnFocusLost) textEntry:SetJustifyH ("left") textEntry:SetTextInsets (8, 8, 0, 0) titleLabel:SetPoint ("topleft", line, "topleft", 5, -5) descLabel:SetPoint ("topleft", titleLabel, "bottomleft", 0, -2) textEntry:SetPoint ("topleft", descLabel, "bottomleft", 0, -4) line.Title = titleLabel line.Desc = descLabel line.MacroTextEntry = textEntry line.UpdateLine = updateMacroLine line:Hide() return line end local macroScrollbox = DF:CreateScrollBox (f, "$parentMacroScrollbox", refreshMacroScrollbox, macrosAvailable, scrollbox_size[1], scrollbox_size[2], scrollbox_lines, scrollbox_line_height) macroScrollbox:SetPoint ("topleft", f, "topleft", 5, -30) macroScrollbox:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) macroScrollbox:SetBackdropColor (0, 0, 0, 0) macroScrollbox:SetBackdropBorderColor (0, 0, 0, 1) f.MacroScrollbox = macroScrollbox DF:ReskinSlider (macroScrollbox) macroScrollbox.__background:Hide() --create the scrollbox lines for i = 1, scrollbox_lines do macroScrollbox:CreateLine (macroListCreateLine) end end DetailsPluginContainerWindow.OpenPlugin (DetailsMacrosPanel) DetailsMacrosPanel.MacroScrollbox:Refresh() DetailsMacrosPanel:Show() end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- ~plater function _detalhes:InitializePlaterIntegrationWindow() local DetailsPlaterIntegrationPanel = gump:CreateSimplePanel (UIParent, 700, 480, "Details! Plater Nameplates Integration", "DetailsPlaterIntegrationPanel") DetailsPlaterIntegrationPanel.Frame = DetailsPlaterIntegrationPanel DetailsPlaterIntegrationPanel.__name = "Plater Nameplates" DetailsPlaterIntegrationPanel.real_name = "DETAILS_PLATERWINDOW" DetailsPlaterIntegrationPanel.__icon = [[Interface\AddOns\Details\images\plater_icon]] --DetailsPlaterIntegrationPanel.__iconcoords = {0, 30/32, 0, 25/32} DetailsPlaterIntegrationPanel.__iconcoords = {0, 1, 0, 1} DetailsPlaterIntegrationPanel.__iconcolor = "white" DetailsPluginContainerWindow.EmbedPlugin (DetailsPlaterIntegrationPanel, DetailsPlaterIntegrationPanel, true) function DetailsPlaterIntegrationPanel.RefreshWindow() _detalhes.OpenPlaterIntegrationWindow() end DetailsPlaterIntegrationPanel:Hide() end function _detalhes.OpenPlaterIntegrationWindow() if (not DetailsPlaterIntegrationPanel or not DetailsPlaterIntegrationPanel.Initialized) then DetailsPlaterIntegrationPanel.Initialized = true local f = DetailsPlaterIntegrationPanel or gump:CreateSimplePanel (UIParent, 700, 480, "Details! Plater Nameplates Integration", "DetailsPlaterIntegrationPanel") --background f.bg1 = f:CreateTexture (nil, "background") f.bg1:SetTexture ([[Interface\AddOns\Details\images\background]], true) f.bg1:SetAlpha (0.8) f.bg1:SetVertexColor (0.27, 0.27, 0.27) f.bg1:SetVertTile (true) f.bg1:SetHorizTile (true) f.bg1:SetSize (790, 454) f.bg1:SetAllPoints() f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) f:SetBackdropColor (.5, .5, .5, .7) f:SetBackdropBorderColor (0, 0, 0, 1) --> anchor text function local anchor_names = {"Top Left", "Left", "Bottom Left", "Bottom", "Bottom Right", "Right", "Top Right", "Top", "Center", "Inner Left", "Inner Right", "Inner Top", "Inner Bottom"} local build_anchor_side_table = function (member) local t = {} for i = 1, 13 do tinsert (t, { label = anchor_names[i], value = i, onclick = function (_, _, value) Details.plater [member].side = value if (Plater) then Plater.UpdateAllPlates() end end }) end return t end local menu_table = { {type = "label", get = function() return "Add Real Time DPS Info in the Nameplate:" end, text_template = Details.gump:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, --> real time dps from all sources { type = "toggle", get = function() return Details.plater.realtime_dps_enabled end, set = function (self, fixedparam, value) Details.plater.realtime_dps_enabled = value Details:RefreshPlaterIntegration() if (not value) then Details:Msg ("a /reload might be needed to disable this setting.") else if (Plater) then Plater.RefreshDBUpvalues() end end end, name = "Show Real Time Dps", desc = "Show Real Time DPS on the nameplate.\n\nReal time DPS is how much damage has been inflicted to the unit in the last 5 seconds.", }, --> text size { type = "range", get = function() return Details.plater.realtime_dps_size end, set = function (self, fixedparam, value) Details.plater.realtime_dps_size = value if (Plater) then Plater.UpdateAllPlates() end end, min = 6, max = 32, step = 1, name = "Text Size", desc = "Text Size", }, --> text color { type = "color", get = function() local color = Details.plater.realtime_dps_color return {color [1], color [2], color [3], color [4]} end, set = function (self, r, g, b, a) local color = Details.plater.realtime_dps_color color[1], color[2], color[3], color[4] = r, g, b, a if (Plater) then Plater.UpdateAllPlates() end end, desc = "Text Color", name = "Text Color", text_template = options_text_template, }, --> text shadow { type = "toggle", get = function() return Details.plater.realtime_dps_shadow end, set = function (self, fixedparam, value) Details.plater.realtime_dps_shadow = value if (Plater) then Plater.UpdateAllPlates() end end, name = "Text Shadow", desc = "Text Shadow", }, --> text anchor --anchor location { type = "select", get = function() return Details.plater.realtime_dps_anchor.side end, values = function() return build_anchor_side_table ("realtime_dps_anchor") end, name = "Anchor Point", desc = "Which side of the nameplate the text is attach to.", }, --anchor x offset { type = "range", get = function() return Details.plater.realtime_dps_anchor.x end, set = function (self, fixedparam, value) Details.plater.realtime_dps_anchor.x = value if (Plater) then Plater.UpdateAllPlates() end end, min = -20, max = 20, step = 1, name = "Anchor X Offset", desc = "Slightly move the text horizontally.", }, --anchor x offset { type = "range", get = function() return Details.plater.realtime_dps_anchor.y end, set = function (self, fixedparam, value) Details.plater.realtime_dps_anchor.y = value if (Plater) then Plater.UpdateAllPlates() end end, min = -20, max = 20, step = 1, name = "Anchor Y Offset", desc = "Slightly move the text vertically.", }, {type = "breakline"}, {type = "label", get = function() return "Add Real Time DPS Info Only From You in the Nameplate:" end, text_template = Details.gump:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, --> real time dps from the player only { type = "toggle", get = function() return Details.plater.realtime_dps_player_enabled end, set = function (self, fixedparam, value) Details.plater.realtime_dps_player_enabled = value Details:RefreshPlaterIntegration() if (not value) then Details:Msg ("a /reload might be needed to disable this setting.") else if (Plater) then Plater.RefreshDBUpvalues() end end end, name = "Show Real Time Dps (From You)", desc = "Show Real Time DPS you are currently applying in the unit.\n\nReal time DPS is how much damage has been inflicted to the unit in the last 5 seconds.", }, --> text size { type = "range", get = function() return Details.plater.realtime_dps_player_size end, set = function (self, fixedparam, value) Details.plater.realtime_dps_player_size = value if (Plater) then Plater.UpdateAllPlates() end end, min = 6, max = 32, step = 1, name = "Text Size", desc = "Text Size", }, --> text color { type = "color", get = function() local color = Details.plater.realtime_dps_player_color return {color [1], color [2], color [3], color [4]} end, set = function (self, r, g, b, a) local color = Details.plater.realtime_dps_player_color color[1], color[2], color[3], color[4] = r, g, b, a if (Plater) then Plater.UpdateAllPlates() end end, desc = "Text Color", name = "Text Color", text_template = options_text_template, }, --> text shadow { type = "toggle", get = function() return Details.plater.realtime_dps_player_shadow end, set = function (self, fixedparam, value) Details.plater.realtime_dps_player_shadow = value if (Plater) then Plater.UpdateAllPlates() end end, name = "Text Shadow", desc = "Text Shadow", }, --> text anchor --anchor location { type = "select", get = function() return Details.plater.realtime_dps_player_anchor.side end, values = function() return build_anchor_side_table ("realtime_dps_player_anchor") end, name = "Anchor Point", desc = "Which side of the nameplate the text is attach to.", }, --anchor x offset { type = "range", get = function() return Details.plater.realtime_dps_player_anchor.x end, set = function (self, fixedparam, value) Details.plater.realtime_dps_player_anchor.x = value if (Plater) then Plater.UpdateAllPlates() end end, min = -20, max = 20, step = 1, name = "Anchor X Offset", desc = "Slightly move the text horizontally.", }, --anchor x offset { type = "range", get = function() return Details.plater.realtime_dps_player_anchor.y end, set = function (self, fixedparam, value) Details.plater.realtime_dps_player_anchor.y = value if (Plater) then Plater.UpdateAllPlates() end end, min = -20, max = 20, step = 1, name = "Anchor Y Offset", desc = "Slightly move the text vertically.", }, {type = "breakline"}, {type = "label", get = function() return "Add Total Damage Taken in the Nameplate:" end, text_template = Details.gump:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, --> total damage taken from all sources { type = "toggle", get = function() return Details.plater.damage_taken_enabled end, set = function (self, fixedparam, value) Details.plater.damage_taken_enabled = value Details:RefreshPlaterIntegration() if (not value) then Details:Msg ("a /reload might be needed to disable this setting.") else if (Plater) then Plater.RefreshDBUpvalues() end end end, name = "Show Total Damage Taken", desc = "Show the total damage taken by the unit", }, --> text size { type = "range", get = function() return Details.plater.damage_taken_size end, set = function (self, fixedparam, value) Details.plater.damage_taken_size = value if (Plater) then Plater.UpdateAllPlates() end end, min = 6, max = 32, step = 1, name = "Text Size", desc = "Text Size", }, --> text color { type = "color", get = function() local color = Details.plater.damage_taken_color return {color [1], color [2], color [3], color [4]} end, set = function (self, r, g, b, a) local color = Details.plater.damage_taken_color color[1], color[2], color[3], color[4] = r, g, b, a if (Plater) then Plater.UpdateAllPlates() end end, desc = "Text Color", name = "Text Color", text_template = options_text_template, }, --> text shadow { type = "toggle", get = function() return Details.plater.damage_taken_shadow end, set = function (self, fixedparam, value) Details.plater.damage_taken_shadow = value if (Plater) then Plater.UpdateAllPlates() end end, name = "Text Shadow", desc = "Text Shadow", }, --> text anchor --anchor location { type = "select", get = function() return Details.plater.damage_taken_anchor.side end, values = function() return build_anchor_side_table ("damage_taken_anchor") end, name = "Anchor Point", desc = "Which side of the nameplate the text is attach to.", }, --anchor x offset { type = "range", get = function() return Details.plater.damage_taken_anchor.x end, set = function (self, fixedparam, value) Details.plater.damage_taken_anchor.x = value if (Plater) then Plater.UpdateAllPlates() end end, min = -20, max = 20, step = 1, name = "Anchor X Offset", desc = "Slightly move the text horizontally.", }, --anchor x offset { type = "range", get = function() return Details.plater.damage_taken_anchor.y end, set = function (self, fixedparam, value) Details.plater.damage_taken_anchor.y = value if (Plater) then Plater.UpdateAllPlates() end end, min = -20, max = 20, step = 1, name = "Anchor Y Offset", desc = "Slightly move the text vertically.", }, } local options_text_template = Details.gump:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") local options_dropdown_template = Details.gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") local options_switch_template = Details.gump:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") local options_slider_template = Details.gump:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") local options_button_template = Details.gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") local titleBackground = CreateFrame ("frame", nil, f) titleBackground:SetPoint ("topleft", f, "topleft", 10, -30) titleBackground:SetPoint ("topright", f, "topright", -10, -30) titleBackground:SetHeight (80) --background titleBackground.bg1 = titleBackground:CreateTexture (nil, "background") titleBackground.bg1:SetTexture ([[Interface\AddOns\Details\images\background]]) titleBackground.bg1:SetAlpha (0.8) titleBackground.bg1:SetVertexColor (0.27, 0.27, 0.27) titleBackground.bg1:SetVertTile (true) titleBackground.bg1:SetHorizTile (true) titleBackground.bg1:SetSize (790, 454) titleBackground.bg1:SetAllPoints() titleBackground:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) titleBackground:SetBackdropColor (.5, .5, .5, .7) titleBackground:SetBackdropBorderColor (0, 0, 0, 1) local platerTitle = Details.gump:CreateLabel (titleBackground, "Plater Nameplates Integration", 16, "white") local platerDesc1 = Details.gump:CreateLabel (titleBackground, "Add DPS and Damage information directly into the nameplate", 11, "silver") local platerDesc2 = Details.gump:CreateLabel (titleBackground, "See how much damage the enemy is taking in real time!", 11, "silver") local platerImage = Details.gump:CreateImage (titleBackground, "Interface\\AddOns\\Details\\images\\plater_image") platerImage:SetSize (256, 64) platerImage:SetPoint ("topright", f, "topright", -150, -35) platerTitle:SetPoint (10, -15) platerDesc1:SetPoint (10, -35) platerDesc2:SetPoint (10, -47) Details.gump:BuildMenu (f, menu_table, 10, -140, 460, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) if (not Plater) then for _, widget in ipairs (f.widget_list) do if (widget.Disable) then widget:Disable() end end local PlaterDisabled1 = Details.gump:CreateLabel (f, "Plater isn't installed! you may download it from the Twitch app.", 16, "red") PlaterDisabled1:SetPoint (10, -330) end end DetailsPluginContainerWindow.OpenPlugin (DetailsPlaterIntegrationPanel) end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- ~run ~runcode function _detalhes:InitializeRunCodeWindow() local DetailsRunCodePanel = gump:CreateSimplePanel (UIParent, 700, 480, "Details! Run Code", "DetailsRunCodePanel") DetailsRunCodePanel.Frame = DetailsRunCodePanel DetailsRunCodePanel.__name = "Auto Run Code" DetailsRunCodePanel.real_name = "DETAILS_RUNCODEWINDOW" --DetailsRunCodePanel.__icon = [[Interface\AddOns\Details\images\lua_logo]] DetailsRunCodePanel.__icon = [[Interface\AddOns\Details\images\run_code]] --DetailsRunCodePanel.__iconcoords = {0, 1, 0, 1} DetailsRunCodePanel.__iconcoords = {0, 30/32, 0, 25/32} DetailsRunCodePanel.__iconcoords = {0, 1, 0, 1} DetailsRunCodePanel.__iconcolor = "white" DetailsPluginContainerWindow.EmbedPlugin (DetailsRunCodePanel, DetailsRunCodePanel, true) function DetailsRunCodePanel.RefreshWindow() _detalhes.OpenRunCodeWindow() end DetailsRunCodePanel:Hide() end function _detalhes.OpenRunCodeWindow() if (not DetailsRunCodePanel or not DetailsRunCodePanel.Initialized) then DetailsRunCodePanel.Initialized = true local f = DetailsRunCodePanel or gump:CreateSimplePanel (UIParent, 700, 480, "Details! Run Code", "DetailsRunCodePanel") --> lua editor local code_editor = gump:NewSpecialLuaEditorEntry (f, 885, 510, "text", "$parentCodeEditorWindow") f.CodeEditor = code_editor code_editor:SetPoint ("topleft", f, "topleft", 20, -56) --> code editor appearance code_editor.scroll:SetBackdrop (nil) code_editor.editbox:SetBackdrop (nil) code_editor:SetBackdrop (nil) gump:ReskinSlider (code_editor.scroll) if (not code_editor.__background) then code_editor.__background = code_editor:CreateTexture (nil, "background") end code_editor:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1}) code_editor:SetBackdropBorderColor (0, 0, 0, 1) code_editor.__background:SetColorTexture (0.2317647, 0.2317647, 0.2317647) code_editor.__background:SetVertexColor (0.27, 0.27, 0.27) code_editor.__background:SetAlpha (0.8) code_editor.__background:SetVertTile (true) code_editor.__background:SetHorizTile (true) code_editor.__background:SetAllPoints() --> code compile error warning local errortext_frame = CreateFrame ("frame", nil, code_editor) errortext_frame:SetPoint ("bottomleft", code_editor, "bottomleft", 1, 1) errortext_frame:SetPoint ("bottomright", code_editor, "bottomright", -1, 1) errortext_frame:SetHeight (20) errortext_frame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) errortext_frame:SetBackdropBorderColor (0, 0, 0, 1) errortext_frame:SetBackdropColor (0, 0, 0) gump:CreateFlashAnimation (errortext_frame) local errortext_label = gump:CreateLabel (errortext_frame, "", gump:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")) errortext_label.textcolor = "red" errortext_label:SetPoint ("left", errortext_frame, "left", 3, 0) code_editor.NextCodeCheck = 0.33 code_editor:HookScript ("OnUpdate", function (self, deltaTime) code_editor.NextCodeCheck = code_editor.NextCodeCheck - deltaTime if (code_editor.NextCodeCheck < 0) then local script = code_editor:GetText() local func, errortext = loadstring (script, "Q") if (not func) then local firstLine = strsplit ("\n", script, 2) errortext = errortext:gsub (firstLine, "") errortext = errortext:gsub ("%[string \"", "") errortext = errortext:gsub ("...\"]:", "") errortext = errortext:gsub ("Q\"]:", "") errortext = "Line " .. errortext errortext_label.text = errortext else errortext_label.text = "" end code_editor.NextCodeCheck = 0.33 end end) --> script selector local on_select_CodeType_option = function (self, fixedParameter, value) --> set the current editing code type f.EditingCode = _detalhes.RunCodeTypes [value].Value f.EditingCodeKey = _detalhes.RunCodeTypes [value].ProfileKey --> load the code for the event local code = _detalhes.run_code [f.EditingCodeKey] code_editor:SetText (code) end local build_CodeType_dropdown_options = function() local t = {} for i = 1, #_detalhes.RunCodeTypes do local option = _detalhes.RunCodeTypes [i] t [#t + 1] = {label = option.Name, value = option.Value, onclick = on_select_CodeType_option, desc = option.Desc} end return t end local code_type_label = gump:CreateLabel (f, "Event:", gump:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")) local code_type_dropdown = gump:CreateDropDown (f, build_CodeType_dropdown_options, 1, 160, 20, "CodeTypeDropdown", _, gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) code_type_dropdown:SetPoint ("left", code_type_label, "right", 2, 0) code_type_dropdown:SetFrameLevel (code_editor:GetFrameLevel() + 10) code_type_label:SetPoint ("bottomleft", code_editor, "topleft", 0, 8) --> create save button local save_script = function() local code = code_editor:GetText() local func, errortext = loadstring (code, "Q") if (func) then _detalhes.run_code [f.EditingCodeKey] = code _detalhes:RecompileAutoRunCode() _detalhes:Msg ("Code saved!") code_editor:ClearFocus() else errortext_frame:Flash (0.2, 0.2, 0.4, true, nil, nil, "NONE") _detalhes:Msg ("Can't save the code: it has errors.") end end local button_y = -6 local save_script_button = gump:CreateButton (f, save_script, 120, 20, "Save", -1, nil, nil, nil, nil, nil, gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), gump:GetTemplate ("font", "PLATER_BUTTON")) save_script_button:SetIcon ([[Interface\BUTTONS\UI-Panel-ExpandButton-Up]], 20, 20, "overlay", {0.1, .9, 0.1, .9}) save_script_button:SetPoint ("topright", code_editor, "bottomright", 0, button_y) --> create cancel button local cancel_script = function() code_editor:SetText (_detalhes.run_code [f.EditingCodeKey]) _detalhes:Msg ("Code cancelled!") code_editor:ClearFocus() end local cancel_script_button = gump:CreateButton (f, cancel_script, 120, 20, "Cancel", -1, nil, nil, nil, nil, nil, gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), gump:GetTemplate ("font", "PLATER_BUTTON")) cancel_script_button:SetIcon ([[Interface\BUTTONS\UI-Panel-MinimizeButton-Up]], 20, 20, "overlay", {0.1, .9, 0.1, .9}) cancel_script_button:SetPoint ("topleft", code_editor, "bottomleft", 0, button_y) --> create run now button local execute_script = function() local script = code_editor:GetText() local func, errortext = loadstring (script, "Q") if (func) then gump:QuickDispatch (func) else errortext_frame:Flash (0.2, 0.2, 0.4, true, nil, nil, "NONE") end end local run_script_button = gump:CreateButton (f, execute_script, 120, 20, "Test Code", -1, nil, nil, nil, nil, nil, gump:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), gump:GetTemplate ("font", "PLATER_BUTTON")) run_script_button:SetIcon ([[Interface\BUTTONS\UI-SpellbookIcon-NextPage-Up]], 20, 20, "overlay", {0.05, 0.95, 0.05, 0.95}) run_script_button:SetPoint ("bottomright", code_editor, "topright", 0, 3) end DetailsPluginContainerWindow.OpenPlugin (DetailsRunCodePanel) DetailsRunCodePanel.CodeTypeDropdown:Select (1, true) --> show the initialization code when showing up this window DetailsRunCodePanel.EditingCode = _detalhes.RunCodeTypes [1].Value DetailsRunCodePanel.EditingCodeKey = _detalhes.RunCodeTypes [1].ProfileKey local code = _detalhes.run_code [DetailsRunCodePanel.EditingCodeKey] DetailsRunCodePanel.CodeEditor:SetText (code) end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- ~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) function DetailsAPIPanel.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") DetailsAPIPanel.Initialized = true local text_box = gump:NewSpecialLuaEditorEntry (f, 685, 540, "text", "$parentTextEntry", true) text_box:SetPoint ("topleft", f, "topleft", 220, -40) text_box:SetBackdrop (nil) --background f.bg1 = f:CreateTexture (nil, "background") f.bg1:SetTexture ([[Interface\AddOns\Details\images\background]], true) f.bg1:SetAlpha (0.8) f.bg1:SetVertexColor (0.27, 0.27, 0.27) f.bg1:SetVertTile (true) f.bg1:SetHorizTile (true) f.bg1:SetSize (790, 454) f.bg1:SetAllPoints() f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) f:SetBackdropColor (.5, .5, .5, .7) f:SetBackdropBorderColor (0, 0, 0, 1) --> create a background area where the text editor is local TextEditorBackground = gump:NewButton (f, nil, nil, nil, 1, 1, function()end) TextEditorBackground:SetAllPoints (text_box) TextEditorBackground:SetTemplate (gump:GetTemplate ("button", "DETAILS_CUSTOMDISPLAY_CODE_BOX")) local file, size, flags = text_box.editbox:GetFont() text_box.editbox:SetFont (file, 12, flags) local topics = Details.APITopics local select_topic = function (self, button, topic) text_box:SetText (Details.APIText [topic]) end for i = 1, #topics do local title = topics [i] local button = gump:CreateButton (f, select_topic, 200, 20, title, i) button:SetTemplate (gump:GetTemplate ("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE")) button:SetPoint ("topleft", f, "topleft", 5, (-i*22)-30) button:SetIcon ([[Interface\Buttons\UI-GuildButton-PublicNote-Up]], nil, nil, nil, nil, nil, nil, 2) button:SetWidth (200) end select_topic (nil, nil, 1) end --DetailsAPIPanel:Show() DetailsPluginContainerWindow.OpenPlugin (DetailsAPIPanel) end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ function Details.OpenDpsBenchmark() --main frame local DF = _detalhes.gump local _ = nil --declaration local f = CreateFrame ("frame", "DetailsBenchmark", UIParent) f:SetSize (800, 600) f:SetPoint ("left", UIParent, "left") f:SetFrameStrata ("LOW") f:EnableMouse (true) f:SetMovable (true) f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) f:SetBackdropColor (0, 0, 0, 0.9) f:SetBackdropBorderColor (0, 0, 0, 1) --register to libwindow local LibWindow = LibStub ("LibWindow-1.1") LibWindow.RegisterConfig (f, _detalhes.benchmark_db.frame) LibWindow.RestorePosition (f) LibWindow.MakeDraggable (f) LibWindow.SavePosition (f) --titlebar f.TitleBar = CreateFrame ("frame", "$parentTitleBar", f) f.TitleBar:SetPoint ("topleft", f, "topleft", 2, -3) f.TitleBar:SetPoint ("topright", f, "topright", -2, -3) f.TitleBar:SetHeight (20) f.TitleBar:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) f.TitleBar:SetBackdropColor (.2, .2, .2, 1) f.TitleBar:SetBackdropBorderColor (0, 0, 0, 1) --close button f.Close = CreateFrame ("button", "$parentCloseButton", f) f.Close:SetPoint ("right", f.TitleBar, "right", -2, 0) f.Close:SetSize (16, 16) f.Close:SetNormalTexture (_detalhes.gump.folder .. "icons") f.Close:SetHighlightTexture (_detalhes.gump.folder .. "icons") f.Close:SetPushedTexture (_detalhes.gump.folder .. "icons") f.Close:GetNormalTexture():SetTexCoord (0, 16/128, 0, 1) f.Close:GetHighlightTexture():SetTexCoord (0, 16/128, 0, 1) f.Close:GetPushedTexture():SetTexCoord (0, 16/128, 0, 1) f.Close:SetAlpha (0.7) f.Close:SetScript ("OnClick", function() f:Hide() end) --title f.Title = f.TitleBar:CreateFontString ("$parentTitle", "overlay", "GameFontNormal") f.Title:SetPoint ("center", f.TitleBar, "center") f.Title:SetTextColor (.8, .8, .8, 1) f.Title:SetText ("Details! Benchmark") DF:InstallTemplate ("font", "DETAILS_BENCHMARK_NORMAL", {color = "white", size = 10, font = "Friz Quadrata TT"}) function f.CreateCombatObject() local t = {} return t end function f.StartNewBenchmark() end function f.StopCurrentBenchmark() end f.OnTickInterval = 0 function f.UpdateOnTick (self, deltaTime) f.OnTickInterval = f.OnTickInterval + deltaTime if (f.OnTickInterval >= 0.024) then --do the update --reset the interval f.OnTickInterval = 0 end end function f.StartUpdateOnTick() f:SetScript ("OnUpdate", f.UpdateOnTick) end --events f:RegisterEvent ("PLAYER_REGEN_DISABLED") f:RegisterEvent ("PLAYER_REGEN_ENABLED") f:SetScript ("OnEvent", function (self, event, ...) if (event == "PLAYER_REGEN_DISABLED") then f.StartNewBenchmark() elseif (event == "PLAYER_REGEN_ENABLED") then f.StopCurrentBenchmark() end end) local normal_text_template = DF:GetTemplate ("font", "DETAILS_BENCHMARK_NORMAL") local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") --locations f.FrameLocations = { summary = {10, -30}, auras = {10, -120}, spells = {10, -180}, history = {10, -280}, } f.FrameSizes = { default = {300, 200}, } --summary block --declaration local summaryFrame = CreateFrame ("frame", "$parentSummaryFrame", f) summaryFrame:SetPoint ("topleft", f, "topleft", unpack (f.FrameLocations.summary)) summaryFrame:SetSize (unpack (f.FrameSizes.default)) summaryFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) summaryFrame:SetBackdropColor (0, 0, 0, 0.9) summaryFrame:SetBackdropBorderColor (0, 0, 0, 1) --time to test string and dropdown local build_time_list = function() local t = { {value = 40, label = "40 seconds"}, {value = 60, label = "60 seconds"}, {value = 90, label = "90 seconds"}, {value = 120, label = "2 minutes"}, {value = 180, label = "3 minutes"}, {value = 300, label = "5 minutes"}, } return t end summaryFrame.TimeToTestLabel = DF:CreateLabel (summaryFrame, "Amount of Time", normal_text_template) summaryFrame.TimeToTestDropdown = DF:CreateDropDown (summaryFrame, build_time_list, default, 150, 20, _, _, options_dropdown_template) --description string and text entry summaryFrame.DescriptionLabel = DF:CreateLabel (summaryFrame, "Description", normal_text_template) summaryFrame.DescriptionEntry = DF:CreateTextEntry (summaryFrame, function()end, 120, 20, nil, _, nil, options_dropdown_template) --DPS Amount string summaryFrame.DPSLabel = DF:CreateLabel (summaryFrame, "100K", normal_text_template) --TIME ELAPSED string summaryFrame.TimeElapsedLabel = DF:CreateLabel (summaryFrame, "01:00", normal_text_template) --boss simulation string and dropdown local build_bosssimulation_list, default = function() local t = { {value = "patchwerk", label = "Patchwerk"}, } return t end summaryFrame.BossSimulationLabel = DF:CreateLabel (summaryFrame, "Boss Simulation", normal_text_template) summaryFrame.BossSimulationDropdown = DF:CreateDropDown (summaryFrame, build_bosssimulation_list, default, 150, 20, _, _, options_dropdown_template) --boss records line with a tooltip importing data from the storage summaryFrame.BossRecordsFrame = CreateFrame ("frame", nil, summaryFrame) summaryFrame.BossRecordsFrame:SetSize (f.FrameSizes.default[1]-20, 20) summaryFrame.BossRecordsFrame:SetBackdropColor (0, 0, 0, 0.3) summaryFrame.BossRecordsFrame:SetScript ("OnEnter", function() end) summaryFrame.BossRecordsFrame:SetScript ("OnLeave", function() end) --set the points do local x, y = 10, -10 summaryFrame.TimeToTestLabel:SetPoint ("topleft", summaryFrame, "topleft", x, y) summaryFrame.TimeToTestDropdown:SetPoint ("topleft", summaryFrame.TimeToTestLabel, "bottomleft", 0, -2) --y = y - 40 summaryFrame.DescriptionLabel:SetPoint ("topleft", summaryFrame, "topleft", x+160, y) summaryFrame.DescriptionEntry:SetPoint ("topleft", summaryFrame.DescriptionLabel, "bottomleft", 0, -2) y = y - 40 summaryFrame.DPSLabel:SetPoint ("topleft", summaryFrame, "topleft", x, y) summaryFrame.TimeElapsedLabel:SetPoint ("topleft", summaryFrame, "topleft", x + 100, y) y = y - 40 summaryFrame.BossSimulationLabel:SetPoint ("topleft", summaryFrame, "topleft", x, y) summaryFrame.BossSimulationDropdown:SetPoint ("topleft", summaryFrame.BossSimulationLabel, "bottomleft", 0, -2) y = y - 40 summaryFrame.BossRecordsFrame:SetPoint ("topleft", summaryFrame, "topleft", 0, 0) end --spells block --declaration local spellsFrame = CreateFrame ("frame", "$parentSpellsFrame", f) spellsFrame:SetPoint ("topleft", f, "topleft", unpack (f.FrameLocations.spells)) spellsFrame:SetSize (unpack (f.FrameSizes.default)) spellsFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) spellsFrame:SetBackdropColor (0, 0, 0, 0.9) spellsFrame:SetBackdropBorderColor (0, 0, 0, 1) --header with the string titles: --Spell Icon | DPS | Damage | Casts | Criticals | Highest Damage --scrollpanel --each line with: --Texture for the icon --5 strings for the data --hover over scripts --auras block --declaration local aurasFrame = CreateFrame ("frame", "$parentAurasFrame", f) aurasFrame:SetPoint ("topleft", f, "topleft", unpack (f.FrameLocations.auras)) aurasFrame:SetSize (unpack (f.FrameSizes.default)) aurasFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) aurasFrame:SetBackdropColor (0, 0, 0, 0.9) aurasFrame:SetBackdropBorderColor (0, 0, 0, 1) --will be 9 blocks? --each block with: --Texture for the icon --3 strings for Total Update, Applications and Refreshes --history block --declaration local historyFrame = CreateFrame ("frame", "$parentHistoryFrame", f) historyFrame:SetPoint ("topleft", f, "topleft", unpack (f.FrameLocations.history)) historyFrame:SetSize (unpack (f.FrameSizes.default)) historyFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) historyFrame:SetBackdropColor (0, 0, 0, 0.9) historyFrame:SetBackdropBorderColor (0, 0, 0, 1) --header with the string titles: --Spec | ILevel | DPS | Time | Talents | Crit | Haste | Versatility | Mastery | Int | Description --scrollpanel --each line with: --7 Textures for talent icons --10 strings for the data --hover over scripts --mechanics --to open the window --on target a training dummy --need to be on a specific map / sanctuary --on start a new combat: --start the timer --start the boss script if not patchwerk --create the graphic tables for *player total damage and *spell damage --create aura tables / grab auras already applied to the player / auras with no duration wont be added --on tick: --*check if the time is gone *update the time string *update the graphic *update the spells *upate the auras --on finishes: --stop the timer and check if the elapsed time is done --create a new benchmark object to store the test --export the data to this new object --add this new object to the benchmark storage table --update the history scrollbar end --old versions dialog --[[ --print ("Last Version:", _detalhes_database.last_version, "Last Interval Version:", _detalhes_database.last_realversion) local resetwarning_frame = CreateFrame ("FRAME", "DetailsResetConfigWarningDialog", UIParent, "ButtonFrameTemplate") resetwarning_frame:SetFrameStrata ("LOW") tinsert (UISpecialFrames, "DetailsResetConfigWarningDialog") resetwarning_frame:SetPoint ("center", UIParent, "center") resetwarning_frame:SetSize (512, 200) resetwarning_frame.portrait:SetTexture ("Interface\\CHARACTERFRAME\\TEMPORARYPORTRAIT-FEMALE-GNOME") resetwarning_frame:SetScript ("OnHide", function() DetailsBubble:HideBubble() end) resetwarning_frame.TitleText:SetText ("Noooooooooooo!!!") resetwarning_frame.midtext = resetwarning_frame:CreateFontString (nil, "artwork", "GameFontNormal") resetwarning_frame.midtext:SetText ("A pack of murlocs has attacked Details! tech center, our gnomes engineers are working on fixing the damage.\n\n If something is messed in your Details!, especially the close, instance and reset buttons, you can either 'Reset Skin' or access the options panel.") resetwarning_frame.midtext:SetPoint ("topleft", resetwarning_frame, "topleft", 10, -90) resetwarning_frame.midtext:SetJustifyH ("center") resetwarning_frame.midtext:SetWidth (370) resetwarning_frame.gnoma = resetwarning_frame:CreateTexture (nil, "artwork") resetwarning_frame.gnoma:SetPoint ("topright", resetwarning_frame, "topright", -3, -80) resetwarning_frame.gnoma:SetTexture ("Interface\\AddOns\\Details\\images\\icons2") resetwarning_frame.gnoma:SetSize (89*1.00, 97*1.00) --resetwarning_frame.gnoma:SetTexCoord (0.212890625, 0.494140625, 0.798828125, 0.99609375) -- 109 409 253 510 resetwarning_frame.gnoma:SetTexCoord (0.17578125, 0.001953125, 0.59765625, 0.787109375) -- 1 306 90 403 resetwarning_frame.close = CreateFrame ("Button", "DetailsFeedbackWindowCloseButton", resetwarning_frame, "OptionsButtonTemplate") resetwarning_frame.close:SetPoint ("bottomleft", resetwarning_frame, "bottomleft", 8, 4) resetwarning_frame.close:SetText ("Close") resetwarning_frame.close:SetScript ("OnClick", function (self) resetwarning_frame:Hide() end) resetwarning_frame.see_updates = CreateFrame ("Button", "DetailsResetWindowSeeUpdatesButton", resetwarning_frame, "OptionsButtonTemplate") resetwarning_frame.see_updates:SetPoint ("bottomright", resetwarning_frame, "bottomright", -10, 4) resetwarning_frame.see_updates:SetText ("Update Info") resetwarning_frame.see_updates:SetScript ("OnClick", function (self) _detalhes.OpenNewsWindow() DetailsBubble:HideBubble() --resetwarning_frame:Hide() end) resetwarning_frame.see_updates:SetWidth (130) resetwarning_frame.reset_skin = CreateFrame ("Button", "DetailsResetWindowResetSkinButton", resetwarning_frame, "OptionsButtonTemplate") resetwarning_frame.reset_skin:SetPoint ("right", resetwarning_frame.see_updates, "left", -5, 0) resetwarning_frame.reset_skin:SetText ("Reset Skin") resetwarning_frame.reset_skin:SetScript ("OnClick", function (self) --do the reset for index, instance in ipairs (_detalhes.tabela_instancias) do if (not instance.iniciada) then instance:RestauraJanela() local skin = instance.skin instance:ChangeSkin ("WoW Interface") instance:ChangeSkin ("Minimalistic") instance:ChangeSkin (skin) instance:DesativarInstancia() else local skin = instance.skin instance:ChangeSkin ("WoW Interface") instance:ChangeSkin ("Minimalistic") instance:ChangeSkin (skin) end end end) resetwarning_frame.reset_skin:SetWidth (130) resetwarning_frame.open_options = CreateFrame ("Button", "DetailsResetWindowOpenOptionsButton", resetwarning_frame, "OptionsButtonTemplate") resetwarning_frame.open_options:SetPoint ("right", resetwarning_frame.reset_skin, "left", -5, 0) resetwarning_frame.open_options:SetText ("Options Panel") resetwarning_frame.open_options:SetScript ("OnClick", function (self) local lower_instance = _detalhes:GetLowerInstanceNumber() if (not lower_instance) then local instance = _detalhes:GetInstance (1) _detalhes.CriarInstancia (_, _, 1) _detalhes:OpenOptionsWindow (instance) else _detalhes:OpenOptionsWindow (_detalhes:GetInstance (lower_instance)) end end) resetwarning_frame.open_options:SetWidth (130) function _detalhes:ResetWarningDialog() DetailsResetConfigWarningDialog:Show() DetailsBubble:SetOwner (resetwarning_frame.gnoma, "bottomright", "topleft", 30, -37, 1) DetailsBubble:FlipHorizontal() DetailsBubble:SetBubbleText ("", "", "WWHYYYYYYYYY!!!!", "", "") DetailsBubble:TextConfig (14, nil, "deeppink") DetailsBubble:ShowBubble() end _detalhes:ScheduleTimer ("ResetWarningDialog", 7) --]] --[[ local background_up = f:CreateTexture (nil, "background") background_up:SetPoint ("topleft", f, "topleft") background_up:SetSize (250, 150) background_up:SetTexture ("Interface\\QuestionFrame\\Question-Main") background_up:SetTexCoord (0, 420/512, 320/512, 475/512) local background_down = f:CreateTexture (nil, "background") background_down:SetPoint ("topleft", background_up, "bottomleft") background_down:SetSize (250, 150) background_down:SetTexture ("Interface\\QuestionFrame\\Question-Main") background_down:SetTexCoord (0, 420/512, 156/512, 308/512) background_up:SetDesaturated (true) background_down:SetDesaturated (true) --]] local CreateCurrentDpsFrame = function (parent, name) local DF = _detalhes.gump local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0") --> some constants local header_size = 12 --title bar size local spacing_vertical = -6 --vertical space between the group anchor and the group dps local green_team_color = {.5, 1, .5, 1} local yellow_team_color = {1, 1, .5, 1} --> main farame local f = CreateFrame ("frame", name, parent or UIParent) f:SetPoint ("center", UIParent, "center") f:SetSize (_detalhes.current_dps_meter.frame.width, _detalhes.current_dps_meter.frame.height) f:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tile = true, tileSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}}) f:SetBackdropColor (unpack (_detalhes.current_dps_meter.frame.backdrop_color)) f:EnableMouse (true) f:SetMovable (true) f:SetClampedToScreen (true) f.PlayerTeam = 0 local LibWindow = LibStub ("LibWindow-1.1") LibWindow.RegisterConfig (f, _detalhes.current_dps_meter.frame) LibWindow.MakeDraggable (f) LibWindow.RestorePosition (f) --> title bar local TitleString = f:CreateFontString (nil, "overlay", "GameFontNormal") TitleString:SetPoint ("top", f, "top", 0, -1) TitleString:SetText ("Dps on Last 5 Seconds") DF:SetFontSize (TitleString, 9) local TitleBackground = f:CreateTexture (nil, "artwork") TitleBackground:SetTexture ([[Interface\Tooltips\UI-Tooltip-Background]]) TitleBackground:SetVertexColor (.1, .1, .1, .9) TitleBackground:SetPoint ("topleft", f, "topleft") TitleBackground:SetPoint ("topright", f, "topright") TitleBackground:SetHeight (header_size) --> labels for arena local labelPlayerTeam = f:CreateFontString (nil, "overlay", "GameFontNormal") local labelYellowTeam = f:CreateFontString (nil, "overlay", "GameFontNormal") labelPlayerTeam:SetText ("Player Team") labelYellowTeam:SetText ("Enemy Team") DF:SetFontSize (labelPlayerTeam, 14) DF:SetFontSize (labelYellowTeam, 14) DF:SetFontOutline (labelPlayerTeam, "NONE") DF:SetFontOutline (labelYellowTeam, "NONE") local labelPlayerTeam_DPS = f:CreateFontString (nil, "overlay", "GameFontNormal") local labelYellowTeam_DPS = f:CreateFontString (nil, "overlay", "GameFontNormal") labelPlayerTeam_DPS:SetText ("0") labelYellowTeam_DPS:SetText ("0") local labelPlayerTeam_DPS_Icon = f:CreateTexture (nil, "overlay") local labelYellowTeam_DPS_Icon = f:CreateTexture (nil, "overlay") labelPlayerTeam_DPS_Icon:SetTexture ([[Interface\LFGFRAME\UI-LFG-ICON-ROLES]]) labelYellowTeam_DPS_Icon:SetTexture ([[Interface\LFGFRAME\UI-LFG-ICON-ROLES]]) labelPlayerTeam_DPS_Icon:SetTexCoord (72/256, 130/256, 69/256, 127/256) labelYellowTeam_DPS_Icon:SetTexCoord (72/256, 130/256, 69/256, 127/256) local icon_size = 16 labelPlayerTeam_DPS_Icon:SetSize (icon_size, icon_size) labelYellowTeam_DPS_Icon:SetSize (icon_size, icon_size) labelPlayerTeam:SetPoint ("left", f, "left", 5, 10) labelYellowTeam:SetPoint ("right", f, "right", -5, 10) labelPlayerTeam_DPS_Icon:SetPoint ("topleft", labelPlayerTeam, "bottomleft", 0, -4) labelYellowTeam_DPS_Icon:SetPoint ("topleft", labelYellowTeam, "bottomleft", 0, -4) labelPlayerTeam_DPS:SetPoint ("left", labelPlayerTeam_DPS_Icon, "right", 4, 0) labelYellowTeam_DPS:SetPoint ("left", labelYellowTeam_DPS_Icon, "right", 4, 0) labelPlayerTeam:SetTextColor (unpack (green_team_color)) labelYellowTeam:SetTextColor (unpack (yellow_team_color)) function f.SwapArenaTeamColors() if (f.PlayerTeam == 0) then labelPlayerTeam:SetTextColor (unpack (yellow_team_color)) labelYellowTeam:SetTextColor (unpack (green_team_color)) else labelPlayerTeam:SetTextColor (unpack (green_team_color)) labelYellowTeam:SetTextColor (unpack (yellow_team_color)) end end --> labels for mythic dungeon / group party local labelGroupDamage = f:CreateFontString (nil, "overlay", "GameFontNormal") labelGroupDamage:SetText ("Real Time Group DPS") DF:SetFontSize (labelGroupDamage, 14) DF:SetFontOutline (labelGroupDamage, "NONE") local labelGroupDamage_DPS = f:CreateFontString (nil, "overlay", "GameFontNormal") labelGroupDamage_DPS:SetText ("0") labelGroupDamage:SetPoint ("center", f, "center", 0, 10) labelGroupDamage_DPS:SetPoint ("center", labelGroupDamage, "center") labelGroupDamage_DPS:SetPoint ("top", labelGroupDamage, "bottom", 0, spacing_vertical) --[=[ local labelGroupDamage_DPS_Icon = f:CreateTexture (nil, "overlay") labelGroupDamage_DPS_Icon:SetTexture ([[Interface\LFGFRAME\UI-LFG-ICON-ROLES]]) labelGroupDamage_DPS_Icon:SetTexCoord (72/256, 130/256, 69/256, 127/256) labelGroupDamage_DPS_Icon:SetSize (icon_size, icon_size) labelGroupDamage_DPS_Icon:SetPoint ("topleft", labelPlayerTeam, "bottomleft", 0, -4) --]=] --> frame update function --> update local time_fraction = 100/1000 --one tick per 100ms f.NextUpdate = time_fraction --when the next tick occur f.NextScreenUpdate = _detalhes.current_dps_meter.update_interval --when the labels on the frame receive update --> arena f.PlayerTeamBuffer = {} f.YellowTeamBuffer = {} f.PlayerTeamDamage = 0 f.YellowDamage = 0 f.LastPlayerTeamDamage = 0 f.LastYellowDamage = 0 --> mythic dungeon / party group f.GroupBuffer = {} f.GroupTotalDamage = 0 f.LastTickGroupDamage = 0 --> general f.SampleSize = _detalhes.current_dps_meter.sample_size f.MaxBufferIndex = 1 f.ShowingArena = false function _detalhes:UpdateTheRealCurrentDPSFrame (scenario) --> don't run if the featured hasn't loaded if (not f) then return end if (not _detalhes.current_dps_meter.enabled) then f:Hide() return end if (not _detalhes.current_dps_meter.arena_enabled and not _detalhes.current_dps_meter.mythic_dungeon_enabled) then f:Hide() return end --> where the player are if (scenario == "arena") then labelPlayerTeam_DPS:Show() labelYellowTeam_DPS:Show() labelPlayerTeam:Show() labelYellowTeam:Show() labelPlayerTeam_DPS_Icon:Show() labelYellowTeam_DPS_Icon:Show() --> update arena labels DF:SetFontColor (labelPlayerTeam_DPS, _detalhes.current_dps_meter.font_color) DF:SetFontFace (labelPlayerTeam_DPS, _detalhes.current_dps_meter.font_face) DF:SetFontSize (labelPlayerTeam_DPS, _detalhes.current_dps_meter.font_size) DF:SetFontOutline (labelPlayerTeam_DPS, _detalhes.current_dps_meter.font_shadow) DF:SetFontColor (labelYellowTeam_DPS, _detalhes.current_dps_meter.font_color) DF:SetFontFace (labelYellowTeam_DPS, _detalhes.current_dps_meter.font_face) DF:SetFontSize (labelYellowTeam_DPS, _detalhes.current_dps_meter.font_size) DF:SetFontOutline (labelYellowTeam_DPS, _detalhes.current_dps_meter.font_shadow) --> wipe current data for arena wipe (f.PlayerTeamBuffer) wipe (f.YellowTeamBuffer) --> reset damage f.PlayerTeamDamage = 0 f.YellowDamage = 0 --> reset last tick damage f.LastPlayerTeamDamage = 0 f.LastYellowDamage = 0 f:Show() else --> isn't arena, hide arena labels labelPlayerTeam_DPS:Hide() labelYellowTeam_DPS:Hide() labelPlayerTeam:Hide() labelYellowTeam:Hide() labelPlayerTeam_DPS_Icon:Hide() labelYellowTeam_DPS_Icon:Hide() end if (scenario == "mythicdungeon") then labelGroupDamage:Show() labelGroupDamage_DPS:Show() DF:SetFontColor (labelGroupDamage_DPS, _detalhes.current_dps_meter.font_color) DF:SetFontFace (labelGroupDamage_DPS, _detalhes.current_dps_meter.font_face) DF:SetFontSize (labelGroupDamage_DPS, _detalhes.current_dps_meter.font_size) DF:SetFontOutline (labelGroupDamage_DPS, _detalhes.current_dps_meter.font_shadow) --> wipe current data for mythic dungeon f.GroupBuffer = {} --> reset damage f.GroupTotalDamage = 0 --> reset last tick damage f.LastTickGroupDamage = 0 f:Show() else labelGroupDamage:Hide() labelGroupDamage_DPS:Hide() end --> frame position f:SetSize (_detalhes.current_dps_meter.frame.width, _detalhes.current_dps_meter.frame.height) LibWindow.RegisterConfig (f, _detalhes.current_dps_meter.frame) LibWindow.RestorePosition (f) --> backdrop color f:SetBackdropColor (unpack (_detalhes.current_dps_meter.frame.backdrop_color)) --> set frame size f:SetSize (_detalhes.current_dps_meter.frame.width, _detalhes.current_dps_meter.frame.height) --> frame is locked if (_detalhes.current_dps_meter.frame.locked) then f:EnableMouse (false) else f:EnableMouse (true) end --> frame can show title if (_detalhes.current_dps_meter.frame.show_title) then TitleString:Show() TitleBackground:Show() else TitleString:Hide() TitleBackground:Hide() end --> frame strata f:SetFrameStrata (_detalhes.current_dps_meter.frame.strata) --> calcule buffer size f.MaxBufferIndex = f.SampleSize * time_fraction * 100 --sample size in seconds * fraction * tick milliseconds --> interval to update the frame f.NextScreenUpdate = _detalhes.current_dps_meter.update_interval end _detalhes:UpdateTheRealCurrentDPSFrame() local on_tick = function (self, deltaTime) self.NextUpdate = self.NextUpdate - deltaTime if (self.NextUpdate <= 0) then --> update string local currentCombat = _detalhes:GetCombat() local damageContainer = currentCombat:GetContainer (DETAILS_ATTRIBUTE_DAMAGE) --> show the current dps during an arena match if (self.ShowingArena) then --> the team damage done at this tick local thisTickPlayerTeamDamage = 0 local thisTickYellowDamage = 0 for i, actor in damageContainer:ListActors() do --actor.arena_team = actor.arena_team or 0 --debug if (actor:IsPlayer() and actor.arena_team) then if (actor.arena_team == 0) then --green team / player team thisTickPlayerTeamDamage = thisTickPlayerTeamDamage + actor.total else --yellow thisTickYellowDamage = thisTickYellowDamage + actor.total end if (actor.nome == _detalhes.playername) then --> if player isn't in green team > swap colors if (f.PlayerTeam ~= actor.arena_team) then f.SwapArenaTeamColors() f.PlayerTeam = actor.arena_team end end end end --> calculate how much damage the team made on this tick local playerTeamDamageDone = thisTickPlayerTeamDamage - f.LastPlayerTeamDamage local yellowDamageDone = thisTickYellowDamage - f.LastYellowDamage --> add the damage to buffer tinsert (f.PlayerTeamBuffer, 1, playerTeamDamageDone) tinsert (f.YellowTeamBuffer, 1, yellowDamageDone) --> save the current damage amount f.LastPlayerTeamDamage = thisTickPlayerTeamDamage f.LastYellowDamage = thisTickYellowDamage --> add the damage to current total damage f.PlayerTeamDamage = f.PlayerTeamDamage + playerTeamDamageDone f.YellowDamage = f.YellowDamage + yellowDamageDone --> remove player team damage local removedDamage = tremove (f.PlayerTeamBuffer, f.MaxBufferIndex+1) if (removedDamage) then f.PlayerTeamDamage = f.PlayerTeamDamage - removedDamage --> be save f.PlayerTeamDamage = max (0, f.PlayerTeamDamage) end --> remove yellow damage local removedDamage = tremove (f.YellowTeamBuffer, f.MaxBufferIndex+1) if (removedDamage) then f.YellowDamage = f.YellowDamage - removedDamage --> be save f.YellowDamage = max (0, f.YellowDamage) end self.NextScreenUpdate = self.NextScreenUpdate - time_fraction if (self.NextScreenUpdate <= 0) then if (f.PlayerTeam == 0) then labelPlayerTeam_DPS:SetText (_detalhes:ToK2 (self.PlayerTeamDamage / self.SampleSize)) labelYellowTeam_DPS:SetText (_detalhes:ToK2 (self.YellowDamage / self.SampleSize)) else labelPlayerTeam_DPS:SetText (_detalhes:ToK2 (self.YellowDamage / self.SampleSize)) labelYellowTeam_DPS:SetText (_detalhes:ToK2 (self.PlayerTeamDamage / self.SampleSize)) end f.NextScreenUpdate = _detalhes.current_dps_meter.update_interval end elseif (self.ShowingMythicDungeon) then --iniciava um novo combate e tinha o buffer do combate anterior --ent�o dava o total de dano do combate recente menos o que tinha no buffer do round anterior --> the party damage done at this tick local thisTickGroupDamage = 0 for i, actor in damageContainer:ListActors() do if (actor:IsPlayer() and actor:IsGroupPlayer()) then thisTickGroupDamage = thisTickGroupDamage + actor.total end end --> calculate how much damage the team made on this tick local groupDamageDoneOnThisTick = thisTickGroupDamage - f.LastTickGroupDamage --> add the damage to buffer tinsert (f.GroupBuffer, 1, groupDamageDoneOnThisTick) --> save the current damage amount f.LastTickGroupDamage = thisTickGroupDamage --> add the damage to current total damage f.GroupTotalDamage = f.GroupTotalDamage + groupDamageDoneOnThisTick --> cicle buffer removing the last index and subtract its damage local removedDamage = tremove (f.GroupBuffer, f.MaxBufferIndex+1) if (removedDamage) then --> remove the value from the total damage f.GroupTotalDamage = f.GroupTotalDamage - removedDamage --> be save f.GroupTotalDamage = max (0, f.GroupTotalDamage) end self.NextScreenUpdate = self.NextScreenUpdate - time_fraction if (self.NextScreenUpdate <= 0) then labelGroupDamage_DPS:SetText (_detalhes:ToK2 (f.GroupTotalDamage / self.SampleSize)) f.NextScreenUpdate = _detalhes.current_dps_meter.update_interval end end --> set next update time self.NextUpdate = time_fraction end end f:SetScript ("OnHide", function() f.ShowingArena = false f.ShowingMythicDungeon = false f:SetScript ("OnUpdate", nil) end) function f:StartForArenaMatch() if (not f.ShowingArena) then _detalhes:UpdateTheRealCurrentDPSFrame ("arena") f.ShowingArena = true f:SetScript ("OnUpdate", on_tick) end end function f:StartForMythicDungeon() if (not f.ShowingMythicDungeon) then _detalhes:UpdateTheRealCurrentDPSFrame ("mythicdungeon") f.ShowingMythicDungeon = true f:SetScript ("OnUpdate", on_tick) end end local eventListener = _detalhes:CreateEventListener() function eventListener:ArenaStarted() if (_detalhes.current_dps_meter.arena_enabled) then f:StartForArenaMatch() end end function eventListener:MythicDungeonStarted() if (_detalhes.current_dps_meter.mythic_dungeon_enabled) then f:StartForMythicDungeon() end end function eventListener:ArenaEnded() f:Hide() end function eventListener:MythicDungeonEnded() f:Hide() end function eventListener:ResetBuffer() if (f:IsShown()) then wipe (f.PlayerTeamBuffer) wipe (f.YellowTeamBuffer) wipe (f.GroupBuffer) f.GroupTotalDamage = 0 f.PlayerTeamDamage = 0 f.YellowDamage = 0 f.LastTickGroupDamage = 0 f.LastPlayerTeamDamage = 0 f.LastYellowDamage = 0 end end eventListener:RegisterEvent ("COMBAT_ARENA_START", "ArenaStarted") eventListener:RegisterEvent ("COMBAT_ARENA_END", "ArenaEnded") eventListener:RegisterEvent ("COMBAT_MYTHICDUNGEON_START", "MythicDungeonStarted") eventListener:RegisterEvent ("COMBAT_MYTHICDUNGEON_END", "MythicDungeonEnded") eventListener:RegisterEvent ("COMBAT_PLAYER_ENTER", "ResetBuffer") _detalhes.Broadcaster_CurrentDpsLoaded = true _detalhes.Broadcaster_CurrentDpsFrame = f f:Hide() end local CreateEventTrackerFrame = function (parent, name) local DF = _detalhes.gump local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0") --> main farame local f = CreateFrame ("frame", name, parent or UIParent) f:SetPoint ("center", UIParent, "center") f:SetMinResize (150, 40) f:SetMaxResize (800, 1024) f:SetSize (_detalhes.event_tracker.frame.width, _detalhes.event_tracker.frame.height) f:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tile = true, tileSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}}) f:SetBackdropColor (unpack (_detalhes.event_tracker.frame.backdrop_color)) f:EnableMouse (true) f:SetMovable (true) f:SetResizable (true) f:SetClampedToScreen (true) local LibWindow = LibStub ("LibWindow-1.1") LibWindow.RegisterConfig (f, _detalhes.event_tracker.frame) LibWindow.MakeDraggable (f) LibWindow.RestorePosition (f) --> two resizers local left_resize, right_resize = DF:CreateResizeGrips (f) left_resize:SetScript ("OnMouseDown", function (self) if (not f.resizing and not _detalhes.event_tracker.frame.locked) then f.resizing = true f:StartSizing ("bottomleft") end end) left_resize:SetScript ("OnMouseUp", function (self) if (f.resizing) then f.resizing = false f:StopMovingOrSizing() _detalhes.event_tracker.frame.width = f:GetWidth() _detalhes.event_tracker.frame.height = f:GetHeight() end end) right_resize:SetScript ("OnMouseDown", function (self) if (not f.resizing and not _detalhes.event_tracker.frame.locked) then f.resizing = true f:StartSizing ("bottomright") end end) right_resize:SetScript ("OnMouseUp", function (self) if (f.resizing) then f.resizing = false f:StopMovingOrSizing() _detalhes.event_tracker.frame.width = f:GetWidth() _detalhes.event_tracker.frame.height = f:GetHeight() end end) f:SetScript ("OnSizeChanged", function (self) end) --> scroll frame --> frame config local scroll_line_amount = 1 local scroll_width = 195 local header_size = 20 --> on tick script local lineOnTick = function (self, deltaTime) --> when this event occured on combat log local gameTime = self.GameTime --> calculate how much time elapsed since the event got triggered local elapsedTime = GetTime() - gameTime --> set the bar animation: local animationPercent = min (elapsedTime, 1) self.Statusbar:SetValue (animationPercent) --> set the spark location if (animationPercent < 1) then self.Spark:SetPoint ("left", self, "left", (self:GetWidth() * animationPercent) - 10, 0) if (not self.Spark:IsShown()) then self.Spark:Show() end else if (self.Spark:IsShown()) then self.Spark:Hide() end end end --> create a line on the scroll frame local scroll_createline = function (self, index) local line = CreateFrame ("frame", "$parentLine" .. index, self) line:EnableMouse (false) line.Index = index --> hack to not trigger error on UpdateWorldTrackerLines since Index is set after this function is ran --> set its backdrop line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tile = true, tileSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}}) line:SetBackdropColor (1, 1, 1, 0.75) --> statusbar local statusbar = CreateFrame ("statusbar", "$parentStatusBar", line) statusbar:SetAllPoints() local statusbartexture = statusbar:CreateTexture (nil, "border") statusbar:SetStatusBarTexture (statusbartexture) statusbar:SetMinMaxValues (0, 1) statusbar:SetValue (0) local statusbarspark = statusbar:CreateTexture (nil, "artwork") statusbarspark:SetTexture ([[Interface\CastingBar\UI-CastingBar-Spark]]) statusbarspark:SetSize (16, 30) statusbarspark:SetBlendMode ("ADD") statusbarspark:Hide() --> create the icon textures and texts - they are all statusbar childs local lefticon = statusbar:CreateTexture ("$parentLeftIcon", "overlay") lefticon:SetPoint ("left", line, "left", 0, 0) local righticon = statusbar:CreateTexture ("$parentRightIcon", "overlay") righticon:SetPoint ("right", line, "right", 0, 0) local lefttext = statusbar:CreateFontString ("$parentLeftText", "overlay", "GameFontNormal") DF:SetFontSize (lefttext, 9) lefttext:SetPoint ("left", lefticon, "right", 2, 0) local righttext = statusbar:CreateFontString ("$parentRightText", "overlay", "GameFontNormal") DF:SetFontSize (righttext, 9) righttext:SetPoint ("right", righticon, "left", -2, 0) lefttext:SetJustifyH ("left") righttext:SetJustifyH ("right") local actionicon = statusbar:CreateTexture ("$parentRightIcon", "overlay") actionicon:SetPoint ("center", line, "center") --> set members line.LeftIcon = lefticon line.RightIcon = righticon line.LeftText = lefttext line.RightText = righttext line.Statusbar = statusbar line.StatusbarTexture = statusbartexture line.Spark = statusbarspark line.ActionIcon = actionicon --> set some parameters _detalhes:UpdateWorldTrackerLines (line) --> set scripts line:SetScript ("OnUpdate", lineOnTick) return line end --> some consts to help work with indexes local SPELLTYPE_COOLDOWN = "cooldown" local SPELLTYPE_INTERRUPT = "interrupt" local SPELLTYPE_OFFENSIVE = "offensive" local SPELLTYPE_CROWDCONTROL = "crowdcontrol" local ABILITYTABLE_SPELLTYPE = 1 local ABILITYTABLE_SPELLID = 2 local ABILITYTABLE_CASTERNAME = 3 local ABILITYTABLE_TARGETNAME = 4 local ABILITYTABLE_TIME = 5 local ABILITYTABLE_EXTRASPELLID = 6 local ABILITYTABLE_GAMETIME = 7 local ABILITYTABLE_CASTERSERIAL = 8 local ABILITYTABLE_ISENEMY = 9 local ABILITYTABLE_TARGETSERIAL = 10 local get_spec_or_class = function (serial, name) local class local spec = _detalhes.cached_specs [serial] if (not spec) then local _, engClass = UnitClass (name) if (engClass) then class = engClass else local locClass, engClass, locRace, engRace, gender = GetPlayerInfoByGUID (serial) if (engClass) then class = engClass end end end return spec, class end local get_player_icon = function (spec, class) if (spec) then return [[Interface\AddOns\Details\images\spec_icons_normal]], unpack (_detalhes.class_specs_coords [spec]) elseif (class) then return [[Interface\AddOns\Details\images\classes_small]], unpack (_detalhes.class_coords [class]) else return [[Interface\AddOns\Details\images\classes_plus]], 0.50390625, 0.62890625, 0, 0.125 end end local add_role_and_class_color = function (player_name, player_serial) --> get the actor object local actor = _detalhes.tabela_vigente[1]:GetActor (player_name) if (actor) then --> remove realm name player_name = _detalhes:GetOnlyName (player_name) local class, spec, role = actor.classe, actor.spec, actor.role if (not class) then spec, class = get_spec_or_class (player_serial, player_name) end --> add the class color if (_detalhes.player_class [class]) then --> is a player, add the class color player_name = _detalhes:AddColorString (player_name, class) end --add the role icon if (role ~= "NONE") then --> have a role player_name = _detalhes:AddRoleIcon (player_name, role, _detalhes.event_tracker.line_height) end else local spec, class = get_spec_or_class (player_serial, player_name) player_name = _detalhes:GetOnlyName (player_name) if (class) then --> add the class color if (_detalhes.player_class [class]) then --> is a player, add the class color player_name = _detalhes:AddColorString (player_name, class) end end end return player_name end local get_text_size = function() local iconsSpace = _detalhes.event_tracker.line_height * 3 local textSpace = 4 local saveSpace = 14 local availableSpace = (f:GetWidth() - iconsSpace - textSpace - saveSpace) / 2 return availableSpace end local shrink_string = function (fontstring, size) local text = fontstring:GetText() local loops = 20 while (fontstring:GetStringWidth() > size and loops > 0) do text = strsub (text, 1, #text-1) fontstring:SetText (text) loops = loops - 1 end return fontstring end --refresh the scroll frame local scroll_refresh = function (self, data, offset, total_lines) local textSize = get_text_size() for i = 1, total_lines do local index = i + offset local ability = data [index] if (ability) then local line = self:GetLine (i) local spec, class = get_spec_or_class (ability [ABILITYTABLE_CASTERSERIAL], ability [ABILITYTABLE_CASTERNAME]) local texture, L, R, T, B = get_player_icon (spec, class) line.LeftIcon:SetTexture (texture) line.LeftIcon:SetTexCoord (L, R, T, B) line.LeftText:SetText (_detalhes:GetOnlyName (ability [ABILITYTABLE_CASTERNAME])) if (ability [ABILITYTABLE_ISENEMY]) then line:SetBackdropColor (1, .3, .3, 0.75) else line:SetBackdropColor (1, 1, 1, 0.75) end if (ability [ABILITYTABLE_SPELLTYPE] == SPELLTYPE_COOLDOWN) then local spellName, _, spellIcon = GetSpellInfo (ability [ABILITYTABLE_SPELLID]) line.RightIcon:SetTexture (spellIcon) line.RightIcon:SetTexCoord (.06, .94, .06, .94) local targetName = ability [ABILITYTABLE_TARGETNAME] if (targetName) then local targetSerial = ability [ABILITYTABLE_TARGETSERIAL] targetName = add_role_and_class_color (targetName, targetSerial) end line.RightText:SetText (targetName or spellName) line.ActionIcon:SetTexture ([[Interface\AddOns\Details\images\event_tracker_icons]]) line.ActionIcon:SetTexCoord (0, 0.125, 0, 1) elseif (ability [ABILITYTABLE_SPELLTYPE] == SPELLTYPE_OFFENSIVE) then local spellName, _, spellIcon = GetSpellInfo (ability [ABILITYTABLE_SPELLID]) line.RightIcon:SetTexture (spellIcon) line.RightIcon:SetTexCoord (.06, .94, .06, .94) line.RightText:SetText (spellName) line.ActionIcon:SetTexture ([[Interface\AddOns\Details\images\event_tracker_icons]]) line.ActionIcon:SetTexCoord (0.127, 0.25, 0, 1) elseif (ability [ABILITYTABLE_SPELLTYPE] == SPELLTYPE_INTERRUPT) then local spellNameInterrupted, _, spellIconInterrupted = GetSpellInfo (ability [ABILITYTABLE_EXTRASPELLID]) line.RightIcon:SetTexture (spellIconInterrupted) line.RightIcon:SetTexCoord (.06, .94, .06, .94) line.RightText:SetText (spellNameInterrupted) line.ActionIcon:SetTexture ([[Interface\AddOns\Details\images\event_tracker_icons]]) line.ActionIcon:SetTexCoord (0.251, 0.375, 0, 1) elseif (ability [ABILITYTABLE_SPELLTYPE] == SPELLTYPE_CROWDCONTROL) then local spellName, _, spellIcon = GetSpellInfo (ability [ABILITYTABLE_SPELLID]) line.RightIcon:SetTexture (spellIcon) line.RightIcon:SetTexCoord (.06, .94, .06, .94) local targetName = ability [ABILITYTABLE_TARGETNAME] if (targetName) then local targetSerial = ability [ABILITYTABLE_TARGETSERIAL] targetName = add_role_and_class_color (targetName, targetSerial) end line.RightText:SetText (targetName or "unknown target") line.ActionIcon:SetTexture ([[Interface\AddOns\Details\images\event_tracker_icons]]) line.ActionIcon:SetTexCoord (0.376, 0.5, 0, 1) end shrink_string (line.LeftText, textSize) shrink_string (line.RightText, textSize) --> set when the ability was registered on combat log line.GameTime = ability [ABILITYTABLE_GAMETIME] line:Show() end end end --title text local TitleString = f:CreateFontString (nil, "overlay", "GameFontNormal") TitleString:SetPoint ("top", f, "top", 0, -3) TitleString:SetText ("Details!: Event Tracker") local TitleBackground = f:CreateTexture (nil, "artwork") TitleBackground:SetTexture ([[Interface\Tooltips\UI-Tooltip-Background]]) TitleBackground:SetVertexColor (.1, .1, .1, .9) TitleBackground:SetPoint ("topleft", f, "topleft") TitleBackground:SetPoint ("topright", f, "topright") TitleBackground:SetHeight (header_size) --> table with spells showing on the scroll frame local CurrentShowing = {} --> scrollframe local scrollframe = DF:CreateScrollBox (f, "$parentScrollFrame", scroll_refresh, CurrentShowing, scroll_width, 400, scroll_line_amount, _detalhes.event_tracker.line_height, scroll_createline, true, true) scrollframe:SetPoint ("topleft", f, "topleft", 0, -header_size) scrollframe:SetPoint ("topright", f, "topright", 0, -header_size) scrollframe:SetPoint ("bottomleft", f, "bottomleft", 0, 0) scrollframe:SetPoint ("bottomright", f, "bottomright", 0, 0) --> update line - used by 'UpdateWorldTrackerLines' function local update_line = function (line) --> get the line index local index = line.Index --> update left text DF:SetFontColor (line.LeftText, _detalhes.event_tracker.font_color) DF:SetFontFace (line.LeftText, _detalhes.event_tracker.font_face) DF:SetFontSize (line.LeftText, _detalhes.event_tracker.font_size) DF:SetFontOutline (line.LeftText, _detalhes.event_tracker.font_shadow) --> update right text DF:SetFontColor (line.RightText, _detalhes.event_tracker.font_color) DF:SetFontFace (line.RightText, _detalhes.event_tracker.font_face) DF:SetFontSize (line.RightText, _detalhes.event_tracker.font_size) DF:SetFontOutline (line.RightText, _detalhes.event_tracker.font_shadow) --> adjust where the line is anchored line:SetPoint ("topleft", line:GetParent(), "topleft", 0, -((index-1)*(_detalhes.event_tracker.line_height+1))) line:SetPoint ("topright", line:GetParent(), "topright", 0, -((index-1)*(_detalhes.event_tracker.line_height+1))) --> set its height line:SetHeight (_detalhes.event_tracker.line_height) --> set texture local texture = SharedMedia:Fetch ("statusbar", _detalhes.event_tracker.line_texture) line.StatusbarTexture:SetTexture (texture) line.StatusbarTexture:SetVertexColor (unpack (_detalhes.event_tracker.line_color)) --> set icon size line.LeftIcon:SetSize (_detalhes.event_tracker.line_height, _detalhes.event_tracker.line_height) line.RightIcon:SetSize (_detalhes.event_tracker.line_height, _detalhes.event_tracker.line_height) line.ActionIcon:SetSize (_detalhes.event_tracker.line_height-4, _detalhes.event_tracker.line_height-4) line.ActionIcon:SetAlpha (0.65) end -- /run _detalhes.event_tracker.font_shadow = 24 -- /run _detalhes:UpdateWorldTrackerLines() function _detalhes:UpdateWorldTrackerLines (line) --> don't run if the featured hasn't loaded if (not f) then return end if (line) then update_line (line) else --> update all lines for index, line in ipairs (scrollframe:GetFrames()) do update_line (line) end scrollframe:SetFramesHeight (_detalhes.event_tracker.line_height) scrollframe:Refresh() end end function _detalhes:UpdateEventTrackerFrame() --> don't run if the featured hasn't loaded if (not f) then return end f:SetSize (_detalhes.event_tracker.frame.width, _detalhes.event_tracker.frame.height) LibWindow.RegisterConfig (f, _detalhes.event_tracker.frame) LibWindow.RestorePosition (f) scrollframe:OnSizeChanged() if (_detalhes.event_tracker.frame.locked) then f:EnableMouse (false) left_resize:Hide() right_resize:Hide() else f:EnableMouse (true) left_resize:Show() right_resize:Show() end if (_detalhes.event_tracker.frame.show_title) then TitleString:Show() TitleBackground:Show() scrollframe:SetPoint ("topleft", f, "topleft", 0, -header_size) scrollframe:SetPoint ("topright", f, "topright", 0, -header_size) else TitleString:Hide() TitleBackground:Hide() scrollframe:SetPoint ("topleft", f, "topleft", 0, 0) scrollframe:SetPoint ("topright", f, "topright", 0, 0) end f:SetBackdropColor (unpack (_detalhes.event_tracker.frame.backdrop_color)) f:SetFrameStrata (_detalhes.event_tracker.frame.strata) _detalhes:UpdateWorldTrackerLines() scrollframe:Refresh() end --create the first line for i = 1, 1 do scrollframe:CreateLine (scroll_createline) end f.scrollframe = scrollframe scrollframe:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16}) scrollframe:SetBackdropColor (0, 0, 0, 0) --> get tables used inside the combat parser local cooldownList1 = _detalhes.DefensiveCooldownSpellsNoBuff local cooldownList2 = _detalhes.DefensiveCooldownSpells local attackCooldownsList1 = _detalhes.AttackCooldownSpells local crowdControlList1 = _detalhes.CrowdControlSpells --> remove thise spells on shipping --cooldownList1 [194679] = {60, 10} --cooldownList1 [221699] = {60, 10} local combatLog = CreateFrame ("frame") combatLog:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") local OBJECT_TYPE_PLAYER = 0x00000400 local OBJECT_TYPE_ENEMY = 0x00000040 --> combat parser local is_player = function (flag) return bit.band (flag, OBJECT_TYPE_PLAYER) ~= 0 end local is_enemy = function (flag) return bit.band (flag, OBJECT_TYPE_ENEMY) ~= 0 end combatLog:SetScript ("OnEvent", function (self, event, time, token, hidding, caster_serial, caster_name, caster_flags, caster_flags2, target_serial, target_name, target_flags, target_flags2, spellid, spellname, spelltype, extraSpellID, extraSpellName, extraSchool) local added = false --> defensive cooldown if (token == "SPELL_CAST_SUCCESS" and (cooldownList1 [spellid] or cooldownList2 [spellid]) and is_player (caster_flags)) then tinsert (CurrentShowing, 1, {SPELLTYPE_COOLDOWN, spellid, caster_name, target_name, time, false, GetTime(), caster_serial, is_enemy (caster_flags), target_serial}) added = true --> offensive cooldown elseif (token == "SPELL_CAST_SUCCESS" and (attackCooldownsList1 [spellid]) and is_player (caster_flags)) then tinsert (CurrentShowing, 1, {SPELLTYPE_OFFENSIVE, spellid, caster_name, target_name, time, false, GetTime(), caster_serial, is_enemy (caster_flags), target_serial}) added = true --> crowd control elseif (token == "SPELL_AURA_APPLIED" and (crowdControlList1 [spellid])) then --check if isnt a pet if (target_flags and is_player (target_flags)) then tinsert (CurrentShowing, 1, {SPELLTYPE_CROWDCONTROL, spellid, caster_name, target_name, time, false, GetTime(), caster_serial, is_enemy (caster_flags), target_serial}) added = true end --> spell interrupt elseif (token == "SPELL_INTERRUPT") then tinsert (CurrentShowing, 1, {SPELLTYPE_INTERRUPT, spellid, caster_name, target_name, time, extraSpellID, GetTime(), caster_serial, is_enemy (caster_flags), target_serial}) added = true end if (added) then local amountOfLines = scrollframe:GetNumFramesShown() local amountToShow = #CurrentShowing if (amountToShow > amountOfLines) then tremove (CurrentShowing, amountToShow) end scrollframe:Refresh() end end) _detalhes.Broadcaster_EventTrackerLoaded = true _detalhes.Broadcaster_EventTrackerFrame = f f:Hide() end function Details:LoadFramesForBroadcastTools() --> event tracker --> if enabled and not loaded, load it if (_detalhes.event_tracker.enabled and not _detalhes.Broadcaster_EventTrackerLoaded) then CreateEventTrackerFrame (UIParent, "DetailsEventTracker") end --> if enabled and loaded, refresh and show if (_detalhes.event_tracker.enabled and _detalhes.Broadcaster_EventTrackerLoaded) then _detalhes:UpdateEventTrackerFrame() DetailsEventTracker:Show() end --> if not enabled but loaded, hide it if (not _detalhes.event_tracker.enabled and _detalhes.Broadcaster_EventTrackerLoaded) then DetailsEventTracker:Hide() end --> current dps local bIsEnabled = _detalhes.current_dps_meter.enabled and (_detalhes.current_dps_meter.arena_enabled or _detalhes.current_dps_meter.mythic_dungeon_enabled) --> if enabled and not loaded, load it if (bIsEnabled and not _detalhes.Broadcaster_CurrentDpsLoaded) then CreateCurrentDpsFrame (UIParent, "DetailsCurrentDpsMeter") end --> if enabled, check if can show if (bIsEnabled and _detalhes.Broadcaster_CurrentDpsLoaded) then if (_detalhes.current_dps_meter.mythic_dungeon_enabled) then local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() if (difficultyID == 8) then --> player is inside a mythic dungeon DetailsCurrentDpsMeter:StartForMythicDungeon() end end if (_detalhes.current_dps_meter.arena_enabled) then local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() if (instanceType == "arena") then --> player is inside an arena DetailsCurrentDpsMeter:StartForArenaMatch() end end end --> if not enabled but loaded, hide it if (not bIsEnabled and _detalhes.Broadcaster_CurrentDpsLoaded) then DetailsCurrentDpsMeter:Hide() end end function Details:OpenCurrentRealDPSOptions (from_options_panel) if (not DetailsCurrentRealDPSOptions) then local DF = _detalhes.gump local f = DF:CreateSimplePanel (UIParent, 700, 400, "Details! The Current Real DPS Options", "DetailsCurrentRealDPSOptions") f:SetPoint ("center", UIParent, "center") f:SetScript ("OnMouseDown", nil) f:SetScript ("OnMouseUp", nil) local LibWindow = LibStub ("LibWindow-1.1") LibWindow.RegisterConfig (f, _detalhes.current_dps_meter.options_frame) LibWindow.MakeDraggable (f) LibWindow.RestorePosition (f) local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") local testUsing = "arena" --mythicdungeon --> frame strata options local set_frame_strata = function (_, _, strata) Details.current_dps_meter.frame.strata = strata Details:UpdateTheRealCurrentDPSFrame (testUsing) end local strataTable = {} strataTable [1] = {value = "BACKGROUND", label = "BACKGROUND", onclick = set_frame_strata} strataTable [2] = {value = "LOW", label = "LOW", onclick = set_frame_strata} strataTable [3] = {value = "MEDIUM", label = "MEDIUM", onclick = set_frame_strata} strataTable [4] = {value = "HIGH", label = "HIGH", onclick = set_frame_strata} strataTable [5] = {value = "DIALOG", label = "DIALOG", onclick = set_frame_strata} --> font options local set_font_shadow= function (_, _, shadow) Details.current_dps_meter.font_shadow = shadow Details:UpdateTheRealCurrentDPSFrame (testUsing) end local fontShadowTable = {} fontShadowTable [1] = {value = "NONE", label = "None", onclick = set_font_shadow} fontShadowTable [2] = {value = "OUTLINE", label = "Outline", onclick = set_font_shadow} fontShadowTable [3] = {value = "THICKOUTLINE", label = "Thick Outline", onclick = set_font_shadow} local on_select_text_font = function (self, fixed_value, value) Details.current_dps_meter.font_face = value Details:UpdateTheRealCurrentDPSFrame (testUsing) end --> options table local options = { {type = "label", get = function() return "Frame Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, --enabled { type = "toggle", get = function() return Details.current_dps_meter.enabled end, set = function (self, fixedparam, value) Details.current_dps_meter.enabled = not Details.current_dps_meter.enabled Details:LoadFramesForBroadcastTools() end, desc = "Enabled", name = "Enabled", text_template = options_text_template, }, --locked { type = "toggle", get = function() return Details.current_dps_meter.frame.locked end, set = function (self, fixedparam, value) Details.current_dps_meter.frame.locked = not Details.current_dps_meter.frame.locked Details:UpdateTheRealCurrentDPSFrame (testUsing) end, desc = "Locked", name = "Locked", text_template = options_text_template, }, --showtitle { type = "toggle", get = function() return Details.current_dps_meter.frame.show_title end, set = function (self, fixedparam, value) Details.current_dps_meter.frame.show_title = not Details.current_dps_meter.frame.show_title Details:UpdateTheRealCurrentDPSFrame (testUsing) end, desc = "Show Title", name = "Show Title", text_template = options_text_template, }, --backdrop color { type = "color", get = function() return {Details.current_dps_meter.frame.backdrop_color[1], Details.current_dps_meter.frame.backdrop_color[2], Details.current_dps_meter.frame.backdrop_color[3], Details.current_dps_meter.frame.backdrop_color[4]} end, set = function (self, r, g, b, a) local color = Details.current_dps_meter.frame.backdrop_color color[1], color[2], color[3], color[4] = r, g, b, a Details:UpdateTheRealCurrentDPSFrame (testUsing) end, desc = "Backdrop Color", name = "Backdrop Color", text_template = options_text_template, }, --statra { type = "select", get = function() return Details.current_dps_meter.frame.strata end, values = function() return strataTable end, name = "Frame Strata" }, --width { type = "range", get = function() return Details.current_dps_meter.frame.width end, set = function (self, fixedparam, value) Details.current_dps_meter.frame.width = value Details:UpdateTheRealCurrentDPSFrame (testUsing) end, min = 1, max = 300, step = 1, name = "Width", text_template = options_text_template, }, --height { type = "range", get = function() return Details.current_dps_meter.frame.height end, set = function (self, fixedparam, value) Details.current_dps_meter.frame.height = value Details:UpdateTheRealCurrentDPSFrame (testUsing) end, min = 1, max = 300, step = 1, name = "Height", text_template = options_text_template, }, {type = "breakline"}, {type = "label", get = function() return "Enabled On:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, --arenas { type = "toggle", get = function() return Details.current_dps_meter.arena_enabled end, set = function (self, fixedparam, value) Details.current_dps_meter.arena_enabled = not Details.current_dps_meter.arena_enabled Details:LoadFramesForBroadcastTools() end, name = "Arena Matches", text_template = options_text_template, }, --mythic dungeon { type = "toggle", get = function() return Details.current_dps_meter.mythic_dungeon_enabled end, set = function (self, fixedparam, value) Details.current_dps_meter.mythic_dungeon_enabled = not Details.current_dps_meter.mythic_dungeon_enabled Details:LoadFramesForBroadcastTools() end, name = "Mythic Dungeons", text_template = options_text_template, }, {type = "breakline"}, {type = "label", get = function() return "Text Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, --font size { type = "range", get = function() return Details.current_dps_meter.font_size end, set = function (self, fixedparam, value) Details.current_dps_meter.font_size = value Details:UpdateTheRealCurrentDPSFrame (testUsing) end, min = 4, max = 32, step = 1, name = "Font Size", text_template = options_text_template, }, --font color { type = "color", get = function() return {Details.current_dps_meter.font_color[1], Details.current_dps_meter.font_color[2], Details.current_dps_meter.font_color[3], Details.current_dps_meter.font_color[4]} end, set = function (self, r, g, b, a) local color = Details.current_dps_meter.font_color color[1], color[2], color[3], color[4] = r, g, b, a Details:UpdateTheRealCurrentDPSFrame (testUsing) end, desc = "Font Color", name = "Font Color", text_template = options_text_template, }, --font shadow { type = "select", get = function() return Details.current_dps_meter.font_shadow end, values = function() return fontShadowTable end, name = "Font Shadow" }, --font face { type = "select", get = function() return Details.current_dps_meter.font_face end, values = function() return DF:BuildDropDownFontList (on_select_text_font) end, name = "Font Face", text_template = options_text_template, }, } DF:BuildMenu (f, options, 7, -30, 500, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) f:SetScript ("OnHide" , function() if (DetailsCurrentDpsMeter) then --> check if can hide the main frame as well --> we force show the main frame for the user see the frame while editing the options local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() if ((instanceType ~= "party" and difficultyID ~= 8) and instanceType ~= "arena") then DetailsCurrentDpsMeter:Hide() end end --> reopen the options panel if (f.FromOptionsPanel) then C_Timer.After (0.2, function() Details:OpenOptionsWindow(Details:GetInstance(1)) end) end end) end --> check if the frame was been created if (not DetailsCurrentDpsMeter) then CreateCurrentDpsFrame (UIParent, "DetailsCurrentDpsMeter") end --> show the options DetailsCurrentRealDPSOptions:Show() DetailsCurrentRealDPSOptions:RefreshOptions() DetailsCurrentRealDPSOptions.FromOptionsPanel = from_options_panel --> start the frame for viewing while editing the options DetailsCurrentDpsMeter:StartForArenaMatch() end function Details:OpenEventTrackerOptions (from_options_panel) if (not DetailsEventTrackerOptions) then local DF = _detalhes.gump local f = DF:CreateSimplePanel (UIParent, 700, 400, "Details! Event Tracker Options", "DetailsEventTrackerOptions") f:SetPoint ("center", UIParent, "center") f:SetScript ("OnMouseDown", nil) f:SetScript ("OnMouseUp", nil) local LibWindow = LibStub ("LibWindow-1.1") LibWindow.RegisterConfig (f, _detalhes.event_tracker.options_frame) LibWindow.MakeDraggable (f) LibWindow.RestorePosition (f) local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") --> frame strata options local set_frame_strata = function (_, _, strata) Details.event_tracker.frame.strata = strata Details:UpdateEventTrackerFrame() end local strataTable = {} strataTable [1] = {value = "BACKGROUND", label = "BACKGROUND", onclick = set_frame_strata} strataTable [2] = {value = "LOW", label = "LOW", onclick = set_frame_strata} strataTable [3] = {value = "MEDIUM", label = "MEDIUM", onclick = set_frame_strata} strataTable [4] = {value = "HIGH", label = "HIGH", onclick = set_frame_strata} strataTable [5] = {value = "DIALOG", label = "DIALOG", onclick = set_frame_strata} --> font options local set_font_shadow= function (_, _, shadow) Details.event_tracker.font_shadow = shadow Details:UpdateEventTrackerFrame() end local fontShadowTable = {} fontShadowTable [1] = {value = "NONE", label = "None", onclick = set_font_shadow} fontShadowTable [2] = {value = "OUTLINE", label = "Outline", onclick = set_font_shadow} fontShadowTable [3] = {value = "THICKOUTLINE", label = "Thick Outline", onclick = set_font_shadow} local on_select_text_font = function (self, fixed_value, value) Details.event_tracker.font_face = value Details:UpdateEventTrackerFrame() end --> texture options local set_bar_texture = function (_, _, value) Details.event_tracker.line_texture = value Details:UpdateEventTrackerFrame() end local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0") local textures = SharedMedia:HashTable ("statusbar") local texTable = {} for name, texturePath in pairs (textures) do texTable [#texTable + 1] = {value = name, label = name, statusbar = texturePath, onclick = set_bar_texture} end table.sort (texTable, function (t1, t2) return t1.label < t2.label end) --> options table local options = { {type = "label", get = function() return "Frame Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, --enabled { type = "toggle", get = function() return Details.event_tracker.enabled end, set = function (self, fixedparam, value) Details.event_tracker.enabled = not Details.event_tracker.enabled Details:LoadFramesForBroadcastTools() end, desc = "Enabled", name = "Enabled", text_template = options_text_template, }, --locked { type = "toggle", get = function() return Details.event_tracker.frame.locked end, set = function (self, fixedparam, value) Details.event_tracker.frame.locked = not Details.event_tracker.frame.locked Details:UpdateEventTrackerFrame() end, desc = "Locked", name = "Locked", text_template = options_text_template, }, --showtitle { type = "toggle", get = function() return Details.event_tracker.frame.show_title end, set = function (self, fixedparam, value) Details.event_tracker.frame.show_title = not Details.event_tracker.frame.show_title Details:UpdateEventTrackerFrame() end, desc = "Show Title", name = "Show Title", text_template = options_text_template, }, --backdrop color { type = "color", get = function() return {Details.event_tracker.frame.backdrop_color[1], Details.event_tracker.frame.backdrop_color[2], Details.event_tracker.frame.backdrop_color[3], Details.event_tracker.frame.backdrop_color[4]} end, set = function (self, r, g, b, a) local color = Details.event_tracker.frame.backdrop_color color[1], color[2], color[3], color[4] = r, g, b, a Details:UpdateEventTrackerFrame() end, desc = "Backdrop Color", name = "Backdrop Color", text_template = options_text_template, }, --statra { type = "select", get = function() return Details.event_tracker.frame.strata end, values = function() return strataTable end, name = "Frame Strata" }, {type = "breakline"}, {type = "label", get = function() return "Line Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, --line height { type = "range", get = function() return Details.event_tracker.line_height end, set = function (self, fixedparam, value) Details.event_tracker.line_height = value Details:UpdateEventTrackerFrame() end, min = 4, max = 32, step = 1, name = "Line Height", text_template = options_text_template, }, --line texture { type = "select", get = function() return Details.event_tracker.line_texture end, values = function() return texTable end, name = "Line Texture", }, --line color { type = "color", get = function() return {Details.event_tracker.line_color[1], Details.event_tracker.line_color[2], Details.event_tracker.line_color[3], Details.event_tracker.line_color[4]} end, set = function (self, r, g, b, a) local color = Details.event_tracker.line_color color[1], color[2], color[3], color[4] = r, g, b, a Details:UpdateEventTrackerFrame() end, desc = "Line Color", name = "Line Color", text_template = options_text_template, }, --font size { type = "range", get = function() return Details.event_tracker.font_size end, set = function (self, fixedparam, value) Details.event_tracker.font_size = value Details:UpdateEventTrackerFrame() end, min = 4, max = 32, step = 1, name = "Font Size", text_template = options_text_template, }, --font color { type = "color", get = function() return {Details.event_tracker.font_color[1], Details.event_tracker.font_color[2], Details.event_tracker.font_color[3], Details.event_tracker.font_color[4]} end, set = function (self, r, g, b, a) local color = Details.event_tracker.font_color color[1], color[2], color[3], color[4] = r, g, b, a Details:UpdateEventTrackerFrame() end, desc = "Font Color", name = "Font Color", text_template = options_text_template, }, --font shadow { type = "select", get = function() return Details.event_tracker.font_shadow end, values = function() return fontShadowTable end, name = "Font Shadow" }, --font face { type = "select", get = function() return Details.event_tracker.font_face end, values = function() return DF:BuildDropDownFontList (on_select_text_font) end, name = "Font Face", text_template = options_text_template, }, } DF:BuildMenu (f, options, 7, -30, 500, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) f:SetScript ("OnHide", function() --> reopen the options panel if (f.FromOptionsPanel) then C_Timer.After (0.2, function() Details:OpenOptionsWindow(Details:GetInstance(1)) end) end end) end DetailsEventTrackerOptions:RefreshOptions() DetailsEventTrackerOptions:Show() DetailsEventTrackerOptions.FromOptionsPanel = from_options_panel end -- fazer painel de op��es -- fazer um painel de op��es "broadcaster settings" C_Timer.After (1, function() --Details:OpenOptionsWindow(Details:GetInstance(1)) end) function _detalhes:FormatBackground (f) f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) f:SetBackdropColor (.5, .5, .5, .5) f:SetBackdropBorderColor (0, 0, 0, 1) if (not f.__background) then f.__background = f:CreateTexture (nil, "background") end f.__background:SetTexture ([[Interface\AddOns\Details\images\background]], true) f.__background:SetAlpha (0.7) f.__background:SetVertexColor (0.27, 0.27, 0.27) f.__background:SetVertTile (true) f.__background:SetHorizTile (true) f.__background:SetAllPoints() end -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> dump table frame function Details:DumpTable (t) return Details:Dump (t) end function Details:Dump (t) if (not DetailsDumpFrame) then DetailsDumpFrame = DetailsFramework:CreateSimplePanel (UIParent) DetailsDumpFrame:SetSize (700, 600) DetailsDumpFrame:SetTitle ("Details! Dump Table [|cFFFF3333Ready Only|r]") local text_editor = DetailsFramework:NewSpecialLuaEditorEntry (DetailsDumpFrame, 680, 560, "Editbox", "$parentEntry", true) text_editor:SetPoint ("topleft", DetailsDumpFrame, "topleft", 10, -30) text_editor.scroll:SetBackdrop (nil) text_editor.editbox:SetBackdrop (nil) text_editor:SetBackdrop (nil) DetailsFramework:ReskinSlider (text_editor.scroll) if (not text_editor.__background) then text_editor.__background = text_editor:CreateTexture (nil, "background") end text_editor:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1}) text_editor:SetBackdropBorderColor (0, 0, 0, 1) text_editor.__background:SetColorTexture (0.2317647, 0.2317647, 0.2317647) text_editor.__background:SetVertexColor (0.27, 0.27, 0.27) text_editor.__background:SetAlpha (0.8) text_editor.__background:SetVertTile (true) text_editor.__background:SetHorizTile (true) text_editor.__background:SetAllPoints() end t = t or {} local s = Details.table.dump (t) DetailsDumpFrame.Editbox:SetText (s) DetailsDumpFrame:Show() end -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> damage scroll function Details:ScrollDamage() if (not DetailsScrollDamage) then local DF = DetailsFramework DetailsScrollDamage = DetailsFramework:CreateSimplePanel (UIParent) DetailsScrollDamage:SetSize (707, 505) DetailsScrollDamage:SetTitle ("Details! Scroll Damage") DetailsScrollDamage.Data = {} DetailsScrollDamage:ClearAllPoints() DetailsScrollDamage:SetPoint ("left", UIParent, "left", 10, 0) DetailsScrollDamage:Hide() local scroll_width = 675 local scroll_height = 450 local scroll_lines = 21 local scroll_line_height = 20 local backdrop_color = {.2, .2, .2, 0.2} local backdrop_color_on_enter = {.8, .8, .8, 0.4} local backdrop_color_is_critical = {.4, .4, .2, 0.2} local backdrop_color_is_critical_on_enter = {1, 1, .8, 0.4} local y = -15 local headerY = y - 15 local scrollY = headerY - 20 --header local headerTable = { {text = "Icon", width = 32}, {text = "Spell Name", width = 180}, {text = "Amount", width = 80}, {text = "Time", width = 80}, {text = "Token", width = 130}, {text = "Spell ID", width = 80}, {text = "School", width = 80}, } local headerOptions = { padding = 2, } DetailsScrollDamage.Header = DetailsFramework:CreateHeader (DetailsScrollDamage, headerTable, headerOptions) DetailsScrollDamage.Header:SetPoint ("topleft", DetailsScrollDamage, "topleft", 5, headerY) local scroll_refresh = function (self, data, offset, total_lines) local ToK = _detalhes:GetCurrentToKFunction() for i = 1, total_lines do local index = i + offset local spellTable = data [index] if (spellTable) then local line = self:GetLine (i) local time, token, hidding, sourceSerial, sourceName, sourceFlag, sourceFlag2, targetSerial, targetName, targetFlag, targetFlag2, spellID, spellName, spellType, amount, overKill, school, resisted, blocked, absorbed, isCritical = unpack (spellTable) local spellName, _, spellIcon if (token ~= "SWING_DAMAGE") then spellName, _, spellIcon = GetSpellInfo (spellID) else spellName, _, spellIcon = GetSpellInfo (1) end line.SpellID = spellID line.IsCritical = isCritical if (isCritical) then line:SetBackdropColor (unpack (backdrop_color_is_critical)) else line:SetBackdropColor (unpack (backdrop_color)) end if (spellName) then line.Icon:SetTexture (spellIcon) line.Icon:SetTexCoord (.1, .9, .1, .9) line.DamageText.text = isCritical and "|cFFFFFF00" .. ToK (_, amount) or ToK (_, amount) line.TimeText.text = format ("%.4f", time - DetailsScrollDamage.Data.Started) line.TokenText.text = token:gsub ("SPELL_", "") line.SchoolText.text = _detalhes:GetSpellSchoolFormatedName (school) line.SpellIDText.text = spellID line.SpellNameText.text = spellName else line:Hide() end end end end local lineOnEnter = function (self) if (self.IsCritical) then self:SetBackdropColor (unpack (backdrop_color_is_critical_on_enter)) else self:SetBackdropColor (unpack (backdrop_color_on_enter)) end if (self.SpellID) then GameTooltip:SetOwner (self, "ANCHOR_TOPLEFT") GameTooltip:SetSpellByID (self.SpellID) GameTooltip:AddLine (" ") GameTooltip:Show() end end local lineOnLeave = function (self) if (self.IsCritical) then self:SetBackdropColor (unpack (backdrop_color_is_critical)) else self:SetBackdropColor (unpack (backdrop_color)) end GameTooltip:Hide() end local scroll_createline = function (self, index) local line = CreateFrame ("button", "$parentLine" .. index, self) line:SetPoint ("topleft", self, "topleft", 1, -((index-1)*(scroll_line_height+1)) - 1) line:SetSize (scroll_width - 2, scroll_line_height) line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) line:SetBackdropColor (unpack (backdrop_color)) DF:Mixin (line, DF.HeaderFunctions) line:SetScript ("OnEnter", lineOnEnter) line:SetScript ("OnLeave", lineOnLeave) --icon local icon = line:CreateTexture ("$parentSpellIcon", "overlay") icon:SetSize (scroll_line_height - 2, scroll_line_height - 2) --spellname local spellNameText = DF:CreateLabel (line) --damage local damageText = DF:CreateLabel (line) --time local timeText = DF:CreateLabel (line) --token local tokenText = DF:CreateLabel (line) --spell ID local spellIDText = DF:CreateLabel (line) --school local schoolText = DF:CreateLabel (line) line:AddFrameToHeaderAlignment (icon) line:AddFrameToHeaderAlignment (spellNameText) line:AddFrameToHeaderAlignment (damageText) line:AddFrameToHeaderAlignment (timeText) line:AddFrameToHeaderAlignment (tokenText) line:AddFrameToHeaderAlignment (spellIDText) line:AddFrameToHeaderAlignment (schoolText) line:AlignWithHeader (DetailsScrollDamage.Header, "left") line.Icon = icon line.DamageText = damageText line.TimeText = timeText line.TokenText = tokenText line.SchoolText = schoolText line.SpellIDText = spellIDText line.SpellNameText = spellNameText return line end local damageScroll = DF:CreateScrollBox (DetailsScrollDamage, "$parentSpellScroll", scroll_refresh, DetailsScrollDamage.Data, scroll_width, scroll_height, scroll_lines, scroll_line_height) DF:ReskinSlider (damageScroll) damageScroll:SetPoint ("topleft", DetailsScrollDamage, "topleft", 5, scrollY) --create lines for i = 1, scroll_lines do damageScroll:CreateLine (scroll_createline) end local combatLogReader = CreateFrame ("frame") local playerSerial = UnitGUID ("player") combatLogReader:SetScript ("OnEvent", function (self) local timew, token, hidding, sourceSerial, sourceName, sourceFlag, sourceFlag2, targetSerial, targetName, targetFlag, targetFlag2, spellID, spellName, spellType, amount, overKill, school, resisted, blocked, absorbed, isCritical = CombatLogGetCurrentEventInfo() if (sourceSerial == playerSerial) then if (token == "SPELL_DAMAGE" or token == "SPELL_PERIODIC_DAMAGE" or token == "RANGE_DAMAGE" or token == "DAMAGE_SHIELD") then if (not DetailsScrollDamage.Data.Started) then DetailsScrollDamage.Data.Started = time() end tinsert (DetailsScrollDamage.Data, 1, {timew, token, hidding, sourceSerial, sourceName, sourceFlag, sourceFlag2, targetSerial, targetName, targetFlag, targetFlag2, spellID, spellName, spellType, amount, overKill or 0, school or 1, resisted or 0, blocked or 0, absorbed or 0, isCritical}) damageScroll:Refresh() elseif (token == "SWING_DAMAGE") then -- amount, overkill, school, resisted, blocked, absorbed, critical, glacing, crushing, isoffhand = spellID, spellName, spellType, amount, overKill, school, resisted, blocked, absorbed, isCritical -- tinsert (DetailsScrollDamage.Data, 1, {timew, token, hidding, sourceSerial, sourceName, sourceFlag, sourceFlag2, targetSerial, targetName, targetFlag, targetFlag2, spellID, spellName, spellType, amount, overKill, school, resisted, blocked, absorbed, isCritical}) -- damageScroll:Refresh() end end end) DetailsScrollDamage:SetScript ("OnShow", function() wipe (DetailsScrollDamage.Data) damageScroll:Refresh() combatLogReader:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") end) DetailsScrollDamage:SetScript ("OnHide", function() combatLogReader:UnregisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") end) end DetailsScrollDamage:Show() end