You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1591 lines
56 KiB
1591 lines
56 KiB
|
5 years ago
|
local AceLocale = LibStub ("AceLocale-3.0")
|
||
|
|
local Loc = AceLocale:GetLocale ("Details_ChartViewer")
|
||
|
|
|
||
|
|
local _math_floor = math.floor
|
||
|
|
local _cstr = string.format
|
||
|
|
local _string_len = string.len
|
||
|
|
local UnitGroupRolesAssigned = UnitGroupRolesAssigned
|
||
|
|
local ipairs = ipairs
|
||
|
|
|
||
|
|
--> Create the plugin Object
|
||
|
|
local ChartViewer = _detalhes:NewPluginObject ("Details_ChartViewer", DETAILSPLUGIN_ALWAYSENABLED)
|
||
|
|
--> Main Frame
|
||
|
|
local CVF = ChartViewer.Frame
|
||
|
|
|
||
|
|
--> desc
|
||
|
|
ChartViewer:SetPluginDescription (Loc ["STRING_PLUGIN_DESC"])
|
||
|
|
|
||
|
|
local plugin_version = "v2.90"
|
||
|
|
|
||
|
|
local function CreatePluginFrames (data)
|
||
|
|
|
||
|
|
-- ChartViewerWindowFrame:SetBackdrop (_detalhes.PluginDefaults and _detalhes.PluginDefaults.Backdrop or {bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16,
|
||
|
|
-- edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1,
|
||
|
|
-- insets = {left = 1, right = 1, top = 1, bottom = 1}})
|
||
|
|
-- ChartViewerWindowFrame:SetBackdropColor (unpack (_detalhes.PluginDefaults and _detalhes.PluginDefaults.BackdropColor or {0, 0, 0, .6}))
|
||
|
|
-- ChartViewerWindowFrame:SetBackdropBorderColor (unpack (_detalhes.PluginDefaults and _detalhes.PluginDefaults.BackdropBorderColor or {0, 0, 0, 1}))
|
||
|
|
|
||
|
|
ChartViewerWindowFrame.bg1 = ChartViewerWindowFrame:CreateTexture (nil, "background")
|
||
|
|
ChartViewerWindowFrame.bg1:SetTexture ([[Interface\AddOns\Details\images\background]], true)
|
||
|
|
ChartViewerWindowFrame.bg1:SetAlpha (0.7)
|
||
|
|
ChartViewerWindowFrame.bg1:SetVertexColor (0.27, 0.27, 0.27)
|
||
|
|
ChartViewerWindowFrame.bg1:SetVertTile (true)
|
||
|
|
ChartViewerWindowFrame.bg1:SetHorizTile (true)
|
||
|
|
ChartViewerWindowFrame.bg1:SetAllPoints()
|
||
|
|
|
||
|
|
local c = CreateFrame ("Button", "ChartViewerWindowFrameCloseButton", ChartViewerWindowFrame, "UIPanelCloseButton")
|
||
|
|
c:SetWidth (20)
|
||
|
|
c:SetHeight (20)
|
||
|
|
c:SetPoint ("TOPRIGHT", ChartViewerWindowFrame, "TOPRIGHT", -2, -3)
|
||
|
|
c:SetFrameLevel (ChartViewerWindowFrame:GetFrameLevel()+1)
|
||
|
|
c:GetNormalTexture():SetDesaturated (true)
|
||
|
|
c:SetAlpha (1)
|
||
|
|
|
||
|
|
function ChartViewer:OnDetailsEvent (event)
|
||
|
|
|
||
|
|
if (event == "HIDE") then
|
||
|
|
--> in case the welcome is shown when hiding the main panel
|
||
|
|
if (ChartViewer.welcome_panel) then
|
||
|
|
ChartViewer.welcome_panel:Hide()
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (event == "SHOW") then
|
||
|
|
if (not ChartViewerWindowFrame.OptionsButton) then
|
||
|
|
local options = ChartViewer:GetFramework():NewButton (ChartViewerWindowFrame, nil, "$parentOptionsButton", "OptionsButton", 120, 20, ChartViewer.OpenOptionsPanel, nil, nil, nil, "Options")
|
||
|
|
options:SetTextColor (1, 0.93, 0.74)
|
||
|
|
options:SetIcon ([[Interface\Buttons\UI-OptionsButton]], 14, 14, nil, {0, 1, 0, 1}, nil, 3)
|
||
|
|
options:SetPoint ("left", ChartViewer.NewTabButton, "right", 4, 0)
|
||
|
|
options:SetTemplate (ChartViewer:GetFramework():GetTemplate ("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE"))
|
||
|
|
options:SetFrameLevel (10)
|
||
|
|
end
|
||
|
|
|
||
|
|
ChartViewer:RefreshScale()
|
||
|
|
|
||
|
|
elseif (event == "PLUGIN_DISABLED") then
|
||
|
|
ChartViewer:HideButton()
|
||
|
|
|
||
|
|
elseif (event == "PLUGIN_ENABLED") then
|
||
|
|
ChartViewer:CanShowOrHideButton()
|
||
|
|
if (ChartViewerWindowFrame and ChartViewerWindowFrame:IsShown()) then
|
||
|
|
ChartViewer:RefreshScale()
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (event == "DETAILS_STARTED") then
|
||
|
|
--> craete icon
|
||
|
|
ChartViewer:CanShowOrHideButton()
|
||
|
|
|
||
|
|
elseif (event == "DETAILS_DATA_RESET") then
|
||
|
|
--ChartViewer:CanShowOrHideButton()
|
||
|
|
--ChartViewerWindowFrame:Hide()
|
||
|
|
|
||
|
|
elseif (event == "COMBAT_PLAYER_LEAVE") then
|
||
|
|
ChartViewer:CheckFor_CreateNewTabForCombat()
|
||
|
|
ChartViewer:CanShowOrHideButton()
|
||
|
|
|
||
|
|
elseif (event == "COMBAT_PLAYER_ENTER") then
|
||
|
|
ChartViewer:OnCombatEnter()
|
||
|
|
|
||
|
|
elseif (event == "COMBAT_CHARTTABLES_CREATING") then
|
||
|
|
--criar as data captures
|
||
|
|
for index, tab in ipairs (ChartViewer.tabs) do
|
||
|
|
if (tab.data and tab.data:find ("PRESET_")) then
|
||
|
|
ChartViewer:BuildAndAddPresetFunction (tab.data)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (event == "COMBAT_CHARTTABLES_CREATED") then
|
||
|
|
--apagar as data captures
|
||
|
|
for i = #_detalhes.savedTimeCaptures, 1, -1 do
|
||
|
|
local t = _detalhes.savedTimeCaptures [i]
|
||
|
|
if (t[1]:find ("PRESET_")) then
|
||
|
|
_detalhes:TimeDataUnregister (t[1])
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
----------> Check Combat
|
||
|
|
function ChartViewer:CheckFor_CreateNewTabForCombat()
|
||
|
|
|
||
|
|
if (not ChartViewer.db.options.auto_create) then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
local combat = ChartViewer:GetCurrentCombat()
|
||
|
|
if (combat) then
|
||
|
|
|
||
|
|
--verifica se o comnate era arena, verifica se tem uma aba pra arena.
|
||
|
|
if (combat.is_arena) then
|
||
|
|
local has_arena_tab = false
|
||
|
|
|
||
|
|
for _, tab in ChartViewer:GetAllTabs() do
|
||
|
|
if (tab.iType and tab.iType:find ("arena")) then
|
||
|
|
has_arena_tab = true
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--print ("IS ARENA COMBAT", has_arena_tab)
|
||
|
|
|
||
|
|
if (not has_arena_tab) then
|
||
|
|
--> auto create an arena tab (two actually)
|
||
|
|
local presets = ChartViewer:GetChartsForIType ("arena", true)
|
||
|
|
--print ("FOUND:", #presets, "presets.")
|
||
|
|
for _, preset_name in ipairs (presets) do
|
||
|
|
-- create chart for this preset
|
||
|
|
local internal_options = ChartViewer:GetInternalOptionsForChart (preset_name)
|
||
|
|
ChartViewer:CreateTab (internal_options.name, 1, preset_name, "line", internal_options, preset_name)
|
||
|
|
--print ("Auto Created Arena Tab:", preset_name)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (combat.is_boss) then
|
||
|
|
local has_raid_tab = false
|
||
|
|
local role = UnitGroupRolesAssigned ("player")
|
||
|
|
local iType = "raid-" .. role
|
||
|
|
|
||
|
|
for _, tab in ChartViewer:GetAllTabs() do
|
||
|
|
if (tab.iType and tab.iType == iType) then
|
||
|
|
has_raid_tab = true
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if (not has_raid_tab) then
|
||
|
|
local presets = ChartViewer:GetChartsForIType (iType)
|
||
|
|
for _, preset_name in ipairs (presets) do
|
||
|
|
-- create chart for this preset
|
||
|
|
local internal_options = ChartViewer:GetInternalOptionsForChart (preset_name)
|
||
|
|
ChartViewer:CreateTab (internal_options.name, 1, preset_name, "line", internal_options, preset_name)
|
||
|
|
--print ("Auto Created Raid Tab:", preset_name)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
----------> Tabs
|
||
|
|
local titlecase = function (first, rest)
|
||
|
|
return first:upper()..rest:lower()
|
||
|
|
end
|
||
|
|
|
||
|
|
--tab on enter
|
||
|
|
function ChartViewer:TabOnEnter (tab)
|
||
|
|
GameTooltip:SetOwner (tab, "ANCHOR_TOPLEFT")
|
||
|
|
local tabObject = DETAILS_PLUGIN_CHART_VIEWER:GetTab (tab.index)
|
||
|
|
GameTooltip:AddLine (tabObject.name)
|
||
|
|
GameTooltip:AddLine (tabObject.segment_type == 1 and "Current Segment" or "Last 5 Segments")
|
||
|
|
GameTooltip:AddLine (" ")
|
||
|
|
|
||
|
|
local chartData = tabObject.data
|
||
|
|
if (chartData:find ("MULTICHARTS~")) then --multichart
|
||
|
|
chartData = chartData:gsub ("MULTICHARTS~", "")
|
||
|
|
chartData = chartData:gsub ("~", ", ")
|
||
|
|
|
||
|
|
elseif (chartData:find ("_")) then --preset
|
||
|
|
chartData = chartData:gsub ("_", " ")
|
||
|
|
chartData = chartData:gsub ("(%a)([%w_']*)", titlecase)
|
||
|
|
chartData = chartData:gsub ("Preset", "Preset:")
|
||
|
|
end
|
||
|
|
|
||
|
|
GameTooltip:AddDoubleLine ("Chart:", chartData)
|
||
|
|
GameTooltip:Show()
|
||
|
|
tab.CloseButton:SetNormalTexture ("Interface\\Buttons\\UI-Panel-MinimizeButton-Up")
|
||
|
|
end
|
||
|
|
|
||
|
|
--new tab
|
||
|
|
ChartViewer.tab_prototype = {name = Loc ["STRING_NEWTAB"], segment_type = 1, data = "", texture = "line", version = "v2.0"}
|
||
|
|
|
||
|
|
function ChartViewer:GetAllTabs()
|
||
|
|
return ipairs (self.tabs)
|
||
|
|
end
|
||
|
|
|
||
|
|
function ChartViewer:GetTab (tabindex)
|
||
|
|
return self.tabs [tabindex]
|
||
|
|
end
|
||
|
|
|
||
|
|
function ChartViewer:CreateTab (tabname, segment_type, tabdata, tabtexture, extra_options, data_preset_name)
|
||
|
|
|
||
|
|
if (not tabname) then
|
||
|
|
return false
|
||
|
|
|
||
|
|
elseif (_string_len (tabname) < 2) then
|
||
|
|
ChartViewer:Msg (Loc ["STRING_TOOSHORTNAME"])
|
||
|
|
return false
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
if (not segment_type) then
|
||
|
|
segment_type = 1
|
||
|
|
end
|
||
|
|
|
||
|
|
if (tabname == Loc ["STRING_NEWTAB"] and data_preset_name and data_preset_name ~= "") then
|
||
|
|
tabname = data_preset_name
|
||
|
|
end
|
||
|
|
|
||
|
|
local new_tab = table_deepcopy (ChartViewer.tab_prototype)
|
||
|
|
new_tab.name = tabname
|
||
|
|
new_tab.segment_type = segment_type
|
||
|
|
new_tab.data = tabdata
|
||
|
|
new_tab.texture = tabtexture
|
||
|
|
new_tab.options = extra_options
|
||
|
|
|
||
|
|
if (extra_options) then
|
||
|
|
new_tab.iType = extra_options.iType
|
||
|
|
end
|
||
|
|
|
||
|
|
new_tab.iType = new_tab.iType or "NONE"
|
||
|
|
|
||
|
|
tinsert (ChartViewer.tabs, new_tab)
|
||
|
|
|
||
|
|
ChartViewer:TabRefresh (#ChartViewer.tabs)
|
||
|
|
return new_tab
|
||
|
|
end
|
||
|
|
|
||
|
|
--refresh tabs
|
||
|
|
function ChartViewer:TabRefresh (tab_selected)
|
||
|
|
|
||
|
|
--put in order
|
||
|
|
for index, tab in ipairs (ChartViewer.tabs) do
|
||
|
|
local tabFrame = ChartViewer:TabGetFrame (index)
|
||
|
|
tabFrame:Show()
|
||
|
|
tabFrame:SetText (tab.name)
|
||
|
|
tabFrame.index = index
|
||
|
|
tabFrame:SetPoint ("topleft", tabFrame:GetParent(), "topleft", 50 + ( (index-1) * 100), -30)
|
||
|
|
end
|
||
|
|
|
||
|
|
--hide not used tabs
|
||
|
|
ChartViewer:TabHideNotUsedFrames()
|
||
|
|
|
||
|
|
--check which tab is selected
|
||
|
|
if (not tab_selected) then
|
||
|
|
tab_selected = ChartViewer.tabs.last_selected
|
||
|
|
end
|
||
|
|
if (tab_selected > #ChartViewer.tabs) then
|
||
|
|
tab_selected = #ChartViewer.tabs
|
||
|
|
end
|
||
|
|
|
||
|
|
--click on the selected tab
|
||
|
|
ChartViewer:TabClick (ChartViewer.tab_container [tab_selected])
|
||
|
|
end
|
||
|
|
|
||
|
|
--click on a tab
|
||
|
|
|
||
|
|
function ChartViewer:TabDoubleClick (self)
|
||
|
|
--edit
|
||
|
|
local tab = ChartViewer.tabs [self.index]
|
||
|
|
|
||
|
|
ChartViewer.type_dropdown:Select (tab.segment_type, true)
|
||
|
|
ChartViewer.data_dropdown:Select (tab.data)
|
||
|
|
|
||
|
|
ChartViewer.type_dropdown:Disable()
|
||
|
|
ChartViewer.data_dropdown:Disable()
|
||
|
|
|
||
|
|
ChartViewer.create_button.text = Loc ["STRING_CONFIRM"]
|
||
|
|
|
||
|
|
ChartViewer.name_textentry.text = tab.name
|
||
|
|
ChartViewer.texture_dropdown:Select (tab.texture)
|
||
|
|
|
||
|
|
ChartViewer.NewTabPanel.editing = tab
|
||
|
|
ChartViewer.NewTabPanel:Show()
|
||
|
|
end
|
||
|
|
|
||
|
|
function ChartViewer:TabClick (self)
|
||
|
|
ChartViewer.tabs.last_selected = self.index
|
||
|
|
ChartViewer:TabHighlight (self.index)
|
||
|
|
ChartViewer:RefreshGraphic()
|
||
|
|
end
|
||
|
|
|
||
|
|
--get the selected tab object
|
||
|
|
function ChartViewer:TabGetCurrent()
|
||
|
|
return ChartViewer.tabs [ChartViewer.tabs.last_selected]
|
||
|
|
end
|
||
|
|
|
||
|
|
--delete a tab
|
||
|
|
function ChartViewer:TabErase (index)
|
||
|
|
|
||
|
|
--get the new index
|
||
|
|
local new_selected_tab = 1
|
||
|
|
if (#ChartViewer.tabs > 1) then
|
||
|
|
if (index == ChartViewer.tabs.last_selected) then
|
||
|
|
if (index > 1 and #ChartViewer.tabs > index) then
|
||
|
|
new_selected_tab = index
|
||
|
|
elseif (index == #ChartViewer.tabs) then
|
||
|
|
ChartViewer:TabRefresh (index-1)
|
||
|
|
else
|
||
|
|
ChartViewer:TabRefresh (1)
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (index < ChartViewer.tabs.last_selected) then
|
||
|
|
new_selected_tab = ChartViewer.tabs.last_selected - 1
|
||
|
|
else
|
||
|
|
new_selected_tab = ChartViewer.tabs.last_selected
|
||
|
|
end
|
||
|
|
end
|
||
|
|
--do the erase thing
|
||
|
|
tremove (ChartViewer.tabs, index)
|
||
|
|
|
||
|
|
--check if there is at least 1 tab
|
||
|
|
if (#ChartViewer.tabs == 0) then
|
||
|
|
ChartViewer.tabs [1] = {name = Loc ["STRING_NEWTAB"], captures = {}, segment_type = 1, data = "", texture = "line"}
|
||
|
|
new_selected_tab = 1
|
||
|
|
end
|
||
|
|
|
||
|
|
--refresh
|
||
|
|
ChartViewer:TabRefresh (new_selected_tab)
|
||
|
|
end
|
||
|
|
|
||
|
|
--tab frames
|
||
|
|
function ChartViewer:TabGetFrame (index)
|
||
|
|
local frame = ChartViewer.tab_container [index]
|
||
|
|
if (not frame) then
|
||
|
|
frame = ChartViewer:TabCreateFrame (index)
|
||
|
|
frame.widget.index = index
|
||
|
|
frame.index = index
|
||
|
|
tinsert (ChartViewer.tab_container, frame)
|
||
|
|
end
|
||
|
|
return frame
|
||
|
|
end
|
||
|
|
function ChartViewer:TabCreateFrame (index)
|
||
|
|
local onClick = function (self, button)
|
||
|
|
if (self.lastclick and self.lastclick + 0.2 > GetTime()) then
|
||
|
|
DETAILS_PLUGIN_CHART_VIEWER:TabDoubleClick (self)
|
||
|
|
self.lastclick = nil
|
||
|
|
return
|
||
|
|
end
|
||
|
|
self.lastclick = GetTime()
|
||
|
|
if (button == "LeftButton") then
|
||
|
|
ChartViewer:TabClick (self)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
local frame = DetailsFramework:CreateButton (ChartViewerWindowFrame, onClick, 20, 20)
|
||
|
|
frame:SetTemplate ("DETAILS_TAB_BUTTON_TEMPLATE")
|
||
|
|
frame:SetAlpha (0.8)
|
||
|
|
return frame
|
||
|
|
end
|
||
|
|
function ChartViewer:TabHideNotUsedFrames()
|
||
|
|
for i = #ChartViewer.tabs+1, #ChartViewer.tab_container do
|
||
|
|
ChartViewer.tab_container [i]:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
function ChartViewer:TabHighlight (index)
|
||
|
|
for i = 1, #ChartViewer.tab_container do
|
||
|
|
local tabFrame = ChartViewer:TabGetFrame (i)
|
||
|
|
if (i == index) then
|
||
|
|
tabFrame:SetTemplate ("DETAILS_TAB_BUTTONSELECTED_TEMPLATE")
|
||
|
|
else
|
||
|
|
tabFrame:SetTemplate ("DETAILS_TAB_BUTTON_TEMPLATE")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
--if is a boss encounter, force close the window
|
||
|
|
local check_for_boss = function()
|
||
|
|
if (_detalhes and _detalhes.tabela_vigente and _detalhes.tabela_vigente.is_boss) then
|
||
|
|
if (CVF and CVF:IsShown()) then
|
||
|
|
CVF:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ChartViewer:OnCombatEnter()
|
||
|
|
ChartViewer.current_on_combat = true
|
||
|
|
ChartViewer.capturing_data = true
|
||
|
|
|
||
|
|
C_Timer.After (1, check_for_boss)
|
||
|
|
end
|
||
|
|
|
||
|
|
----------> Icon show functions
|
||
|
|
function ChartViewer:ShowButton()
|
||
|
|
if (not ChartViewer.ToolbarButton:IsShown()) then
|
||
|
|
ChartViewer:ShowToolbarIcon (ChartViewer.ToolbarButton, "star")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
function ChartViewer:HideButton()
|
||
|
|
if (ChartViewer.ToolbarButton:IsShown()) then
|
||
|
|
ChartViewer:HideToolbarIcon (ChartViewer.ToolbarButton)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ChartViewer:RefreshScale()
|
||
|
|
local scale = ChartViewer.options.window_scale
|
||
|
|
if (ChartViewerWindowFrame) then
|
||
|
|
ChartViewerWindowFrame:SetScale (scale)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ChartViewer:CanShowOrHideButton()
|
||
|
|
|
||
|
|
if (not ChartViewer.__enabled) then
|
||
|
|
return ChartViewer:HideButton()
|
||
|
|
end
|
||
|
|
|
||
|
|
if (ChartViewer.welcome_panel) then
|
||
|
|
ChartViewer:ShowButton()
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
if (self.options.show_method == 1) then --> always show
|
||
|
|
ChartViewer:ShowButton()
|
||
|
|
|
||
|
|
elseif (self.options.show_method == 2) then --> group
|
||
|
|
if (IsInGroup() or IsInRaid()) then
|
||
|
|
ChartViewer:ShowButton()
|
||
|
|
else
|
||
|
|
ChartViewer:HideButton()
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (self.options.show_method == 3) then --> inside instances
|
||
|
|
local _, instanceType = GetInstanceInfo()
|
||
|
|
if (instanceType == "raid") then
|
||
|
|
ChartViewer:ShowButton()
|
||
|
|
else
|
||
|
|
ChartViewer:HideButton()
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (self.options.show_method == 4) then --> automatic
|
||
|
|
|
||
|
|
local segments = ChartViewer:GetCombatSegments()
|
||
|
|
local segments_start_index = 1
|
||
|
|
|
||
|
|
for i = 1, #segments do
|
||
|
|
local this_combat = segments [i]
|
||
|
|
if ( (not this_combat.is_trash and this_combat.is_boss and this_combat.TimeData) or (this_combat.is_arena)) then
|
||
|
|
local charts = this_combat.TimeData
|
||
|
|
if (charts) then
|
||
|
|
for id, chart in pairs (charts) do
|
||
|
|
if (chart and chart [1] and chart [2]) then
|
||
|
|
ChartViewer:ShowButton()
|
||
|
|
return
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
ChartViewer:HideButton()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
ChartViewer.CanShowOrHideButtonEvents = {
|
||
|
|
["GROUP_ROSTER_UPDATE"] = true,
|
||
|
|
["ZONE_CHANGED_NEW_AREA"] = true,
|
||
|
|
["PLAYER_ENTERING_WORLD"] = true,
|
||
|
|
}
|
||
|
|
|
||
|
|
function ChartViewer:CreateNewDataFeed (templateID)
|
||
|
|
local name = ChartViewer.DataFeedTemplatesByIndex [templateID]
|
||
|
|
local script = ChartViewer.DataFeedTemplates [name]
|
||
|
|
|
||
|
|
if (script) then
|
||
|
|
local result = ChartViewer:TimeDataRegister (name, script, nil, "Chart Viewer", "1.0", [[Interface\ICONS\TEMP]], true)
|
||
|
|
if (type (result) == "string") then
|
||
|
|
ChartViewer:Msg (result)
|
||
|
|
else
|
||
|
|
ChartViewer:Msg (Loc ["STRING_ADDEDOKAY"])
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
----------> Graphic Frame
|
||
|
|
|
||
|
|
--graphic
|
||
|
|
local frame = _G.ChartViewerWindowFrame
|
||
|
|
frame:SetToplevel (true)
|
||
|
|
|
||
|
|
--> using details framework
|
||
|
|
local chart_panel = ChartViewer:GetFramework():CreateChartPanel (frame, frame:GetWidth()-20, frame:GetHeight()-20, "ChartViewerWindowFrameChartFrame")
|
||
|
|
chart_panel:SetPoint ("topleft", frame, "topleft", 8, -65)
|
||
|
|
chart_panel:SetTitle ("")
|
||
|
|
chart_panel:SetFrameStrata ("HIGH")
|
||
|
|
chart_panel:SetFrameLevel (4)
|
||
|
|
chart_panel:CanMove (false)
|
||
|
|
chart_panel:HideCloseButton()
|
||
|
|
chart_panel:RightClickClose (false)
|
||
|
|
|
||
|
|
if (not DetailsPluginContainerWindow) then
|
||
|
|
chart_panel:SetScript ("OnMouseDown", function (self, button)
|
||
|
|
if (button == "LeftButton") then
|
||
|
|
if (not frame.isMoving) then
|
||
|
|
frame.isMoving = true
|
||
|
|
frame:StartMoving()
|
||
|
|
end
|
||
|
|
elseif (button == "RightButton") then
|
||
|
|
if (not frame.isMoving) then
|
||
|
|
frame:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
chart_panel:SetScript ("OnMouseUp", function (self, button)
|
||
|
|
if (button == "LeftButton" and frame.isMoving) then
|
||
|
|
frame.isMoving = nil
|
||
|
|
frame:StopMovingOrSizing()
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
else
|
||
|
|
chart_panel:EnableMouse (false)
|
||
|
|
end
|
||
|
|
|
||
|
|
chart_panel:SetBackdrop({
|
||
|
|
edgeFile = [[Interface\Buttons\WHITE8X8]], tile = true, tileSize = 16, edgeSize = 1,
|
||
|
|
insets = {left = 1, right = 1, top = 0, bottom = 1},})
|
||
|
|
chart_panel:SetBackdropBorderColor (0, 0, 0, 1)
|
||
|
|
|
||
|
|
local g = chart_panel
|
||
|
|
|
||
|
|
g:Reset()
|
||
|
|
|
||
|
|
--refresh the graphic
|
||
|
|
|
||
|
|
local colors = {
|
||
|
|
{1, 1, 1}, {1, 1, .4}, {1, 0.9, 0.1}, {1, 0.5, 0.1}, {1, 0.1, 0.1}, {1, 0.1, 0.5}, {1, 0.1, 0.9}, {0.9, 0.4, 1}, {0.6, 0.7, 1}, {0.3, 0.9, 1},
|
||
|
|
{0.1, 1, 0.9}, {0.1, 1, 0.5}, {0.1, 1, 0.1}, {0.4, 0.5, 0.5}, {0.7, 0.3, 0.3}, {1, 0.5, 1}, {0.8, 0.5, 0.8}, {0.9, 0.5, 0.8}, {1, 0.4, 0.8}, {0.4, 0.4, 0.8}
|
||
|
|
}
|
||
|
|
|
||
|
|
function ChartViewer:RefreshGraphic (combat)
|
||
|
|
|
||
|
|
if (not combat) then
|
||
|
|
combat = ChartViewer:GetCombat (ChartViewer.current_segment)
|
||
|
|
if (not combat) then
|
||
|
|
ChartViewer.current_segment = 1
|
||
|
|
combat = ChartViewer:GetCurrentCombat()
|
||
|
|
ChartViewer.segments_dropdown:Select (1, true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local current_tab = ChartViewer:TabGetCurrent()
|
||
|
|
|
||
|
|
local capture_name = current_tab.data
|
||
|
|
local tab_type = current_tab.segment_type
|
||
|
|
local options = current_tab.options
|
||
|
|
|
||
|
|
g:Reset()
|
||
|
|
|
||
|
|
local segments = ChartViewer:GetCombatSegments()
|
||
|
|
local segments_start_index = 1
|
||
|
|
|
||
|
|
--avoid selecting a trash segment during raids
|
||
|
|
if (IsInInstance() and (combat.is_trash or not combat.is_boss)) then
|
||
|
|
for i = 1, #segments do
|
||
|
|
local this_combat = segments [i]
|
||
|
|
if (not this_combat.is_trash) then
|
||
|
|
combat = this_combat
|
||
|
|
segments_start_index = i
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local elapsed_time = combat:GetCombatTime()
|
||
|
|
local texture = current_tab.texture
|
||
|
|
local data = {}
|
||
|
|
local maxTime = 0
|
||
|
|
local boss_id = combat.is_boss and combat.is_boss.id
|
||
|
|
|
||
|
|
if (capture_name:find ("MULTICHARTS~") and tab_type == 1 and elapsed_time > 12) then --current
|
||
|
|
-- v�rias charts setadas no valor
|
||
|
|
local charts = {}
|
||
|
|
for key in capture_name:gsub ("MULTICHARTS~", ""):gmatch ("[^%~]+") do
|
||
|
|
charts [key] = true
|
||
|
|
end
|
||
|
|
|
||
|
|
local i = 1
|
||
|
|
for name, t in pairs (combat.TimeData) do
|
||
|
|
if (charts [name] and t.max_value and t.max_value > 0) then
|
||
|
|
--> mostrar
|
||
|
|
local color = colors [i] or colors [1]
|
||
|
|
if (options) then
|
||
|
|
if (options.colors and options.colors [name]) then
|
||
|
|
color = options.colors [name]
|
||
|
|
end
|
||
|
|
end
|
||
|
|
tinsert (data, {t, color, elapsed_time, name, texture})
|
||
|
|
if (elapsed_time > maxTime) then
|
||
|
|
maxTime = elapsed_time
|
||
|
|
end
|
||
|
|
i = i + 1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (capture_name:find ("PRESET_") and tab_type == 1 and elapsed_time > 12) then --current
|
||
|
|
|
||
|
|
-- � um preset e precisa pegar todos os presets registrados no combate desse tipo
|
||
|
|
local i = 1
|
||
|
|
for name, t in pairs (combat.TimeData) do
|
||
|
|
if (name:find (capture_name) and t.max_value and t.max_value > 0) then
|
||
|
|
--> mostrar
|
||
|
|
local data_name = name:gsub ((".*%~"), "")
|
||
|
|
data_name = data_name:gsub (("%-.*"), "")
|
||
|
|
tinsert (data, {t, colors [i] or colors [1], elapsed_time, data_name, texture})
|
||
|
|
if (elapsed_time > maxTime) then
|
||
|
|
maxTime = elapsed_time
|
||
|
|
end
|
||
|
|
i = i + 1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (tab_type == 1 and elapsed_time > 12) then --current segment
|
||
|
|
|
||
|
|
local chart_data = combat.TimeData [capture_name]
|
||
|
|
if (chart_data and chart_data.max_value and chart_data.max_value > 0) then
|
||
|
|
tinsert (data, {chart_data, {1, 1, 1}, elapsed_time, capture_name, texture})
|
||
|
|
if (elapsed_time > maxTime) then
|
||
|
|
maxTime = elapsed_time
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (tab_type == 2) then --last 5 segments
|
||
|
|
|
||
|
|
local color_index = 1
|
||
|
|
local boss_index = 1
|
||
|
|
|
||
|
|
for i = segments_start_index + 5, segments_start_index, -1 do
|
||
|
|
local combat = ChartViewer:GetCombat (i)
|
||
|
|
if (combat) then
|
||
|
|
|
||
|
|
local boss_validated = true
|
||
|
|
if (boss_id) then
|
||
|
|
if ((not combat.is_boss) or (not combat.is_boss.id) or (combat.is_boss.id ~= boss_id)) then
|
||
|
|
boss_validated = false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local elapsed_time = combat:GetCombatTime()
|
||
|
|
if (elapsed_time > 12 and boss_validated) then
|
||
|
|
|
||
|
|
if (capture_name:find ("PRESET_")) then --current
|
||
|
|
for name, t in pairs (combat.TimeData) do
|
||
|
|
if (name:find (capture_name) and t.max_value and t.max_value > 0) then
|
||
|
|
--> mostrar
|
||
|
|
local data_name
|
||
|
|
if (boss_index == 1) then
|
||
|
|
data_name = name:gsub ((".*%~"), "")
|
||
|
|
boss_index = boss_index + 1
|
||
|
|
else
|
||
|
|
data_name = "segment #" .. boss_index
|
||
|
|
boss_index = boss_index + 1
|
||
|
|
end
|
||
|
|
|
||
|
|
tinsert (data, {t, colors [color_index] or colors [1], elapsed_time, data_name, texture})
|
||
|
|
color_index = color_index + 1
|
||
|
|
|
||
|
|
if (elapsed_time > maxTime) then
|
||
|
|
maxTime = elapsed_time
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
else
|
||
|
|
local chart_data = combat:GetTimeData (capture_name)
|
||
|
|
if (chart_data and chart_data.max_value and chart_data.max_value > 0) then
|
||
|
|
|
||
|
|
local data_name
|
||
|
|
if (boss_index == 1) then
|
||
|
|
data_name = capture_name
|
||
|
|
boss_index = boss_index + 1
|
||
|
|
else
|
||
|
|
data_name = "segment #" .. boss_index
|
||
|
|
boss_index = boss_index + 1
|
||
|
|
end
|
||
|
|
|
||
|
|
tinsert (data, {chart_data, colors [color_index] or colors [1], elapsed_time, data_name, texture})
|
||
|
|
color_index = color_index + 1
|
||
|
|
|
||
|
|
if (elapsed_time > maxTime) then
|
||
|
|
maxTime = elapsed_time
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
if (#data > 0) then
|
||
|
|
for index, chart in ipairs (data) do
|
||
|
|
--> get the tables and color
|
||
|
|
local chart_data = chart [1]
|
||
|
|
local chart_color = chart [2]
|
||
|
|
local combat_time = chart [3]
|
||
|
|
local line_name = chart [4]
|
||
|
|
local texture = chart [5]
|
||
|
|
|
||
|
|
g:AddLine (chart_data, chart_color, line_name, combat_time, texture) --, "SMA"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
----------> Window Functions
|
||
|
|
|
||
|
|
function ChartViewer.RefreshWindow()
|
||
|
|
local segments = ChartViewer:GetCombatSegments()
|
||
|
|
|
||
|
|
for i = 1, #segments do
|
||
|
|
local this_combat = segments [i]
|
||
|
|
if (this_combat.is_boss and this_combat.is_boss.index) then
|
||
|
|
|
||
|
|
ChartViewer.current_segment = i
|
||
|
|
ChartViewer.segments_dropdown:Refresh()
|
||
|
|
ChartViewer.segments_dropdown:Select (1, true)
|
||
|
|
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
ChartViewer:TabRefresh()
|
||
|
|
end
|
||
|
|
|
||
|
|
--open window
|
||
|
|
function ChartViewer:OpenWindow()
|
||
|
|
local segments = ChartViewer:GetCombatSegments()
|
||
|
|
|
||
|
|
for i = 1, #segments do
|
||
|
|
local this_combat = segments [i]
|
||
|
|
if (this_combat.is_boss and this_combat.is_boss.index) then
|
||
|
|
|
||
|
|
ChartViewer.current_segment = i
|
||
|
|
ChartViewer.segments_dropdown:Refresh()
|
||
|
|
ChartViewer.segments_dropdown:Select (1, true)
|
||
|
|
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
ChartViewer:TabRefresh()
|
||
|
|
|
||
|
|
--ChartViewerWindowFrame:Show()
|
||
|
|
DetailsPluginContainerWindow.OpenPlugin (ChartViewer)
|
||
|
|
|
||
|
|
if (ChartViewer.welcome_panel) then
|
||
|
|
ChartViewer.welcome_panel:Show()
|
||
|
|
ChartViewer.welcome_panel = nil
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
----------> Create the icon
|
||
|
|
|
||
|
|
local cooltip_menu = function()
|
||
|
|
|
||
|
|
local CoolTip = GameCooltip2
|
||
|
|
|
||
|
|
CoolTip:Reset()
|
||
|
|
CoolTip:SetType ("menu")
|
||
|
|
|
||
|
|
CoolTip:SetOption ("TextSize", Details.font_sizes.menus)
|
||
|
|
CoolTip:SetOption ("TextFont", Details.font_faces.menus)
|
||
|
|
|
||
|
|
CoolTip:SetOption ("LineHeightSizeOffset", 3)
|
||
|
|
CoolTip:SetOption ("VerticalOffset", 2)
|
||
|
|
CoolTip:SetOption ("VerticalPadding", -4)
|
||
|
|
CoolTip:SetOption ("FrameHeightSizeOffset", -3)
|
||
|
|
|
||
|
|
Details:SetTooltipMinWidth()
|
||
|
|
|
||
|
|
--build the menu with the available tabs
|
||
|
|
for index, tab in ipairs (ChartViewer.tabs) do
|
||
|
|
CoolTip:AddLine (tab.name .. " Graphic")
|
||
|
|
CoolTip:AddIcon ([[Interface\Addons\Details_ChartViewer\icon]], 1, 1, 16, 16, 0, 1, 0, 1, "orange")
|
||
|
|
|
||
|
|
CoolTip:AddMenu (1, function()
|
||
|
|
ChartViewer:OpenWindow()
|
||
|
|
local tab = ChartViewer:TabGetFrame (index)
|
||
|
|
tab:Click()
|
||
|
|
CoolTip:Hide()
|
||
|
|
end, "main")
|
||
|
|
end
|
||
|
|
|
||
|
|
--apply the backdrop settings to the menu
|
||
|
|
Details:FormatCooltipBackdrop()
|
||
|
|
CoolTip:SetOwner (CHARTVIEWER_BUTTON, "bottom", "top", 0, 0)
|
||
|
|
CoolTip:ShowCooltip()
|
||
|
|
end
|
||
|
|
|
||
|
|
ChartViewer.ToolbarButton = _detalhes.ToolBar:NewPluginToolbarButton (ChartViewer.OpenWindow, [[Interface\Addons\Details_ChartViewer\icon]], Loc ["STRING_PLUGIN_NAME"], Loc ["STRING_TOOLTIP"], 14, 14, "CHARTVIEWER_BUTTON", cooltip_menu)
|
||
|
|
ChartViewer.ToolbarButton.shadow = true
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
local build_options_panel = function()
|
||
|
|
|
||
|
|
local options_frame = ChartViewer:CreatePluginOptionsFrame ("ChartViewerOptionsWindow", Loc ["STRING_OPTIONS"], 2)
|
||
|
|
|
||
|
|
local set = function (_, _, value)
|
||
|
|
ChartViewer.options.show_method = value
|
||
|
|
ChartViewer:CanShowOrHideButton()
|
||
|
|
end
|
||
|
|
local on_show_menu = {
|
||
|
|
{value = 1, label = "Always", onclick = set, desc = "Always show the icon."},
|
||
|
|
{value = 2, label = "In Group", onclick = set, desc = "Only show the icon while in group."},
|
||
|
|
{value = 3, label = "Inside Raid", onclick = set, desc = "Only show the icon while inside a raid."},
|
||
|
|
{value = 4, label = "Auto", onclick = set, desc = "The plugin decides when the icon needs to be shown."},
|
||
|
|
}
|
||
|
|
|
||
|
|
local menu = {
|
||
|
|
{
|
||
|
|
type = "select",
|
||
|
|
get = function() return ChartViewer.options.show_method end,
|
||
|
|
values = function() return on_show_menu end,
|
||
|
|
desc = "When the icon is shown over Details! toolbar.",
|
||
|
|
name = Loc ["STRING_OPTIONS_SHOWICON"]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
type = "range",
|
||
|
|
get = function() return ChartViewer.options.window_scale end,
|
||
|
|
set = function (self, fixedparam, value) ChartViewer.options.window_scale = value; ChartViewer:RefreshScale() end,
|
||
|
|
min = 0.65,
|
||
|
|
max = 1.50,
|
||
|
|
step = 0.1,
|
||
|
|
desc = "Set the window size",
|
||
|
|
name = Loc ["STRING_OPTIONS_WINDOWSCALE"],
|
||
|
|
usedecimals = true,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
ChartViewer:GetFramework():BuildMenu (options_frame, menu, 15, -75, 260)
|
||
|
|
end
|
||
|
|
|
||
|
|
ChartViewer.OpenOptionsPanel = function()
|
||
|
|
if (not ChartViewerOptionsWindow) then
|
||
|
|
build_options_panel()
|
||
|
|
ChartViewerOptionsWindow:SetFrameStrata ("FULLSCREEN")
|
||
|
|
end
|
||
|
|
|
||
|
|
ChartViewerOptionsWindow:Show()
|
||
|
|
end
|
||
|
|
|
||
|
|
local create_segment_dropdown = function()
|
||
|
|
|
||
|
|
local statusbar_background = CreateFrame ("frame", nil, ChartViewerWindowFrame, "BackdropTemplate")
|
||
|
|
statusbar_background:SetPoint ("bottomleft", ChartViewerWindowFrame, "bottomleft")
|
||
|
|
statusbar_background:SetPoint ("bottomright", ChartViewerWindowFrame, "bottomright")
|
||
|
|
statusbar_background:SetHeight (30)
|
||
|
|
statusbar_background:EnableMouse (true)
|
||
|
|
statusbar_background:SetFrameLevel (9)
|
||
|
|
|
||
|
|
local frame = ChartViewerWindowFrame
|
||
|
|
if (not DetailsPluginContainerWindow) then
|
||
|
|
statusbar_background:SetScript ("OnMouseDown", function (self, button)
|
||
|
|
if (button == "LeftButton") then
|
||
|
|
if (not frame.isMoving) then
|
||
|
|
frame.isMoving = true
|
||
|
|
frame:StartMoving()
|
||
|
|
end
|
||
|
|
elseif (button == "RightButton") then
|
||
|
|
if (not frame.isMoving) then
|
||
|
|
frame:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
statusbar_background:SetScript ("OnMouseUp", function (self, button)
|
||
|
|
if (button == "LeftButton" and frame.isMoving) then
|
||
|
|
frame.isMoving = nil
|
||
|
|
frame:StopMovingOrSizing()
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
|
||
|
|
local on_segment_chosen = function (self, _, segment)
|
||
|
|
ChartViewer.current_segment = segment
|
||
|
|
ChartViewer:RefreshGraphic (ChartViewer:GetCombat (segment))
|
||
|
|
end
|
||
|
|
|
||
|
|
local build_segments_menu = function (self)
|
||
|
|
local segments = ChartViewer:GetCombatSegments()
|
||
|
|
local return_table = {}
|
||
|
|
|
||
|
|
for index, combat in ipairs (segments) do
|
||
|
|
--verify if the combat has a valid chart to display
|
||
|
|
if (next (combat.TimeData)) then
|
||
|
|
if (combat.is_boss and combat.is_boss.index) then
|
||
|
|
local l, r, t, b, icon = ChartViewer:GetBossIcon (combat.is_boss.mapid, combat.is_boss.index)
|
||
|
|
return_table [#return_table+1] = {value = index, label = "#" .. index .. " " .. combat.is_boss.name, icon = icon, texcoord = {l, r, t, b}, onclick = on_segment_chosen}
|
||
|
|
|
||
|
|
else
|
||
|
|
return_table [#return_table+1] = {value = index, label = "#" .. index .. " " .. (combat.enemy or "unknown"), icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Up]], onclick = on_segment_chosen}
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return return_table
|
||
|
|
end
|
||
|
|
|
||
|
|
local segments_string = ChartViewer:GetFramework():CreateLabel (ChartViewerWindowFrame, "Segment:", nil, nil, "GameFontNormal")
|
||
|
|
segments_string:SetPoint ("bottomleft", frame, "bottomleft", 8, 12)
|
||
|
|
|
||
|
|
local segments_dropdown = ChartViewer:GetFramework():CreateDropDown (ChartViewerWindowFrame, build_segments_menu, 1, 150, 20)
|
||
|
|
segments_dropdown:SetPoint ("left", segments_string, "right", 2, 0)
|
||
|
|
segments_dropdown:SetFrameLevel (10)
|
||
|
|
segments_dropdown:SetTemplate (_detalhes.gump:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
|
||
|
|
ChartViewer.segments_dropdown = segments_dropdown
|
||
|
|
end
|
||
|
|
|
||
|
|
--<
|
||
|
|
local create_delete_button = function (f, name)
|
||
|
|
local frame = CreateFrame ("frame", "ChartViewerDeleteButton" .. (name or math.random (1, 100000)), f, "BackdropTemplate")
|
||
|
|
frame:SetPoint ("topleft", f, "topleft", 10, -10)
|
||
|
|
frame:SetBackdrop ({bgFile = [[Interface\AddOns\Details\images\background]], edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", edgeSize = 8})
|
||
|
|
|
||
|
|
local delete_button = CreateFrame ("button", nil, frame, "BackdropTemplate")
|
||
|
|
delete_button:SetPoint ("topleft", frame, "topleft")
|
||
|
|
delete_button:SetPoint ("bottomright", frame, "bottomright")
|
||
|
|
delete_button:SetScript ("OnClick", function()
|
||
|
|
ChartViewer.tabs [delete_button.Id] = nil
|
||
|
|
ChartViewer:TabRefresh (#ChartViewer.tabs)
|
||
|
|
end)
|
||
|
|
return frame
|
||
|
|
end
|
||
|
|
|
||
|
|
local create_add_tab_button = function()
|
||
|
|
local fw = ChartViewer:GetFramework()
|
||
|
|
|
||
|
|
local button = fw:CreateButton (ChartViewerWindowFrame, ChartViewer.OpenAddTabPanel, 120, 20, "Add Chart")
|
||
|
|
button:SetTextColor (1, 0.93, 0.74)
|
||
|
|
button:SetIcon ([[Interface\PaperDollInfoFrame\Character-Plus]], 14, 14, nil, {0, 1, 0, 1}, nil, 3)
|
||
|
|
button:SetTemplate (ChartViewer:GetFramework():GetTemplate ("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE"))
|
||
|
|
button:SetFrameLevel (10)
|
||
|
|
|
||
|
|
button:SetPoint ("left", ChartViewer.segments_dropdown, "right", 4, 0)
|
||
|
|
ChartViewer.NewTabButton = button
|
||
|
|
end
|
||
|
|
local create_add_tab_panel = function()
|
||
|
|
|
||
|
|
local fw = ChartViewer:GetFramework()
|
||
|
|
|
||
|
|
local panel = fw:CreatePanel (ChartViewerWindowFrame, 360, 280)
|
||
|
|
ChartViewer.NewTabPanel = panel
|
||
|
|
|
||
|
|
panel:SetPoint ("center", ChartViewerWindowFrame, "center")
|
||
|
|
|
||
|
|
panel:SetFrameStrata ("FULLSCREEN")
|
||
|
|
|
||
|
|
Details:FormatBackground (panel)
|
||
|
|
|
||
|
|
local titlebar = CreateFrame ("frame", nil, panel.widget, "BackdropTemplate")
|
||
|
|
titlebar:SetPoint ("topleft", panel.widget, "topleft", 2, -3)
|
||
|
|
titlebar:SetPoint ("topright", panel.widget, "topright", -2, -3)
|
||
|
|
titlebar:SetHeight (20)
|
||
|
|
titlebar:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
|
||
|
|
titlebar:SetBackdropColor (.5, .5, .5, 1)
|
||
|
|
titlebar:SetBackdropBorderColor (0, 0, 0, 1)
|
||
|
|
--> title
|
||
|
|
local titleLabel = _detalhes.gump:NewLabel (titlebar, titlebar, nil, "titulo", "Add Chart", "GameFontHighlightLeft", 12, {227/255, 186/255, 4/255})
|
||
|
|
titleLabel:SetPoint ("center", titlebar , "center")
|
||
|
|
titleLabel:SetPoint ("top", titlebar , "top", 0, -5)
|
||
|
|
|
||
|
|
|
||
|
|
local x_start = 10
|
||
|
|
|
||
|
|
--<
|
||
|
|
local tab_size = {
|
||
|
|
width = 1024,
|
||
|
|
height = 768,
|
||
|
|
}
|
||
|
|
|
||
|
|
-- name
|
||
|
|
--label
|
||
|
|
local name_label = fw:CreateLabel (panel, "Name:") -- , size, color, font, member, name, layer)
|
||
|
|
|
||
|
|
--texentry
|
||
|
|
local name_textentry = fw:CreateTextEntry (panel, func, 150, 20) -- , member, name)
|
||
|
|
name_textentry:SetPoint ("left", name_label, "right", 2, 0)
|
||
|
|
ChartViewer.name_textentry = name_textentry
|
||
|
|
name_textentry:SetTemplate (ChartViewer:GetFramework():GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
|
||
|
|
|
||
|
|
-- type
|
||
|
|
--label
|
||
|
|
local type_label = fw:CreateLabel (panel, "Type:")
|
||
|
|
|
||
|
|
--dropdown
|
||
|
|
local type_options_onselect = function()
|
||
|
|
if (ChartViewer.data_dropdown) then
|
||
|
|
ChartViewer.data_dropdown:Refresh()
|
||
|
|
ChartViewer.data_dropdown:Select (1, true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
local type_options = {
|
||
|
|
{onclick = type_options_onselect, value = 1, icon = [[Interface\AddOns\Details\images\toolbar_icons]], iconcolor = {1, 1, 1}, iconsize = {14, 14}, texcoord = {32/256, 64/256, 0, 1}, label = "Current Segment", desc = "Show data only for the current segment, but can show more than one player."},
|
||
|
|
{onclick = type_options_onselect, value = 2, icon = [[Interface\AddOns\Details\images\toolbar_icons]], iconcolor = {1, 1, 1}, iconsize = {14, 14}, texcoord = {32/256, 64/256, 0, 1}, label = "Last 5 Segments", desc = "Show only one player, but shows it for the last 5 segments."},
|
||
|
|
}
|
||
|
|
local type_options_func = function()
|
||
|
|
return type_options
|
||
|
|
end
|
||
|
|
local type_dropdown = fw:CreateDropDown (panel, type_options_func, 1, 150, 20) -- , member, name
|
||
|
|
type_dropdown:SetPoint ("left", type_label, "right", 2, 0)
|
||
|
|
ChartViewer.type_dropdown = type_dropdown
|
||
|
|
type_dropdown:SetTemplate (ChartViewer:GetFramework():GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
|
||
|
|
|
||
|
|
-- data
|
||
|
|
--label
|
||
|
|
local data_label = fw:CreateLabel (panel, "Data:")
|
||
|
|
|
||
|
|
--dropdown
|
||
|
|
local data_options_func = function()
|
||
|
|
|
||
|
|
if (type_dropdown.value == 1) then -- current
|
||
|
|
local t = {}
|
||
|
|
|
||
|
|
-- raid healing done
|
||
|
|
tinsert (t, {value = "PRESET_PLAYER_HEAL", label = "Player Healing Done", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
-- player healing done
|
||
|
|
tinsert (t, {value = "PRESET_RAID_HEAL", label = "Raid Healing Done", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
|
||
|
|
-- same class
|
||
|
|
tinsert (t, {value = "PRESET_DAMAGE_SAME_CLASS", label = "Damage (Same Class)", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
tinsert (t, {value = "PRESET_HEAL_SAME_CLASS", label = "Healing (Same Class)", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
|
||
|
|
-- all damagers
|
||
|
|
tinsert (t, {value = "PRESET_ALL_DAMAGERS", label = "All Damagers", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
|
||
|
|
-- all healers
|
||
|
|
tinsert (t, {value = "PRESET_ALL_HEALERS", label = "All Healers", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
|
||
|
|
-- tank damage taken
|
||
|
|
tinsert (t, {value = "PRESET_TANK_TAKEN", label = "Tanks Damage Taken", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
|
||
|
|
-- already created data charts
|
||
|
|
for index, capture in ipairs (_detalhes.savedTimeCaptures) do
|
||
|
|
tinsert (t, {value = capture[1], icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}, label = capture[1], onclick = nil})
|
||
|
|
end
|
||
|
|
|
||
|
|
-- arena ally team damage
|
||
|
|
tinsert (t, {value = "MULTICHARTS~Your Team Damage~Enemy Team Damage", label = "Arena Damage", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
tinsert (t, {value = "MULTICHARTS~Your Team Healing~Enemy Team Healing", label = "Arena Heal", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
|
||
|
|
return t
|
||
|
|
|
||
|
|
elseif (type_dropdown.value == 2) then -- last 5
|
||
|
|
|
||
|
|
local t = {}
|
||
|
|
|
||
|
|
-- raid healing done
|
||
|
|
tinsert (t, {value = "PRESET_PLAYER_HEAL", label = "Player Healing Done", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
tinsert (t, {value = "PRESET_RAID_HEAL", label = "Raid Healing Done", icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}})
|
||
|
|
|
||
|
|
-- already created data charts
|
||
|
|
for index, capture in ipairs (_detalhes.savedTimeCaptures) do
|
||
|
|
tinsert (t, {value = capture[1], icon = [[Interface\Buttons\UI-GuildButton-PublicNote-Disabled]], iconsize = {14, 14}, label = capture[1], onclick = nil})
|
||
|
|
end
|
||
|
|
|
||
|
|
return t
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
return data_options
|
||
|
|
end
|
||
|
|
|
||
|
|
local data_dropdown = fw:CreateDropDown (panel, data_options_func, 1, 150, 20)
|
||
|
|
data_dropdown:SetPoint ("left", data_label, "right", 2, 0)
|
||
|
|
ChartViewer.data_dropdown = data_dropdown
|
||
|
|
data_dropdown:SetTemplate (ChartViewer:GetFramework():GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
|
||
|
|
|
||
|
|
-- line texture
|
||
|
|
--label
|
||
|
|
local texture_label = fw:CreateLabel (panel, "Texture:")
|
||
|
|
|
||
|
|
--dropdown
|
||
|
|
local texture_options = {
|
||
|
|
{value = "thinline", label = "Thin Line", icon = [[Interface\AddOns\Details\Libs\LibGraph-2.0\thinline]], iconcolor = {1, 1, 1}, iconsize = {30, 14}, texcoord = {0, 1, 0.3, 0.7}, onclick = nil},
|
||
|
|
{value = "line", label = "Normal Line", icon = [[Interface\AddOns\Details\Libs\LibGraph-2.0\line]], iconcolor = {1, 1, 1}, iconsize = {30, 14}, texcoord = {0, 1, 0.3, 0.7}, onclick = nil},
|
||
|
|
--{value = "sline", label = "Sline", desc = "", icon = [[Interface\AddOns\Details\Libs\LibGraph-2.0\sline]], iconcolor = {1, 1, 1}, iconsize = {130, 14}, texcoord = {0, 1, 0.3, 0.7}, onclick = nil},
|
||
|
|
--{value = "smallline", label = "Small Line", desc = "", icon = [[Interface\AddOns\Details\Libs\LibGraph-2.0\smallline]], iconcolor = {1, 1, 1}, iconsize = {130, 14}, texcoord = {0, 1, 0.3, 0.7}, onclick = nil},
|
||
|
|
}
|
||
|
|
local texture_options_func = function()
|
||
|
|
return texture_options
|
||
|
|
end
|
||
|
|
local texture_dropdown = fw:CreateDropDown (panel, texture_options_func, 1, 150, 20)
|
||
|
|
texture_dropdown:SetPoint ("left", texture_label, "right", 2, 0)
|
||
|
|
ChartViewer.texture_dropdown = texture_dropdown
|
||
|
|
texture_dropdown:SetTemplate (ChartViewer:GetFramework():GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
|
||
|
|
|
||
|
|
local internal_options = {
|
||
|
|
["MULTICHARTS~Your Team Damage~Enemy Team Damage"] = {colors = {["Your Team Damage"] = {1, 1, 1}, ["Enemy Team Damage"] = {1, 0.6, 0.2}}, iType = "arena-DAMAGER", name = "Arena Damage"},
|
||
|
|
["MULTICHARTS~Your Team Healing~Enemy Team Healing"] = {colors = {["Your Team Healing"] = {1, 1, 1}, ["Enemy Team Healing"] = {1, 0.6, 0.2}}, iType = "arena-HEALER", name = "Arena Heal"},
|
||
|
|
["PRESET_PLAYER_HEAL"] = {iType = "solo-HEALER", name = "Player Healing Done"},
|
||
|
|
["PRESET_RAID_HEAL"] = {iType = "raid-HEALER", name = "Raid Healing Done"},
|
||
|
|
["PRESET_TANK_TAKEN"] = {iType = "raid-TANK", name = "Tanks Damage Taken"},
|
||
|
|
["PRESET_ALL_HEALERS"] = {iType = "raid-HEALER", name = "All Healers"},
|
||
|
|
["PRESET_ALL_DAMAGERS"] = {iType = "raid-DAMAGER-all", name = "All Damagers"},
|
||
|
|
["PRESET_HEAL_SAME_CLASS"] = {iType = "raid-HEALER", name = "Healing (Same Class)"},
|
||
|
|
["PRESET_DAMAGE_SAME_CLASS"] = {iType = "raid-DAMAGER", name = "Damager (Same Class)"},
|
||
|
|
}
|
||
|
|
|
||
|
|
function ChartViewer:GetInternalOptionsForChart (preset_name)
|
||
|
|
return internal_options [preset_name]
|
||
|
|
end
|
||
|
|
|
||
|
|
function ChartViewer:GetChartsForIType (iType, is_keyword)
|
||
|
|
local t = {}
|
||
|
|
if (is_keyword) then
|
||
|
|
for preset_name, internal_options in pairs (internal_options) do
|
||
|
|
if (internal_options.iType:find (iType)) then
|
||
|
|
tinsert (t, preset_name)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
else
|
||
|
|
for preset_name, internal_options in pairs (internal_options) do
|
||
|
|
if (internal_options.iType == iType) then
|
||
|
|
tinsert (t, preset_name)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return t
|
||
|
|
end
|
||
|
|
|
||
|
|
-- todo: smoothness process selection
|
||
|
|
|
||
|
|
-- create button
|
||
|
|
local create_func = function()
|
||
|
|
local tab_name = name_textentry.text
|
||
|
|
local tab_type = type_dropdown.value
|
||
|
|
local tab_data = data_dropdown.value
|
||
|
|
local tab_texture = texture_dropdown.value
|
||
|
|
|
||
|
|
if (ChartViewer.NewTabPanel.editing) then
|
||
|
|
ChartViewer.NewTabPanel.editing.texture = tab_texture
|
||
|
|
ChartViewer.NewTabPanel.editing.name = tab_name
|
||
|
|
ChartViewer:RefreshGraphic()
|
||
|
|
else
|
||
|
|
local extra_options = internal_options [tab_data]
|
||
|
|
ChartViewer:CreateTab (tab_name, tab_type, tab_data, tab_texture, extra_options, data_dropdown.label:GetText())
|
||
|
|
end
|
||
|
|
|
||
|
|
panel:Hide()
|
||
|
|
end
|
||
|
|
local create_button = fw:CreateButton (panel, create_func, 86, 16, "Create")
|
||
|
|
ChartViewer.create_button = create_button
|
||
|
|
create_button:SetTemplate (ChartViewer:GetFramework():GetTemplate ("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE"))
|
||
|
|
|
||
|
|
local cancel_button = fw:CreateButton (panel, function() name_textentry:ClearFocus(); panel:Hide(); ChartViewer.NewTabPanel.editing = nil end, 86, 16, "Cancel")
|
||
|
|
cancel_button:SetTemplate (ChartViewer:GetFramework():GetTemplate ("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE"))
|
||
|
|
|
||
|
|
create_button:SetIcon ([[Interface\Buttons\UI-CheckBox-Check]], nil, nil, nil, {0.125, 0.875, 0.125, 0.875}, nil, 4, 2)
|
||
|
|
cancel_button:SetIcon ([[Interface\Buttons\UI-GroupLoot-Pass-Down]], nil, nil, nil, {0.125, 0.875, 0.125, 0.875}, nil, 4, 2)
|
||
|
|
|
||
|
|
-- align
|
||
|
|
local y = -26
|
||
|
|
name_label:SetPoint ("topleft", panel, "topleft", x_start, y*2)
|
||
|
|
type_label:SetPoint ("topleft", panel, "topleft", x_start, y*3)
|
||
|
|
data_label:SetPoint ("topleft", panel, "topleft", x_start, y*4)
|
||
|
|
texture_label:SetPoint ("topleft", panel, "topleft", x_start, y*5)
|
||
|
|
|
||
|
|
create_button:SetPoint ("topleft", panel, "topleft", 10, y*7)
|
||
|
|
cancel_button:SetPoint ("left", create_button, "right", 20, 0)
|
||
|
|
|
||
|
|
ChartViewer.OpenAddTabPanel = function()
|
||
|
|
ChartViewer.type_dropdown:Enable()
|
||
|
|
ChartViewer.data_dropdown:Enable()
|
||
|
|
ChartViewer.create_button.text = "Create"
|
||
|
|
ChartViewer.name_textentry.text = "New Tab"
|
||
|
|
ChartViewer.NewTabPanel.editing = nil
|
||
|
|
panel:Show()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ChartViewer:OnEvent (_, event, ...)
|
||
|
|
|
||
|
|
if (event == "ADDON_LOADED") then
|
||
|
|
local AddonName = select (1, ...)
|
||
|
|
if (AddonName == "Details_ChartViewer") then
|
||
|
|
|
||
|
|
if (_G._detalhes) then
|
||
|
|
|
||
|
|
--> register player damage done chart data
|
||
|
|
ChartViewer:TimeDataRegister ("Player Damage Done", ChartViewer.PlayerDamageDoneChartCode, nil, "Chart Viewer", "1.0", [[Interface\ICONS\Ability_MeleeDamage]], true)
|
||
|
|
|
||
|
|
--> create widgets
|
||
|
|
CreatePluginFrames()
|
||
|
|
|
||
|
|
local MINIMAL_DETAILS_VERSION_REQUIRED = 76
|
||
|
|
|
||
|
|
--> Install
|
||
|
|
local install, saveddata, is_enabled = _G._detalhes:InstallPlugin ("TOOLBAR", Loc ["STRING_PLUGIN_NAME"], [[Interface\Addons\Details_ChartViewer\icon]], ChartViewer, "DETAILS_PLUGIN_CHART_VIEWER", MINIMAL_DETAILS_VERSION_REQUIRED, "Details! Team", plugin_version)
|
||
|
|
if (type (install) == "table" and install.error) then
|
||
|
|
print (Loc ["STRING_PLUGIN_NAME"], install.errortext)
|
||
|
|
return
|
||
|
|
end
|
||
|
|
-- /run DETAILS_PLUGIN_CHART_VIEWER:ShowButton()
|
||
|
|
if (not saveddata.tabs) then
|
||
|
|
--> first run
|
||
|
|
local welcome = CreateFrame ("frame", nil, ChartViewerFrame, "BackdropTemplate")
|
||
|
|
welcome:SetFrameStrata ("TOOLTIP")
|
||
|
|
welcome:SetPoint ("center", ChartViewerFrame, "center")
|
||
|
|
welcome:SetSize (300, 150)
|
||
|
|
ChartViewer.welcome_panel = welcome
|
||
|
|
welcome:Hide()
|
||
|
|
welcome:SetBackdrop ({edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", edgeSize = 8,
|
||
|
|
bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 130, insets = {left = 1, right = 1, top = 5, bottom = 5}})
|
||
|
|
|
||
|
|
local str = _detalhes.gump:CreateLabel (welcome, "- Each tab shows a graphic.\n\n- Double click a tab to edit it.\n\n- Click on 'Add Chart' to create a new tab.\n\n- Press escape or right mouse button to close the panel.")
|
||
|
|
str:SetPoint (15, -15)
|
||
|
|
str:SetWidth (270)
|
||
|
|
|
||
|
|
local close_button = _detalhes.gump:CreateButton (welcome, function() welcome:Hide() end, 86, 16, "Close")
|
||
|
|
close_button:InstallCustomTexture()
|
||
|
|
close_button:SetPoint ("center", welcome, "center")
|
||
|
|
close_button:SetPoint ("bottom", welcome, "bottom", 0, 10)
|
||
|
|
end
|
||
|
|
|
||
|
|
--> detect 1.x versions
|
||
|
|
if (saveddata.tabs and saveddata.tabs[1] and saveddata.tabs[1].captures) then
|
||
|
|
table.wipe (saveddata.tabs)
|
||
|
|
end
|
||
|
|
|
||
|
|
--> build tab container
|
||
|
|
saveddata.tabs = saveddata.tabs or {}
|
||
|
|
saveddata.options = saveddata.options or {show_method = 4, window_scale = 1.0}
|
||
|
|
if (saveddata.options.auto_create == nil) then
|
||
|
|
saveddata.options.auto_create = true
|
||
|
|
end
|
||
|
|
|
||
|
|
ChartViewer.tabs = saveddata.tabs
|
||
|
|
ChartViewer.options = saveddata.options
|
||
|
|
|
||
|
|
ChartViewer.tabs.last_selected = ChartViewer.tabs.last_selected or 1
|
||
|
|
|
||
|
|
ChartViewer.tab_container = {}
|
||
|
|
|
||
|
|
if (#ChartViewer.tabs == 0) then
|
||
|
|
ChartViewer.tabs [1] = {name = "Your Damage", segment_type = 2, data = "Player Damage Done", texture = "line", version = "v2.0"}
|
||
|
|
ChartViewer.tabs [2] = {name = "Class Damage", segment_type = 1, data = "PRESET_DAMAGE_SAME_CLASS", texture = "line", version = "v2.0", iType = "raid-DAMAGER"}
|
||
|
|
ChartViewer.tabs [3] = {name = "Raid Damage", segment_type = 2, data = "Raid Damage Done", texture = "line", version = "v2.0"}
|
||
|
|
end
|
||
|
|
|
||
|
|
--> register wow events
|
||
|
|
CVF:RegisterEvent ("GROUP_ROSTER_UPDATE")
|
||
|
|
CVF:RegisterEvent ("ZONE_CHANGED_NEW_AREA")
|
||
|
|
CVF:RegisterEvent ("PLAYER_ENTERING_WORLD")
|
||
|
|
|
||
|
|
if (is_enabled) then
|
||
|
|
ChartViewer:CanShowOrHideButton()
|
||
|
|
else
|
||
|
|
ChartViewer:HideButton()
|
||
|
|
end
|
||
|
|
|
||
|
|
--> register details events
|
||
|
|
_G._detalhes:RegisterEvent (ChartViewer, "DETAILS_DATA_RESET")
|
||
|
|
|
||
|
|
_G._detalhes:RegisterEvent (ChartViewer, "COMBAT_PLAYER_LEAVE")
|
||
|
|
_G._detalhes:RegisterEvent (ChartViewer, "COMBAT_PLAYER_ENTER")
|
||
|
|
|
||
|
|
_G._detalhes:RegisterEvent (ChartViewer, "COMBAT_CHARTTABLES_CREATING")
|
||
|
|
_G._detalhes:RegisterEvent (ChartViewer, "COMBAT_CHARTTABLES_CREATED")
|
||
|
|
|
||
|
|
create_segment_dropdown()
|
||
|
|
create_add_tab_panel()
|
||
|
|
create_add_tab_button()
|
||
|
|
|
||
|
|
ChartViewer.current_segment = 1
|
||
|
|
|
||
|
|
ChartViewer.NewTabPanel:Hide()
|
||
|
|
|
||
|
|
--> replace the built-in frame with the outside frame
|
||
|
|
ChartViewer.Frame = _G.ChartViewerWindowFrame
|
||
|
|
|
||
|
|
--> embed the plugin into the plugin window
|
||
|
|
if (DetailsPluginContainerWindow) then
|
||
|
|
DetailsPluginContainerWindow.EmbedPlugin (ChartViewer, ChartViewerWindowFrame)
|
||
|
|
end
|
||
|
|
|
||
|
|
C_Timer.After (5, function()
|
||
|
|
--> adjust the size of the chart frame
|
||
|
|
local height = ChartViewerWindowFrame:GetHeight()
|
||
|
|
ChartViewerWindowFrameChartFrame:SetSize (ChartViewerWindowFrame:GetWidth()-20, height-100)
|
||
|
|
|
||
|
|
--ChartViewerWindowFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
|
||
|
|
--ChartViewerWindowFrame:SetBackdropColor (0.2, 0.2, 0.2, .6)
|
||
|
|
--ChartViewerWindowFrame:SetBackdropBorderColor (0, 0, 0, 1)
|
||
|
|
|
||
|
|
--title bar
|
||
|
|
local titlebar = CreateFrame ("frame", nil, ChartViewerWindowFrame, "BackdropTemplate")
|
||
|
|
titlebar:SetPoint ("topleft", ChartViewerWindowFrame, "topleft", 2, -3)
|
||
|
|
titlebar:SetPoint ("topright", ChartViewerWindowFrame, "topright", -2, -3)
|
||
|
|
titlebar:SetHeight (20)
|
||
|
|
titlebar:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
|
||
|
|
titlebar:SetBackdropColor (.5, .5, .5, 1)
|
||
|
|
titlebar:SetBackdropBorderColor (0, 0, 0, 1)
|
||
|
|
|
||
|
|
local name_bg_texture = ChartViewerWindowFrame:CreateTexture (nil, "background")
|
||
|
|
name_bg_texture:SetTexture ([[Interface\PetBattles\_PetBattleHorizTile]], true)
|
||
|
|
name_bg_texture:SetHorizTile (true)
|
||
|
|
name_bg_texture:SetTexCoord (0, 1, 126/256, 19/256)
|
||
|
|
name_bg_texture:SetPoint ("topleft", ChartViewerWindowFrame, "topleft", 2, -22)
|
||
|
|
name_bg_texture:SetPoint ("bottomright", ChartViewerWindowFrame, "bottomright")
|
||
|
|
name_bg_texture:SetHeight (54)
|
||
|
|
name_bg_texture:SetVertexColor (0, 0, 0, 0.2)
|
||
|
|
|
||
|
|
--window title
|
||
|
|
local titleLabel = _detalhes.gump:NewLabel (titlebar, titlebar, nil, "titulo", "Chart Viewer", "GameFontHighlightLeft", 12, {227/255, 186/255, 4/255})
|
||
|
|
titleLabel:SetPoint ("center", ChartViewerWindowFrame, "center")
|
||
|
|
titleLabel:SetPoint ("top", ChartViewerWindowFrame, "top", 0, -7)
|
||
|
|
|
||
|
|
--close button
|
||
|
|
|
||
|
|
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
elseif (ChartViewer.CanShowOrHideButtonEvents [event]) then
|
||
|
|
ChartViewer:CanShowOrHideButton()
|
||
|
|
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local add_preset_player_healind_done = function()
|
||
|
|
local code = [[
|
||
|
|
local current_combat = _detalhes:GetCombat ("current")
|
||
|
|
local my_self = current_combat (2, _detalhes.playername)
|
||
|
|
return my_self and my_self.total or 0
|
||
|
|
]]
|
||
|
|
_detalhes:TimeDataRegister ("PRESET_PLAYER_HEAL~" .. _detalhes.playername, code, nil, "Chart Viewer 2.0", "v1.0", [[Interface\Buttons\UI-GuildButton-PublicNote-Up]], true, true)
|
||
|
|
end
|
||
|
|
|
||
|
|
local add_preset_raid_healind_done = function()
|
||
|
|
local code = [[
|
||
|
|
local current_combat = _detalhes:GetCombat ("current")
|
||
|
|
local total_healing = current_combat:GetTotal ( DETAILS_ATTRIBUTE_HEAL, nil, DETAILS_TOTALS_ONLYGROUP )
|
||
|
|
return total_healing or 0]]
|
||
|
|
_detalhes:TimeDataRegister ("PRESET_RAID_HEAL~Raid Healing Done", code, nil, "Chart Viewer 2.0", "v1.0", [[Interface\Buttons\UI-GuildButton-PublicNote-Up]], true, true)
|
||
|
|
end
|
||
|
|
|
||
|
|
local add_preset_damage_same_class = function()
|
||
|
|
if (IsInRaid()) then
|
||
|
|
local _, class = UnitClass ("player")
|
||
|
|
for i = 1, GetNumGroupMembers() do
|
||
|
|
local name, rank, subgroup, level, class2, class1, zone, online, isDead, _, isML, role = GetRaidRosterInfo (i)
|
||
|
|
if (class == class1) then
|
||
|
|
|
||
|
|
local playerName, realmName = UnitName ("raid" .. i)
|
||
|
|
if (realmName and realmName ~= "") then
|
||
|
|
playerName = playerName .. "-" .. realmName
|
||
|
|
end
|
||
|
|
|
||
|
|
--even my self
|
||
|
|
local code = [[
|
||
|
|
local current_combat = _detalhes:GetCombat ("current")
|
||
|
|
local my_self = current_combat (1, "PLAYERNAME")
|
||
|
|
return my_self and my_self.total or 0]]
|
||
|
|
code = code:gsub ("PLAYERNAME", playerName)
|
||
|
|
_detalhes:TimeDataRegister ("PRESET_DAMAGE_SAME_CLASS~" .. playerName, code, nil, "Chart Viewer 2.0", "v1.0", [[Interface\Buttons\UI-GuildButton-PublicNote-Up]], true, true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local add_preset_heal_same_class = function()
|
||
|
|
if (IsInRaid()) then
|
||
|
|
local _, class = UnitClass ("player")
|
||
|
|
for i = 1, GetNumGroupMembers() do
|
||
|
|
local name, rank, subgroup, level, class2, class1, zone, online, isDead, _, isML, role = GetRaidRosterInfo (i)
|
||
|
|
if (class == class1) then
|
||
|
|
local playerName, realmName = UnitName ("raid" .. i)
|
||
|
|
if (realmName and realmName ~= "") then
|
||
|
|
playerName = playerName .. "-" .. realmName
|
||
|
|
end
|
||
|
|
|
||
|
|
--even my self
|
||
|
|
local code = [[
|
||
|
|
local current_combat = _detalhes:GetCombat ("current")
|
||
|
|
local my_self = current_combat (2, "PLAYERNAME")
|
||
|
|
return my_self and my_self.total or 0]]
|
||
|
|
code = code:gsub ("PLAYERNAME", playerName)
|
||
|
|
_detalhes:TimeDataRegister ("PRESET_HEAL_SAME_CLASS~" .. playerName, code, nil, "Chart Viewer 2.0", "v1.0", [[Interface\Buttons\UI-GuildButton-PublicNote-Up]], true, true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local add_preset_all_damagers = function()
|
||
|
|
if (IsInRaid()) then
|
||
|
|
for i = 1, GetNumGroupMembers() do
|
||
|
|
local name, rank, subgroup, level, class2, class1, zone, online, isDead, _, isML, role = GetRaidRosterInfo (i)
|
||
|
|
if (role == "DAMAGER") then
|
||
|
|
local playerName, realmName = UnitName ("raid" .. i)
|
||
|
|
if (realmName and realmName ~= "") then
|
||
|
|
playerName = playerName .. "-" .. realmName
|
||
|
|
end
|
||
|
|
|
||
|
|
--even my self
|
||
|
|
local code = [[
|
||
|
|
local current_combat = _detalhes:GetCombat ("current")
|
||
|
|
local my_self = current_combat (1, "PLAYERNAME")
|
||
|
|
return my_self and my_self.total or 0]]
|
||
|
|
code = code:gsub ("PLAYERNAME", playerName)
|
||
|
|
_detalhes:TimeDataRegister ("PRESET_ALL_DAMAGERS~" .. playerName, code, nil, "Chart Viewer 2.0", "v1.0", [[Interface\Buttons\UI-GuildButton-PublicNote-Up]], true, true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local add_preset_all_healers = function()
|
||
|
|
if (IsInRaid()) then
|
||
|
|
for i = 1, GetNumGroupMembers() do
|
||
|
|
local name, rank, subgroup, level, class2, class1, zone, online, isDead, _, isML, role = GetRaidRosterInfo (i)
|
||
|
|
if (role == "HEALER") then
|
||
|
|
local playerName, realmName = UnitName ("raid" .. i)
|
||
|
|
if (realmName and realmName ~= "") then
|
||
|
|
playerName = playerName .. "-" .. realmName
|
||
|
|
end
|
||
|
|
|
||
|
|
--even my self
|
||
|
|
local code = [[
|
||
|
|
local current_combat = _detalhes:GetCombat ("current")
|
||
|
|
local my_self = current_combat (2, "PLAYERNAME")
|
||
|
|
return my_self and my_self.total or 0]]
|
||
|
|
code = code:gsub ("PLAYERNAME", playerName)
|
||
|
|
_detalhes:TimeDataRegister ("PRESET_ALL_HEALERS~" .. playerName, code, nil, "Chart Viewer 2.0", "v1.0", [[Interface\Buttons\UI-GuildButton-PublicNote-Up]], true, true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local add_preset_tank_damage_taken = function()
|
||
|
|
if (IsInRaid()) then
|
||
|
|
for i = 1, GetNumGroupMembers() do
|
||
|
|
local name, rank, subgroup, level, class2, class1, zone, online, isDead, _, isML, role = GetRaidRosterInfo (i)
|
||
|
|
|
||
|
|
if (role == "TANK") then
|
||
|
|
local playerName, realmName = UnitName ("raid" .. i)
|
||
|
|
if (realmName and realmName ~= "") then
|
||
|
|
playerName = playerName .. "-" .. realmName
|
||
|
|
end
|
||
|
|
|
||
|
|
--even my self
|
||
|
|
local code = [[
|
||
|
|
local current_combat = _detalhes:GetCombat ("current")
|
||
|
|
local my_self = current_combat (1, "PLAYERNAME")
|
||
|
|
return my_self and my_self.damage_taken or 0]]
|
||
|
|
code = code:gsub ("PLAYERNAME", playerName)
|
||
|
|
_detalhes:TimeDataRegister ("PRESET_TANK_TAKEN~" .. playerName, code, nil, "Chart Viewer 2.0", "v1.0", [[Interface\Buttons\UI-GuildButton-PublicNote-Up]], true, true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ChartViewer:BuildAndAddPresetFunction (preset_name)
|
||
|
|
|
||
|
|
if (preset_name == "PRESET_PLAYER_HEAL") then
|
||
|
|
add_preset_player_healind_done()
|
||
|
|
|
||
|
|
elseif (preset_name == "PRESET_RAID_HEAL") then
|
||
|
|
add_preset_raid_healind_done()
|
||
|
|
|
||
|
|
elseif (preset_name == "PRESET_DAMAGE_SAME_CLASS") then
|
||
|
|
add_preset_damage_same_class()
|
||
|
|
|
||
|
|
elseif (preset_name == "PRESET_HEAL_SAME_CLASS") then
|
||
|
|
add_preset_heal_same_class()
|
||
|
|
|
||
|
|
elseif (preset_name == "PRESET_ALL_DAMAGERS") then
|
||
|
|
add_preset_all_damagers()
|
||
|
|
|
||
|
|
elseif (preset_name == "PRESET_ALL_HEALERS") then
|
||
|
|
add_preset_all_healers()
|
||
|
|
|
||
|
|
elseif (preset_name == "PRESET_TANK_TAKEN") then
|
||
|
|
add_preset_tank_damage_taken()
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
--> player damage done chart code
|
||
|
|
ChartViewer.PlayerDamageDoneChartCode = [[
|
||
|
|
|
||
|
|
-- the goal of this script is get the current combat then get your character and extract your damage done.
|
||
|
|
-- the first thing to do is get the combat, so, we use here the command "_detalhes:GetCombat ( "overall" "current" or "segment number")"
|
||
|
|
|
||
|
|
local current_combat = _detalhes:GetCombat ("current") --> getting the current combat
|
||
|
|
|
||
|
|
-- the next step is request your character from the combat
|
||
|
|
-- to do this, we take the combat which here we named "current_combat" and tells what we want inside parentheses.
|
||
|
|
|
||
|
|
local my_self = current_combat (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername)
|
||
|
|
|
||
|
|
-- _detalhes.playername holds the name of your character.
|
||
|
|
-- DETAILS_ATTRIBUTE_DAMAGE means we want the damage table, _HEAL _ENERGY _MISC is the other 3 tables.
|
||
|
|
|
||
|
|
-- before we proceed, the result needs to be checked to make sure its a valid result.
|
||
|
|
|
||
|
|
if (not my_self) then
|
||
|
|
return 0 -- the combat doesnt have *you*, this happens when you didn't deal any damage in the combat yet.
|
||
|
|
end
|
||
|
|
|
||
|
|
-- now its time to get the total damage.
|
||
|
|
|
||
|
|
local my_damage = my_self.total
|
||
|
|
|
||
|
|
-- then finally return the amount to the capture.
|
||
|
|
|
||
|
|
return my_damage
|
||
|
|
|
||
|
|
]]
|
||
|
|
|
||
|
|
ChartViewer.DataFeedTemplatesByIndex = {
|
||
|
|
"Raid Damage Taken", "Raid Healing Done", "Raid Overheal"
|
||
|
|
}
|
||
|
|
|
||
|
|
ChartViewer.DataFeedTemplates = {
|
||
|
|
["Raid Damage Taken"] = [[ -- this script takes the current combat and get the total of damage taken by the group.
|
||
|
|
local damage_taken = 0
|
||
|
|
|
||
|
|
--get the raid players on current combat
|
||
|
|
local players = _detalhes:GetActorsOnDamageCache()
|
||
|
|
|
||
|
|
--add the damage taken from each player
|
||
|
|
for _, player in ipairs (players) do
|
||
|
|
damage_taken = damage_taken + player.damage_taken
|
||
|
|
end
|
||
|
|
|
||
|
|
--return the value
|
||
|
|
return damage_taken
|
||
|
|
]],
|
||
|
|
|
||
|
|
["Raid Healing Done"] = [[ -- this script takes the current combat and request the total of healing done by the group.
|
||
|
|
-- get the current combat
|
||
|
|
local current_combat = _detalhes:GetCombat ("current")
|
||
|
|
|
||
|
|
-- get the total healing done from the combat
|
||
|
|
local total_healing = current_combat:GetTotal ( DETAILS_ATTRIBUTE_HEAL, nil, DETAILS_TOTALS_ONLYGROUP )
|
||
|
|
|
||
|
|
-- check if the result is valid
|
||
|
|
if (not total_healing) then
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
-- return the value
|
||
|
|
return total_healing
|
||
|
|
end
|
||
|
|
]],
|
||
|
|
|
||
|
|
["Raid Overheal"] = [[ -- this script get the total of overheal from the raid.
|
||
|
|
local overheal = 0
|
||
|
|
|
||
|
|
--get the raid players on current combat
|
||
|
|
local players = _detalhes:GetActorsOnHealingCache()
|
||
|
|
|
||
|
|
--add the overheal from each player
|
||
|
|
for _, player in ipairs (players) do
|
||
|
|
overheal = overheal + player.totalover
|
||
|
|
end
|
||
|
|
|
||
|
|
--return the value
|
||
|
|
return overheal
|
||
|
|
]]
|
||
|
|
}
|
||
|
|
|
||
|
|
ChartViewer.PlayerIndividualChartCode = [[
|
||
|
|
local current_combat = _detalhes:GetCombat ("current") --> getting the current combat
|
||
|
|
local my_self = current_combat (DETAILS_ATTRIBUTE_DAMAGE, UnitName ("player"))
|
||
|
|
if (not my_self) then
|
||
|
|
return 0
|
||
|
|
end
|
||
|
|
local my_damage = my_self.total
|
||
|
|
return my_damage or 0
|
||
|
|
]]
|