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 LDB, 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 ClickDropdown(self, name)
	if(IsShiftKeyDown() and not pending) then
		local dialog = StaticPopup_Show('CONFIRM_SAVE_EQUIPMENT_SET', name)
		dialog.data = name
	elseif(IsControlKeyDown() and not pending) then
		local dialog = StaticPopup_Show('CONFIRM_DELETE_EQUIPMENT_SET', name)
		dialog.data = name
	else
		if(InCombatLockdown()) then
			Broker_Equipment:RegisterEvent('PLAYER_REGEN_ENABLED')
			pending = name

			UpdateDisplay()
		else
			EquipmentManager_EquipSet(name)
		end
	end
end

local function OnTooltipShow(self)
	self:SetEquipmentSet(LDB.text)
end

local function OnClick(self, button)
	if(GameTooltip:GetOwner() == self) then
		GameTooltip:Hide()
	end

	if(button ~= 'RightButton' and GetNumEquipmentSets() > 0) then
		ToggleDropDownMenu(1, nil, Broker_Equipment, self, 0, 0)
	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

local info = {}
local function CreateDropdown()
	for index = 1, GetNumEquipmentSets() do
		local name, icon, _, equipped, _, _, _, missing  = GetEquipmentSetInfo(index)
		info.func = ClickDropdown
		info.icon = icon
		info.arg1 = name
		info.checked = equipped

		info.tooltipTitle = 'Broker_Equipment_Hack'
		info.tooltipText = name
		info.tooltipWhileDisabled = true
		info.tooltipOnButton = true

		if(pending == name) then
			info.text = string.format('|cffffff00%s|r', name)
		elseif(missing > 0) then
			info.text = string.format('|cffff0000%s|r', name)
		else
			info.text = name
		end

		UIDropDownMenu_AddButton(info)
	end
end

function Broker_Equipment:PLAYER_LOGIN()
	LDB = LibStub('LibDataBroker-1.1'):NewDataObject('Broker_Equipment', {
		type = 'data source',
		OnTooltipShow = OnTooltipShow,
		OnClick = OnClick,
	})

	self:RegisterEvent('UNIT_INVENTORY_CHANGED')
	self:RegisterEvent('EQUIPMENT_SETS_CHANGED')
	self.EQUIPMENT_SETS_CHANGED = UpdateDisplay

	self.initialize = CreateDropdown
	self.displayMode = 'MENU'

	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')

	ClickDropdown(nil, pending)
	pending = nil
end

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

GameTooltip:HookScript('OnShow', function(self)
	if(GameTooltipTextLeft1:GetText() == 'Broker_Equipment_Hack') then
		GameTooltip:SetEquipmentSet(GameTooltipTextLeft2:GetText())
	end
end)