local Details = _G.Details
local Loc = _G.LibStub ( " AceLocale-3.0 " ) : GetLocale ( " Details " )
local SharedMedia = _G.LibStub : GetLibrary ( " LibSharedMedia-3.0 " )
local UIParent = UIParent
local gump = Details.gump
local _
local addonName , Details222 = ...
--remove warnings in the code
local ipairs = ipairs
local tinsert = tinsert
local tremove = tremove
local type = type
local unpack = _G.unpack
local PixelUtil = PixelUtil
local UISpecialFrames = UISpecialFrames
local wipe = wipe
local CreateFrame = _G.CreateFrame
local detailsFramework = DetailsFramework
local subAttributes = Details.sub_atributos
local breakdownWindow = Details.playerDetailWindow
local SummaryWidgets = { }
local CurrentTab = " Summary "
local PLAYER_DETAILS_WINDOW_WIDTH = 890
local PLAYER_DETAILS_WINDOW_HEIGHT = 574
local PLAYER_DETAILS_STATUSBAR_HEIGHT = 20
local PLAYER_DETAILS_STATUSBAR_ALPHA = 1
Details.player_details_tabs = { }
breakdownWindow.currentTabsInUse = { }
Details222.BreakdownWindow . BackdropSettings = {
backdrop = { edgeFile = [[Interface\Buttons\WHITE8X8]] , edgeSize = 1 , bgFile = [[Interface\Tooltips\UI-Tooltip-Background]] , tileSize = 64 , tile = true } ,
backdropcolor = { DetailsFramework : GetDefaultBackdropColor ( ) } ,
backdropbordercolor = { 0 , 0 , 0 , 0.7 } ,
}
------------------------------------------------------------------------------------------------------------------------------
--self = instancia
--jogador = classe_damage ou classe_heal
function Details : GetBreakdownTabsInUse ( )
return breakdownWindow.currentTabsInUse
end
function Details : GetBreakdownTabByName ( tabName , tablePool )
tablePool = tablePool or Details.player_details_tabs
for index = 1 , # tablePool do
local tab = tablePool [ index ]
if ( tab.tabname == tabName ) then
return tab , index
end
end
end
--return the combat being used to show the data in the opened breakdown window
function Details : GetCombatFromBreakdownWindow ( )
return breakdownWindow.instancia and breakdownWindow.instancia . showing
end
---return the window that requested to open the player breakdown window
---@return instance
function Details : GetActiveWindowFromBreakdownWindow ( )
return breakdownWindow.instancia
end
--return if the breakdown window is showing damage or heal
function Details : GetDisplayTypeFromBreakdownWindow ( )
return breakdownWindow.atributo , breakdownWindow.sub_atributo
end
--return the actor object in use by the breakdown window
function Details : GetActorObjectFromBreakdownWindow ( )
return breakdownWindow.jogador
end
function Details : GetBreakdownWindow ( )
return Details.playerDetailWindow
end
function Details : IsBreakdownWindowOpen ( )
return breakdownWindow.ativo
end
---open the breakdown window
---@param self details
---@param instanceObject instance
---@param actorObject actor
---@param bFromAttributeChange boolean|nil
---@param bIsRefresh boolean|nil
---@param bIsShiftKeyDown boolean|nil
---@param bIsControlKeyDown boolean|nil
function Details : OpenBreakdownWindow ( instanceObject , actorObject , bFromAttributeChange , bIsRefresh , bIsShiftKeyDown , bIsControlKeyDown )
---@type number, number
local mainAttribute , subAttribute = instanceObject : GetDisplay ( )
--create the player list frame in the left side of the window
Details.PlayerBreakdown . CreatePlayerListFrame ( )
Details.PlayerBreakdown . CreateDumpDataFrame ( )
if ( not Details.row_singleclick_overwrite [ mainAttribute ] or not Details.row_singleclick_overwrite [ mainAttribute ] [ subAttribute ] ) then
Details : CloseBreakdownWindow ( )
return
elseif ( type ( Details.row_singleclick_overwrite [ mainAttribute ] [ subAttribute ] ) == " function " ) then
if ( bFromAttributeChange ) then
Details : CloseBreakdownWindow ( )
return
end
Details.row_singleclick_overwrite [ mainAttribute ] [ subAttribute ] ( _ , actorObject , instanceObject , bIsShiftKeyDown , bIsControlKeyDown )
return
end
if ( instanceObject : GetMode ( ) == DETAILS_MODE_RAID ) then
Details : CloseBreakdownWindow ( )
return
end
--Details.info_jogador armazena o jogador que esta sendo mostrado na janela de detalhes
if ( breakdownWindow.jogador and breakdownWindow.jogador == actorObject and instanceObject and breakdownWindow.atributo and mainAttribute == breakdownWindow.atributo and subAttribute == breakdownWindow.sub_atributo and not bIsRefresh ) then
Details : CloseBreakdownWindow ( ) --se clicou na mesma barra ent�o fecha a janela de detalhes
return
elseif ( not actorObject ) then
Details : CloseBreakdownWindow ( )
return
end
if ( not breakdownWindow.bHasInitialized ) then
local infoNumPoints = breakdownWindow : GetNumPoints ( )
for i = 1 , infoNumPoints do
local point1 , anchorObject , point2 , x , y = breakdownWindow : GetPoint ( i )
if ( not anchorObject ) then
breakdownWindow : ClearAllPoints ( )
end
end
breakdownWindow : SetUserPlaced ( false )
breakdownWindow : SetDontSavePosition ( true )
local okay , errorText = pcall ( function ( )
breakdownWindow : SetPoint ( " center " , UIParent , " center " , 0 , 0 )
end )
if ( not okay ) then
breakdownWindow : ClearAllPoints ( )
breakdownWindow : SetPoint ( " center " , UIParent , " center " , 0 , 0 )
end
breakdownWindow.bHasInitialized = true
end
if ( not breakdownWindow.RightSideBar ) then
--breakdownWindow:CreateRightSideBar()
end
--todo: all portuguese keys to english
breakdownWindow.ativo = true --sinaliza o addon que a janela esta aberta
breakdownWindow.atributo = mainAttribute --instancia.atributo -> grava o atributo (damage, heal, etc)
breakdownWindow.sub_atributo = subAttribute --instancia.sub_atributo -> grava o sub atributo (damage done, dps, damage taken, etc)
breakdownWindow.jogador = actorObject --de qual jogador (objeto classe_damage)
breakdownWindow.instancia = instanceObject --salva a refer�ncia da inst�ncia que pediu o breakdownWindow
breakdownWindow.target_text = Loc [ " STRING_TARGETS " ] .. " : "
breakdownWindow.target_member = " total "
breakdownWindow.target_persecond = false
breakdownWindow.mostrando = nil
local nome = breakdownWindow.jogador . nome --nome do jogador
local atributo_nome = subAttributes [ breakdownWindow.atributo ] . lista [ breakdownWindow.sub_atributo ] .. " " .. Loc [ " STRING_ACTORFRAME_REPORTOF " ] --// nome do atributo // precisa ser o sub atributo correto???
--removendo o nome da realm do jogador
if ( nome : find ( " - " ) ) then
nome = nome : gsub ( ( " -.* " ) , " " )
end
if ( breakdownWindow.instancia . atributo == 1 and breakdownWindow.instancia . sub_atributo == 6 ) then --enemy
atributo_nome = subAttributes [ breakdownWindow.atributo ] . lista [ 1 ] .. " " .. Loc [ " STRING_ACTORFRAME_REPORTOF " ]
end
breakdownWindow.actorName : SetText ( nome ) --found it
breakdownWindow.attributeName : SetText ( atributo_nome )
local serial = actorObject.serial
local avatar
if ( serial ~= " " ) then
avatar = NickTag : GetNicknameTable ( serial )
end
if ( avatar and avatar [ 1 ] ) then
breakdownWindow.actorName : SetText ( ( not Details.ignore_nicktag and avatar [ 1 ] ) or nome )
end
if ( avatar and avatar [ 2 ] ) then
breakdownWindow.avatar : SetTexture ( avatar [ 2 ] )
breakdownWindow.avatar_bg : SetTexture ( avatar [ 4 ] )
if ( avatar [ 5 ] ) then
breakdownWindow.avatar_bg : SetTexCoord ( unpack ( avatar [ 5 ] ) )
end
if ( avatar [ 6 ] ) then
breakdownWindow.avatar_bg : SetVertexColor ( unpack ( avatar [ 6 ] ) )
end
breakdownWindow.avatar_nick : SetText ( avatar [ 1 ] or nome )
breakdownWindow.avatar_attribute : SetText ( atributo_nome )
breakdownWindow.avatar_attribute : SetPoint ( " CENTER " , breakdownWindow.avatar_nick , " CENTER " , 0 , 14 )
breakdownWindow.avatar : Show ( )
breakdownWindow.avatar_bg : Show ( )
breakdownWindow.avatar_bg : SetAlpha ( .65 )
breakdownWindow.avatar_nick : Show ( )
breakdownWindow.avatar_attribute : Show ( )
breakdownWindow.actorName : Hide ( )
breakdownWindow.attributeName : Hide ( )
else
breakdownWindow.avatar : Hide ( )
breakdownWindow.avatar_bg : Hide ( )
breakdownWindow.avatar_nick : Hide ( )
breakdownWindow.avatar_attribute : Hide ( )
breakdownWindow.actorName : Show ( )
breakdownWindow.attributeName : Show ( )
end
breakdownWindow.attributeName : SetPoint ( " bottomleft " , breakdownWindow.actorName , " topleft " , 0 , 2 )
---@type string
local actorClass = actorObject.classe --classe not registered because it should be renamed to english 'class'
if ( not actorClass ) then
actorClass = " monster "
end
breakdownWindow.classIcon : SetTexture ( " Interface \\ AddOns \\ Details \\ images \\ classes " ) --top left
breakdownWindow.SetClassIcon ( actorObject , actorClass )
Details.FadeHandler . Fader ( breakdownWindow , 0 )
Details : UpdateBreakdownPlayerList ( )
Details : InitializeAurasTab ( )
Details : InitializeCompareTab ( )
--open tab
local tabsShown = { }
local tabsReplaced = { }
local tabReplacedAmount = 0
wipe ( breakdownWindow.currentTabsInUse )
for index = 1 , # Details.player_details_tabs do
local tab = Details.player_details_tabs [ index ]
tab.replaced = nil
tabsShown [ # tabsShown + 1 ] = tab
end
for index = 1 , # tabsShown do
--get the tab
local tab = tabsShown [ index ]
if ( tab.replaces ) then
local attributeList = tab.replaces . attributes
if ( attributeList [ breakdownWindow.atributo ] ) then
if ( attributeList [ breakdownWindow.atributo ] [ breakdownWindow.sub_atributo ] ) then
local tabReplaced , tabIndex = Details : GetBreakdownTabByName ( tab.replaces . tabNameToReplace , tabsShown )
if ( tabReplaced and tabIndex < index ) then
tabReplaced : Hide ( )
tabReplaced.frame : Hide ( )
tinsert ( tabsReplaced , tabReplaced )
tremove ( tabsShown , tabIndex )
tinsert ( tabsShown , tabIndex , tab )
if ( tabReplaced.tabname == breakdownWindow.selectedTab ) then
breakdownWindow.selectedTab = tab.tabname
end
tabReplaced.replaced = true
tabReplacedAmount = tabReplacedAmount + 1
end
end
end
end
end
local newTabsShown = { }
local tabAlreadyInUse = { }
for index = 1 , # tabsShown do
if ( not tabAlreadyInUse [ tabsShown [ index ] . tabname ] ) then
tabAlreadyInUse [ tabsShown [ index ] . tabname ] = true
tinsert ( newTabsShown , tabsShown [ index ] )
end
end
tabsShown = newTabsShown
breakdownWindow.currentTabsInUse = newTabsShown
breakdownWindow : ShowTabs ( )
Details222.BreakdownWindow . CurrentDefaultTab = nil
local shownTab
for index = 1 , # tabsShown do
local tabButton = tabsShown [ index ]
if ( tabButton : condition ( breakdownWindow.jogador , breakdownWindow.atributo , breakdownWindow.sub_atributo ) ) then
if ( tabButton.IsDefaultTab ) then
Details222.BreakdownWindow . CurrentDefaultTab = tabButton
end
if ( breakdownWindow.selectedTab == tabButton.tabname ) then
tabButton : DoClick ( )
tabButton : OnShowFunc ( )
shownTab = tabButton
actorObject : MontaInfo ( ) --old api to update the breakdown window
end
end
end
if ( shownTab ) then
shownTab : Click ( )
end
end
function Details : CloseBreakdownWindow ( )
if ( breakdownWindow.ativo ) then
Details.FadeHandler . Fader ( breakdownWindow , 1 )
breakdownWindow.ativo = false --sinaliza o addon que a janela esta agora fechada
breakdownWindow.jogador = nil
breakdownWindow.atributo = nil
breakdownWindow.sub_atributo = nil
breakdownWindow.instancia = nil
breakdownWindow.actorName : SetText ( " " )
breakdownWindow.attributeName : SetText ( " " )
--iterate all tabs and clear caches
local tabsInUse = Details : GetBreakdownTabsInUse ( )
for index = 1 , # tabsInUse do
local tabButton = tabsInUse [ index ]
tabButton.last_actor = nil
end
end
end
function Details . PlayerBreakdown . CreateDumpDataFrame ( )
breakdownWindow.dumpDataFrame = CreateFrame ( " frame " , " $parentDumpTableFrame " , DetailsBreakdownWindowPlayerScrollBox , " BackdropTemplate " )
breakdownWindow.dumpDataFrame : SetPoint ( " topleft " , DetailsBreakdownWindowPlayerScrollBox , " topleft " , 0 , 0 )
breakdownWindow.dumpDataFrame : SetPoint ( " bottomright " , DetailsBreakdownWindowPlayerScrollBox , " bottomright " , 0 , 0 )
breakdownWindow.dumpDataFrame : SetFrameLevel ( DetailsBreakdownWindowPlayerScrollBox : GetFrameLevel ( ) + 10 )
detailsFramework : ApplyStandardBackdrop ( breakdownWindow.dumpDataFrame , true )
breakdownWindow.dumpDataFrame : Hide ( )
--create a details framework special lua editor
breakdownWindow.dumpDataFrame . luaEditor = detailsFramework : NewSpecialLuaEditorEntry ( breakdownWindow.dumpDataFrame , 1 , 1 , " text " , " $parentCodeEditorWindow " )
breakdownWindow.dumpDataFrame . luaEditor : SetPoint ( " topleft " , breakdownWindow.dumpDataFrame , " topleft " , 2 , - 2 )
breakdownWindow.dumpDataFrame . luaEditor : SetPoint ( " bottomright " , breakdownWindow.dumpDataFrame , " bottomright " , - 2 , 2 )
breakdownWindow.dumpDataFrame . luaEditor : SetFrameLevel ( breakdownWindow.dumpDataFrame : GetFrameLevel ( ) + 1 )
breakdownWindow.dumpDataFrame . luaEditor : SetBackdrop ( { } )
--hide the scroll bar
DetailsBreakdownWindowPlayerScrollBoxDumpTableFrameCodeEditorWindowScrollBar : Hide ( )
end
function breakdownWindow : CreateRightSideBar ( ) --not enabled
breakdownWindow.RightSideBar = CreateFrame ( " frame " , nil , breakdownWindow , " BackdropTemplate " )
breakdownWindow.RightSideBar : SetWidth ( 20 )
breakdownWindow.RightSideBar : SetPoint ( " topleft " , breakdownWindow , " topright " , 1 , 0 )
breakdownWindow.RightSideBar : SetPoint ( " bottomleft " , breakdownWindow , " bottomright " , 1 , 0 )
local rightSideBarAlpha = 0.75
detailsFramework : ApplyStandardBackdrop ( breakdownWindow.RightSideBar )
local toggleMergePlayerSpells = function ( )
Details.merge_player_abilities = not Details.merge_player_abilities
local playerObject = Details : GetActorObjectFromBreakdownWindow ( )
local instanceObject = Details : GetActiveWindowFromBreakdownWindow ( )
Details : OpenBreakdownWindow ( instanceObject , playerObject ) --toggle
Details : OpenBreakdownWindow ( instanceObject , playerObject )
end
local mergePlayerSpellsCheckbox = detailsFramework : CreateSwitch ( breakdownWindow , toggleMergePlayerSpells , Details.merge_player_abilities , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , detailsFramework : GetTemplate ( " switch " , " OPTIONS_CHECKBOX_BRIGHT_TEMPLATE " ) )
mergePlayerSpellsCheckbox : SetAsCheckBox ( )
mergePlayerSpellsCheckbox : SetPoint ( " bottom " , breakdownWindow.RightSideBar , " bottom " , 0 , 2 )
local mergePlayerSpellsLabel = breakdownWindow.RightSideBar : CreateFontString ( nil , " overlay " , " GameFontNormal " )
mergePlayerSpellsLabel : SetText ( " Merge Player Spells " )
detailsFramework : SetFontRotation ( mergePlayerSpellsLabel , 90 )
mergePlayerSpellsLabel : SetPoint ( " center " , mergePlayerSpellsCheckbox.widget , " center " , - 6 , mergePlayerSpellsCheckbox : GetHeight ( ) / 2 + mergePlayerSpellsLabel : GetStringWidth ( ) / 2 )
--
local toggleMergePetSpells = function ( )
Details.merge_pet_abilities = not Details.merge_pet_abilities
local playerObject = Details : GetActorObjectFromBreakdownWindow ( )
local instanceObject = Details : GetActiveWindowFromBreakdownWindow ( )
Details : OpenBreakdownWindow ( instanceObject , playerObject ) --toggle
Details : OpenBreakdownWindow ( instanceObject , playerObject )
end
local mergePetSpellsCheckbox = detailsFramework : CreateSwitch ( breakdownWindow , toggleMergePetSpells , Details.merge_pet_abilities , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , detailsFramework : GetTemplate ( " switch " , " OPTIONS_CHECKBOX_BRIGHT_TEMPLATE " ) )
mergePetSpellsCheckbox : SetAsCheckBox ( true )
mergePetSpellsCheckbox : SetPoint ( " bottom " , breakdownWindow.RightSideBar , " bottom " , 0 , 160 )
local mergePetSpellsLabel = breakdownWindow.RightSideBar : CreateFontString ( nil , " overlay " , " GameFontNormal " )
mergePetSpellsLabel : SetText ( " Merge Pet Spells " )
detailsFramework : SetFontRotation ( mergePetSpellsLabel , 90 )
mergePetSpellsLabel : SetPoint ( " center " , mergePetSpellsCheckbox.widget , " center " , - 6 , mergePetSpellsCheckbox : GetHeight ( ) / 2 + mergePetSpellsLabel : GetStringWidth ( ) / 2 )
mergePlayerSpellsCheckbox : SetAlpha ( rightSideBarAlpha )
mergePlayerSpellsLabel : SetAlpha ( rightSideBarAlpha )
mergePetSpellsCheckbox : SetAlpha ( rightSideBarAlpha )
mergePetSpellsLabel : SetAlpha ( rightSideBarAlpha )
end
---@type {[number]: boolean}
Details222.BreakdownWindow . ExpandedSpells = { }
---set a spell as expanded or not in the breakdown window
---@param key any
---@param bIsExpanded boolean
function Details222 . BreakdownWindow . SetSpellAsExpanded ( key , bIsExpanded )
Details222.BreakdownWindow . ExpandedSpells [ key ] = bIsExpanded
end
---get the state of the expanded for a spell
---@param key any
---@return boolean
function Details222 . BreakdownWindow . IsSpellExpanded ( key )
return Details222.BreakdownWindow . ExpandedSpells [ key ]
end
---receives spell data to show in the summary tab
---@param data breakdownspelldatalist
---@param actorObject actor
---@param combatObject combat
---@param instance instance
function Details222 . BreakdownWindow . SendSpellData ( data , actorObject , combatObject , instance )
--need to get the tab showing the summary and transmit the data to it
local tabButton = Details222.BreakdownWindow . CurrentDefaultTab
if ( tabButton ) then
--tab is the tab button
if ( tabButton.OnReceiveSpellData ) then
tabButton.OnReceiveSpellData ( data , actorObject , combatObject , instance )
end
end
end
function Details222 . BreakdownWindow . SendTargetData ( targetList , actorObject , combatObject , instance )
local tabButton = Details222.BreakdownWindow . CurrentDefaultTab
if ( tabButton ) then
if ( tabButton.OnReceiveTargetData ) then
tabButton.OnReceiveTargetData ( targetList , actorObject , combatObject , instance )
end
end
end
function Details222 . BreakdownWindow . SendGenericData ( resultTable , actorObject , combatObject , instance )
local tabButton = Details222.BreakdownWindow . CurrentDefaultTab
if ( tabButton ) then
if ( tabButton.OnReceiveGenericData ) then
tabButton.OnReceiveGenericData ( resultTable , actorObject , combatObject , instance )
end
end
end
---set the class or spec icon for the actor displayed
---@param actorObject actor
---@param class string
function breakdownWindow . SetClassIcon ( actorObject , class )
if ( actorObject.spellicon ) then
breakdownWindow.classIcon : SetTexture ( actorObject.spellicon )
breakdownWindow.classIcon : SetTexCoord ( .1 , .9 , .1 , .9 )
elseif ( actorObject.spec ) then
breakdownWindow.classIcon : SetTexture ( [[Interface\AddOns\Details\images\spec_icons_normal_alpha]] )
breakdownWindow.classIcon : SetTexCoord ( unpack ( _detalhes.class_specs_coords [ actorObject.spec ] ) )
else
local coords = CLASS_ICON_TCOORDS [ class ]
if ( coords ) then
breakdownWindow.classIcon : SetTexture ( [[Interface\Glues\CHARACTERCREATE\UI-CHARACTERCREATE-CLASSES]] )
local l , r , t , b = unpack ( coords )
breakdownWindow.classIcon : SetTexCoord ( l + 0.01953125 , r - 0.01953125 , t + 0.01953125 , b - 0.01953125 )
else
local c = _detalhes.class_coords [ " MONSTER " ]
breakdownWindow.classIcon : SetTexture ( " Interface \\ AddOns \\ Details \\ images \\ classes " )
breakdownWindow.classIcon : SetTexCoord ( c [ 1 ] , c [ 2 ] , c [ 3 ] , c [ 4 ] )
end
end
end
function Details : SetBreakdownWindowBackgroundTexture ( texture )
breakdownWindow.backgroundTexture : SetTexture ( texture )
end
--search key: ~create ~inicio ~start
function Details : CreateBreakdownWindow ( )
table.insert ( UISpecialFrames , breakdownWindow : GetName ( ) )
breakdownWindow.extra_frames = { }
breakdownWindow.Loaded = true
Details.playerDetailWindow = breakdownWindow
breakdownWindow : SetWidth ( PLAYER_DETAILS_WINDOW_WIDTH )
breakdownWindow : SetHeight ( PLAYER_DETAILS_WINDOW_HEIGHT )
breakdownWindow : SetFrameStrata ( " HIGH " )
breakdownWindow : SetToplevel ( true )
breakdownWindow : EnableMouse ( true )
breakdownWindow : SetResizable ( true )
breakdownWindow : SetMovable ( true )
breakdownWindow : SetClampedToScreen ( true )
--make the window movable
if ( not breakdownWindow.registeredLibWindow ) then
local LibWindow = LibStub ( " LibWindow-1.1 " )
breakdownWindow.registeredLibWindow = true
if ( LibWindow ) then
breakdownWindow.libWindowTable = breakdownWindow.libWindowTable or { }
LibWindow.RegisterConfig ( breakdownWindow , breakdownWindow.libWindowTable )
LibWindow.RestorePosition ( breakdownWindow )
LibWindow.MakeDraggable ( breakdownWindow )
LibWindow.SavePosition ( breakdownWindow )
breakdownWindow : SetScript ( " OnMouseDown " , function ( self , button )
if ( button == " RightButton " ) then
Details : CloseBreakdownWindow ( )
end
end )
end
end
detailsFramework : ApplyStandardBackdrop ( breakdownWindow )
--background
breakdownWindow.backgroundTexture = breakdownWindow : CreateTexture ( " $parent " , " background " , nil , - 3 )
breakdownWindow.backgroundTexture : SetAllPoints ( )
breakdownWindow.backgroundTexture : Hide ( )
--host the textures and fontstring of the default frame of the player breakdown window
--what is the summary window: is the frame where all the widgets for the summary tab are created
breakdownWindow.SummaryWindowWidgets = CreateFrame ( " frame " , " DetailsBreakdownWindowSummaryWidgets " , breakdownWindow , " BackdropTemplate " )
local SWW = breakdownWindow.SummaryWindowWidgets
SWW : SetAllPoints ( )
table.insert ( SummaryWidgets , SWW ) --where SummaryWidgets is declared: at the header of the file, what is the purpose of this table?
breakdownWindow.SummaryWindowWidgets : Hide ( )
detailsFramework : CreateScaleBar ( breakdownWindow , Details.player_details_window )
breakdownWindow : SetScale ( Details.player_details_window . scale )
--class icon
breakdownWindow.classIcon = breakdownWindow : CreateTexture ( nil , " overlay " , nil , 1 )
breakdownWindow.classIcon : SetPoint ( " topleft " , breakdownWindow , " topleft " , 2 , - 17 )
breakdownWindow.classIcon : SetSize ( 54 , 54 )
breakdownWindow.classIcon : SetAlpha ( 0.7 )
--close button
breakdownWindow.closeButton = CreateFrame ( " Button " , nil , breakdownWindow , " UIPanelCloseButton " )
breakdownWindow.closeButton : SetSize ( 20 , 20 )
breakdownWindow.closeButton : SetPoint ( " TOPRIGHT " , breakdownWindow , " TOPRIGHT " , - 5 , - 4 )
breakdownWindow.closeButton : SetFrameLevel ( breakdownWindow : GetFrameLevel ( ) + 5 )
breakdownWindow.closeButton : GetNormalTexture ( ) : SetDesaturated ( true )
breakdownWindow.closeButton : GetNormalTexture ( ) : SetVertexColor ( .6 , .6 , .6 )
breakdownWindow.closeButton : SetScript ( " OnClick " , function ( self )
Details : CloseBreakdownWindow ( )
end )
--title
detailsFramework : NewLabel ( breakdownWindow , breakdownWindow , nil , " titleText " , Loc [ " STRING_PLAYER_DETAILS " ] , " GameFontHighlightLeft " , 12 , { 227 / 255 , 186 / 255 , 4 / 255 } )
breakdownWindow.titleText : SetPoint ( " center " , breakdownWindow , " center " )
breakdownWindow.titleText : SetPoint ( " top " , breakdownWindow , " top " , 0 , - 6 )
--create the texts shown on the window
do
breakdownWindow.actorName = breakdownWindow : CreateFontString ( nil , " overlay " , " QuestFont_Large " )
breakdownWindow.actorName : SetPoint ( " left " , breakdownWindow.classIcon , " right " , 20 , - 7 )
breakdownWindow.attributeName = breakdownWindow : CreateFontString ( nil , " OVERLAY " , " GameFontHighlightSmall " )
breakdownWindow.avatar = breakdownWindow : CreateTexture ( nil , " overlay " )
breakdownWindow.avatar_bg = breakdownWindow : CreateTexture ( nil , " overlay " )
breakdownWindow.avatar_attribute = breakdownWindow : CreateFontString ( nil , " overlay " , " GameFontHighlightSmall " )
breakdownWindow.avatar_nick = breakdownWindow : CreateFontString ( nil , " overlay " , " QuestFont_Large " )
breakdownWindow.avatar : SetDrawLayer ( " overlay " , 3 )
breakdownWindow.avatar_bg : SetDrawLayer ( " overlay " , 2 )
breakdownWindow.avatar_nick : SetDrawLayer ( " overlay " , 4 )
breakdownWindow.avatar : SetPoint ( " TOPLEFT " , breakdownWindow , " TOPLEFT " , 60 , - 10 )
breakdownWindow.avatar_bg : SetPoint ( " TOPLEFT " , breakdownWindow , " TOPLEFT " , 60 , - 12 )
breakdownWindow.avatar_bg : SetSize ( 275 , 60 )
breakdownWindow.avatar_nick : SetPoint ( " TOPLEFT " , breakdownWindow , " TOPLEFT " , 195 , - 54 )
breakdownWindow.avatar : Hide ( )
breakdownWindow.avatar_bg : Hide ( )
breakdownWindow.avatar_nick : Hide ( )
end
--statusbar
local statusBar = CreateFrame ( " frame " , nil , breakdownWindow , " BackdropTemplate " )
statusBar : SetPoint ( " bottomleft " , breakdownWindow , " bottomleft " )
statusBar : SetPoint ( " bottomright " , breakdownWindow , " bottomright " )
statusBar : SetHeight ( PLAYER_DETAILS_STATUSBAR_HEIGHT )
detailsFramework : ApplyStandardBackdrop ( statusBar )
statusBar : SetAlpha ( PLAYER_DETAILS_STATUSBAR_ALPHA )
breakdownWindow.statusBar = statusBar
statusBar.Text = detailsFramework : CreateLabel ( statusBar )
statusBar.Text : SetPoint ( " left " , 2 , 0 )
--create the gradients in the top and bottom side of the breakdown window
local gradientStartColor = Details222.ColorScheme . GetColorFor ( " gradient-background " )
local gradientUp = detailsFramework : CreateTexture ( breakdownWindow , { gradient = " vertical " , fromColor = gradientStartColor , toColor = { 0 , 0 , 0 , 0.2 } } , 1 , 68 , " artwork " , { 0 , 1 , 0 , 1 } )
gradientUp : SetPoint ( " tops " , 1 , 1 )
local gradientHeight = 481
local gradientDown = detailsFramework : CreateTexture ( breakdownWindow , { gradient = " vertical " , fromColor = " transparent " , toColor = { 0 , 0 , 0 , 0.7 } } , 1 , gradientHeight , " border " , { 0 , 1 , 0 , 1 } )
gradientDown : SetPoint ( " bottomleft " , breakdownWindow.statusBar , " topleft " , 1 , 1 )
gradientDown : SetPoint ( " bottomright " , breakdownWindow.statusBar , " topright " , - 1 , 1 )
function breakdownWindow : SetStatusbarText ( text , fontSize , fontColor )
if ( not text ) then
breakdownWindow : SetStatusbarText ( " Details! Damage Meter | Use '/details stats' for statistics " , 10 , " gray " )
return
end
statusBar.Text . text = text
statusBar.Text . fontsize = fontSize
statusBar.Text . fontcolor = fontColor
end
--set default text
breakdownWindow : SetStatusbarText ( )
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--tabs ~tabs
function breakdownWindow : ShowTabs ( )
local tabsShown = 0
local secondRowIndex = 1
local breakLine = 6 --the tab it'll start the second line
local tablePool = Details : GetBreakdownTabsInUse ( )
for index = 1 , # tablePool do
local tabButton = tablePool [ index ]
if ( tabButton : condition ( breakdownWindow.jogador , breakdownWindow.atributo , breakdownWindow.sub_atributo ) and not tabButton.replaced ) then
--test if can show the tutorial for the comparison tab
if ( tabButton.tabname == " Compare " ) then
--Details:SetTutorialCVar ("DETAILS_INFO_TUTORIAL1", false)
if ( not Details : GetTutorialCVar ( " DETAILS_INFO_TUTORIAL1 " ) ) then
Details : SetTutorialCVar ( " DETAILS_INFO_TUTORIAL1 " , true )
local alert = CreateFrame ( " frame " , " DetailsInfoPopUp1 " , breakdownWindow , " DetailsHelpBoxTemplate " )
alert.ArrowUP : Show ( )
alert.ArrowGlowUP : Show ( )
alert.Text : SetText ( Loc [ " STRING_INFO_TUTORIAL_COMPARISON1 " ] )
alert : SetPoint ( " bottom " , tabButton.widget or tabButton , " top " , 5 , 28 )
alert : Show ( )
end
end
tabButton : Show ( )
tabsShown = tabsShown + 1
tabButton : ClearAllPoints ( )
--get the button width
local buttonTemplate = gump : GetTemplate ( " button " , " DETAILS_TAB_BUTTON_TEMPLATE " )
local buttonWidth = buttonTemplate.width + 1
--pixelutil might not be compatible with classic wow
if ( PixelUtil ) then
PixelUtil.SetSize ( tabButton , buttonTemplate.width , buttonTemplate.height )
if ( tabsShown >= breakLine ) then --next row of icons
PixelUtil.SetPoint ( tabButton , " bottomright " , breakdownWindow , " topright " , - 514 + ( buttonWidth * ( secondRowIndex ) ) , - 50 )
secondRowIndex = secondRowIndex + 1
else
PixelUtil.SetPoint ( tabButton , " bottomright " , breakdownWindow , " topright " , - 514 + ( buttonWidth * tabsShown ) , - 69 )
end
else
tabButton : SetSize ( buttonTemplate.width , buttonTemplate.height )
if ( tabsShown >= breakLine ) then --next row of icons
tabButton : SetPoint ( " bottomright " , breakdownWindow , " topright " , - 514 + ( buttonWidth * ( secondRowIndex ) ) , - 50 )
secondRowIndex = secondRowIndex + 1
else
tabButton : SetPoint ( " bottomright " , breakdownWindow , " topright " , - 514 + ( buttonWidth * tabsShown ) , - 69 )
end
end
tabButton : SetAlpha ( 0.8 )
else
tabButton.frame : Hide ( )
tabButton : Hide ( )
end
end
if ( tabsShown < 2 ) then
tablePool [ 1 ] : SetPoint ( " bottomleft " , breakdownWindow.container_barras , " topleft " , 490 - ( 94 * ( 1 - 0 ) ) , 1 )
end
--selected by default
tablePool [ 1 ] : Click ( )
end
breakdownWindow : SetScript ( " OnHide " , function ( self )
Details : CloseBreakdownWindow ( )
for _ , tab in ipairs ( Details.player_details_tabs ) do
tab : Hide ( )
tab.frame : Hide ( )
end
end )
breakdownWindow.tipo = 1 --tipo da janela // 1 = janela normal
return breakdownWindow
end
breakdownWindow.selectedTab = " Summary "
function Details : CreatePlayerDetailsTab ( tabName , locName , conditionFunc , fillFunc , tabOnClickFunc , onCreateFunc , iconSettings , replace , bIsDefaultTab ) --~tab
if ( not tabName ) then
tabName = " unnamed "
end
--create a button to select the tab
local tabButton = detailsFramework : CreateButton ( breakdownWindow , function ( ) end , 20 , 20 , locName , nil , nil , nil , nil , breakdownWindow : GetName ( ) .. " TabButton " .. tabName .. math.random ( 1 , 1000 ) , nil , " DETAILS_TAB_BUTTON_TEMPLATE " )
tabButton : SetFrameLevel ( breakdownWindow : GetFrameLevel ( ) + 1 )
tabButton : Hide ( )
if ( tabName == " Summary " ) then
tabButton : SetTemplate ( " DETAILS_TAB_BUTTONSELECTED_TEMPLATE " )
end
tabButton.IsDefaultTab = bIsDefaultTab
tabButton.condition = conditionFunc
tabButton.tabname = tabName
tabButton.localized_name = locName
tabButton.onclick = tabOnClickFunc
tabButton.fillfunction = fillFunc
tabButton.last_actor = { } --need to double check is this getting cleared
---@type tabframe
local tabFrame = CreateFrame ( " frame " , breakdownWindow : GetName ( ) .. " TabFrame " .. tabName .. math.random ( 1 , 10000 ) , breakdownWindow , " BackdropTemplate " )
tabFrame : SetFrameLevel ( breakdownWindow : GetFrameLevel ( ) + 1 )
tabFrame : SetPoint ( " topleft " , breakdownWindow , " topleft " , 0 , - 70 )
tabFrame : SetPoint ( " bottomright " , breakdownWindow , " bottomright " , - 1 , 20 )
tabFrame : Hide ( )
DetailsFramework : ApplyStandardBackdrop ( tabFrame )
tabFrame : SetBackdropBorderColor ( 0 , 0 , 0 , 0.3 )
tabFrame.__background : SetAlpha ( 0.3 )
tabFrame.RightEdge : Hide ( )
--create the gradients in the top and bottom side of the breakdown window
local gradientStartColor = Details222.ColorScheme . GetColorFor ( " gradient-background " )
local red , green , blue = unpack ( gradientStartColor )
local gradientUpDown = detailsFramework : CreateTexture ( tabFrame , { gradient = " vertical " , fromColor = { red , green , blue , 0 } , toColor = { red , green , blue , 0.4 } } , 1 , 34 * 2 , " artwork " , { 0 , 1 , 0 , 1 } )
gradientUpDown : SetPoint ( " topleft " , tabFrame , " topleft " , 0 , 0 )
gradientUpDown : SetPoint ( " topright " , tabFrame , " topright " , 0 , 0 )
tabButton.tabFrame = tabFrame
tabButton.frame = tabFrame
if ( iconSettings ) then
local texture = iconSettings.texture
local coords = iconSettings.coords
local width = iconSettings.width
local height = iconSettings.height
local overlay , textdistance , leftpadding , textheight , short_method --nil
tabButton : SetIcon ( texture , width , height , " overlay " , coords , overlay , textdistance , leftpadding , textheight , short_method )
if ( iconSettings.desaturated ) then
tabButton.icon : SetDesaturated ( true )
end
end
if ( tabButton.fillfunction ) then
tabFrame : SetScript ( " OnShow " , function ( )
---@type actor
local actorObject = Details : GetActorObjectFromBreakdownWindow ( )
if ( tabButton.last_actor == actorObject ) then
return
end
---@type instance
local instanceObject = Details : GetActiveWindowFromBreakdownWindow ( )
---@type combat
local combatObject = instanceObject : GetCombat ( )
tabButton.last_actor = actorObject --it's caching the actor, on pre-reset need to clean up this variable (need to check this later)
tabButton : fillfunction ( actorObject , combatObject )
end )
end
if ( onCreateFunc ) then
onCreateFunc ( tabButton , tabFrame )
end
tabButton.replaces = replace
Details.player_details_tabs [ # Details.player_details_tabs + 1 ] = tabButton
local onTabClickCallback = function ( self ) --self = tabButton
self = self.MyObject or self --framework button
for _ , thisTabButton in ipairs ( Details : GetBreakdownTabsInUse ( ) ) do
thisTabButton.frame : Hide ( )
thisTabButton : SetTemplate ( " DETAILS_TAB_BUTTON_TEMPLATE " )
end
self : SetTemplate ( " DETAILS_TAB_BUTTONSELECTED_TEMPLATE " )
breakdownWindow.selectedTab = self.tabname
end
if ( not tabOnClickFunc ) then
tabButton.OnShowFunc = function ( self )
--hide all tab frames, reset the template on all tabs
--then set the template on this tab and set as selected tab
onTabClickCallback ( self )
--show the tab frame
tabFrame : Show ( )
end
tabButton : SetScript ( " OnClick " , tabButton.OnShowFunc )
else
--custom
tabButton.OnShowFunc = function ( self )
--hide all tab frames, reset the template on all tabs
--then set the template on this tab and set as selected tab
onTabClickCallback ( self )
--run onclick func
local result , errorText = pcall ( tabOnClickFunc , tabButton , tabFrame )
if ( not result ) then
print ( " error on running tabOnClick function: " , errorText )
end
end
tabButton : SetScript ( " OnClick " , tabButton.OnShowFunc )
end
function tabButton : DoClick ( )
self : GetScript ( " OnClick " ) ( self )
end
tabButton : SetScript ( " PostClick " , function ( self )
CurrentTab = self.tabname or self.MyObject . tabname
if ( CurrentTab ~= " Summary " ) then
for _ , widget in ipairs ( SummaryWidgets ) do
widget : Hide ( )
end
else
for _ , widget in ipairs ( SummaryWidgets ) do
widget : Show ( )
end
end
end )
return tabButton , tabFrame
end