Quantcast
--Raid mark bar. Similar to quickmark which just semms to be impossible to skin
local E, L, V, P, G, _ = unpack(ElvUI); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB, Localize Underscore
local RM = E:NewModule('RaidMarks', 'AceHook-3.0', 'AceEvent-3.0');
local Mtemplate = "SecureActionButtonTemplate"

local mark_menu = CreateFrame("Frame", "Mark_Menu", E.UIParent)
local m1 = CreateFrame("Button", "M1", Mark_Menu, Mtemplate)
local m2 = CreateFrame("Button", "M2", Mark_Menu, Mtemplate)
local m3 = CreateFrame("Button", "M3", Mark_Menu, Mtemplate)
local m4 = CreateFrame("Button", "M4", Mark_Menu, Mtemplate)
local m5 = CreateFrame("Button", "M5", Mark_Menu, Mtemplate)
local m6 = CreateFrame("Button", "M6", Mark_Menu, Mtemplate)
local m7 = CreateFrame("Button", "M7", Mark_Menu, Mtemplate)
local m8 = CreateFrame("Button", "M8", Mark_Menu, Mtemplate)

local MarkB = {m1,m2,m3,m4,m5,m6,m7,m8}


--Main frame
function RM:CreateFrame()
	mark_menu:Point("BOTTOMRIGHT", RightChatTab, "TOPRIGHT", 2, 3) --Default positon
	mark_menu:SetFrameStrata('LOW');
	mark_menu:CreateBackdrop();
	mark_menu.backdrop:SetAllPoints();

	mark_menu:Hide()
end

function RM:SetupButton(button, mark)
	button:CreateBackdrop()
	button.backdrop:SetAllPoints()
	button:SetAttribute("type", "macro")
	button:SetAttribute("macrotext",  '/script SetRaidTargetIcon("target",'..mark..')')

	button.tex = button:CreateTexture(nil, 'OVERLAY')
	button.tex:Point('TOPLEFT', button, 'TOPLEFT', 2, -2)
	button.tex:Point('BOTTOMRIGHT', button, 'BOTTOMRIGHT', -2, 2)
	button.tex:SetTexture("INTERFACE/TARGETINGFRAME/UI-RaidTargetingIcon_"..mark)
end

--Buttons creation
function RM:CreateButtons()
	for i = 1, 8 do
		RM:SetupButton(MarkB[i], 9 - i)
	end
end

--Setting/updating buttons' size
function RM:FrameButtonsSize()
	for i = 1, 8 do
		MarkB[i]:Size(E.db.sle.marks.size)
	end
end

--Setting growth direction for buttons
function RM:FrameButtonsGrowth()
	local db = E.db.sle.marks
	local size = db.size
	local width, height, x, y, anchor, point
	local t = {8*size+11,size+4,"LEFT","RIGHT","TOP","BOTTOM",1,0,-1}
	for i = 1, 8 do
		MarkB[i]:ClearAllPoints()
	end

	if db.growth == "RIGHT" then
		width, height, anchor, point, _, _, x, y = unpack(t)
	elseif db.growth == "LEFT" then
		width, height, point, anchor, _, _, _, y, x = unpack(t)
	elseif db.growth == "UP" then
		height, width, _, _, point, anchor, y, x = unpack(t)
	elseif db.growth == "DOWN" then
		height, width, _, _, anchor, point, _, x, y = unpack(t)
	end

	mark_menu:SetWidth(width)
	mark_menu:SetHeight(height)

	for i = 1, 8 do
		if i == 1 then
			MarkB[i]:Point(anchor, Mark_Menu, anchor, 2 * x, 2 * y)
		else
			MarkB[i]:Point(anchor, MarkB[i-1], point, x, y)
		end
	end
end

--Visibility/enable check
function RM:UpdateVisibility()
	local inInstance, instanceType = IsInInstance()
	local db = E.db.sle.marks
	if db.enabled then
		if (inInstance and instanceType ~= "pvp") and db.showinside then
			E.FrameLocks['Mark_Menu'] = true -- Because theyre thinking of adding battle pets to raids
			mark_menu:Show()
		elseif not inInstance and db.showinside then
			E.FrameLocks['Mark_Menu'] = nil
			mark_menu:Hide()
		elseif not db.showinside then
			E.FrameLocks['Mark_Menu'] = true
			mark_menu:Show()
		end
	else
		E.FrameLocks['Mark_Menu'] = true
		mark_menu:Hide()
	end
end

function RM:Backdrop()
	if E.db.sle.marks.backdrop then
		mark_menu.backdrop:Show()
	else
		mark_menu.backdrop:Hide()
	end
end

function RM:Update()
	RM:FrameButtonsSize()
	RM:FrameButtonsGrowth()
	RM:UpdateVisibility()
	RM:Backdrop()
end

function RM:Initialize()
	RM:CreateFrame()
	RM:Update()
	RM:CreateButtons()
	self:RegisterEvent("PLAYER_ENTERING_WORLD", "UpdateVisibility");

	E:CreateMover(mark_menu, "MarkMover", "RM", nil, nil, nil, "ALL,S&L,S&L MISC")
end

E:RegisterModule(RM:GetName())