Quantcast
local Broker_Equipment = CreateFrame('Frame')
Broker_Equipment:RegisterEvent('PLAYER_LOGIN')
Broker_Equipment:SetScript('OnEvent', function(self, event, ...) self[event](self, ...) end)
Broker_Equipment:Hide()

local BACKDROP = {
	bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
	edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], edgeSize = 16,
	insets = {top = 3, bottom = 3, left = 3, right = 3}
}

local LDB = LibStub('LibDataBroker-1.1'):NewDataObject('Broker_Equipment', {
	type = 'data source',
})

local Menu, pending

local function UpdateDisplay()
	if(InCombatLockdown() and pending) then
		LDB.text = '|cffffff00' .. pending
		LDB.icon = [[Interface\Icons\]] .. GetEquipmentSetInfoByName(pending)
	else
		for index = 1, GetNumEquipmentSets() do
			local name, icon, _, equipped = GetEquipmentSetInfo(index)
			if(equipped) then
				LDB.text = name
				LDB.icon = icon
				return
			end
		end

		LDB.text = UNKNOWN
		LDB.icon = [[Interface\Icons\INV_Misc_QuestionMark]]
	end
end

local function OnItemClick(self)
	if(IsShiftKeyDown() and not pending) then
		local dialog = StaticPopup_Show('CONFIRM_SAVE_EQUIPMENT_SET', self.name)
		dialog.data = self.name
	elseif(IsControlKeyDown() and not pending) then
		local dialog = StaticPopup_Show('CONFIRM_DELETE_EQUIPMENT_SET', self.name)
		dialog.data = self.name
	else
		if(InCombatLockdown()) then
			Broker_Equipment:RegisterEvent('PLAYER_REGEN_ENABLED')
			pending = self.name

			UpdateDisplay()
		else
			EquipmentManager_EquipSet(pending or self.name)
		end
	end

	Menu:Hide()
end

local function OnEnter()
	Menu.Fader:Stop()
end

local function OnLeave()
	Menu.Fader:Play()
end

local function OnItemEnter(self)
	if(Broker_EquipmentDB.showTooltipMenu) then
		GameTooltip:SetOwner(self, 'ANCHOR_RIGHT')
		GameTooltip:SetEquipmentSet(self.name)
	end

	OnEnter()
end

local function UpdateMenu(parent)
	local maxWidth = 0

	local numEquipmentSets = GetNumEquipmentSets()
	for index = 1, numEquipmentSets do
		local Item = Menu.items[index]
		if(not Item) then
			Item = CreateFrame('Button', nil, Menu)
			Item:SetPoint('TOPLEFT', 11, -((index - 1) * 18) - UIDROPDOWNMENU_BORDER_HEIGHT)
			Item:SetHighlightTexture([[Interface\QuestFrame\UI-QuestTitleHighlight]])
			Item:GetHighlightTexture():SetBlendMode('ADD')
			Item:SetScript('OnClick', OnItemClick)
			Item:SetScript('OnEnter', OnItemEnter)
			Item:SetScript('OnLeave', GameTooltip_Hide)
			Item:HookScript('OnLeave', OnLeave)

			local Button = CreateFrame('CheckButton', nil, Item)
			Button:SetPoint('LEFT')
			Button:SetSize(16, 16)
			Button:SetNormalTexture([[Interface\Common\UI-DropDownRadioChecks]])
			Button:GetNormalTexture():SetTexCoord(0.5, 1, 0.5, 1)
			Button:SetCheckedTexture([[Interface\Common\UI-DropDownRadioChecks]])
			Button:GetCheckedTexture():SetTexCoord(0, 0.5, 0.5, 1)
			Button:EnableMouse(false)
			Item.Button = Button

			local Label = Item:CreateFontString(nil, nil, 'GameFontHighlightSmall')
			Label:SetPoint('LEFT', 20, 0)
			Item:SetFontString(Label)
			Item.Label = Label

			local Icon = Item:CreateTexture(nil, 'ARTWORK')
			Icon:SetPoint('RIGHT')
			Icon:SetSize(16, 16)
			Item.Icon = Icon

			Menu.items[index] = Item
		else
			Item:Show()
		end

		local name, icon, _, equipped, _, _, _, missing = GetEquipmentSetInfo(index)
		Item.Button:SetChecked(equipped)
		Item.Icon:SetTexture(icon)
		Item.name = name

		if(pending == name) then
			Item:SetFormattedText('|cffffff00%s|r', name)
		elseif(missing > 0) then
			Item:SetFormattedText('|cffff0000%s|r', name)
		else
			Item:SetText(name)
		end

		local width = Item.Label:GetWidth() + 50
		if(width > maxWidth) then
			maxWidth = width
		end
	end

	for index = numEquipmentSets + 1, #Menu.items do
		Menu.items[index]:Hide()
	end

	for _, Item in next, Menu.items do
		Item:SetSize(maxWidth, 18)
	end

	Menu:SetSize(maxWidth + 25, (numEquipmentSets * 18) + (UIDROPDOWNMENU_BORDER_HEIGHT * 2))
