--[[ RecapOptions.lua ]] local classabr = { ["WARRIOR"] = "WAR", ["MAGE"] = "MAG", ["ROGUE"] = "ROG", ["DRUID"] = "DRU", ["HUNTER"] = "HNT", ["SHAMAN"] = "SHM", ["PRIEST"] = "PRI", ["WARLOCK"] = "WLK", ["PALADIN"] = "PAL", ["Pet"] = "PET" } -- knob=nil to use current values local function set_anchor_buttons(knob) RecapAnchorTopLeft:SetNormalTexture("Interface\\AddOns\\Recap\\RecapButtons-Down") RecapAnchorTopLeft:UnlockHighlight() RecapAnchorTopRight:SetNormalTexture("Interface\\AddOns\\Recap\\RecapButtons-Down") RecapAnchorTopRight:UnlockHighlight() RecapAnchorBottomLeft:SetNormalTexture("Interface\\AddOns\\Recap\\RecapButtons-Down") RecapAnchorBottomLeft:UnlockHighlight() RecapAnchorBottomRight:SetNormalTexture("Interface\\AddOns\\Recap\\RecapButtons-Down") RecapAnchorBottomRight:UnlockHighlight() if knob=="RecapAnchorTopLeft" then recap.Opt.GrowUpwards.value = false recap.Opt.GrowLeftwards.value = false elseif knob=="RecapAnchorTopRight" then recap.Opt.GrowUpwards.value = false recap.Opt.GrowLeftwards.value = true elseif knob=="RecapAnchorBottomLeft" then recap.Opt.GrowUpwards.value = true recap.Opt.GrowLeftwards.value = false elseif knob=="RecapAnchorBottomRight" then recap.Opt.GrowUpwards.value = true recap.Opt.GrowLeftwards.value = true else knob = "RecapAnchor"..(recap.Opt.GrowUpwards.value and "Bottom" or "Top")..(recap.Opt.GrowLeftwards.value and "Right" or "Left") end getglobal(knob):SetNormalTexture("Interface\\AddOns\\Recap\\RecapButtons-Up") getglobal(knob):LockHighlight() Recap_MoveMinimize() if recap.Opt.Minimized.value then Recap_Minimize() end end function Recap_InitializeOptions() local chatname,chatid,i RecapAutoFadeSlider:SetValue(recap.Opt.AutoFadeTimer.value) RecapIdleFightSlider:SetValue(recap.Opt.IdleFightTimer.value) RecapMaxRowsSlider:SetValue(recap.Opt.MaxRows.value) RecapMaxRankSlider:SetValue(recap.Opt.MaxRank.value) RecapOptTab1:LockHighlight() RecapOptSubFrame1:Show() RecapOpt_StatDropDownText:SetText(recap.Opt.AutoPost.Stat) _,_,chatid,chatname = string.find(recap.Opt.AutoPost.Channel,"(%d+)-(%w+)") if chatid and chatid~=GetChannelName(chatid) then recap.Opt.AutoPost.Channel = "Self" end RecapOpt_ChannelDropDownText:SetText(recap.Opt.AutoPost.Channel) if recap.UseOneSettings then RecapOptCheck_UseOneSettings:SetChecked(1) else RecapOptCheck_UseOneSettings:SetChecked(0) end -- set check state for all checked options for i in recap.Opt do if RecapOptFrame and recap.Opt[i].type=="Check" then if recap.Opt[i].value==true then getglobal("RecapOptCheck_"..i):SetChecked(1) else getglobal("RecapOptCheck_"..i):SetChecked(0) end end end set_anchor_buttons() end function RecapOpt_OnMouseDown(arg1) if recap_temp.Loaded and arg1=="LeftButton" then RecapOptFrame:StartMoving() end end function RecapOpt_OnMouseUp(arg1) if recap_temp.Loaded and arg1=="LeftButton" then RecapOptFrame:StopMovingOrSizing() end end function Recap_AutoFadeSlider_OnValueChanged(arg1) if recap_temp.Loaded and arg1 then RecapAutoFadeSlider_Text:SetText(arg1.." seconds") recap.Opt.AutoFadeTimer.value = arg1 end end function Recap_IdleFightSlider_OnValueChanged(arg1) if recap_temp.Loaded and arg1 then RecapIdleFightSlider_Text:SetText(arg1.." seconds") recap.Opt.IdleFightTimer.value = arg1 end end function Recap_MaxRowsSlider_OnValueChanged(arg1) if recap_temp.Loaded and arg1 then RecapMaxRowsSlider_Text:SetText(arg1.." rows") recap.Opt.MaxRows.value = arg1 RecapScrollBar_Update() end end function Recap_MaxRankSlider_OnValueChanged(arg1) if recap_temp.Loaded and arg1 then RecapMaxRankSlider_Text:SetText("Rank top "..arg1) recap.Opt.MaxRank.value = arg1 end end function RecapOptCheck_OnEnter() local id = this:GetID() Recap_Tooltip(recap_temp.OptList[id][2],recap_temp.OptList[id][3]) end function RecapOptCheck_OnClick() local i local id = this:GetID() RecapSetEditBox:ClearFocus() if id>0 and recap_temp.OptList[id][1] then i = getglobal("RecapOptCheck_"..recap_temp.OptList[id][1]):GetChecked() if i==1 then recap.Opt[recap_temp.OptList[id][1]].value = true PlaySound("igMainMenuOptionCheckBoxOn") else recap.Opt[recap_temp.OptList[id][1]].value = false PlaySound("igMainMenuOptionCheckBoxOff") end -- if display list/self checks if ((id>=11 and id<=16) or (id>=26 and id<=27) or (id>=30 and id<=34) or (id>=43 and id<=45)) and not recap.Opt.SelfView.value and not recap.Opt.Minimized.value then Recap_Maximize() elseif (id>=48 and id<=62) and recap.Opt.SelfView.value and not recap.Opt.Minimized.value then Recap_Maximize() -- if display minimized checks elseif ((id>=17 and id<=22) or id==36) and recap.Opt.Minimized.value then Recap_Minimize() elseif recap_temp.OptList[id][1]=="UseColor" then Recap_SetColors() if not recap.Opt.Minimized.value then Recap_SetView() end elseif recap_temp.OptList[id][1]=="ShowTooltips" then GameTooltip:Hide() Recap_OnTooltip("ShowTooltips") elseif recap_temp.OptList[id][1]=="HideFoe" then Recap_SetView() elseif recap_temp.OptList[id][1]=="HideZero" then Recap_SetView() elseif recap_temp.OptList[id][1]=="HideYardTrash" then Recap_SetView() elseif recap_temp.OptList[id][1]=="IdleFight" then if recap.Opt.IdleFight.value and recap.Opt.State.value=="Active" then recap_temp.IdleTimer = 0 else recap_temp.IdleTimer = -1 end elseif recap_temp.OptList[id][1]=="TooltipFollow" then Recap_OnTooltip("TooltipFollow") elseif recap_temp.OptList[id][1]=="AutoFade" then recap_temp.FadeTimer = -1 elseif recap_temp.OptList[id][1]=="MergePets" and not UnitIsVisible then recap.Opt.MergePets.value = false RecapOptCheck_MergePets:SetChecked(0) elseif recap_temp.OptList[id][1]=="GrowLeftwards" or recap_temp.OptList[id][1]=="GrowUpwards" or recap_temp.OptList[id][1]=="AutoMinimize" then Recap_MoveMinimize() if recap.Opt.Minimized.value then Recap_Minimize() end elseif recap_temp.OptList[id][1]=="ShowPanel" then if RecapPanel:IsVisible() then RecapPanel_Hide(1) end elseif recap_temp.OptList[id][1]=="LightData" then if recap.Opt.LightData.value then msg = recap_temp.Local.ConfirmLightData else msg = recap_temp.Local.ConfirmHeavyData end StaticPopupDialogs["RECAP_CONFIRMLIGHTDATA"] = { text = TEXT(msg), button1 = TEXT(ACCEPT), button2 = TEXT(CANCEL), OnAccept = function() recap.DataVersion = recap.DataVersion - 0.01 -- force rebuild of data ReloadUI() end, OnHide = function() RecapOptCheck_LightData:Enable() end, OnCancel = function() recap.Opt.LightData.value = not recap.Opt.LightData.value if recap.Opt.LightData.value then RecapOptCheck_LightData:SetChecked(1) else RecapOptCheck_LightData:SetChecked(0) end end, timeout = 0, showAlert = 1, whileDead = 1 } RecapOptCheck_LightData:Disable() StaticPopup_Show("RECAP_CONFIRMLIGHTDATA") elseif recap_temp.OptList[id][1]=="ShowGauges" then RecapScrollBar_Update() end end end function Recap_UseOneSettings_OnClick() i = RecapOptCheck_UseOneSettings:GetChecked() if i==1 then recap.UseOneSettings = true PlaySound("igMainMenuOptionCheckBoxOn") msg = recap_temp.Local.ConfirmGlobalSettings else recap.UseOneSettings = false PlaySound("igMainMenuOptionCheckBoxOff") msg = recap_temp.Local.ConfirmSeparateSettings end StaticPopupDialogs["RECAP_CONFIRMLIGHTDATA"] = { text = TEXT(msg), button1 = TEXT(ACCEPT), button2 = TEXT(CANCEL), OnAccept = function() if recap.UseOneSettings then local i,user for i in recap_set do _,_,user = string.find(i,"^UserData:(.+)") if user and user~=recap_temp.p then recap_set["UserData:"..user] = nil recap[user] = nil end end end ReloadUI() end, OnHide = function() RecapOptCheck_UseOneSettings:Enable() end, OnCancel = function() recap.UseOneSettings = not recap.UseOneSettings if recap.UseOneSettings then RecapOptCheck_UseOneSettings:SetChecked(1) else RecapOptCheck_UseOneSettings:SetChecked(0) end end, timeout = 0, showAlert = 1, whileDead = 1 } RecapOptCheck_UseOneSettings:Disable() StaticPopup_Show("RECAP_CONFIRMLIGHTDATA") end --[[ Fight Data Set functions ]] function Recap_InitDataSets() if RecapOptTitle then RecapFightDataSetHeader_Name:SetTextColor(recap_temp.ColorNone.r,recap_temp.ColorNone.g,recap_temp.ColorNone.b) RecapFightDataSetHeader_Date:SetTextColor(recap_temp.ColorNone.r,recap_temp.ColorNone.g,recap_temp.ColorNone.b) RecapFightDataSetHeader_Combatants:SetTextColor(recap_temp.ColorNone.r,recap_temp.ColorNone.g,recap_temp.ColorNone.b) RecapSaveButton:Disable() RecapLoadButton:Disable() RecapDeleteButton:Disable() Recap_BuildFightSets() RecapOptTitle:SetText("Recap v"..Recap_Version.." for "..recap_temp.Player.." of "..recap_temp.Server) end end function Recap_SetEditValidateButtons() local text if recap_temp.Loaded then text = RecapSetEditBox:GetText() if text and text~="" then RecapSaveButton:Enable() else RecapSaveButton:Disable() RecapLoadButton:Disable() RecapDeleteButton:Disable() end recap_temp.FightSetSelected = Recap_SetExists(text) RecapFightSetsScrollBar_Update() if recap_temp.FightSetSelected~=0 then RecapLoadButton:Enable() RecapDeleteButton:Enable() else RecapLoadButton:Disable() RecapDeleteButton:Disable() end end end -- populates recap_temp.FightSets with a list of existing fight sets function Recap_BuildFightSets() local i,friendly recap_temp.FightSetsSize = 1 for i in recap_set do if recap_set[i] and not string.find(i,"^UserData:") then if not recap_temp.FightSets[recap_temp.FightSetsSize] then recap_temp.FightSets[recap_temp.FightSetsSize] = {} end recap_temp.FightSets[recap_temp.FightSetsSize].Name = i recap_temp.FightSets[recap_temp.FightSetsSize].Date = recap_set[i].TimeStamp friendly = 0 for j in recap_set[i].Combatant do if string.find(recap_set[i].Combatant[j],"^true") then friendly = friendly + 1 end end recap_temp.FightSets[recap_temp.FightSetsSize].Combatants = recap_set[i].ListSize .. " ("..friendly..")" recap_temp.FightSetsSize = recap_temp.FightSetsSize + 1 end end table.sort(recap_temp.FightSets,Recap_SetSort) end function RecapFightSetsScrollBar_Update() local i, index, item if recap_temp.Loaded then FauxScrollFrame_Update(RecapFightSetsScrollBar,recap_temp.FightSetsSize-1,10,5) for i=1,10 do index = i + FauxScrollFrame_GetOffset(RecapFightSetsScrollBar) if index < recap_temp.FightSetsSize then getglobal("RecapList"..i.."Back"):Hide() getglobal("RecapFightDataList"..i.."_Name"):SetText(recap_temp.FightSets[index].Name) getglobal("RecapFightDataList"..i.."_Date"):SetText(recap_temp.FightSets[index].Date) getglobal("RecapFightDataList"..i.."_Combatants"):SetText(recap_temp.FightSets[index].Combatants) item = getglobal("RecapFightDataList"..i) item:Show() if recap_temp.FightSetSelected == index then item:LockHighlight() else item:UnlockHighlight() end else item = getglobal("RecapFightDataList"..i) item:Hide() item:UnlockHighlight() getglobal("RecapList"..i.."Back"):Show() end end end end function RecapFightData_OnClick() local id = this:GetID() RecapSetEditBox:ClearFocus() index = id + FauxScrollFrame_GetOffset(RecapFightSetsScrollBar) if index < recap_temp.FightSetsSize then recap_temp.FightSetSelected = index RecapSetEditBox:SetText(recap_temp.FightSets[index].Name) RecapSaveButton:Enable() RecapLoadButton:Enable() RecapDeleteButton:Enable() RecapFightSetsScrollBar_Update() end end function Recap_SetExists(arg1) local result = 0 for i in recap_temp.FightSets do if recap_temp.FightSets[i].Name == arg1 then result = i end end return result end -- fight data set sort (by date) function Recap_SetSort(e1,e2) if e1 and e2 and ( e1.Date > e2.Date ) then return true else return false end end --[[ Options tabs ]] function RecapOptTab_OnEnter() id = this:GetID() if id and id>0 then Recap_OnTooltip("OptTab"..id) end end function RecapOptTab_OnClick() local id,i = this:GetID() PlaySound("GAMEGENERICBUTTONPRESS") if id and id>0 then for i=1,4 do getglobal("RecapOptTab"..i):UnlockHighlight() getglobal("RecapOptSubFrame"..i):Hide() end RecapOptClipFrame:Hide() getglobal("RecapOptTab"..id):LockHighlight() getglobal("RecapOptSubFrame"..id):Show() end end --[[ drop down lists ]] function RecapDropMenu_OnClick() local id = this:GetID() if recap_temp.CurrentDrop==RecapOpt_StatDropDownButton then recap.Opt.AutoPost.Stat = getglobal("RecapDropMenu"..id.."_Text"):GetText() RecapOpt_StatDropDownText:SetText(recap.Opt.AutoPost.Stat) else recap.Opt.AutoPost.Channel = getglobal("RecapDropMenu"..id.."_Text"):GetText() RecapOpt_ChannelDropDownText:SetText(recap.Opt.AutoPost.Channel) end Recap_DropMenu:Hide() recap_temp.CurrentDrop = nil end function RecapDropMenu_OnEnter() end function Recap_ToggleDropDown() if Recap_DropMenu:IsVisible() and recap_temp.CurrentDrop==this then Recap_DropMenu:Hide() recap_temp.CurrentDrop = nil elseif recap_temp.CurrentDrop~=this and this==RecapOpt_StatDropDownButton then Recap_ShowStatDrop() recap_temp.CurrentDrop = this elseif recap_temp.CurrentDrop~=this then Recap_ShowChannelDrop() recap_temp.CurrentDrop = this end end function Recap_ShowStatDrop() Recap_DropMenu:ClearAllPoints() Recap_DropMenu:SetPoint("TOPLEFT","RecapOpt_StatDropDown","BOTTOMLEFT",16,8) Recap_PopulateDrop(recap_temp.StatDropList) end function Recap_ShowChannelDrop() local new_list = {} Recap_DropMenu:ClearAllPoints() Recap_DropMenu:SetPoint("TOPLEFT","RecapOpt_ChannelDropDown","BOTTOMLEFT",16,8) for i=1,table.getn(recap_temp.ChannelDropList) do table.insert(new_list,recap_temp.ChannelDropList[i]) end for i=1,10 do c,name = GetChannelName(i) if name then for i=1,table.getn(recap_temp.Local.SkipChannels) do if string.find(name,recap_temp.Local.SkipChannels[i]) then name = nil i = table.getn(recap_temp.Local.SkipChannels) end end end if name then table.insert(new_list,c.."-"..name) end end Recap_PopulateDrop(new_list) end function Recap_PopulateDrop(arg1) local height = 0 for i=1,math.min(8,table.getn(arg1)) do getglobal("RecapDropMenu"..i.."_Text"):SetText(arg1[i]) getglobal("RecapDropMenu"..i):Show() height = height + 16 end for i=table.getn(arg1)+1,8 do getglobal("RecapDropMenu"..i):Hide() end Recap_DropMenu:SetHeight(height+4) Recap_DropMenu:Show() end function RecapDropMenu_OnUpdate(arg1) if not recap_temp.MenuTimer or MouseIsOver(Recap_DropMenu) or (recap_temp.CurrentDrop and MouseIsOver(recap_temp.CurrentDrop)) then recap_temp.MenuTimer = 0 end recap_temp.MenuTimer = recap_temp.MenuTimer + arg1 if recap_temp.MenuTimer > .25 then recap_temp.MenuTimer = 0 Recap_DropMenu:Hide() recap_temp.CurrentDrop = nil end end local function logline(arg1,clip) local lineformat = recap_temp.Local.LogFormat local str local prefix = recap.Opt.HTML.value and "" or "" local suffix = recap.Opt.HTML.value and "" or "" if recap.Opt.HTML.value then lineformat = recap_temp.Local.HTMLFormat end if arg1=="FirstLine" then str = string.format(lineformat,prefix..recap_temp.Local.Log[1]..suffix, prefix..recap_temp.Local.Log[2]..suffix, prefix..recap_temp.Local.Log[3]..suffix, prefix..recap_temp.Local.Log[4]..suffix, prefix..recap_temp.Local.Log[5]..suffix, prefix..recap_temp.Local.Log[6]..suffix, prefix..recap_temp.Local.Log[7]..suffix, prefix..recap_temp.Local.Log[8]..suffix, prefix..recap_temp.Local.Log[9]..suffix, prefix..recap_temp.Local.Log[10]..suffix, prefix..recap_temp.Local.Log[11]..suffix, prefix..recap_temp.Local.Log[12]..suffix) elseif arg1=="Spacer" then str = recap.Opt.HTML.value and string.format(lineformat," "," "," "," "," "," "," "," "," "," "," "," ") or " " else str = string.format(lineformat, recap_temp.List[arg1].Name, Recap_FormatLevel(recap.Combatant[recap_temp.List[arg1].Name].Level), Recap_FormatClass(recap.Combatant[recap_temp.List[arg1].Name].Class), Recap_FormatTime(recap_temp.List[arg1].Time), recap_temp.List[arg1].Heal, recap_temp.List[arg1].HealP.."%%", recap_temp.List[arg1].DmgIn, recap_temp.List[arg1].DmgInP.."%%", recap_temp.List[arg1].DmgOut, recap_temp.List[arg1].DmgOutP.."%%", recap_temp.List[arg1].MaxHit, string.format("%.1f",recap_temp.List[arg1].DPS)) end if str then str = str .. ((clip and not recap.Opt.HTML.value) and "\n" or "") if clip then str = string.gsub(str,"%%%%","%%") end return str end end function Recap_WriteClip() local i,donefriends local headerformat = recap_temp.Local.LogHeader RecapClipEditBox:SetText("") RecapOptSubFrame4:Hide() RecapOptClipFrame:Show() RecapClipEditBox:SetFocus() if recap.Opt.HTML.value then headerformat = recap_temp.Local.HTMLHeader RecapClipEditBox:Insert(recap_temp.Local.HTMLPrefix) end RecapClipEditBox:Insert(string.format(headerformat,UnitName("player"),recap_temp.Local.LastAll[recap.Opt.View.value],date(),GetRealZoneText()).."\n") RecapClipEditBox:Insert(logline("FirstLine","clip")) for i=1,recap_temp.ListSize-1 do if not donefriends and not recap.Combatant[recap_temp.List[i].Name].Friend then if not recap.Opt.WriteFriends.value then RecapClipEditBox:Insert(logline("Spacer","clip")) end donefriends = true end if not donefriends or not recap.Opt.WriteFriends.value then RecapClipEditBox:Insert(logline(i,"clip")) end end if recap.Opt.HTML.value then RecapClipEditBox:Insert(recap_temp.Local.HTMLSuffix) end RecapClipEditBox:HighlightText() end function Recap_WriteLog() local i,chatnum,chatname,freeslot,donefriends,alreadyin local lines = 0 local logchat = "recaplog"..string.lower(UnitName("player")) local headerformat = recap_temp.Local.LogHeader local prefix,suffix = "", "" for i=1,10 do _,chatname = GetChannelName(i) if not chatname then freeslot = true elseif string.lower(chatname)==logchat then freeslot = true alreadyin = true end end if freeslot then if not alreadyin then RecapFrame:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE") JoinChannelByName(logchat) RecapOpt_WriteLogLabel:SetText(RECAP_ACQUIRING_CHANNEL) end chatnum = nil for i=1,10 do j,chatname = GetChannelName(i) if chatname and string.lower(chatname)==logchat then chatnum=j end end if chatnum then if recap.Opt.HTML.value then headerformat = recap_temp.Local.HTMLHeader prefix = "-->" suffix = "