local Details = _G.Details local Loc = _G.LibStub("AceLocale-3.0"):GetLocale("Details") local libwindow = LibStub("LibWindow-1.1") local _ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --local pointers local floor = math.floor --lua local local type = type --lua local local abs = math.abs --lua local local _math_min = math.min local _math_max = math.max local ipairs = ipairs --lua local local gump = Details.gump --details local ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --constants local end_window_spacement = 0 --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 Details: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 Details: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 Details:PerformAnimations(amtLines) if (self.bars_sort_direction == 2) then for i = _math_min(self.rows_fit_in_window, amtLines) - 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 Details: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 Details: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 Details: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 Details:RefreshAnimationFunctions() if (Details.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 = Details.animation_speed animation_speed_hightravel_trigger = Details.animation_speed_triggertravel animation_speed_hightravel_maxspeed = Details.animation_speed_maxtravel animation_speed_lowtravel_minspeed = Details.animation_speed_mintravel end --deprecated function Details: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 Details: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 Details: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 Details: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 Details:SaveLibWindow() local frame = self.baseframe if (frame) then local left = frame:GetLeft() if (not left) then return Details: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 Details:SaveMainWindowSize() local baseframe_width = self.baseframe:GetWidth() if (not baseframe_width) then return Details:ScheduleTimer("SaveMainWindowSize", 1, self) end local baseframe_height = self.baseframe:GetHeight() --calc position local _x, _y = self:GetPositionOnScreen() if (not _x) then return Details: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 Details: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 Details:ScheduleTimer("SaveMainWindowPosition", 1, self) end local baseframe_height = self.baseframe:GetHeight() --calc position local _x, _y = self:GetPositionOnScreen() if (not _x) then return Details: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 Details:RestoreMainWindowPosition (pre_defined) if (not pre_defined and self.libwindow.x and self.mostrando == "normal" and not Details.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 Details: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 Details: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 Details: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 Details: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 Details:ResetaGump (instancia, tipo, segmento) --replaced by instance:ResetWindow(resetType, segmentId) 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 if esta_barra.extraStatusbar then esta_barra.extraStatusbar:Hide() end end if (instancia.rolagem) then instancia:EsconderScrollBar() --hida a scrollbar end instancia.need_rolagem = false instancia.bar_mod = nil end function Details: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 or instancia.baseframe:GetHeight())) / 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 Details: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 = 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 = 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:CreateNewLine(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 if (self.barras[index]) then self.barras[index]:SetWidth(self.baseframe:GetWidth()+self.bar_mod) end end else local rightOffset = self.row_info.row_offsets.right for index = 1, self.rows_fit_in_window do if (self.barras[index]) then self.barras[index]:SetWidth(self.baseframe:GetWidth()+self.row_info.space.right + rightOffset) end 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 Details.FadeHandler.Fader(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 --Details.FadeHandler.Fader(barra, 0) Details.FadeHandler.Fader(barra, "out") else --if (self.baseframe.isStretching or self.auto_resize) then Details.FadeHandler.Fader(barra, 1) --else -- Details.FadeHandler.Fader(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 = 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 Details.FadeHandler.Fader(barra, 1) else --Details.FadeHandler.Fader(barra, "in", 0.1) Details.FadeHandler.Fader(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 whichRowLine = 1 for i = self.barraS[1], self.barraS[2], 1 do local esta_barra = self.barras [whichRowLine] 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 whichRowLine = whichRowLine+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}} Details.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}} Details.cooltip_preset2_backdrop = preset2_backdrop --"Details BarBorder 3" function Details: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 Details.yesNo = Details.gump:NewPanel(UIParent, _, "DetailsYesNoWindow", _, 500, 80) Details.yesNo:SetPoint("center", UIParent, "center") Details.gump:NewLabel(Details.yesNo, _, "$parentAsk", "ask", "") Details.yesNo ["ask"]:SetPoint("center", Details.yesNo, "center", 0, 25) Details.yesNo ["ask"]:SetWidth(480) Details.yesNo ["ask"]:SetJustifyH("center") Details.yesNo ["ask"]:SetHeight(22) Details.gump:NewButton(Details.yesNo, _, "$parentNo", "no", 100, 30, function() Details.yesNo:Hide() end, nil, nil, nil, Loc ["STRING_NO"]) Details.gump:NewButton(Details.yesNo, _, "$parentYes", "yes", 100, 30, nil, nil, nil, nil, Loc ["STRING_YES"]) Details.yesNo ["no"]:SetPoint(10, -45) Details.yesNo ["yes"]:SetPoint(390, -45) Details.yesNo ["no"]:InstallCustomTexture() Details.yesNo ["yes"]:InstallCustomTexture() Details.yesNo ["yes"]:SetHook("OnMouseUp", function() Details.yesNo:Hide() end) function Details:Ask (msg, func, ...) Details.yesNo ["ask"].text = msg local p1, p2 = ... Details.yesNo ["yes"]:SetClickFunction(func, p1, p2) Details.yesNo:Show() end Details.yesNo:Hide() end --cria o frame de wait for plugin function Details:CreateWaitForPlugin() local WaitForPluginFrame = CreateFrame("frame", "DetailsWaitForPluginFrame" .. self.meu_id, UIParent,"BackdropTemplate") local WaitTexture = WaitForPluginFrame:CreateTexture(nil, "overlay") WaitTexture:SetTexture("Interface\\CHARACTERFRAME\\Disconnect-Icon") WaitTexture:SetWidth(64/2) WaitTexture:SetHeight(64/2) --WaitTexture:SetDesaturated(true) --WaitTexture:SetVertexColor(1, 1, 1, 0.3) WaitForPluginFrame.wheel = WaitTexture local RotateAnimGroup = WaitForPluginFrame:CreateAnimationGroup() local rotate = RotateAnimGroup:CreateAnimation("Alpha") --rotate:SetDegrees(360) --rotate:SetDuration(5) rotate:SetFromAlpha(0.8) rotate:SetToAlpha(1) --RotateAnimGroup:SetLooping ("repeat") rotate:SetTarget(WaitTexture) local bgpanel = gump:NewPanel(WaitForPluginFrame, WaitForPluginFrame, "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(bgpanel, bgpanel, nil, nil, Loc ["STRING_WAITPLUGIN"]) label.color = "white" label:SetPoint("center", WaitForPluginFrame, "center") label:SetJustifyH("left") label:Hide() WaitTexture:SetPoint("right", label.widget, "topleft", 12, -7) 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) bgpanel:ClearAllPoints() bgpanel:SetPoint("topleft", self.baseframe, 0, 0) bgpanel:SetPoint("bottomright", self.baseframe, 0, 0) --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 == Details.solo) then Details.SoloTables:switch(nil, Details.SoloTables.Mode) elseif (self.modo == Details._detalhes_props["MODO_RAID"]) then Details.RaidTables:EnableRaidMode (self) end end end do local WaitForPluginFrame = CreateFrame("frame", "DetailsWaitForPluginFrame", UIParent,"BackdropTemplate") 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 Details:WaitForSoloPlugin(instancia) instancia:ChangeIcon ([[Interface\GossipFrame\ActiveQuestIcon]]) if (WaitForPluginFrame:IsShown() and WaitForPluginFrame:GetParent() == instancia.baseframe) then return Details: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 Details:ScheduleTimer("ExecDelayedPlugin", 5, instancia) end function Details:CancelWaitForPlugin() RotateAnimGroup:Stop() WaitForPluginFrame:Hide() label:Hide() bgpanel:Hide() end function Details:ExecDelayedPlugin(instancia) RotateAnimGroup:Stop() WaitForPluginFrame:Hide() label:Hide() bgpanel:Hide() if (instancia.meu_id == Details.solo) then Details.SoloTables:switch(nil, Details.SoloTables.Mode) elseif (instancia.meu_id == Details.raid) then Details.RaidTables:switch(nil, Details.RaidTables.Mode) end end end --feedback window function Details: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 Details:CopyPaste ([[http://www.wowinterface.com/downloads/addcomment.php?action=addcomment&fileid=23056]]) elseif (website == 2) then Details:CopyPaste ([[http://www.curse.com/addons/wow/details]]) elseif (website == 3) then Details: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 --interface menu local f = CreateFrame("frame", "DetailsInterfaceOptionsPanel", UIParent,"BackdropTemplate") 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) f.options_button:SetText(Loc ["STRING_INTERFACE_OPENOPTIONS"]) f.options_button:SetPoint("topleft", f, "topleft", 10, -100) f.options_button:SetHeight(170) f.options_button:SetWidth(170) f.options_button:SetScript("OnClick", function(self) local lower_instance = Details:GetLowerInstanceNumber() if (not lower_instance) then --no window opened? local instance1 = Details.tabela_instancias [1] if (instance1) then instance1:Enable() return Details:OpenOptionsWindow (instance1) else instance1 = Details:CriarInstancia(_, true) if (instance1) then return Details:OpenOptionsWindow (instance1) else Details:Msg("couldn't open options panel: no window available.") end end end Details:OpenOptionsWindow (Details:GetInstance(lower_instance)) end) --create new window f.new_window_button = CreateFrame("button", nil, f) 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) Details:CriarInstancia(_, true) end) --update details version window function Details:OpenUpdateWindow() if (not _G.DetailsUpdateDialog) then local updatewindow_frame = CreateFrame("frame", "DetailsUpdateDialog", UIParent, "ButtonFrameTemplate") updatewindow_frame:SetFrameStrata("LOW") table.insert(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!") --10.0 fuck 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 = Details.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) 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 Details:UpdateDialogSetFocus() DetailsUpdateDialog:Show() DetailsUpdateDialogTextEntry.MyObject:SetFocus() DetailsUpdateDialogTextEntry.MyObject:HighlightText() end Details:ScheduleTimer("UpdateDialogSetFocus", 1) end end --minimap icon and hotcorner function Details: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 if (IsControlKeyDown()) then Details:ToggleWindows() return end --1 = open options panel if (Details.minimap.onclick_what_todo == 1) then if (_G.DetailsOptionsWindow) then if (_G.DetailsOptionsWindow:IsShown()) then _G.DetailsOptionsWindow:Hide() return end end local lower_instance = Details:GetLowerInstanceNumber() if (not lower_instance) then local instance = Details:GetInstance(1) Details.CriarInstancia (_, _, 1) Details:OpenOptionsWindow (instance) else Details:OpenOptionsWindow (Details:GetInstance(lower_instance)) end --2 = reset data elseif (Details.minimap.onclick_what_todo == 2) then Details.tabela_historico:ResetAllCombatData() --3 = show hide windows elseif (Details.minimap.onclick_what_todo == 3) then local opened = Details:GetOpenedWindowsAmount() if (opened == 0) then Details:ReabrirTodasInstancias() else Details:ShutDownAllInstances() end end elseif (button == "RightButton") then --minimap menu GameTooltip:Hide() local GameCooltip = GameCooltip GameCooltip:Reset() GameCooltip:SetType ("menu") GameCooltip:SetOption("ButtonsYMod", -5) GameCooltip:SetOption("HeighMod", 5) GameCooltip:SetOption("TextSize", 10) --reset GameCooltip:AddMenu (1, Details.tabela_historico.ResetAllCombatData, 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, Details.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, Details.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, Details.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, Details.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, Details.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() Details.minimap.hide = not value LDBIcon:Refresh ("Details", Details.minimap) if (Details.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, Details.tooltip_backdrop, nil, Details.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 (Details.minimap.onclick_what_todo == 1) then tooltip:AddLine(Loc ["STRING_MINIMAP_TOOLTIP1"]) elseif (Details.minimap.onclick_what_todo == 2) then tooltip:AddLine(Loc ["STRING_MINIMAP_TOOLTIP11"]) elseif (Details.minimap.onclick_what_todo == 3) then tooltip:AddLine(Loc ["STRING_MINIMAP_TOOLTIP12"]) end tooltip:AddLine(Loc ["STRING_MINIMAP_TOOLTIP2"]) tooltip:AddLine("|cFFCFCFCFctrl + left click|r: show/hide windows") end, }) if (databroker and not LDBIcon:IsRegistered ("Details")) then LDBIcon:Register ("Details", databroker, self.minimap) end Details.databroker = databroker end end function Details:DoRegisterHotCorner() --register lib-hotcorners local on_click_on_hotcorner_button = function(frame, button) if (Details.hotcorner_topleft.onclick_what_todo == 1) then local lower_instance = Details:GetLowerInstanceNumber() if (not lower_instance) then local instance = Details:GetInstance(1) Details.CriarInstancia (_, _, 1) Details:OpenOptionsWindow (instance) else Details:OpenOptionsWindow (Details:GetInstance(lower_instance)) end elseif (Details.hotcorner_topleft.onclick_what_todo == 2) then Details.tabela_historico:ResetAllCombatData() end end local quickclick_func1 = function(frame, button) Details.tabela_historico:ResetAllCombatData() end local quickclick_func2 = function(frame, button) local lower_instance = Details:GetLowerInstanceNumber() if (not lower_instance) then local instance = Details:GetInstance(1) Details.CriarInstancia (_, _, 1) Details:OpenOptionsWindow (instance) else Details:OpenOptionsWindow (Details:GetInstance(lower_instance)) end end local tooltip_hotcorner = function() GameTooltip:AddLine("Details!", 1, 1, 1, 1) if (Details.hotcorner_topleft.onclick_what_todo == 1) then GameTooltip:AddLine("|cFF00FF00Left Click:|r open options panel.", 1, 1, 1, 1) elseif (Details.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 Details.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 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- ~API function Details:InitializeAPIWindow() local DetailsAPI2Frame = gump:CreateSimplePanel(UIParent, 700, 480, "Details! API", "DetailsAPI2Frame") DetailsAPI2Frame.Frame = DetailsAPI2Frame DetailsAPI2Frame.__name = "API" DetailsAPI2Frame.real_name = "DETAILS_APIWINDOW" DetailsAPI2Frame.__icon = [[Interface\AddOns\Details\images\icons]] DetailsAPI2Frame.__iconcoords = {449/512, 480/512, 62/512, 83/512} DetailsAPI2Frame.__iconcolor = "DETAILS_API_ICON" DetailsPluginContainerWindow.EmbedPlugin(DetailsAPI2Frame, DetailsAPI2Frame, true) function DetailsAPI2Frame.RefreshWindow() Details.OpenAPI() end end function Details.OpenAPI() --create the window if not loaded yet Details:CreateAPI2Frame() DetailsAPI2Frame:Show() DetailsAPI2Frame.Refresh() --doesn't exists? DetailsPluginContainerWindow.OpenPlugin(DetailsAPI2Frame) end function Details:LoadFramesForBroadcastTools() --event tracker --if enabled and not loaded, load it if (Details.event_tracker.enabled and not Details.Broadcaster_EventTrackerLoaded) then Details:CreateEventTrackerFrame(UIParent, "DetailsEventTracker") end --if enabled and loaded, refresh and show if (Details.event_tracker.enabled and Details.Broadcaster_EventTrackerLoaded) then Details:UpdateEventTrackerFrame() _G.DetailsEventTracker:Show() end --if not enabled but loaded, hide it if (not Details.event_tracker.enabled and Details.Broadcaster_EventTrackerLoaded) then _G.DetailsEventTracker:Hide() end --current dps local bIsEnabled = Details.realtime_dps_meter.enabled and (Details.realtime_dps_meter.arena_enabled or Details.realtime_dps_meter.mythic_dungeon_enabled) --if enabled and not loaded, load it if (bIsEnabled and not Details.Broadcaster_CurrentDpsLoaded) then Details:CreateCurrentDpsFrame(UIParent, "DetailsCurrentDpsMeter") end --if enabled, check if can show if (bIsEnabled and Details.Broadcaster_CurrentDpsLoaded) then if (Details.realtime_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 _G.DetailsCurrentDpsMeter:StartForMythicDungeon() end end if (Details.realtime_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 _G.DetailsCurrentDpsMeter:StartForArenaMatch() end end end --if not enabled but loaded, hide it if (not bIsEnabled and Details.Broadcaster_CurrentDpsLoaded) then _G.DetailsCurrentDpsMeter:Hide() end end function Details:FormatBackground(frame) --deprecated I guess frame:SetBackdrop({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) frame:SetBackdropColor(.5, .5, .5, .5) frame:SetBackdropBorderColor(0, 0, 0, 1) if (not frame.__background) then frame.__background = frame:CreateTexture(nil, "background") end frame.__background:SetTexture([[Interface\AddOns\Details\images\background]], true) frame.__background:SetAlpha(0.7) frame.__background:SetVertexColor(0.27, 0.27, 0.27) frame.__background:SetVertTile(true) frame.__background:SetHorizTile(true) frame.__background:SetAllPoints() end function Details.ShowCopyValueFrame(textToShow) if (not DetailsCopyValueFrame) then local frame = CreateFrame("frame", "DetailsCopyValueFrame", UIParent) frame:SetSize(160, 20) frame:SetPoint("center", UIParent, "center", 0, 0) DetailsFramework:ApplyStandardBackdrop(frame) table.insert(UISpecialFrames, "DetailsCopyValueFrame") frame.editBox = CreateFrame("editbox", nil, frame) frame.editBox:SetPoint("topleft", frame, "topleft") frame.editBox:SetAutoFocus(false) frame.editBox:SetFontObject("GameFontHighlightSmall") frame.editBox:SetAllPoints() frame.editBox:SetJustifyH("center") frame.editBox:EnableMouse(true) frame.editBox:SetScript("OnEnterPressed", function() frame.editBox:ClearFocus() frame:Hide() end) frame.editBox:SetScript("OnEscapePressed", function() frame.editBox:ClearFocus() frame:Hide() end) frame.editBox:SetScript("OnChar", function() frame.editBox:ClearFocus() frame:Hide() end) end DetailsCopyValueFrame:Show() DetailsCopyValueFrame.editBox:SetText(textToShow or "") DetailsCopyValueFrame.editBox:SetFocus() DetailsCopyValueFrame.editBox:HighlightText() end