Quantcast
local T, C, L = unpack(Tukui)

local function AllPoints(obj, frame, inset)
	obj:ClearAllPoints()
	if not inset then inset = 0 end
	obj:SetPoint("TOPLEFT", frame, "TOPLEFT", inset, -inset)
	obj:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -inset, inset)
end

local function innerBorder(f)
	if f.innerborder then f.innerborder:Show() return end
	f.innerborder = CreateFrame("Frame", nil, f)
	f.innerborder:SetPoint("TOPLEFT", T.mult, -T.mult)
	f.innerborder:SetPoint("BOTTOMRIGHT", -T.mult, T.mult)
	f.innerborder:SetBackdrop({
		edgeFile = C["media"].blank,
		edgeSize = T.mult,
		insets = { left = T.mult, right = T.mult, top = T.mult, bottom = T.mult }
	})
	f.innerborder:SetBackdropBorderColor(0,0,0)

end

local function outerBorder(f)
	if f.outerborder then f.outerborder:Show() return end
	f.outerborder = CreateFrame("Frame", nil, f)
	f.outerborder:SetPoint("TOPLEFT", -T.mult, T.mult)
	f.outerborder:SetPoint("BOTTOMRIGHT", T.mult, -T.mult)
	f.outerborder:SetBackdrop({
		edgeFile = C["media"].blank,
		edgeSize = T.mult,
		insets = { left = T.mult, right = T.mult, top = T.mult, bottom = T.mult }
	})
	f.outerborder:SetBackdropBorderColor(0,0,0)

end

-- hooksecurefunc(f, "SetBackdrop", function(self, ...)
		-- if backdrop == nil then
			-- f.innerborder:Hide()
		-- else
			-- f.innerborder:Show()
		-- end
	-- end)
-- hooksecurefunc(f, "SetBackdrop", function(self, ...)
		-- if backdrop == nil then
			-- f.outerborder:Hide()
		-- else
			-- f.outerborder:Show()
		-- end
	-- end)

local function ThickBorder(f, force)
	if f.backdrop and not force then
		outerBorder(f.backdrop)
		innerBorder(f.backdrop)
	else
		outerBorder(f)
		innerBorder(f)
	end
end

local function AddText(parent, name, text, ...)
	local globalName = nil
	if parent:GetName() and name then globalName = (parent:GetName().."_"..name) end

	local fs = parent:CreateFontString(globalName, "OVERLAY")
	fs:SetFont(unpack(C.pFont))
	if text then fs:SetText(text) end
	if ... then
		fs:SetPoint(...)
	end
	if not name then
		parent.text = fs
	else
		parent[name] = fs
	end

	return fs
end

--AddEditBox(self[, name], width, height[, point])
local function AddEditBox(self, ...)
	local vArgs = {...}
	local name = "editbox"
	local width, height, point
	if type(vArgs[1]) == "string" then
		name, width, height, point = ...
	else
		width, height, point = ...
	end

	local editbox = CreateFrame("EditBox", nil, self)
	editbox:SetSize(width, height)
	editbox:SetTemplate()
	editbox:ThickBorder()
	editbox:SetFont(unpack(C.pFont))
	editbox:SetTextInsets(3, 0, 0, 1)
	editbox:SetJustifyH("CENTER")
	editbox:SetAutoFocus(false)
	editbox:ClearFocus()
	editbox:SetScript("OnEscapePressed", function(self) self:ClearFocus() end)
	editbox:SetScript("OnEditFocusGained", function(self) self:HighlightText() end)
	editbox:SetScript("OnEditFocusLost", function(self) self:HighlightText(0,0) end)

	if point then editbox:SetPoint(unpack(point)) end

	self[name] = editbox
end

------------------------------------------------------------------
-- Unitframe Builders --------------------------------------------
------------------------------------------------------------------

local function AddSpark(self)
	local sbTexture = self:GetStatusBarTexture()
	if sbTexture then
		local spark = self:CreateTexture(nil, "OVERLAY")
		spark:SetPoint("TOPLEFT", sbTexture, "TOPRIGHT", 0, 0)
		spark:SetPoint("BOTTOMLEFT", sbTexture, "BOTTOMRIGHT", 0, 0)
		spark:SetWidth(1)
		spark:SetTexture(0,0,0)
		self.spark = spark
		self:SetScript("OnValueChanged", function(self, value)
			local minVal, maxVal = self:GetMinMaxValues()
			if value < minVal+2 or value > maxVal-2 then
				self.spark:Hide()
			else
				self.spark:Show()
			end
		end)
	end
end

local function CreateFiller(self)
	if self.fill then return end
	self.fill = self:CreateTexture(nil, "BACKGROUND")
	self.fill:SetTexture(C.media.normTex)
	self.fill:SetVertexColor(1, 1, 1, C.unitframes.fillAlpha)
	self.fill:SetPoint("TOPLEFT", self:GetStatusBarTexture(), "TOPRIGHT", 0, 0)
	self.fill:SetPoint("BOTTOMLEFT", self:GetStatusBarTexture(), "BOTTOMLEFT", 0, 0)
	self.fill:SetPoint("RIGHT", self, 0, 0)
