Quantcast
local _, ns = ...

local LSM = LibStub('LibSharedMedia-3.0')
local OBJECTS = {
	Zone = 'MinimapZoneTextButton',
	Difficulty = 'MiniMapInstanceDifficulty',
	Battlefield = 'MiniMapBattlefieldFrame',
	Dungeon = 'MiniMapLFGFrame',
	Tracking = 'MiniMapTracking',
	Clock = 'TimeManagerClockButton',
	Mail = 'MiniMapMailFrame',
}

function ns.UpdateObjects()
	for name, setting in pairs(pMinimapDB.objects) do
		local object = _G[OBJECTS[name]]

		if(setting.shown) then
			object:SetAlpha(1)
			object:EnableMouse(true)
		else
			object:SetAlpha(0)
			object:EnableMouse(false)
		end

		object:ClearAllPoints()
		object:SetPoint(setting.point)
	end
end

function ns.UpdateCore()
	Minimap:SetScale(pMinimapDB.minimap.scale)
	Minimap:SetFrameStrata(pMinimapDB.minimap.strata)
	Minimap:SetFrameLevel(pMinimapDB.minimap.level)

	local size = pMinimapDB.minimap.borderSize
	Minimap:SetBackdrop({bgFile = [=[Interface\ChatFrame\ChatFrameBackground]=], insets = {left = -size, right = -size, top = -size, bottom = -size}})
	Minimap:SetBackdropColor(unpack(pMinimapDB.minimap.borderColors))
end

function ns.UpdateFont()
	local font, size = LSM:Fetch('font', pMinimapDB.font.name), pMinimapDB.font.size
	local flag = pMinimapDB.font.shadow .. (pMinimapDB.font.monochrome and 'MONOCHROME' or '')

	MinimapZoneText:SetFont(font, size, flag)
	TimeManagerClockTicker:SetFont(font, size, flag)
end


local function AddConfig(name, func)
	local group = CreateFrame('Frame', nil, InterfaceOptionsFramePanelContainer)
	group.name = name
	group:SetScript('OnShow', func)
	group:HookScript('OnShow', function(self) self:SetScript('OnShow', nil) end)

	if(name ~= 'pMinimap') then
		group.parent = 'pMinimap'
		group.addonname = 'pMinimap'
	end

	InterfaceOptions_AddCategory(group)
end

AddConfig('pMinimap', function(self)
	local scale = ns.slider(self, 'Scale', '%.1f', pMinimapDB.minimap.scale, 0.5, 2.5, 0.1, 'TOPLEFT', 30, -30)
	scale:HookScript('OnValueChanged', function(frame, value)
		pMinimapDB.minimap.scale = value
		ns.UpdateCore()
	end)

	local level = ns.slider(self, 'Frame Level', '%d', pMinimapDB.minimap.level, 0, 10, 1, 'TOPRIGHT', -30, -30)
	level:HookScript('OnValueChanged', function(frame, value)
		pMinimapDB.minimap.level = value
		ns.UpdateCore()
	end)

	local strata = ns.dropdown(self, 'Frame Strata', pMinimapDB.minimap.strata, {'HIGH', 'MEDIUM', 'LOW', 'BACKGROUND'},
		function(self)
			pMinimapDB.minimap.strata = self.value
			ns.UpdateCore()
		end)
	strata:SetPoint('TOPRIGHT', -10, -80)

	local background1 = self:CreateTexture(nil, 'BACKGROUND')
	background1:SetPoint('TOPLEFT', scale, -20, 20)
	background1:SetPoint('BOTTOMRIGHT', strata, 0, -5)
	background1:SetTexture(0, 0, 0, 0.5)

	local borderSize = ns.slider(self, 'Border Thickness', '%d', pMinimapDB.minimap.borderSize, 0, 10, 1, 'LEFT', 30, 0)
	borderSize:HookScript('OnValueChanged', function(frame, value)
		pMinimapDB.minimap.borderSize = value
		ns.UpdateCore()
	end)

	local borderColor = ns.palette(self, 'Border Color', pMinimapDB.minimap.borderColors, 'RIGHT', -130, 0)

	local background2 = self:CreateTexture(nil, 'BACKGROUND')
	background2:SetPoint('TOPLEFT', borderSize, -20, 20)
	background2:SetPoint('BOTTOMRIGHT', borderColor, 120, -20)
	background2:SetTexture(0, 0, 0, 0.5)

	ns.dropdown(self, 'Font', pMinimapDB.font.name, LSM:List('font'),
		function(self)
			pMinimapDB.font.name = self.value
			ns.UpdateFont()
		end
	):SetPoint('BOTTOMLEFT', 10, 20)

	local size = ns.slider(self, 'Font Size', '%d', pMinimapDB.font.size, 6, 36, 1, 'BOTTOMLEFT', 30, 80)
	size:HookScript('OnValueChanged', function(frame, value)
		pMinimapDB.font.size = value
		ns.UpdateFont()
	end)

	local shadow = ns.dropdown(self, 'Font Shadow', pMinimapDB.font.shadow, {'OUTLINE', 'THICKOUTLINE', 'NONE'},
		function(self)
			pMinimapDB.font.shadow = self.value
			ns.UpdateFont()
		end)
	shadow:SetPoint('BOTTOMRIGHT', -10, 20)

	local monochrome = ns.checkbox(self, 'Monochrome', 'BOTTOMRIGHT', -140, 75)
	monochrome:SetChecked(pMinimapDB.font.monochrome)
	monochrome:SetScript('OnClick', function()
		pMinimapDB.font.monochrome = not pMinimapDB.font.monochrome
		ns.UpdateFont()
	end)

	local background3 = self:CreateTexture(nil, 'BACKGROUND')
	background3:SetPoint('TOPLEFT', size, -20, 20)
	background3:SetPoint('BOTTOMRIGHT', shadow, 0, -5)
	background3:SetTexture(0, 0, 0, 0.5)
end)

AddConfig('Objects', function(self)
	local points = {'TOPLEFT', 'TOP', 'TOPRIGHT', 'LEFT', 'CENTER', 'RIGHT', 'BOTTOMLEFT', 'BOTTOM', 'BOTTOMRIGHT'}
	local offset = 25

	for name, setting in pairs(pMinimapDB.objects) do
		local shown = ns.checkbox(self, name, 'TOPLEFT', 25, -offset)
		shown:SetChecked(setting.shown)
		shown:SetScript('OnClick', function()
			setting.shown = not setting.shown
			ns.UpdateObjects()
		end)

		local position = ns.dropdown(self, name..' Position', setting.point, points,
			function(self)
				setting.point = self.value
				ns.UpdateObjects()
			end)
		position:SetPoint('TOPRIGHT', -10, -offset)

		local background = self:CreateTexture(nil, 'BACKGROUND')
		background:SetPoint('TOPLEFT', shown, -15, 15)
		background:SetPoint('BOTTOMRIGHT', position)
		background:SetTexture(0, 0, 0, 0.4)

		offset = offset + 60
	end
end)