Quantcast
------------------------------------------------------
-- MEDIA & CONFIG ------------------------------------
------------------------------------------------------
local font = { [[Interface\AddOns\stAddonManager\media\SEMPRG__.TTF]], 8, "MONOCHROMEOUTLINE" }
local barTex = [[Interface\AddOns\stAddonManager\media\normTex.tga]]
local blankTex = [[Interface\AddOns\stAddonManager\media\blankTex.tga]]
local glowTex = [[Interface\AddOns\stAddonManager\media\glowTex.tga]]

local bordercolor = {0, 0, 0, 1}
local backdropcolor = {0.05, 0.05, 0.05, 0.9}
local backdrop = {
	bgFile = blankTex,
	edgeFile =  blankTex,
	tile = false, tileSize = 0, edgeSize = 1,
	insets = { left = 1, right = 1, top = 1, bottom = 1},
}

------------------------------------------------------
-- INITIAL FRAME CREATION ----------------------------
------------------------------------------------------
stAddonManager = CreateFrame("Frame", "stAddonManager", UIParent)
stAddonManager:SetFrameStrata("HIGH")
stAddonManager.header = CreateFrame("Frame", "stAddonmanager_Header", stAddonManager)

stAddonManager.header:SetPoint("CENTER", UIParent, "CENTER", 0, 50)
stAddonManager:SetPoint("TOP", stAddonManager.header, "TOP", 0, 0)

------------------------------------------------------
-- FUNCTIONS -----------------------------------------
------------------------------------------------------
local function SkinFrame(frame, shadowed)
	frame:SetBackdrop(backdrop)
	frame:SetBackdropColor(unpack(backdropcolor))
	frame:SetBackdropBorderColor(unpack(bordercolor))

	if shadowed and not frame.shadow then
		local shadow = CreateFrame("Frame", nil, frame)
		shadow:SetFrameLevel(frame:GetFrameLevel())
		shadow:SetFrameStrata(frame:GetFrameStrata())
		shadow:SetPoint("TOPLEFT", -3, 3)
		shadow:SetPoint("BOTTOMLEFT", -3, -3)
		shadow:SetPoint("TOPRIGHT", 3, 3)
		shadow:SetPoint("BOTTOMRIGHT", 3, -3)
		shadow:SetBackdrop( {
			edgeFile = glowTex, edgeSize = 3,
			insets = {left = 5, right = 5, top = 5, bottom = 5},
		})
		shadow:SetBackdropColor(0, 0, 0, 0)
		shadow:SetBackdropBorderColor(0, 0, 0, 0.8)
		frame.shadow = shadow
	end
end

local function CreateBackdrop(frame, shadowed)
	if not frame.backdrop then
		local backdrop = CreateFrame("Frame", nil, frame)
		backdrop:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 1, 1)
		backdrop:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", -1, -1)
		SkinFrame(backdrop, shadowed)
		backdrop:SetFrameLevel(frame:GetFrameLevel()>0 and frame:GetFrameLevel()-1 or 0)
		backdrop:SetFrameStrata(frame:GetFrameStrata())

		frame.backdrop = backdrop
	end
end

local function StripTextures(object, kill)
	for i=1, object:GetNumRegions() do
		local region = select(i, object:GetRegions())
		if region:GetObjectType() == "Texture" then
			region:SetTexture(nil)
		end
	end
end

