-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
local _detalhes = _G.Details
local Loc = LibStub ( " AceLocale-3.0 " ) : GetLocale ( " Details " )
local SharedMedia = LibStub : GetLibrary ( " LibSharedMedia-3.0 " )
local DEFAULT_CHILD_WIDTH = 60
local DEFAULT_CHILD_HEIGHT = 16
local DEFAULT_CHILD_FONTFACE = " Friz Quadrata TT "
local DEFAULT_CHILD_FONTCOLOR = { 1 , 0.733333 , 0 , 1 }
local DEFAULT_CHILD_FONTSIZE = 10
local _
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
local _math_floor = math.floor --api local
local ipairs = ipairs --api local
local UnitGroupRolesAssigned = DetailsFramework.UnitGroupRolesAssigned
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--status bar core functions
--hida all micro frames
function _detalhes . StatusBar : Hide ( instance , side )
if ( not side ) then
if ( instance.StatusBar . center and instance.StatusBar . left and instance.StatusBar . right ) then
instance.StatusBar . center.frame : Hide ( )
instance.StatusBar . left.frame : Hide ( )
instance.StatusBar . right.frame : Hide ( )
end
end
end
function _detalhes . StatusBar : Show ( instance , side )
if ( not side ) then
if ( instance.StatusBar . center and instance.StatusBar . left and instance.StatusBar . right ) then
instance.StatusBar . center.frame : Show ( )
instance.StatusBar . left.frame : Show ( )
instance.StatusBar . right.frame : Show ( )
end
end
end
function _detalhes . StatusBar : LockDisplays ( instance , locked )
if ( instance.StatusBar . center and instance.StatusBar . left and instance.StatusBar . right ) then
if ( locked ) then
instance.StatusBar . center.frame : EnableMouse ( false )
instance.StatusBar . left.frame : EnableMouse ( false )
instance.StatusBar . right.frame : EnableMouse ( false )
else
instance.StatusBar . center.frame : EnableMouse ( true )
instance.StatusBar . left.frame : EnableMouse ( true )
instance.StatusBar . right.frame : EnableMouse ( true )
end
end
end
--create a plugin child for an instance
function _detalhes . StatusBar : CreateStatusBarChildForInstance ( instance , pluginName )
local PluginObject = _detalhes.StatusBar . NameTable [ pluginName ]
if ( PluginObject ) then
local new_child = PluginObject : CreateChildObject ( instance )
if ( new_child ) then
instance.StatusBar [ # instance.StatusBar + 1 ] = new_child
new_child.enabled = false
return new_child
end
end
return nil
end
--functions to set the three statusbar places: left, center and right
function _detalhes . StatusBar : SetCenterPlugin ( instance , childObject , fromStartup )
childObject.frame : Show ( )
childObject.frame : ClearAllPoints ( )
childObject.options . textAlign = 2
if ( instance.micro_displays_side == 2 ) then --default - bottom
childObject.frame : SetPoint ( " center " , instance.baseframe . rodape.StatusBarCenterAnchor , " center " )
elseif ( instance.micro_displays_side == 1 ) then --top side
childObject.frame : SetPoint ( " center " , instance.baseframe . cabecalho.StatusBarCenterAnchor , " center " )
end
childObject.text : ClearAllPoints ( )
childObject.text : SetPoint ( " center " , childObject.frame , " center " , childObject.options . textXMod , childObject.options . textYMod )
instance.StatusBar . center = childObject
childObject.anchor = " center "
childObject.enabled = true
if ( childObject.OnEnable ) then
childObject : OnEnable ( )
end
if ( fromStartup and childObject.options . isHidden ) then
childObject.frame . text : Hide ( )
if ( childObject.frame . texture ) then
childObject.frame . texture : Hide ( )
end
end
return true
end
function _detalhes . StatusBar : SetLeftPlugin ( instance , childObject , fromStartup )
if ( not childObject ) then
return
end
childObject.frame : Show ( )
childObject.frame : ClearAllPoints ( )
childObject.options . textAlign = 1
if ( instance.micro_displays_side == 2 ) then --default - bottom
childObject.frame : SetPoint ( " left " , instance.baseframe . rodape.StatusBarLeftAnchor , " left " )
elseif ( instance.micro_displays_side == 1 ) then --top side
childObject.frame : SetPoint ( " left " , instance.baseframe . cabecalho.StatusBarLeftAnchor , " left " )
end
childObject.text : ClearAllPoints ( )
childObject.text : SetPoint ( " left " , childObject.frame , " left " , childObject.options . textXMod , childObject.options . textYMod )
instance.StatusBar . left = childObject
childObject.anchor = " left "
childObject.enabled = true
if ( childObject.OnEnable ) then
childObject : OnEnable ( )
end
if ( fromStartup and childObject.options . isHidden ) then
childObject.frame . text : Hide ( )
if ( childObject.frame . texture ) then
childObject.frame . texture : Hide ( )
end
end
return true
end
function _detalhes . StatusBar : SetRightPlugin ( instance , childObject , fromStartup )
childObject.frame : Show ( )
childObject.frame : ClearAllPoints ( )
childObject.options . textAlign = 3
if ( instance.micro_displays_side == 2 ) then --default - bottom
childObject.frame : SetPoint ( " right " , instance.baseframe . rodape.direita , " right " , - 20 , 10 )
elseif ( instance.micro_displays_side == 1 ) then --top side
childObject.frame : SetPoint ( " right " , instance.baseframe . cabecalho.StatusBarRightAnchor , " right " )
end
childObject.text : ClearAllPoints ( )
childObject.text : SetPoint ( " right " , childObject.frame , " right " , childObject.options . textXMod , childObject.options . textYMod )
instance.StatusBar . right = childObject
childObject.anchor = " right "
childObject.enabled = true
if ( childObject.OnEnable ) then
childObject : OnEnable ( )
end
if ( fromStartup and childObject.options . isHidden ) then
childObject.frame . text : Hide ( )
if ( childObject.frame . texture ) then
childObject.frame . texture : Hide ( )
end
end
return true
end
--disable all plugin childs attached to an specified instance and reactive the childs taking the instance statusbar anchors
function _detalhes . StatusBar : ReloadAnchors ( instance )
for _ , child in ipairs ( instance.StatusBar ) do
child.frame : ClearAllPoints ( )
child.frame : Hide ( )
child.anchor = nil
child.enabled = false
if ( child.OnDisable ) then
child : OnDisable ( )
end
end
--enable only needed plugins
if ( instance.StatusBar . right ) then
_detalhes.StatusBar : SetRightPlugin ( instance , instance.StatusBar . right )
end
if ( instance.StatusBar . center ) then
_detalhes.StatusBar : SetCenterPlugin ( instance , instance.StatusBar . center )
end
if ( instance.StatusBar . left ) then
_detalhes.StatusBar : SetLeftPlugin ( instance , instance.StatusBar . left )
end
if ( not instance.show_statusbar and instance.micro_displays_side == 2 ) then
_detalhes.StatusBar : Hide ( instance )
end
end
--select a new plugin in for an instance anchor
local ChoosePlugin = function ( _ , _ , index , current_child , anchor )
GameCooltip : Close ( )
local byuser = false
if ( type ( index ) == " table " ) then
index , current_child , anchor = unpack ( index )
byuser = true
end
if ( index and index == - 1 ) then --hide
_detalhes.StatusBar : ApplyOptions ( current_child , " hidden " , true )
return
else
_detalhes.StatusBar : ApplyOptions ( current_child , " hidden " , false )
current_child.frame . text : Show ( )
if ( current_child.frame . texture ) then
current_child.frame . texture : Show ( )
end
end
local pluginMestre = _detalhes.StatusBar . Plugins [ index ]
if ( not pluginMestre ) then
if ( anchor == " left " ) then
pluginMestre = _detalhes.StatusBar . Plugins [ 2 ]
elseif ( anchor == " center " ) then
pluginMestre = _detalhes.StatusBar . Plugins [ 4 ]
elseif ( anchor == " right " ) then
pluginMestre = _detalhes.StatusBar . Plugins [ 1 ]
end
end
local instance = current_child.instance -- instance que estamos usando agora
local chosenChild = nil
--procura pra ver se ja tem uma criada
for _ , child_created in ipairs ( instance.StatusBar ) do
if ( child_created.mainPlugin == pluginMestre ) then
chosenChild = child_created
break
end
end
--se nao tiver cria uma
if ( not chosenChild ) then
chosenChild = _detalhes.StatusBar : CreateStatusBarChildForInstance ( current_child.instance , pluginMestre.real_name )
end
instance.StatusBar [ anchor ] = chosenChild
--copia os atributos do current para o chosen
local options_current = Details.CopyTable ( current_child.options )
if ( chosenChild.anchor ) then
--o widget escolhido ja estava sendo mostrado...
-- copia os atributos do chosen para o current
current_child.options = Details.CopyTable ( chosenChild.options )
instance.StatusBar [ chosenChild.anchor ] = current_child
end
chosenChild.options = options_current
_detalhes.StatusBar : ReloadAnchors ( instance )
_detalhes.StatusBar : UpdateOptions ( instance )
end
function _detalhes . StatusBar : SetPlugin ( instance , absolute_name , anchor )
if ( absolute_name == - 1 ) then --none
anchor = string.lower ( anchor )
ChoosePlugin ( nil , nil , - 1 , instance.StatusBar [ anchor ] , anchor )
else
local index = _detalhes.StatusBar : GetIndexFromAbsoluteName ( absolute_name )
if ( index and anchor ) then
anchor = string.lower ( anchor )
ChoosePlugin ( nil , nil , index , instance.StatusBar [ anchor ] , anchor )
end
end
end
--on enter
local onEnterCooltipTexts = {
{ text = " |TInterface \\ TUTORIALFRAME \\ UI-TUTORIAL-FRAME:14:14:0:1:512:512:8:70:224:306|t " .. Loc [ " STRING_PLUGIN_TOOLTIP_LEFTBUTTON " ] } ,
{ text = " |TInterface \\ TUTORIALFRAME \\ UI-TUTORIAL-FRAME:14:14:0:1:512:512:8:70:328:409|t " .. Loc [ " STRING_PLUGIN_TOOLTIP_RIGHTBUTTON " ] } }
local on_enter_backdrop = { bgFile = " Interface \\ Tooltips \\ UI-Tooltip-Background " , tile = true , tileSize = 16 }
local OnEnter = function ( frame )
--|TTexturePath: size X: size Y: point offset Y X : texture size : coordx1 L : coordx2 R : coordy1 T : coordy2 B |t
-- left click: 0.0019531:0.1484375:0.4257813:0.6210938 right click: 0.0019531:0.1484375:0.6269531:0.8222656
local instance = frame.child . instance
_detalhes.OnEnterMainWindow ( instance )
frame : SetBackdrop ( on_enter_backdrop )
frame : SetBackdropColor ( 0.7 , 0.7 , 0.7 , 0.6 )
GameCooltip : Reset ( )
GameCooltip : AddFromTable ( onEnterCooltipTexts )
GameCooltip : SetOption ( " TextSize " , 9 )
GameCooltip : SetWallpaper ( 1 , [[Interface\SPELLBOOK\Spellbook-Page-1]] , { .6 , 0.1 , 0 , 0.64453125 } , { 1 , 1 , 1 , 0.1 } , true )
GameCooltip : SetOption ( " ButtonHeightMod " , - 4 )
GameCooltip : SetOption ( " ButtonsYMod " , - 4 )
GameCooltip : SetOption ( " YSpacingMod " , - 4 )
GameCooltip : SetOption ( " FixedHeight " , 46 )
GameCooltip : ShowCooltip ( frame , " tooltip " )
return true
end
--on leave
local OnLeave = function ( frame )
frame : SetBackdrop ( nil )
_detalhes.OnLeaveMainWindow ( frame.child . instance )
_detalhes.popup : Hide ( )
return true
end
local OnMouseUp = function ( frame , mouse )
if ( mouse == " LeftButton " ) then
if ( not frame.child . Setup ) then
print ( Loc [ " STRING_STATUSBAR_NOOPTIONS " ] )
return
end
frame.child : Setup ( )
else
GameCooltip : Reset ( )
GameCooltip : SetType ( " menu " )
GameCooltip : AddMenu ( 1 , ChoosePlugin , - 1 , frame.child , frame.child . anchor , Loc [ " STRING_PLUGIN_CLEAN " ] , [[Interface\Buttons\UI-GroupLoot-Pass-Down]] , true )
local current
for index , _name_and_icon in ipairs ( _detalhes.StatusBar . Menu ) do
GameCooltip : AddMenu ( 1 , ChoosePlugin , { index , frame.child , frame.child . anchor } , nil , nil , _name_and_icon [ 1 ] , _name_and_icon [ 2 ] , true )
local pluginMestre = _detalhes.StatusBar . Plugins [ index ]
if ( pluginMestre and pluginMestre.real_name == frame.child . mainPlugin.real_name ) then
current = index + 1
end
end
if ( current ) then
GameCooltip : SetLastSelected ( 1 , current )
else
GameCooltip : SetOption ( " NoLastSelectedBar " , true )
end
GameCooltip : SetOption ( " HeightAnchorMod " , - 12 )
GameCooltip : SetWallpaper ( 1 , [[Interface\SPELLBOOK\Spellbook-Page-1]] , { .6 , 0.1 , 0 , 0.64453125 } , { 1 , 1 , 1 , 0.1 } , true )
GameCooltip : ShowCooltip ( frame , " menu " )
end
return true
end
--reset micro frames
function _detalhes . StatusBar : Reset ( instance )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textcolor " , { 1 , 0.82 , 0 , 1 } )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textcolor " , { 1 , 0.82 , 0 , 1 } )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textcolor " , { 1 , 0.82 , 0 , 1 } )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textface " , " Friz Quadrata TT " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textface " , " Friz Quadrata TT " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textface " , " Friz Quadrata TT " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textsize " , 9 )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textsize " , 9 )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textsize " , 9 )
end
function _detalhes . StatusBar : GetIndexFromAbsoluteName ( AbsName )
for index , object in ipairs ( _detalhes.StatusBar . Plugins ) do
if ( object.real_name == AbsName ) then
return index
end
end
end
function _detalhes . StatusBar : UpdateOptions ( instance )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textcolor " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textsize " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textface " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textxmod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textymod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " hidden " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textcolor " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textsize " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textface " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textxmod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textymod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " hidden " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textcolor " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textsize " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textface " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textxmod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textymod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " hidden " )
end
function _detalhes . StatusBar : UpdateChilds ( instance )
local left = instance.StatusBarSaved . left
local center = instance.StatusBarSaved . center
local right = instance.StatusBarSaved . right
local left_index = _detalhes.StatusBar : GetIndexFromAbsoluteName ( left )
ChoosePlugin ( nil , nil , left_index , instance.StatusBar . left , " left " )
local center_index = _detalhes.StatusBar : GetIndexFromAbsoluteName ( center )
ChoosePlugin ( nil , nil , center_index , instance.StatusBar . center , " center " )
local right_index = _detalhes.StatusBar : GetIndexFromAbsoluteName ( right )
ChoosePlugin ( nil , nil , right_index , instance.StatusBar . right , " right " )
if ( instance.StatusBarSaved . options and instance.StatusBarSaved . options [ left ] ) then
instance.StatusBar . left.options = Details.CopyTable ( instance.StatusBarSaved . options [ left ] )
end
if ( instance.StatusBarSaved . options and instance.StatusBarSaved . options [ center ] ) then
instance.StatusBar . center.options = Details.CopyTable ( instance.StatusBarSaved . options [ center ] )
end
if ( instance.StatusBarSaved . options and instance.StatusBarSaved . options [ right ] ) then
instance.StatusBar . right.options = Details.CopyTable ( instance.StatusBarSaved . options [ right ] )
end
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textcolor " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textsize " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textface " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textxmod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " textymod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . left , " hidden " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textcolor " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textsize " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textface " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textxmod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " textymod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . center , " hidden " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textcolor " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textsize " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textface " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textxmod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " textymod " )
_detalhes.StatusBar : ApplyOptions ( instance.StatusBar . right , " hidden " )
end
--build-in function for create a frame for an plugin child
function _detalhes . StatusBar : CreateChildFrame ( instance , name , w , h )
--local frame = _detalhes.gump:NewPanel(instance.baseframe.cabecalho.fechar, nil, name..instance:GetInstanceId(), nil, w or DEFAULT_CHILD_WIDTH, h or DEFAULT_CHILD_HEIGHT, false)
local frame = _detalhes.gump : NewPanel ( instance.baseframe , nil , name .. instance : GetInstanceId ( ) , nil , w or DEFAULT_CHILD_WIDTH , h or DEFAULT_CHILD_HEIGHT , false )
frame : SetFrameLevel ( instance.baseframe : GetFrameLevel ( ) + 4 )
--create widgets
local text = _detalhes.gump : NewLabel ( frame , nil , " $parentText " , " text " , " 0 " )
text : SetPoint ( " right " , frame , " right " , 0 , 0 )
text : SetJustifyH ( " right " )
_detalhes : SetFontSize ( text , 9.8 )
frame : SetHook ( " OnEnter " , OnEnter )
frame : SetHook ( " OnLeave " , OnLeave )
frame : SetHook ( " OnMouseUp " , OnMouseUp )
return frame
end
--built-in function for create an table for the plugin child
function _detalhes . StatusBar : CreateChildTable ( instance , mainObject , frame )
local _table = { }
--treat as a class
setmetatable ( _table , mainObject )
--default members
_table.instance = instance
_table.frame = frame
_table.text = frame.text
_table.mainPlugin = mainObject
--options table
_table.options = instance.StatusBar . options [ mainObject.real_name ]
if ( not _table.options ) then
_table.options = {
textStyle = 2 ,
textColor = { unpack ( DEFAULT_CHILD_FONTCOLOR ) } ,
textSize = DEFAULT_CHILD_FONTSIZE ,
textAlign = 0 ,
textXMod = 0 ,
textYMod = 0 ,
textFace = DEFAULT_CHILD_FONTFACE }
instance.StatusBar . options [ mainObject.real_name ] = _table.options
end
_detalhes.StatusBar : ApplyOptions ( _table , " textcolor " )
_detalhes.StatusBar : ApplyOptions ( _table , " textsize " )
_detalhes.StatusBar : ApplyOptions ( _table , " textface " )
_detalhes.StatusBar : ReloadAnchors ( instance )
--table reference on frame widget
frame.frame . child = _table
--adds this new child to parent child container
mainObject.childs [ # mainObject.childs + 1 ] = _table
return _table
end
function _detalhes . StatusBar : ApplyOptions ( child , option , value )
option = string.lower ( option )
if ( option == " textxmod " ) then
if ( value == nil ) then
value = child.options . textXMod
end
child.options . textXMod = value
_detalhes.StatusBar : ReloadAnchors ( child.instance )
elseif ( option == " textymod " ) then
if ( value == nil ) then
value = child.options . textYMod
end
child.options . textYMod = value
_detalhes.StatusBar : ReloadAnchors ( child.instance )
elseif ( option == " textcolor " ) then
if ( value == nil ) then
value = child.options . textColor
end
child.options . textColor = value
local r , g , b , a = _detalhes.gump : ParseColors ( child.options . textColor )
child.text : SetTextColor ( r , g , b , a )
elseif ( option == " textsize " ) then
if ( value == nil ) then
value = child.options . textSize
end
child.options . textSize = value or 9
child : SetFontSize ( child.text , child.options . textSize )
elseif ( option == " textface " ) then
if ( value == nil ) then
value = child.options . textFace
end
child.options . textFace = value
child : SetFontFace ( child.text , SharedMedia : Fetch ( " font " , child.options . textFace ) )
elseif ( option == " hidden " ) then
if ( value == nil ) then
value = child.options . isHidden
end
child.options . isHidden = value
if ( value ) then
child.frame . text : Hide ( )
if ( child.frame . texture ) then
child.frame . texture : Hide ( )
end
else
child.frame . text : Show ( )
if ( child.frame . texture ) then
child.frame . texture : Show ( )
end
end
else
if ( child [ option ] and type ( child [ option ] ) == " function " ) then
child [ option ] ( nil , child , value )
end
end
end
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--BUILT-IN DPS PLUGIN
do
--Create the plugin Object [1] = frame name on _G [2] options [3] plugin type
local PDps = _detalhes : NewPluginObject ( " Details_StatusBarDps " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--[[ Note: Declare all functions using : not . if you use . make sure to ignore first parameter and move all parameters 1 position to right ]]
-- handle event "COMBAT_PLAYER_ENTER"
function PDps : PlayerEnterCombat ( )
for index , child in ipairs ( PDps.childs ) do
if ( child.enabled and child.instance : GetSegment ( ) == 0 ) then
child.tick = _detalhes : ScheduleRepeatingTimer ( " PluginDpsUpdate " , 1 , child )
end
end
end
-- handle event "COMBAT_PLAYER_LEAVE"
function PDps : PlayerLeaveCombat ( )
for index , child in ipairs ( PDps.childs ) do
if ( child.tick ) then
_detalhes : CancelTimer ( child.tick )
child.tick = nil
end
end
end
-- handle event "DETAILS_INSTANCE_CHANGESEGMENT"
function PDps : ChangeSegment ( instance , segment )
for index , child in ipairs ( PDps.childs ) do
if ( child.enabled and child.instance == instance ) then
_detalhes : PluginDpsUpdate ( child )
end
end
end
--handle event "DETAILS_DATA_RESET"
function PDps : DataReset ( )
for index , child in ipairs ( PDps.childs ) do
if ( child.enabled ) then
child.text : SetText ( " 0 " )
end
end
end
function PDps : Refresh ( child )
_detalhes : PluginDpsUpdate ( child )
end
--still a little buggy, working on
function _detalhes : PluginDpsUpdate ( child )
--showing is the combat table which is current shown on instance
if ( child.instance . showing ) then
--GetCombatTime() return the time length of combat
local combatTime = child.instance . showing : GetCombatTime ( )
if ( combatTime < 1 ) then
return child.text : SetText ( " 0 " )
end
--GetTotal (attribute, sub attribute, onlyGroup) return the total of requested attribute
local total = child.instance . showing : GetTotal ( child.instance . atributo , child.instance . sub_atributo , true )
local dps = _math_floor ( total / combatTime )
local textStyle = child.options . textStyle
if ( textStyle == 1 ) then
child.text : SetText ( _detalhes : ToK ( dps ) )
elseif ( textStyle == 2 ) then
child.text : SetText ( _detalhes : comma_value ( dps ) )
else
child.text : SetText ( dps )
end
end
end
--Create Plugin Frames
function PDps : CreateChildObject ( instance )
--create main frame and widgets
--a statusbar frame is made of a panel with a member called 'text' which is a label
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsStatusBarDps " , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , PDps , myframe )
return new_child
end
--Handle events (must have, we'll use direct call to functions)
function PDps : OnDetailsEvent ( event )
return
end
--Install
-- _detalhes:InstallPlugin ( Plugin Type | Plugin Display Name | Plugin Icon | Plugin Object | Plugin Real Name )
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_PDPSNAME " ] , " Interface \\ Icons \\ Achievement_brewery_3 " , PDps , " DETAILS_STATUSBAR_PLUGIN_PDPS " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
--Register needed events
-- here we are redirecting the event to an specified function, otherwise events need to be handle inside "PDps:OnDetailsEvent (event)"
_detalhes : RegisterEvent ( PDps , " DETAILS_INSTANCE_CHANGESEGMENT " , PDps.ChangeSegment )
_detalhes : RegisterEvent ( PDps , " DETAILS_DATA_RESET " , PDps.DataReset )
_detalhes : RegisterEvent ( PDps , " COMBAT_PLAYER_ENTER " , PDps.PlayerEnterCombat )
_detalhes : RegisterEvent ( PDps , " COMBAT_PLAYER_LEAVE " , PDps.PlayerLeaveCombat )
end
---------BUILT-IN SEGMENT PLUGIN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
--Create the plugin Object
local PSegment = _detalhes : NewPluginObject ( " Details_Segmenter " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--Handle events (must have)
function PSegment : OnDetailsEvent ( event )
return
end
--initialize and reset 'can_schedule' variable
function PSegment : NewCombat ( )
PSegment.can_schedule = 1
PSegment : Change ( )
end
function PSegment : OnSegmentChange ( )
PSegment.can_schedule = 1
PSegment : Change ( )
end
--on 'can_schedule' timeout, re-run the Change() function
function PSegment : SchduleGetName ( )
PSegment : Change ( )
end
function PSegment : Change ( )
for index , child in ipairs ( PSegment.childs ) do
if ( child.enabled and child.instance : IsEnabled ( ) ) then
child.options . segmentType = child.options . segmentType or 2
if ( not child.instance . showing ) then
return child.text : SetText ( Loc [ " STRING_EMPTY_SEGMENT " ] )
end
if ( child.instance . segmento == - 1 ) then --overall
child.text : SetText ( Loc [ " STRING_OVERALL " ] )
elseif ( child.instance . segmento == 0 ) then --combate atual
if ( child.options . segmentType == 1 ) then
child.text : SetText ( Loc [ " STRING_CURRENT " ] )
else
local name = _detalhes.tabela_vigente : GetCombatName ( true )
if ( name and name ~= Loc [ " STRING_UNKNOW " ] ) then
if ( child.options . segmentType == 2 ) then
child.text : SetText ( name )
elseif ( child.options . segmentType == 3 ) then
child.text : SetText ( name )
end
else
child.text : SetText ( Loc [ " STRING_CURRENT " ] )
if ( _detalhes.in_combat and PSegment.can_schedule <= 2 ) then
PSegment : ScheduleTimer ( " SchduleGetName " , 2 )
PSegment.can_schedule = PSegment.can_schedule + 1
return
end
end
end
else --alguma tabela do hist�rico
if ( child.options . segmentType == 1 ) then
child.text : SetText ( Loc [ " STRING_FIGHTNUMBER " ] .. child.instance . segmento )
else
local name = child.instance . showing : GetCombatName ( true )
if ( name ~= Loc [ " STRING_UNKNOW " ] ) then
if ( child.options . segmentType == 2 ) then
child.text : SetText ( name )
elseif ( child.options . segmentType == 3 ) then
child.text : SetText ( name .. " # " .. child.instance . segmento )
end
else
if ( child.options . segmentType == 2 ) then
child.text : SetText ( Loc [ " STRING_UNKNOW " ] )
elseif ( child.options . segmentType == 3 ) then
child.text : SetText ( Loc [ " STRING_UNKNOW " ] .. " # " .. child.instance . segmento )
end
end
end
end
end
end
end
function PSegment : ExtraOptions ( )
--all widgets need to be placed on a table
local widgets = { }
--reference of extra window for custom options
local window = _G.DetailsStatusBarOptions2 . MyObject
--build all your widgets -----------------------------------------------------------------------------------------------------------------------------
_detalhes.gump : NewLabel ( window , nil , " $parentSegmentOptionLabel " , " segmentOptionLabel " , Loc [ " STRING_PLUGIN_SEGMENTTYPE " ] )
window.segmentOptionLabel : SetPoint ( 10 , - 15 )
local onSelectSegmentType = function ( _ , child , thistype )
child.options . segmentType = thistype
PSegment : Change ( )
end
local segmentTypes = {
{ value = 1 , label = Loc [ " STRING_PLUGIN_SEGMENTTYPE_1 " ] , onclick = onSelectSegmentType , icon = [[Interface\ICONS\Ability_Rogue_KidneyShot]] } ,
{ value = 2 , label = Loc [ " STRING_PLUGIN_SEGMENTTYPE_2 " ] , onclick = onSelectSegmentType , icon = [[Interface\ICONS\Achievement_Boss_Ra_Den]] } ,
{ value = 3 , label = Loc [ " STRING_PLUGIN_SEGMENTTYPE_3 " ] , onclick = onSelectSegmentType , icon = [[Interface\ICONS\Achievement_Boss_Durumu]] } ,
}
_detalhes.gump : NewDropDown ( window , nil , " $parentSegmentTypeDropdown " , " segmentTypeDropdown " , 200 , 20 , function ( ) return segmentTypes end , 1 ) -- func, default
window.segmentTypeDropdown : SetPoint ( " left " , window.segmentOptionLabel , " right " , 2 )
-----------------------------------------------------------------------------------------------------------------------------
--now we insert all widgets created on widgets table
table.insert ( widgets , window.segmentOptionLabel )
table.insert ( widgets , window.segmentTypeDropdown )
--after first call we replace this function with widgets table
PSegment.ExtraOptions = widgets
end
--ExtraOptionsOnOpen is called when options are opened and plugin have custom options
--here we setup options widgets for get the values of clicked child and also for tell options window what child we are configuring
function PSegment : ExtraOptionsOnOpen ( child )
_G.DetailsStatusBarOptions2SegmentTypeDropdown . MyObject : SetFixedParameter ( child )
_G.DetailsStatusBarOptions2SegmentTypeDropdown . MyObject : Select ( child.options . segmentType , true )
end
--Create Plugin Frames (must have)
function PSegment : CreateChildObject ( instance )
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsPSegmentInstance " .. instance : GetInstanceId ( ) , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , PSegment , myframe )
new_child.options . segmentType = new_child.options . segmentType or 2
return new_child
end
--Install
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_PSEGMENTNAME " ] , " Interface \\ Icons \\ inv_misc_enchantedscroll " , PSegment , " DETAILS_STATUSBAR_PLUGIN_PSEGMENT " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
--Register needed events
_detalhes : RegisterEvent ( PSegment , " DETAILS_INSTANCE_CHANGESEGMENT " , PSegment.OnSegmentChange )
_detalhes : RegisterEvent ( PSegment , " DETAILS_DATA_RESET " , PSegment.Change )
_detalhes : RegisterEvent ( PSegment , " COMBAT_PLAYER_ENTER " , PSegment.NewCombat )
end
---------BUILT-IN ATTRIBUTE PLUGIN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
--Create the plugin Object
local PAttribute = _detalhes : NewPluginObject ( " Details_Attribute " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--Handle events (must have)
function PAttribute : OnDetailsEvent ( event )
return
end
function PAttribute : Change ( instance , attribute , subAttribute )
if ( not instance ) then
instance , attribute , subAttribute = self.instance , self.instance . atributo , self.instance . sub_atributo
end
for index , child in ipairs ( PAttribute.childs ) do
if ( child.instance == instance and child.enabled and child.instance : IsEnabled ( ) ) then
local sName = child.instance : GetInstanceAttributeText ( )
child.text : SetText ( sName )
end
end
end
function PAttribute : OnEnable ( )
self : Change ( )
end
--Create Plugin Frames (must have)
function PAttribute : CreateChildObject ( instance )
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsPAttributeInstance " .. instance : GetInstanceId ( ) , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , PAttribute , myframe )
return new_child
end
--Install
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_PATTRIBUTENAME " ] , " Interface \\ Icons \\ inv_misc_emberclothbolt " , PAttribute , " DETAILS_STATUSBAR_PLUGIN_PATTRIBUTE " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
--Register needed events
_detalhes : RegisterEvent ( PAttribute , " DETAILS_INSTANCE_CHANGEATTRIBUTE " , PAttribute.Change )
end
---------BUILT-IN CLOCK PLUGIN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
--Create the plugin Object
local Clock = _detalhes : NewPluginObject ( " Details_Clock " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--Handle events --must have this function
function Clock : OnDetailsEvent ( event )
return
end
--enter combat
function Clock : PlayerEnterCombat ( )
Clock.tick = _detalhes : ScheduleRepeatingTimer ( " ClockPluginTick " , 1 )
end
--leave combat
function Clock : PlayerLeaveCombat ( )
_detalhes : CancelTimer ( Clock.tick )
end
function _detalhes : ClockPluginTickOnSegment ( )
_detalhes : ClockPluginTick ( true )
end
--1 sec tick
function _detalhes : ClockPluginTick ( force )
for index , child in ipairs ( Clock.childs ) do
local instance = child.instance
if ( child.enabled and instance : IsEnabled ( ) ) then
if ( instance.showing and ( ( instance.segmento ~= - 1 ) or ( instance.segmento == - 1 and not _detalhes.in_combat ) or force ) ) then
local timeType = child.options . timeType
if ( timeType == 1 ) then
local combatTime = instance.showing : GetCombatTime ( )
local minutos , segundos = _math_floor ( combatTime / 60 ) , _math_floor ( combatTime % 60 )
child.text : SetText ( minutos .. " m " .. segundos .. " s " )
elseif ( timeType == 2 ) then
local combatTime = instance.showing : GetCombatTime ( )
child.text : SetText ( combatTime .. " s " )
elseif ( timeType == 3 ) then
local getSegment = instance.segmento
if ( getSegment < 1 ) then
getSegment = 1
elseif ( getSegment > _detalhes.segments_amount ) then
getSegment = _detalhes.segments_amount
else
getSegment = getSegment + 1
end
local lastFight = _detalhes : GetCombat ( getSegment )
local currentCombatTime = instance.showing : GetCombatTime ( )
if ( lastFight ) then
child.text : SetText ( currentCombatTime - lastFight : GetCombatTime ( ) .. " s " )
else
child.text : SetText ( currentCombatTime .. " s " )
end
end
end
end
end
end
--on reset
function Clock : DataReset ( )
for index , child in ipairs ( Clock.childs ) do
if ( child.enabled and child.instance : IsEnabled ( ) ) then
child.text : SetText ( " 0m 0s " )
end
end
end
--this is a fixed member, put all your widgets for custom options inside this function
--if ExtraOptions isn't preset, secondary options box will be hided and only default options will be show
function Clock : ExtraOptions ( )
--all widgets need to be placed on a table
local widgets = { }
--reference of extra window for custom options
local window = _G.DetailsStatusBarOptions2 . MyObject
--build all your widgets -----------------------------------------------------------------------------------------------------------------------------
_detalhes.gump : NewLabel ( window , nil , " $parentClockTypeLabel " , " ClockTypeLabel " , Loc [ " STRING_PLUGIN_CLOCKTYPE " ] )
window.ClockTypeLabel : SetPoint ( 10 , - 15 )
local onSelectClockType = function ( _ , child , thistype )
child.options . timeType = thistype
_detalhes : ClockPluginTick ( )
end
local clockTypes = { { value = 1 , label = Loc [ " STRING_PLUGIN_MINSEC " ] , onclick = onSelectClockType } ,
{ value = 2 , label = Loc [ " STRING_PLUGIN_SECONLY " ] , onclick = onSelectClockType } ,
{ value = 3 , label = Loc [ " STRING_PLUGIN_TIMEDIFF " ] , onclick = onSelectClockType } }
_detalhes.gump : NewDropDown ( window , nil , " $parentClockTypeDropdown " , " ClockTypeDropdown " , 200 , 20 , function ( ) return clockTypes end , 1 ) -- func, default
window.ClockTypeDropdown : SetPoint ( " left " , window.ClockTypeLabel , " right " , 2 )
-----------------------------------------------------------------------------------------------------------------------------
--now we insert all widgets created on widgets table
table.insert ( widgets , window.ClockTypeLabel )
table.insert ( widgets , window.ClockTypeDropdown )
--after first call we replace this function with widgets table
Clock.ExtraOptions = widgets
end
--ExtraOptionsOnOpen is called when options are opened and plugin have custom options
--here we setup options widgets for get the values of clicked child and also for tell options window what child we are configuring
function Clock : ExtraOptionsOnOpen ( child )
_G.DetailsStatusBarOptions2ClockTypeDropdown . MyObject : SetFixedParameter ( child )
_G.DetailsStatusBarOptions2ClockTypeDropdown . MyObject : Select ( child.options . timeType , true )
end
--Create Plugin Frames
function Clock : CreateChildObject ( instance )
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsClockInstance " .. instance : GetInstanceId ( ) , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
--we place custom frame, widgets inside this function
--local texture = myframe:CreateTexture(nil, "overlay")
--texture:SetTexture("Interface\\AddOns\\Details\\images\\clock")
--texture:SetPoint("right", myframe.text.widget, "left")
--myframe.texture = texture
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , Clock , myframe )
--default text
new_child.text : SetText ( " 0m 0s " )
--some changes from default options
if ( new_child.options . textXMod == 0 ) then
new_child.options . textXMod = 6
end
--here we are adding a new option member
new_child.options . timeType = new_child.options . timeType or 1
return new_child
end
--Install
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_CLOCKNAME " ] , " Interface \\ Icons \\ Achievement_BG_grab_cap_flagunderXseconds " , Clock , " DETAILS_STATUSBAR_PLUGIN_CLOCK " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
--Register needed events
_detalhes : RegisterEvent ( Clock , " COMBAT_PLAYER_ENTER " , Clock.PlayerEnterCombat )
_detalhes : RegisterEvent ( Clock , " COMBAT_PLAYER_LEAVE " , Clock.PlayerLeaveCombat )
_detalhes : RegisterEvent ( Clock , " DETAILS_INSTANCE_CHANGESEGMENT " , _detalhes.ClockPluginTickOnSegment )
_detalhes : RegisterEvent ( Clock , " DETAILS_DATA_SEGMENTREMOVED " , _detalhes.ClockPluginTick )
_detalhes : RegisterEvent ( Clock , " DETAILS_DATA_RESET " , Clock.DataReset )
end
---------BUILT-IN THREAT PLUGIN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
local _UnitDetailedThreatSituation = UnitDetailedThreatSituation --wow api
local _cstr = string.format --lua api
local abs = math.abs --lua api
--Create the plugin Object
local Threat = _detalhes : NewPluginObject ( " Details_TargetThreat " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--Handle events
function Threat : OnDetailsEvent ( event )
return
end
Threat.isTank = nil
function Threat : PlayerEnterCombat ( )
local role = UnitGroupRolesAssigned ( " player " )
if ( role == " TANK " ) then
Threat.isTank = true
else
Threat.isTank = nil
end
Threat.tick = _detalhes : ScheduleRepeatingTimer ( " ThreatPluginTick " , 1 )
end
function Threat : PlayerLeaveCombat ( )
_detalhes : CancelTimer ( Threat.tick )
end
function _detalhes : ThreatPluginTick ( )
for index , child in ipairs ( Threat.childs ) do
local instance = child.instance
if ( child.enabled and instance : IsEnabled ( ) ) then
-- atualiza a threat
if ( not DetailsFramework.IsClassicWow ( ) ) then
local isTanking , status , threatpct , rawthreatpct , threatvalue = _UnitDetailedThreatSituation ( " player " , " target " )
if ( threatpct ) then
child.text : SetText ( _math_floor ( threatpct ) .. " % " )
if ( Threat.isTank ) then
child.text : SetTextColor ( abs ( threatpct - 100 ) * 0.01 , threatpct * 0.01 , 0 , 1 )
else
child.text : SetTextColor ( threatpct * 0.01 , abs ( threatpct - 100 ) * 0.01 , 0 , 1 )
end
else
child.text : SetText ( " 0% " )
child.text : SetTextColor ( 1 , 1 , 1 , 1 )
end
else
child.text : SetText ( " 0% " )
child.text : SetTextColor ( 1 , 1 , 1 , 1 )
end
end
end
end
--Create Plugin Frames
function Threat : CreateChildObject ( instance )
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsThreatInstance " .. instance : GetInstanceId ( ) , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , Threat , myframe )
myframe.widget : RegisterEvent ( " PLAYER_TARGET_CHANGED " )
myframe.widget : SetScript ( " OnEvent " , function ( )
_detalhes : ThreatPluginTick ( )
end )
return new_child
end
--Install
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_THREATNAME " ] , " Interface \\ Icons \\ Ability_Hunter_ResistanceIsFutile " , Threat , " DETAILS_STATUSBAR_PLUGIN_THREAT " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
--Register needed events
_detalhes : RegisterEvent ( Threat , " COMBAT_PLAYER_ENTER " , Threat.PlayerEnterCombat )
_detalhes : RegisterEvent ( Threat , " COMBAT_PLAYER_LEAVE " , Threat.PlayerLeaveCombat )
end
---------BUILT-IN PFS PLUGIN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
--Create the plugin Object
local PFps = _detalhes : NewPluginObject ( " Details_Statusbar_Fps " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--Handle events (must have)
function PFps : OnDetailsEvent ( event )
return
end
function PFps : UpdateFps ( )
self.text : SetText ( _math_floor ( GetFramerate ( ) ) .. " fps " )
end
function PFps : OnDisable ( )
self : CancelTimer ( self.srt , true )
end
function PFps : OnEnable ( )
self.srt = self : ScheduleRepeatingTimer ( " UpdateFps " , 1 , self )
self : UpdateFps ( )
end
function PFps : CreateChildObject ( instance )
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsPFpsInstance " .. instance : GetInstanceId ( ) , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , PFps , myframe )
return new_child
end
--Install
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_FPS " ] , " Interface \\ Icons \\ Spell_Shadow_MindTwisting " , PFps , " DETAILS_STATUSBAR_PLUGIN_PFPS " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
end
---------BUILT-IN LATENCY PLUGIN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
--Create the plugin Object
local PLatency = _detalhes : NewPluginObject ( " Details_Statusbar_Latency " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--Handle events (must have)
function PLatency : OnDetailsEvent ( event )
return
end
function PLatency : UpdateLatency ( )
local _ , _ , _ , lagWorld = GetNetStats ( )
self.text : SetText ( _math_floor ( lagWorld ) .. " ms " )
end
function PLatency : OnDisable ( )
self : CancelTimer ( self.srt , true )
end
function PLatency : OnEnable ( )
self.srt = self : ScheduleRepeatingTimer ( " UpdateLatency " , 30 , self )
self : UpdateLatency ( )
end
function PLatency : CreateChildObject ( instance )
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsPLatencyInstance " .. instance : GetInstanceId ( ) , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , PLatency , myframe )
return new_child
end
--Install
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_LATENCY " ] , " Interface \\ FriendsFrame \\ PlusManz-BattleNet " , PLatency , " DETAILS_STATUSBAR_PLUGIN_PLATENCY " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
end
---------BUILT-IN DURABILITY PLUGIN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
local _GetInventoryItemDurability = GetInventoryItemDurability
--Create the plugin Object
local PDurability = _detalhes : NewPluginObject ( " Details_Statusbar_Latency " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--Handle events (must have)
function PDurability : OnDetailsEvent ( event )
return
end
function PDurability : UpdateDurability ( )
local percent , items = 0 , 0
for i = INVSLOT_FIRST_EQUIPPED , INVSLOT_LAST_EQUIPPED do
local durability , maxdurability = _GetInventoryItemDurability ( i )
if ( durability and maxdurability ) then
local p = durability / maxdurability * 100
percent = percent + p
items = items + 1
end
end
if ( items == 0 ) then
self.text : SetText ( Loc [ " STRING_UPTADING " ] )
return self : ScheduleTimer ( " UpdateDurability " , 5 , self )
end
percent = percent / items
self.text : SetText ( _math_floor ( percent ) .. " % " )
end
function PDurability : OnDisable ( )
self.frame . widget : UnregisterEvent ( " PLAYER_DEAD " )
self.frame . widget : UnregisterEvent ( " PLAYER_UNGHOST " )
self.frame . widget : UnregisterEvent ( " UPDATE_INVENTORY_DURABILITY " )
self.frame . widget : UnregisterEvent ( " MERCHANT_SHOW " )
self.frame . widget : UnregisterEvent ( " MERCHANT_CLOSED " )
self.frame . widget : UnregisterEvent ( " ZONE_CHANGED_NEW_AREA " )
end
function PDurability : OnEnable ( )
self.frame . widget : RegisterEvent ( " PLAYER_DEAD " )
self.frame . widget : RegisterEvent ( " PLAYER_UNGHOST " )
self.frame . widget : RegisterEvent ( " UPDATE_INVENTORY_DURABILITY " )
self.frame . widget : RegisterEvent ( " MERCHANT_SHOW " )
self.frame . widget : RegisterEvent ( " MERCHANT_CLOSED " )
self.frame . widget : RegisterEvent ( " ZONE_CHANGED_NEW_AREA " )
self : UpdateDurability ( )
end
function PDurability : CreateChildObject ( instance )
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsPDurabilityInstance " .. instance : GetInstanceId ( ) , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , PDurability , myframe )
local texture = myframe : CreateTexture ( nil , " overlay " )
texture : SetTexture ( " Interface \\ AddOns \\ Details \\ images \\ icons " )
texture : SetPoint ( " right " , myframe.text . widget , " left " , - 2 , - 1 )
texture : SetWidth ( 10 )
texture : SetHeight ( 10 )
texture : SetTexCoord ( 0.216796875 , 0.26171875 , 0.0078125 , 0.052734375 )
myframe.texture = texture
myframe.widget : SetScript ( " OnEvent " , function ( )
new_child : UpdateDurability ( )
end )
return new_child
end
--Install
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_DURABILITY " ] , " Interface \\ ICONS \\ INV_Chest_Chain_10 " , PDurability , " DETAILS_STATUSBAR_PLUGIN_PDURABILITY " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
end
---------BUILT-IN GOLD PLUGIN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
--Create the plugin Object
local PGold = _detalhes : NewPluginObject ( " Details_Statusbar_Gold " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--Handle events (must have)
function PGold : OnDetailsEvent ( event )
return
end
function PGold : GoldPluginTick ( )
for index , child in ipairs ( PGold.childs ) do
local instance = child.instance
if ( child.enabled and instance : IsEnabled ( ) ) then
child : UpdateGold ( )
end
end
end
function PGold : UpdateGold ( )
self.text : SetText ( _math_floor ( GetMoney ( ) / 100 / 100 ) )
end
function PGold : OnEnable ( )
self : UpdateGold ( )
end
function PGold : CreateChildObject ( instance )
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsPGoldInstance " .. instance : GetInstanceId ( ) , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , PGold , myframe )
local texture = myframe : CreateTexture ( nil , " overlay " )
texture : SetTexture ( " Interface \\ MONEYFRAME \\ UI-GoldIcon " )
texture : SetPoint ( " right " , myframe.text . widget , " left " )
texture : SetWidth ( 12 )
texture : SetHeight ( 12 )
myframe.texture = texture
myframe.widget : RegisterEvent ( " PLAYER_MONEY " )
myframe.widget : RegisterEvent ( " PLAYER_ENTERING_WORLD " )
myframe.widget : SetScript ( " OnEvent " , function ( event )
if ( event == " PLAYER_ENTERING_WORLD " ) then
return PGold : ScheduleTimer ( " GoldPluginTick " , 10 )
end
PGold : GoldPluginTick ( )
end )
return new_child
end
--Install
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_GOLD " ] , " Interface \\ Icons \\ INV_Ore_Gold_01 " , PGold , " DETAILS_STATUSBAR_PLUGIN_PGold " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
end
---------BUILT-IN TIME PLUGIN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
--Create the plugin Object
local PTime = _detalhes : NewPluginObject ( " Details_Statusbar_Time " , DETAILSPLUGIN_ALWAYSENABLED , " STATUSBAR " )
--Handle events (must have)
function PTime : OnDetailsEvent ( event )
return
end
function PTime : UpdateClock ( )
if ( self.options . timeType == 1 ) then
self.text : SetText ( date ( " %I:%M %p " ) )
elseif ( self.options . timeType == 2 ) then
self.text : SetText ( date ( " %H:%M " ) )
end
end
function PTime : OnDisable ( )
self : CancelTimer ( self.srt , true )
end
function PTime : OnEnable ( )
self.srt = self : ScheduleRepeatingTimer ( " UpdateClock " , 60 , self )
self : UpdateClock ( )
end
function PTime : ExtraOptions ( )
--all widgets need to be placed on a table
local widgets = { }
--reference of extra window for custom options
local window = _G.DetailsStatusBarOptions2 . MyObject
--build all your widgets -----------------------------------------------------------------------------------------------------------------------------
_detalhes.gump : NewLabel ( window , _ , " $parentTimeTypeLabel " , " TimeTypeLabel " , Loc [ " STRING_PLUGIN_CLOCKTYPE " ] )
window.TimeTypeLabel : SetPoint ( 10 , - 15 )
local onSelectClockType = function ( _ , child , thistype )
child.options . timeType = thistype
child : UpdateClock ( )
end
local clockTypes = { { value = 1 , label = date ( " %I:%M %p " ) , onclick = onSelectClockType } ,
{ value = 2 , label = date ( " %H:%M " ) , onclick = onSelectClockType }
}
_detalhes.gump : NewDropDown ( window , _ , " $parentTimeTypeDropdown " , " TimeTypeDropdown " , 200 , 20 , function ( ) return clockTypes end , 1 ) -- func, default
window.TimeTypeDropdown : SetPoint ( " left " , window.TimeTypeLabel , " right " , 2 )
-----------------------------------------------------------------------------------------------------------------------------
--now we insert all widgets created on widgets table
table.insert ( widgets , window.TimeTypeLabel )
table.insert ( widgets , window.TimeTypeDropdown )
--after first call we replace this function with widgets table
PTime.ExtraOptions = widgets
end
--ExtraOptionsOnOpen is called when options are opened and plugin have custom options
--here we setup options widgets for get the values of clicked child and also for tell options window what child we are configuring
function PTime : ExtraOptionsOnOpen ( child )
_G.DetailsStatusBarOptions2TimeTypeDropdown . MyObject : SetFixedParameter ( child )
_G.DetailsStatusBarOptions2TimeTypeDropdown . MyObject : Select ( child.options . timeType , true )
end
--Create Plugin Frames (must have)
function PTime : CreateChildObject ( instance )
local myframe = _detalhes.StatusBar : CreateChildFrame ( instance , " DetailsPTimeInstance " .. instance : GetInstanceId ( ) , DEFAULT_CHILD_WIDTH , DEFAULT_CHILD_HEIGHT )
local new_child = _detalhes.StatusBar : CreateChildTable ( instance , PTime , myframe )
new_child.options . timeType = new_child.options . timeType or 1
return new_child
end
--Install
local install = _detalhes : InstallPlugin ( " STATUSBAR " , Loc [ " STRING_PLUGIN_TIME " ] , " Interface \\ Icons \\ Spell_Shadow_LastingAfflictions " , PTime , " DETAILS_STATUSBAR_PLUGIN_PTIME " )
if ( type ( install ) == " table " and install.error ) then
print ( install.errortext )
return
end
end
---------default options panel ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
local window = _detalhes.gump : NewPanel ( UIParent , nil , " DetailsStatusBarOptions " , nil , 300 , 180 )
tinsert ( UISpecialFrames , " DetailsStatusBarOptions " )
window : SetPoint ( " center " , UIParent , " center " )
window.locked = false
window.close_with_right = true
window.child = nil
window.instance = nil
window : SetFrameStrata ( " FULLSCREEN " )
DetailsFramework : ApplyStandardBackdrop ( window )
--window:SetBackdrop({bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 16, edgeFile = [[Interface\AddOns\Details\images\border_2]], edgeSize=12})
--window:SetBackdropColor(0, 0, 0, 0.9)
local extraWindow = _detalhes.gump : NewPanel ( window , nil , " DetailsStatusBarOptions2 " , " extra " , 300 , 180 )
extraWindow : SetPoint ( " left " , window , " right " )
extraWindow.close_with_right = true
extraWindow.locked = false
extraWindow : Hide ( )
DetailsFramework : ApplyStandardBackdrop ( extraWindow )
extraWindow : SetHook ( " OnHide " , function ( )
window : Hide ( )
end )
--text style
_detalhes.gump : NewLabel ( window , _ , " $parentTextStyleLabel " , " textstyle " , Loc [ " STRING_PLUGINOPTIONS_TEXTSTYLE " ] )
window.textstyle : SetPoint ( 10 , - 15 )
local onSelectTextStyle = function ( _ , child , style )
window.instance . StatusBar.left . options.textStyle = style
window.instance . StatusBar.center . options.textStyle = style
window.instance . StatusBar.right . options.textStyle = style
if ( window.instance . StatusBar.left . Refresh and type ( window.instance . StatusBar.left . Refresh ) == " function " ) then
window.instance . StatusBar.left : Refresh ( window.instance . StatusBar.left )
end
if ( window.instance . StatusBar.center . Refresh and type ( window.instance . StatusBar.center . Refresh ) == " function " ) then
window.instance . StatusBar.center : Refresh ( window.instance . StatusBar.center )
end
if ( window.instance . StatusBar.right . Refresh and type ( window.instance . StatusBar.right . Refresh ) == " function " ) then
window.instance . StatusBar.right : Refresh ( window.instance . StatusBar.right )
end
end
local textStyle = { { value = 1 , label = Loc [ " STRING_PLUGINOPTIONS_ABBREVIATE " ] .. " (105.5K) " , onclick = onSelectTextStyle } ,
{ value = 2 , label = Loc [ " STRING_PLUGINOPTIONS_COMMA " ] .. " (105.500) " , onclick = onSelectTextStyle } ,
{ value = 3 , label = Loc [ " STRING_PLUGINOPTIONS_NOFORMAT " ] .. " (105500) " , onclick = onSelectTextStyle } }
_detalhes.gump : NewDropDown ( window , _ , " $parentTextStyleDropdown " , " textstyleDropdown " , 200 , 20 , function ( ) return textStyle end , 1 ) -- func, default
window.textstyleDropdown : SetPoint ( " left " , window.textstyle , " right " , 2 )
--text color
_detalhes.gump : NewLabel ( window , _ , " $parentTextColorLabel " , " textcolor " , Loc [ " STRING_PLUGINOPTIONS_TEXTCOLOR " ] )
window.textcolor : SetPoint ( 10 , - 35 )
local selectedColor = function ( )
local r , g , b , a = ColorPickerFrame : GetColorRGB ( )
window.textcolortexture : SetTexture ( r , g , b , a )
--_detalhes.StatusBar:ApplyOptions (window.child, "textcolor", {r, g, b, a})
local color = { r , g , b , a }
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.left , " textcolor " , color )
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.center , " textcolor " , color )
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.right , " textcolor " , color )
end
local canceledColor = function ( )
local r , g , b , a = unpack ( ColorPickerFrame.previousValues )
window.textcolortexture : SetTexture ( r , g , b , a )
local color = { r , g , b , a }
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.left , " textcolor " , color )
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.center , " textcolor " , color )
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.right , " textcolor " , color )
end
local colorpick = function ( )
ColorPickerFrame.func = selectedColor
ColorPickerFrame.cancelFunc = canceledColor
ColorPickerFrame.opacityFunc = nil
ColorPickerFrame.hasOpacity = false
ColorPickerFrame.previousValues = window.child . options.textColor
ColorPickerFrame : SetParent ( window.widget )
ColorPickerFrame : SetColorRGB ( unpack ( window.child . options.textColor ) )
ColorPickerFrame : Show ( )
end
_detalhes.gump : NewImage ( window , nil , 160 , 16 , nil , nil , " textcolortexture " , " $parentTextColorTexture " )
window.textcolortexture : SetPoint ( " left " , window.textcolor , " right " , 2 )
window.textcolortexture : SetTexture ( 1 , 1 , 1 )
_detalhes.gump : NewButton ( window , _ , " $parentTextColorButton " , " textcolorbutton " , 160 , 20 , colorpick )
window.textcolorbutton : SetPoint ( " left " , window.textcolor , " right " , 2 )
--window.textcolorbutton:InstallCustomTexture()
--text size
_detalhes.gump : NewLabel ( window , _ , " $parentFontSizeLabel " , " fonsizeLabel " , Loc [ " STRING_PLUGINOPTIONS_TEXTSIZE " ] )
window.fonsizeLabel : SetPoint ( 10 , - 55 )
--
_detalhes.gump : NewSlider ( window , _ , " $parentSliderFontSize " , " fonsizeSlider " , 170 , 20 , 7 , 20 , 1 , 1 )
window.fonsizeSlider : SetPoint ( " left " , window.fonsizeLabel , " right " , 2 )
window.fonsizeSlider : SetThumbSize ( 50 )
--window.fonsizeSlider.useDecimals = true
window.fonsizeSlider : SetHook ( " OnValueChange " , function ( self , child , amount )
--_detalhes.StatusBar:ApplyOptions (child, "textsize", amount)
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.left , " textsize " , amount )
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.center , " textsize " , amount )
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.right , " textsize " , amount )
end )
--text font
local onSelectFont = function ( _ , child , fontName )
--_detalhes.StatusBar:ApplyOptions (child, "textface", fontName)
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.left , " textface " , fontName )
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.center , " textface " , fontName )
_detalhes.StatusBar : ApplyOptions ( window.instance . StatusBar.right , " textface " , fontName )
end
local buildFontMenu = function ( )
local fontObjects = SharedMedia : HashTable ( " font " )
local fontTable = { }
for name , fontPath in pairs ( fontObjects ) do
fontTable [ # fontTable + 1 ] = { value = name , label = name , onclick = onSelectFont , font = fontPath }
end
return fontTable
end
_detalhes.gump : NewLabel ( window , _ , " $parentFontFaceLabel " , " fontfaceLabel " , Loc [ " STRING_PLUGINOPTIONS_FONTFACE " ] )
window.fontfaceLabel : SetPoint ( 10 , - 75 )
--
_detalhes.gump : NewDropDown ( window , _ , " $parentFontDropdown " , " fontDropdown " , 170 , 20 , buildFontMenu , nil )
window.fontDropdown : SetPoint ( " left " , window.fontfaceLabel , " right " , 2 )
window : Hide ( )
--align mod X
_detalhes.gump : NewLabel ( window , _ , " $parentAlignXLabel " , " alignXLabel " , Loc [ " STRING_PLUGINOPTIONS_TEXTALIGN_X " ] )
window.alignXLabel : SetPoint ( 10 , - 115 )
--
_detalhes.gump : NewSlider ( window , _ , " $parentSliderAlignX " , " alignXSlider " , 160 , 20 , - 20 , 20 , 1 , 0 )
window.alignXSlider : SetPoint ( " left " , window.alignXLabel , " right " , 2 )
window.alignXSlider : SetThumbSize ( 40 )
window.alignXSlider : SetHook ( " OnValueChange " , function ( self , child , amount )
_detalhes.StatusBar : ApplyOptions ( child , " textxmod " , amount )
end )
--align modY
_detalhes.gump : NewLabel ( window , _ , " $parentAlignYLabel " , " alignYLabel " , Loc [ " STRING_PLUGINOPTIONS_TEXTALIGN_Y " ] )
window.alignYLabel : SetPoint ( 10 , - 135 )
--
_detalhes.gump : NewSlider ( window , _ , " $parentSliderAlignY " , " alignYSlider " , 160 , 20 , - 10 , 10 , 1 , 0 )
window.alignYSlider : SetPoint ( " left " , window.alignYLabel , " right " , 2 )
window.alignYSlider : SetThumbSize ( 40 )
window.alignYSlider : SetHook ( " OnValueChange " , function ( self , child , amount )
_detalhes.StatusBar : ApplyOptions ( child , " textymod " , amount )
end )
--right click to close
local c = window : CreateRightClickLabel ( " short " )
c : SetPoint ( " bottomleft " , window , " bottomleft " , 8 , 5 )
--open options
function _detalhes . StatusBar : OpenOptionsForChild ( child )
window.child = child
window.instance = child.instance
_G.DetailsStatusBarOptionsTextStyleDropdown . MyObject : Select ( child.options . textStyle , true )
_G.DetailsStatusBarOptionsTextColorTexture : SetColorTexture ( child.options . textColor [ 1 ] , child.options . textColor [ 2 ] , child.options . textColor [ 3 ] , child.options . textColor [ 4 ] )
_G.DetailsStatusBarOptionsSliderFontSize . MyObject : SetFixedParameter ( child )
_G.DetailsStatusBarOptionsSliderFontSize . MyObject : SetValue ( child.options . textSize )
_G.DetailsStatusBarOptionsFontDropdown . MyObject : SetFixedParameter ( child )
_G.DetailsStatusBarOptionsFontDropdown . MyObject : Select ( child.options . textFace )
_G.DetailsStatusBarOptionsSliderAlignX . MyObject : SetFixedParameter ( child )
_G.DetailsStatusBarOptionsSliderAlignX . MyObject : SetValue ( child.options . textXMod )
_G.DetailsStatusBarOptionsSliderAlignY . MyObject : SetFixedParameter ( child )
_G.DetailsStatusBarOptionsSliderAlignY . MyObject : SetValue ( child.options . textYMod )
_G.DetailsStatusBarOptions : Show ( )
if ( child.ExtraOptions ) then
if ( type ( child.ExtraOptions ) == " function " ) then
child.ExtraOptions ( )
end
extraWindow : HideWidgets ( )
for _ , widget in pairs ( child.ExtraOptions ) do
widget : Show ( )
end
child : ExtraOptionsOnOpen ( child )
extraWindow : Show ( )
else
extraWindow : Hide ( )
end
end