Quantcast
--[[-------------------------------------------------------------------------
  *
  * ReadyCheck module for PerfectRaid addon.
  *
  * Written by: Panoramix
  * Version: 1.0
  *
---------------------------------------------------------------------------]]


local ReadyCheck = PerfectRaid:NewModule("PerfectRaid-ReadyCheck")
local frames

-- the duration to fade the ready check status
ReadyCheck.fadeDuration = 4

function ReadyCheck:Initialize()

	frames = PerfectRaid.frames

	self:RegisterEvent("READY_CHECK", "UpdateReadyCheck")
	self:RegisterEvent("READY_CHECK_CONFIRM", "UpdateReadyCheck")
	self:RegisterEvent("READY_CHECK_FINISHED", "UpdateReadyCheck")

	self.started = false
end


function ReadyCheck:ConfigureButton( button )
	button.readycheck = CreateFrame("Frame", nil, button.leftbox)
	button.readycheck.indicator = button.readycheck:CreateTexture(nil, "OVERLAY")
end

function ReadyCheck:UpdateButtonLayout( button )

	button.readycheck:ClearAllPoints()
	button.readycheck:SetWidth(button:GetHeight( ))
	button.readycheck:SetHeight(button:GetHeight( ))
	button.readycheck:SetFrameLevel(button.leftbox:GetFrameLevel()+1)

	button.readycheck.indicator:SetAllPoints()
	button.readycheck.indicator:SetTexture(READY_CHECK_READY_TEXTURE)

	button.readycheck:SetPoint("RIGHT", button.name, "RIGHT", 0, 0)
	button.readycheck:Hide()

end


--[[

	event = READY_CHECK | READY_CHECK_CONFIRM(unit)| READY_CHECK_FINISHED
	status = GetReadyCheckStatus( unit )
		   = "ready" | "notready" | "waiting"
]]--
function ReadyCheck:UpdateReadyCheck( event, target )

	-- a ready check is initiated, update all frames
	if event == "READY_CHECK" then

		for unit, tbl in pairs(frames) do

			local status = GetReadyCheckStatus( unit )

			for frame in pairs(frames[unit]) do
				ReadyCheck:SetReadyCheckStatus( frame, status )
			end
		end

	-- a ready check is confirmed or declined, update frames of the unit
	elseif event == "READY_CHECK_CONFIRM" then

		for unit, tbl in pairs(frames) do

			if UnitIsUnit( target, unit ) then

				local status = GetReadyCheckStatus( unit )

				for frame in pairs(frames[unit]) do
					ReadyCheck:SetReadyCheckStatus( frame, status )
				end

				break
			end

		end

	-- the ready check has finished, wrap it up
	elseif event == "READY_CHECK_FINISHED" then

		-- update any ~ready status
		for unit, tbl in pairs(frames) do
			for frame in pairs(frames[unit]) do

				if frame.readycheck.status then

					-- update status to not ready
					if  frame.readycheck.status ~= "ready" then
						ReadyCheck:SetReadyCheckStatus( frame, "notready" )
					end

					-- start fade timer
					frame.readycheck.elapsed = ReadyCheck.fadeDuration
					frame.readycheck:SetScript("OnUpdate", function(self, elapsed)

						self.elapsed = self.elapsed - elapsed
						self:SetAlpha( self.elapsed / ReadyCheck.fadeDuration )

						if self.elapsed <= 0 then
							self:Hide()
							self:SetScript("OnUpdate", nil)
						end
					end)

				end
			end
		end

	end
end

function ReadyCheck:SetReadyCheckStatus( frame, status )

	frame.readycheck.status = status

	if not status then
		return
	end

	if( status == "ready" ) then
		frame.readycheck.indicator:SetTexture(READY_CHECK_READY_TEXTURE)
	elseif( status == "notready" ) then
		frame.readycheck.indicator:SetTexture(READY_CHECK_NOT_READY_TEXTURE)
	elseif( status == "waiting" ) then
		frame.readycheck.indicator:SetTexture(READY_CHECK_WAITING_TEXTURE)
	end

	frame.readycheck:SetAlpha( 1.0 )
	frame.readycheck:Show()
end