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.
377 lines
13 KiB
377 lines
13 KiB
local _, Cell = ...
|
|
local L = Cell.L
|
|
local F = Cell.funcs
|
|
local P = Cell.pixelPerfectFuncs
|
|
local A = Cell.animations
|
|
|
|
local readyBtn, pullBtn
|
|
|
|
local buttonsFrame = CreateFrame("Frame", "CellReadyAndPullFrame", Cell.frames.mainFrame, "SecureFrameTemplate,BackdropTemplate")
|
|
Cell.frames.readyAndPullFrame = buttonsFrame
|
|
P:Size(buttonsFrame, 60, 55)
|
|
PixelUtil.SetPoint(buttonsFrame, "TOPRIGHT", UIParent, "CENTER", -1, -1)
|
|
buttonsFrame:SetClampedToScreen(true)
|
|
buttonsFrame:SetMovable(true)
|
|
buttonsFrame:RegisterForDrag("LeftButton")
|
|
buttonsFrame:SetScript("OnDragStart", function()
|
|
buttonsFrame:StartMoving()
|
|
buttonsFrame:SetUserPlaced(false)
|
|
end)
|
|
buttonsFrame:SetScript("OnDragStop", function()
|
|
buttonsFrame:StopMovingOrSizing()
|
|
P:SavePosition(buttonsFrame, CellDB["tools"]["readyAndPull"][4])
|
|
end)
|
|
|
|
-------------------------------------------------
|
|
-- mover
|
|
-------------------------------------------------
|
|
buttonsFrame.moverText = buttonsFrame:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
|
|
buttonsFrame.moverText:SetPoint("TOP", 0, -3)
|
|
buttonsFrame.moverText:SetText(L["Mover"])
|
|
buttonsFrame.moverText:Hide()
|
|
|
|
local function ShowMover(show)
|
|
if show then
|
|
if not CellDB["tools"]["readyAndPull"][1] then return end
|
|
buttonsFrame:EnableMouse(true)
|
|
buttonsFrame.moverText:Show()
|
|
Cell:StylizeFrame(buttonsFrame, {0, 1, 0, 0.4}, {0, 0, 0, 0})
|
|
if not F:HasPermission() then -- button not shown
|
|
readyBtn:Show()
|
|
pullBtn:Show()
|
|
end
|
|
buttonsFrame:SetAlpha(1)
|
|
else
|
|
buttonsFrame:EnableMouse(false)
|
|
buttonsFrame.moverText:Hide()
|
|
Cell:StylizeFrame(buttonsFrame, {0, 0, 0, 0}, {0, 0, 0, 0})
|
|
if not F:HasPermission() then -- button should not shown
|
|
readyBtn:Hide()
|
|
pullBtn:Hide()
|
|
end
|
|
buttonsFrame:SetAlpha(CellDB["tools"]["fadeOut"] and 0 or 1)
|
|
end
|
|
end
|
|
Cell:RegisterCallback("ShowMover", "RaidButtons_ShowMover", ShowMover)
|
|
|
|
-------------------------------------------------
|
|
-- pull
|
|
-------------------------------------------------
|
|
pullBtn = Cell:CreateStatusBarButton(buttonsFrame, L["Pull"], {60, 17}, 7, "SecureActionButtonTemplate")
|
|
pullBtn:RegisterForClicks("LeftButtonUp", "RightButtonUp", "LeftButtonDown", "RightButtonDown") -- NOTE: ActionButtonUseKeyDown will affect this
|
|
pullBtn:Hide()
|
|
|
|
-------------------------------------------------
|
|
-- pull bar
|
|
-------------------------------------------------
|
|
pullBtn:SetScript("OnEvent", function(self, event, ...)
|
|
self[event](self, ...)
|
|
end)
|
|
|
|
local pullTicker, isPullTickerRunning
|
|
local function Start(sec, sendToChat)
|
|
isPullTickerRunning = true
|
|
pullBtn:SetMaxValue(sec)
|
|
pullBtn:Start()
|
|
|
|
-- update button text
|
|
pullBtn:SetText(sec)
|
|
if pullTicker then
|
|
pullTicker:Cancel()
|
|
pullTicker = nil
|
|
end
|
|
pullBtn.sec = sec
|
|
pullTicker = C_Timer.NewTicker(1, function()
|
|
pullBtn.sec = pullBtn.sec - 1
|
|
if pullBtn.sec == 0 then
|
|
isPullTickerRunning = false
|
|
pullBtn:SetText(L["Go!"])
|
|
if sendToChat then
|
|
SendChatMessage(L["Go!"], IsInRaid() and "RAID_WARNING" or "PARTY")
|
|
end
|
|
elseif pullBtn.sec == -1 then
|
|
pullBtn:SetText(L["Pull"])
|
|
else
|
|
pullBtn:SetText(pullBtn.sec)
|
|
if sendToChat then
|
|
if pullBtn.sec > 3 then
|
|
SendChatMessage(pullBtn.sec, IsInRaid() and "RAID" or "PARTY")
|
|
else
|
|
SendChatMessage(pullBtn.sec, IsInRaid() and "RAID_WARNING" or "PARTY")
|
|
end
|
|
end
|
|
end
|
|
end, sec+1)
|
|
end
|
|
|
|
local function Stop()
|
|
isPullTickerRunning = false
|
|
pullBtn:Stop()
|
|
|
|
-- update button text
|
|
pullBtn:SetText(L["Pull"])
|
|
if pullTicker then
|
|
pullTicker:Cancel()
|
|
pullTicker = nil
|
|
end
|
|
end
|
|
|
|
function pullBtn:CHAT_MSG_ADDON(prefix, text)
|
|
if prefix == "D4" then -- DBM
|
|
local pre, sec = strsplit("\t", text)
|
|
sec = tonumber(sec)
|
|
if pre == "PT" and sec > 0 then -- start
|
|
Start(sec)
|
|
elseif pre == "PT" and sec == 0 then -- cancel
|
|
Stop()
|
|
end
|
|
|
|
-- elseif prefix == "BigWigs" then
|
|
-- local _, pre, sec = strsplit("^", text)
|
|
-- sec = tonumber(sec)
|
|
-- if pre == "Pull" and sec > 0 then -- start
|
|
-- elseif pre == "Pull" and sec == 0 then -- cancel
|
|
-- end
|
|
end
|
|
end
|
|
|
|
function pullBtn:START_TIMER(timerType, timeRemaining, totalTime)
|
|
if totalTime > 0 then
|
|
Start(totalTime)
|
|
else
|
|
Stop()
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------
|
|
-- ready
|
|
-------------------------------------------------
|
|
readyBtn = Cell:CreateStatusBarButton(buttonsFrame, L["Ready"], {60, 17}, 35)
|
|
-- P:Point(readyBtn, "BOTTOMLEFT", pullBtn, "TOPLEFT", 0, 3)
|
|
readyBtn:Hide()
|
|
|
|
readyBtn:RegisterForClicks("LeftButtonDown", "RightButtonDown")
|
|
readyBtn:SetScript("OnClick", function(self, button)
|
|
if button == "LeftButton" then
|
|
DoReadyCheck()
|
|
else
|
|
InitiateRolePoll()
|
|
end
|
|
end)
|
|
|
|
local ready = {}
|
|
readyBtn:SetScript("OnEvent", function(self, event, arg1, arg2)
|
|
if event == "READY_CHECK" then
|
|
readyBtn:SetMaxValue(arg2)
|
|
readyBtn:Start()
|
|
wipe(ready)
|
|
tinsert(ready, "player")
|
|
readyBtn:SetText("1 / "..GetNumGroupMembers())
|
|
elseif event == "READY_CHECK_FINISHED" then
|
|
readyBtn:Stop()
|
|
readyBtn:SetText(L["Ready"])
|
|
else
|
|
if arg2 then -- isReady
|
|
if IsInRaid() then
|
|
if string.find(arg1, "raid") then tinsert(ready, arg1) end
|
|
else
|
|
tinsert(ready, arg1)
|
|
end
|
|
readyBtn:SetText(#ready.." / "..GetNumGroupMembers())
|
|
end
|
|
end
|
|
end)
|
|
|
|
-------------------------------------------------
|
|
-- style
|
|
-------------------------------------------------
|
|
local function CreateTexture(b, tex)
|
|
b.tex = b:CreateTexture(nil, "ARTWORK")
|
|
b.tex:SetPoint("CENTER")
|
|
P:Size(b.tex, 16, 16)
|
|
b.tex:SetTexture(tex)
|
|
|
|
-- push effect
|
|
b.onMouseDown = function()
|
|
b.tex:ClearAllPoints()
|
|
b.tex:SetPoint("CENTER", 0, -1)
|
|
end
|
|
b.onMouseUp = function()
|
|
b.tex:ClearAllPoints()
|
|
b.tex:SetPoint("CENTER")
|
|
end
|
|
b:SetScript("OnMouseDown", b.onMouseDown)
|
|
b:SetScript("OnMouseUp", b.onMouseUp)
|
|
|
|
-- enable / disable
|
|
b:HookScript("OnEnable", function()
|
|
b.tex:SetVertexColor(1, 1, 1)
|
|
b:SetScript("OnMouseDown", b.onMouseDown)
|
|
b:SetScript("OnMouseUp", b.onMouseUp)
|
|
end)
|
|
b:HookScript("OnDisable", function()
|
|
b.tex:SetVertexColor(0.4, 0.4, 0.4)
|
|
b:SetScript("OnMouseDown", nil)
|
|
b:SetScript("OnMouseUp", nil)
|
|
end)
|
|
end
|
|
|
|
local function UpdateStyle()
|
|
P:ClearPoints(pullBtn)
|
|
P:ClearPoints(readyBtn)
|
|
|
|
if CellDB["tools"]["readyAndPull"][2] == "text_button" then
|
|
readyBtn:RegisterEvent("READY_CHECK")
|
|
readyBtn:RegisterEvent("READY_CHECK_FINISHED")
|
|
readyBtn:RegisterEvent("READY_CHECK_CONFIRM")
|
|
|
|
P:Size(buttonsFrame, 60, 55)
|
|
P:Size(pullBtn, 60, 17)
|
|
P:Size(readyBtn, 60, 17)
|
|
|
|
P:Point(pullBtn, "BOTTOMLEFT")
|
|
P:Point(readyBtn, "BOTTOMLEFT", pullBtn, "TOPLEFT", 0, 3)
|
|
|
|
pullBtn.tex:Hide()
|
|
pullBtn:SetText(L["Pull"])
|
|
readyBtn.tex:Hide()
|
|
readyBtn:SetText(L["Ready"])
|
|
else
|
|
Stop()
|
|
readyBtn:Stop()
|
|
|
|
pullBtn:UnregisterAllEvents()
|
|
readyBtn:UnregisterAllEvents()
|
|
|
|
if CellDB["tools"]["readyAndPull"][2] == "icon_button_h" then -- horizontal
|
|
buttonsFrame:SetSize(P:Scale(40)+P:Scale(2), P:Scale(40))
|
|
P:Size(pullBtn, 20, 20)
|
|
P:Size(readyBtn, 20, 20)
|
|
|
|
P:Point(readyBtn, "BOTTOMLEFT")
|
|
P:Point(pullBtn, "BOTTOMLEFT", readyBtn, "BOTTOMRIGHT", 2, 0)
|
|
else -- vertical
|
|
P:Size(buttonsFrame, 20, 62)
|
|
P:Size(pullBtn, 20, 20)
|
|
P:Size(readyBtn, 20, 20)
|
|
|
|
P:Point(pullBtn, "BOTTOMLEFT")
|
|
P:Point(readyBtn, "BOTTOMLEFT", pullBtn, "TOPLEFT", 0, 2)
|
|
end
|
|
|
|
pullBtn.tex:Show()
|
|
pullBtn:SetText("")
|
|
readyBtn.tex:Show()
|
|
readyBtn:SetText("")
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------
|
|
-- fade out
|
|
-------------------------------------------------
|
|
A:ApplyFadeInOutToParent(buttonsFrame, function()
|
|
return CellDB["tools"]["fadeOut"] and not buttonsFrame.moverText:IsShown()
|
|
end, readyBtn, pullBtn)
|
|
|
|
-------------------------------------------------
|
|
-- functions
|
|
-------------------------------------------------
|
|
local function CheckPermission()
|
|
if InCombatLockdown() then
|
|
buttonsFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
|
|
else
|
|
buttonsFrame:UnregisterEvent("PLAYER_REGEN_ENABLED")
|
|
if F:HasPermission() and CellDB["tools"]["readyAndPull"][1] then
|
|
readyBtn:Show()
|
|
readyBtn:SetEnabled(true)
|
|
pullBtn:Show()
|
|
pullBtn:SetEnabled(true)
|
|
else
|
|
readyBtn:Hide()
|
|
readyBtn:SetEnabled(false)
|
|
pullBtn:Hide()
|
|
pullBtn:SetEnabled(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
buttonsFrame:SetScript("OnEvent", function()
|
|
CheckPermission()
|
|
end)
|
|
|
|
Cell:RegisterCallback("PermissionChanged", "RaidButtons_PermissionChanged", CheckPermission)
|
|
|
|
local function UpdateTools(which)
|
|
if not which or which == "buttons" then
|
|
CheckPermission()
|
|
ShowMover(Cell.vars.showMover and CellDB["tools"]["readyAndPull"][1])
|
|
end
|
|
|
|
if not which or which == "readyAndPull" then
|
|
if not pullBtn.tex then CreateTexture(pullBtn, "Interface\\AddOns\\Cell\\Media\\Icons\\pull") end
|
|
if not readyBtn.tex then CreateTexture(readyBtn, "Interface\\AddOns\\Cell\\Media\\Icons\\ready") end
|
|
|
|
pullBtn:UnregisterAllEvents()
|
|
pullBtn:SetScript("OnMouseUp", pullBtn.onMouseUp)
|
|
pullBtn:SetAttribute("type1", "macro")
|
|
pullBtn:SetAttribute("type2", "macro")
|
|
|
|
if CellDB["tools"]["readyAndPull"][3][1] == "mrt" then
|
|
pullBtn:RegisterEvent("CHAT_MSG_ADDON")
|
|
pullBtn:SetAttribute("macrotext1", "/ert pull "..CellDB["tools"]["readyAndPull"][3][2])
|
|
pullBtn:SetAttribute("macrotext2", "/ert pull 0")
|
|
elseif CellDB["tools"]["readyAndPull"][3][1] == "dbm" then
|
|
pullBtn:RegisterEvent("CHAT_MSG_ADDON")
|
|
pullBtn:SetAttribute("macrotext1", "/dbm pull "..CellDB["tools"]["readyAndPull"][3][2])
|
|
pullBtn:SetAttribute("macrotext2", "/dbm pull 0")
|
|
elseif CellDB["tools"]["readyAndPull"][3][1] == "bw" then
|
|
pullBtn:RegisterEvent("CHAT_MSG_ADDON")
|
|
pullBtn:SetAttribute("macrotext1", "/pull "..CellDB["tools"]["readyAndPull"][3][2])
|
|
pullBtn:SetAttribute("macrotext2", "/pull 0")
|
|
else -- default
|
|
if Cell.isRetail then
|
|
-- C_PartyInfo.DoCountdown(CellDB["tools"]["readyAndPull"][3][2])
|
|
pullBtn:RegisterEvent("START_TIMER")
|
|
pullBtn:SetAttribute("macrotext1", "/cd "..CellDB["tools"]["readyAndPull"][3][2])
|
|
pullBtn:SetAttribute("macrotext2", "/cd 0")
|
|
else
|
|
pullBtn:SetAttribute("type1", nil)
|
|
pullBtn:SetAttribute("type2", nil)
|
|
pullBtn:SetScript("OnMouseUp", function(self, button)
|
|
if button == "LeftButton" then
|
|
SendChatMessage(L["Pull in %d sec"]:format(CellDB["tools"]["readyAndPull"][3][2]), IsInRaid() and "RAID_WARNING" or "PARTY")
|
|
Start(CellDB["tools"]["readyAndPull"][3][2], true)
|
|
else
|
|
if isPullTickerRunning then
|
|
SendChatMessage(L["Pull timer cancelled"], IsInRaid() and "RAID_WARNING" or "PARTY")
|
|
Stop()
|
|
end
|
|
end
|
|
pullBtn.onMouseUp()
|
|
end)
|
|
end
|
|
end
|
|
|
|
UpdateStyle()
|
|
end
|
|
|
|
if not which or which == "fadeOut" then
|
|
if CellDB["tools"]["fadeOut"] and not buttonsFrame.moverText:IsShown() then
|
|
buttonsFrame:SetAlpha(0)
|
|
else
|
|
buttonsFrame:SetAlpha(1)
|
|
end
|
|
end
|
|
|
|
if not which then -- position
|
|
P:LoadPosition(buttonsFrame, CellDB["tools"]["readyAndPull"][4])
|
|
end
|
|
end
|
|
Cell:RegisterCallback("UpdateTools", "RaidButtons_UpdateTools", UpdateTools)
|
|
|
|
local function UpdatePixelPerfect()
|
|
-- P:Resize(buttonsFrame)
|
|
readyBtn:UpdatePixelPerfect()
|
|
pullBtn:UpdatePixelPerfect()
|
|
end
|
|
Cell:RegisterCallback("UpdatePixelPerfect", "RaidButtons_UpdatePixelPerfect", UpdatePixelPerfect)
|