local function SkinScrollBar(frame, thumbTrim)
	if _G[frame:GetName().."BG"] then _G[frame:GetName().."BG"]:SetTexture(nil) end
	if _G[frame:GetName().."Track"] then  _G[frame:GetName().."Track"]:SetTexture(nil) end

	if _G[frame:GetName().."Top"] then
		_G[frame:GetName().."Top"]:SetTexture(nil)
		_G[frame:GetName().."Bottom"]:SetTexture(nil)
		_G[frame:GetName().."Middle"]:SetTexture(nil)
	end

	local uScroll = _G[frame:GetName().."ScrollUpButton"]
	local dScroll = _G[frame:GetName().."ScrollDownButton"]
	local track = _G[frame:GetName().."Track"]

	if uScroll and dScroll then
		StripTextures(uScroll)
		StripTextures(dScroll)
		dScroll:EnableMouse(false)
		uScroll:EnableMouse(false)

		if frame:GetThumbTexture() then
			frame:GetThumbTexture():SetTexture(nil)
			if not frame.thumbbg then
				frame.thumbbg = CreateFrame("Frame", nil, frame)
				frame.thumbbg:SetPoint("TOPLEFT", frame:GetThumbTexture(), "TOPLEFT", 2, 14)
				frame.thumbbg:SetPoint("BOTTOMRIGHT", frame:GetThumbTexture(), "BOTTOMRIGHT", -2, -14)
				SkinFrame(frame.thumbbg)
				if frame.trackbg then
					frame.thumbbg:SetFrameLevel(frame.trackbg:GetFrameLevel()+2)
				end
			end
		end
	end
end

function stAddonManager:UpdateAddonList(queryString)
	local addons = {}
	for i=1, GetNumAddOns() do
		local name, title, notes, enabled, loadable, reason, security = GetAddOnInfo(i)
		local lwrTitle, lwrName = strlower(title), strlower(name)
		if (queryString and (strfind(lwrTitle,strlower(queryString)) or strfind(lwrName,strlower(queryString)))) or (not queryString) then
			addons[i] = {}
			addons[i].name = name
			addons[i].title = title
			addons[i].notes = notes
			addons[i].enabled = enabled
		end
	end
	return addons
end