end

local function AddDetail(self, width, height, ...)
	local detail = CreateFrame("Frame", self:GetName().."_Detail", self)
	detail:SetHeight(height)
	detail:SetWidth(width)
	if ... then detail:SetPoint(...) end
	detail:SetTemplate("Transparent")
	detail:ThickBorder()

	self.Detail = detail

	tinsert(self.__elements, T.UpdateDetailColor)
	T.UpdateDetailColor(self)
end

local function CreateAltPowerBar(self, width, height, ...)
	if self.AltPowerBar then return end
	local varArgs = {...}

	local bar = CreateFrame("StatusBar", self:GetName() and self:GetName().."_AltPowerBar" or nil, self)
	bar:Height(4)
	bar:SetStatusBarTexture(barTex)
	bar:GetStatusBarTexture():SetHorizTile(false)
	bar:SetStatusBarColor(unpack(C.unitframes.statusbarcolor))
	bar:CreateBackdrop()
	bar.backdrop:SetBackdropColor(0, 0, 0)
	bar.backdrop:ThickBorder()

	bar:CreateFiller()
	bar:AddSpark()

	if type(varArgs[1]) == "boolean" then
		bar:AddText("text", "", "CENTER", bar)
		tremove(varArgs, 1)
	end
	bar:SetPoint(unpack(varArgs))

	self.AltPowerBar = bar
end

local function CreateCastBar(self, width, height, ...)
	if self.Castbar then return end
	local varArgs = {...}

	local castbar = CreateFrame("StatusBar", self:GetName() and self:GetName().."_CastBar" or nil, self)
	castbar:SetStatusBarTexture(barTex)
	castbar:CreateBackdrop()
	castbar.backdrop:SetBackdropColor(0, 0, 0, 0)
	castbar.backdrop:ThickBorder()
	castbar:SetHeight(height)
	castbar:SetWidth(width)

	castbar:AddSpark()
	castbar:CreateFiller()

	castbar:AddText("Time", "", "RIGHT", castbar, "RIGHT", -2, 0)
	castbar:AddText("Text", "", "LEFT", castbar, "LEFT", 2, 0)

	if type(varArgs[1]) == "boolean" then
		castbar.Reverse = varArgs[1]
		tremove(varArgs, 1)
	end
	castbar:SetPoint(unpack(varArgs))

	castbar.CustomTimeText = T.CustomCastTimeText
	castbar.CustomDelayText = T.CustomCastDelayText
	castbar.PostCastStart = T.CheckCast
	castbar.PostChannelStart = T.CheckChannel

	self.Castbar = castbar
end

-- oUF_AuraTracker
local function CreateAuraTracker(self, size, ...)
	local AuraTracker = CreateFrame("Frame", self:GetName().."_AuraTracker" or nil, self)
	AuraTracker:SetSize(size, size)
	AuraTracker:SetPoint(...)
	AuraTracker:SetTemplate()
	AuraTracker:ThickBorder()

	AuraTracker.icon = AuraTracker:CreateTexture(nil, "OVERLAY")
	AuraTracker.icon:SetAllPoints(AuraTracker)
	AuraTracker.icon:SetPoint("TOPLEFT", AuraTracker, 1, -1)
	AuraTracker.icon:SetPoint("BOTTOMRIGHT", AuraTracker, -1, 1)
	AuraTracker.icon:SetTexCoord(0.08,0.92,0.08,0.92)

	AuraTracker:AddText("Timer", "", "CENTER", 1, 0)
	AuraTracker:AddText("Count", "", "BOTTOMRIGHT", -1, 1)
	AuraTracker:Hide()
	self.AuraTracker = AuraTracker
end

local function addapi(object)
	local mt = getmetatable(object).__index
	if not object.AllPoints then mt.AllPoints = AllPoints end
	if not object.ThickBorder then mt.ThickBorder = ThickBorder end
	if not object.InnerBorder then mt.Innerborder = innerBorder end
	if not object.OuterBorder then mt.Outerborder = outerBorder end
	if not object.AddEditBox then mt.AddEditBox = AddEditBox end
	if not object.AddText then mt.AddText = AddText end
	if not object.AddSpark then mt.AddSpark = AddSpark end
	if not object.AddDetail then mt.AddDetail = AddDetail end
	if not object.CreateFiller then mt.CreateFiller = CreateFiller end
	if not object.CreateAltPowerBar then mt.CreateAltPowerBar = CreateAltPowerBar end
	if not object.CreateCastBar then mt.CreateCastBar = CreateCastBar end
	if not object.CreateAuraTracker then mt.CreateAuraTracker = CreateAuraTracker end
end

local handled = {["Frame"] = true}
local object = CreateFrame("Frame")
addapi(object)
addapi(object:CreateTexture())
addapi(object:CreateFontString())

object = EnumerateFrames()
while object do
	if not handled[object:GetObjectType()] then
		addapi(object)
		handled[object:GetObjectType()] = true
	end

	object = EnumerateFrames(object)
end