end

function LDB:OnTooltipShow()
	if(Broker_EquipmentDB.showTooltipDisplay) then
		self:SetEquipmentSet(LDB.text)
	end
end

local hooked = {}
function LDB:OnClick(button)
	if(GameTooltip:GetOwner() == self) then
		GameTooltip:Hide()
	end

	if(button ~= 'RightButton' and GetNumEquipmentSets() > 0) then
		if(not Menu) then
			Menu = CreateFrame('Frame', nil, UIParent)
			Menu:SetBackdrop(BACKDROP)
			Menu:SetBackdropColor(0, 0, 0)
			Menu:SetFrameStrata('DIALOG')
			Menu:SetScript('OnEnter', OnEnter)
			Menu:SetScript('OnLeave', OnLeave)
			Menu:Hide()
			Menu.items = {}

			local Fader = Menu:CreateAnimationGroup()
			Fader:CreateAnimation():SetDuration(UIDROPDOWNMENU_SHOW_TIME)
			Fader:SetScript('OnFinished', function()
				Menu:Hide()
			end)
			Menu.Fader = Fader
		end

		if(Menu:IsShown()) then
			Menu:Hide()
		else
			UpdateMenu(self)
			Menu:ClearAllPoints()
			Menu:SetPoint('TOP', self, 'BOTTOM') -- temporary anchor

			local sideAnchor = ''
			if(Menu:GetRight() > GetScreenWidth()) then
				sideAnchor = 'RIGHT'
			elseif(Menu:GetLeft() <= 0) then
				sideAnchor = 'LEFT'
			end

			Menu:ClearAllPoints()
			if(Menu:GetBottom() <= 0) then
				Menu:SetPoint('BOTTOM' .. sideAnchor, self, 'TOP' .. sideAnchor)
			else
				Menu:SetPoint('TOP' .. sideAnchor, self, 'BOTTOM' .. sideAnchor)
			end

			Menu:Show()
		end

		PlaySound('igMainMenuOptionCheckBoxOn')

		if(not hooked[self]) then
			self:HookScript('OnEnter', OnEnter)
			self:HookScript('OnLeave', OnLeave)

			hooked[self] = true
		end
	else
		if(not PaperDollFrame:IsVisible()) then
			ToggleCharacter('PaperDollFrame')
		end

		if(not CharacterFrame.Expanded) then
			SetCVar('characterFrameCollapsed', '0')
			CharacterFrame_Expand()
		end

		if(not _G[PAPERDOLL_SIDEBARS[3].frame]:IsShown()) then
			Broker_Equipment:Show()
		end
	end
end

function Broker_Equipment:PLAYER_LOGIN()
	self:RegisterEvent('UNIT_INVENTORY_CHANGED')
	self:RegisterEvent('EQUIPMENT_SETS_CHANGED')
	self.EQUIPMENT_SETS_CHANGED = UpdateDisplay

	UpdateDisplay()
end

function Broker_Equipment:UNIT_INVENTORY_CHANGED(unit)
	if(unit == 'player') then
		UpdateDisplay()
	end
end

function Broker_Equipment:PLAYER_REGEN_ENABLED()
	self:UnregisterEvent('PLAYER_REGEN_ENABLED')

	OnItemClick()
	pending = nil
end

Broker_Equipment:SetScript('OnUpdate', function(self)
	PaperDollFrame_SetSidebar(nil, 3)
	self:Hide()
end)