local function LoadWindow()
	if not stAddonManager.Loaded then
		local window = stAddonManager
		local header = window.header

		tinsert(UISpecialFrames,window:GetName());

		window:SetSize(300,300)
		header:SetSize(300,20)

		SkinFrame(window)
		SkinFrame(header)

		header:EnableMouse(true)
		header:SetMovable(true)
		header:SetScript("OnMouseDown", function(self) self:StartMoving() end)
		header:SetScript("OnMouseUp", function(self) self:StopMovingOrSizing() end)

		local hTitle = stAddonManager.header:CreateFontString(nil, "OVERLAY")
		hTitle:SetFont(unpack(font))
		hTitle:SetPoint("CENTER")
		hTitle:SetText("|cff00aaffst|rAddonManager")
		header.title = hTitle

		local close = CreateFrame("Button", nil, header)
		close:SetPoint("RIGHT", header, "RIGHT", 0, 0)
		close:SetFrameLevel(header:GetFrameLevel()+2)
		close:SetSize(20, 20)
		close.text = close:CreateFontString(nil, "OVERLAY")
		close.text:SetFont(unpack(font))
		close.text:SetText("x")
		close.text:SetPoint("CENTER", close, "CENTER", 0, 0)
		close:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end)
		close:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end)
		close:SetScript("OnClick", function() window:Hide() end)
		header.close = close

		addonListBG = CreateFrame("Frame", window:GetName().."_ScrollBackground", window)
		addonListBG:SetPoint("TOPLEFT", header, "TOPLEFT", 10, -50)
		addonListBG:SetWidth(window:GetWidth()-20)
		addonListBG:SetHeight(window:GetHeight()-60)
		SkinFrame(addonListBG)

		--Create scroll frame (God damn these things are a pain)
		local scrollFrame = CreateFrame("ScrollFrame", window:GetName().."_ScrollFrame", window, "UIPanelScrollFrameTemplate")
		scrollFrame:SetPoint("TOPLEFT", addonListBG, "TOPLEFT", 0, -2)
		scrollFrame:SetWidth(addonListBG:GetWidth()-25)
		scrollFrame:SetHeight(addonListBG:GetHeight()-5)
		SkinScrollBar(_G[window:GetName().."_ScrollFrameScrollBar"])
		scrollFrame:SetFrameLevel(window:GetFrameLevel()+1)

		scrollFrame.Anchor = CreateFrame("Frame", window:GetName().."_ScrollAnchor", scrollFrame)
		scrollFrame.Anchor:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, -3)
		scrollFrame.Anchor:SetWidth(window:GetWidth()-40)
		scrollFrame.Anchor:SetHeight(scrollFrame:GetHeight())
		scrollFrame.Anchor:SetFrameLevel(scrollFrame:GetFrameLevel()+1)
		scrollFrame:SetScrollChild(scrollFrame.Anchor)

		--Load up addon information
		stAddonManager.AllAddons = stAddonManager:UpdateAddonList()
		stAddonManager.FilteredAddons = stAddonManager:UpdateAddonList()
		stAddonManager.showEnabled = true
		stAddonManager.showDisabled = true

		stAddonManager.Buttons = {}

		--Create initial list
		for i, addon in pairs(stAddonManager.AllAddons) do
			local button = CreateFrame("Frame", nil, scrollFrame.Anchor)
			button:SetFrameLevel(scrollFrame.Anchor:GetFrameLevel() + 1)
			button:SetSize(16, 16)
			SkinFrame(button)
			if addon.enabled then
				button:SetBackdropColor(0/255, 170/255, 255/255)
			end

			if i == 1 then
				button:SetPoint("TOPLEFT", scrollFrame.Anchor, "TOPLEFT", 5, -5)
			else
				button:SetPoint("TOP", stAddonManager.Buttons[i-1], "BOTTOM", 0, -5)
			end
			button.text = button:CreateFontString(nil, "OVERLAY")
			button.text:SetFont(unpack(font))
			button.text:SetJustifyH("LEFT")
			button.text:SetPoint("LEFT", button, "RIGHT", 8, 0)
			button.text:SetPoint("RIGHT", scrollFrame.Anchor, "RIGHT", 0, 0)
			button.text:SetText(addon.title)

			button:SetScript("OnEnter", function(self)
				--tooltip stuff
			end)

			button:SetScript("OnMouseDown", function(self)
				if addon.enabled then
					self:SetBackdropColor(unpack(backdropcolor))
					DisableAddOn(addon.name)
					addon.enabled = false
				else
					self:SetBackdropColor(0/255, 170/255, 255/255)
					EnableAddOn(addon.name)
					addon.enabled = true
				end
			end)

			stAddonManager.Buttons[i] = button
		end

		local function UpdateList(AddonsTable)
			--Start off by hiding all of the buttons
			for _, b in pairs(stAddonManager.Buttons) do b:Hide() end

			local bIndex = 1
			for i, addon in pairs(AddonsTable) do
				local button = stAddonManager.Buttons[bIndex]
				button:Show()
				if addon.enabled then
					button:SetBackdropColor(0/255, 170/255, 255/255)
				else
					button:SetBackdropColor(unpack(backdropcolor))
				end

				button:SetScript("OnMouseDown", function(self)
					if addon.enabled then
						self:SetBackdropColor(unpack(backdropcolor))
						DisableAddOn(addon.name)
						addon.enabled = false
					else
						self:SetBackdropColor(0/255, 170/255, 255/255)
						EnableAddOn(addon.name)
						addon.enabled = true
					end
				end)

				button.text:SetText(addon.title)
				bIndex = bIndex+1
			end
		end

		--Search Bar
		local searchBar = CreateFrame("EditBox", window:GetName().."_SearchBar", window)
		searchBar:SetFrameLevel(window:GetFrameLevel()+1)
		searchBar:SetPoint("TOPLEFT", header, "BOTTOMLEFT", 10, -5)
		searchBar:SetWidth(200)
		searchBar:SetHeight(20)
		SkinFrame(searchBar)
		searchBar:SetFont(unpack(font))
		searchBar:SetText("Search")
		searchBar:SetAutoFocus(false)
		searchBar:SetTextInsets(3, 0, 0 ,0)
		searchBar:SetScript("OnEnterPressed", function(self) self:ClearFocus() end)
		searchBar:SetScript("OnEscapePressed", function(self) searchBar:SetText("Search") UpdateList(stAddonManager.AllAddons) searchBar:ClearFocus() end)
		searchBar:SetScript("OnEditFocusGained", function(self) self:HighlightText() end)
		searchBar:SetScript("OnTextChanged", function(self, input)
			if input then
				stAddonManager.FilteredAddons = stAddonManager:UpdateAddonList(self:GetText())
				UpdateList(stAddonManager.FilteredAddons)
			end
		end)

		local sbClear = CreateFrame("Button", nil, searchBar)
		sbClear:SetPoint("RIGHT", searchBar, "RIGHT", 0, 0)
		sbClear:SetFrameLevel(searchBar:GetFrameLevel()+2)
		sbClear:SetSize(20, 20)
		sbClear.text = sbClear:CreateFontString(nil, "OVERLAY")
		sbClear.text:SetFont(unpack(font))
		sbClear.text:SetText("x")
		sbClear.text:SetPoint("CENTER", sbClear, "CENTER", 0, 0)
		sbClear:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end)
		sbClear:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end)
		sbClear:SetScript("OnClick", function(self) searchBar:SetText("Search") UpdateList(stAddonManager.AllAddons) searchBar:ClearFocus() end)
		searchBar.clear = sbClear

		local reloadButton = CreateFrame("Button", window:GetName().."_ReloadUIButton", window)
		reloadButton:SetPoint("LEFT", searchBar, "RIGHT", 5, 0)
		reloadButton:SetWidth(window:GetWidth()-25-searchBar:GetWidth())
		reloadButton:SetHeight(searchBar:GetHeight())
		reloadButton.text = reloadButton:CreateFontString(nil, "OVERLAY")
		reloadButton.text:SetPoint("CENTER")
		reloadButton.text:SetFont(unpack(font))
		reloadButton.text:SetText("ReloadUI")
		reloadButton:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end)
		reloadButton:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end)
		reloadButton:SetScript("OnClick", function(self)
			if InCombatLockdown() then return end
			ReloadUI()
		end)
		SkinFrame(reloadButton)

		stAddonManager.Loaded = true
	else
		stAddonManager:Show()
	end
end

SLASH_STADDONMANAGER1, SLASH_STADDONMANAGER2, SLASH_STADDONMANAGER3 = "/staddonmanager", "/stam", "/staddon"
SlashCmdList["STADDONMANAGER"] = LoadWindow

local function CheckForAddon(event, addon, addonName)
	return ((event == "PLAYER_ENTERING_WORLD" and IsAddOnLoaded(addonName)) or (event == "ADDON_LOADED" and addon == addonName))
end

local gmbAddOns = CreateFrame("Button", "GameMenuButtonAddOns", GameMenuFrame, "GameMenuButtonTemplate")
gmbAddOns:SetSize(GameMenuButtonMacros:GetWidth(), GameMenuButtonMacros:GetHeight())
GameMenuFrame:SetHeight(GameMenuFrame:GetHeight()+GameMenuButtonMacros:GetHeight());
GameMenuButtonLogout:SetPoint("TOP", gmbAddOns, "BOTTOM", 0, -1)
gmbAddOns:SetPoint("TOP", GameMenuButtonMacros, "BOTTOM", 0, -1)
gmbAddOns:SetText("|cff00aaffst|rAddonManager")
gmbAddOns:SetScript("OnClick", function()
	HideUIPanel(GameMenuFrame);
	LoadWindow()
end)

gmbAddOns:RegisterEvent("ADDON_LOADED")
gmbAddOns:RegisterEvent("PLAYER_ENTERING_WORLD")
gmbAddOns:SetScript("OnEvent", function(self, event, addon)
	if CheckForAddon(event, addon, "Aurora") then
		local F, C = unpack(Aurora)
		if not gmbAddOns.skinned then
			F.Reskin(gmbAddOns)
			gmbAddOns.skinned = true
		end

	elseif CheckForAddon(event, addon, "Tukui") then
		local T, C, L = unpack(Tukui)
		T.SkinButton(gmbAddOns)
		local font = {GameMenuButtonMacros:GetFontString():GetFont()}
		local shadow = {GameMenuButtonMacros:GetFontString():GetShadowOffset()}
		gmbAddOns:GetFontString():SetFont(unpack(font))
		gmbAddOns:GetFontString():SetShadowOffset(unpack(shadow))
	end
end)