You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

586 lines
18 KiB

local addonName, addon = ...
addon = LibStub("AceAddon-3.0"):GetAddon(addonName)
local L = LibStub("AceLocale-3.0"):GetLocale(addonName)
local AceGUI = LibStub("AceGUI-3.0")
local CollectionList = addon.CollectionList
CollectionList.showAll = true
local MogItLoaded = false
local refresh = false
local LISTWINDOW
local vendorDB = {}
local locationDB = {}
local RetrievingDataText = RED_FONT_COLOR_CODE..RETRIEVING_ITEM_INFO
local function GetBossInfo(itemID)
local drops = C_TransmogCollection.GetAppearanceSourceDrops(itemID)
local sourceText = ""
if #drops == 1 then
sourceText = string.format(WARDROBE_TOOLTIP_ENCOUNTER_SOURCE, drops[1].encounter, drops[1].instance)
local drop = drops[1]
local diffText = drop.difficulties[1]
if diffText then
for i = 2, #drop.difficulties do
diffText = diffText..", "..drop.difficulties[i]
end
sourceText = sourceText.." "..string.format(PARENS_TEMPLATE, diffText)
end
end
return sourceText
end
local inspectScantip = CreateFrame("GameTooltip", addonName.."ScanningTooltip", nil, "GameTooltipTemplate")
inspectScantip:SetOwner(UIParent, "ANCHOR_NONE")
local needsRefresh
local refreshData
local function GetQuestnfo(questData)
--for i = 1, #questData do
local sourceData
local questID = questData
local questName
local link = "quest:"..questID
inspectScantip:SetHyperlink("quest:"..questID)
--local link = "\124cffffff00\124Hquest:%s\124h[%s]\124h\124r"
if inspectScantip:NumLines() > 0 then
needsRefresh = nil
local tooltipLine = _G[addonName.."ScanningTooltipTextLeft1"]
local text = tooltipLine:GetText()
if text and text ~= "" then
questName = text
--link = link:format(questID,questName)
end
else
needsRefresh = true
end
inspectScantip:ClearLines()
--local zoneName = ("%s: "):format(locationDB[questID][1]) --GetZoneName(QuestToZone[questID],"%s: ").
local questlocationDB = _G.BetterWardrobeData.questlocationDB or {}
local zoneid = questlocationDB[tonumber(questID)]
local zoneid = zoneid and zoneid[1] or 0
local zoneName = locationDB[zoneid] --GetZoneName(QuestToZone[questID],"%s: ")
return questName, zoneName, questID, link
end
local function GetDropInfo(dropData)
local zonelist = {}
local objectlist = {}
local containerlist = {}
for zoneID in string.gmatch(dropData, "(%w+),") do
if string.match(zoneID, "c") then
zoneID = string.gsub(tostring(zoneID),"c","")
table.insert(containerlist, tonumber(zoneID))
elseif string.match(zoneID, "o") then
zoneID = string.gsub(tostring(zoneID),"o","")
table.insert(objectlist, tonumber(zoneID))
else
table.insert(zonelist, tonumber(zoneID))
end
end
return zonelist, objectlist, containerlist
end
local function GetSourceInfo(itemID)
local zonelist = {}
local objectlist = {}
local containerlist = {}
local questList = {}
local achievementList = {}
local professionList = {}
local vendorList = {}
local itemSourceDB = (_G.BetterWardrobeData and _G.BetterWardrobeData.sourceDB )or {}
local dropData = itemSourceDB[tonumber(itemID)]
if dropData then
--for sourceID in string.gmatch(dropData, '(%a:%-?%d+:-),') do
for sourceID in string.gmatch(dropData, '(%a:%-?%d+:-"-[%s%w%p]-"-),') do
if string.match(sourceID, "p:") then
--sourceID = string.gsub(tostring(sourceID),"p","")
for id, pr in string.gmatch(sourceID, 'p:(%w+):(.+)') do
table.insert(professionList, {id,pr})
end
elseif string.match(sourceID, "c:") then
sourceID = string.gsub(tostring(sourceID),"c:","")
table.insert(containerlist, tonumber(sourceID))
elseif string.match(sourceID, "o:") then
sourceID = string.gsub(tostring(sourceID),"o:","")
table.insert(objectlist, tonumber(sourceID))
elseif string.match(sourceID, "q:") then
for id in string.gmatch(sourceID, 'q:(%w+)') do
table.insert(questList, id)
end
elseif string.match(sourceID, "v:") then
for id, pr in string.gmatch(sourceID, 'v:(%w+):(.+)') do
table.insert(vendorList, {id,pr})
end
--table.insert(vendorList, tonumber(sourceID))
elseif string.match(sourceID, "a:") then
sourceID = string.gsub(tostring(sourceID),"a:","")
table.insert(achievementList, tonumber(sourceID))
elseif string.match(sourceID, "l:") then
sourceID = string.gsub(tostring(sourceID),"l:","")
table.insert(zonelist, tonumber(sourceID))
end
end
else
end
return zonelist, objectlist, containerlist, questList, achievementList, professionList, vendorList
--[[for i = 1, #questData do
local sourceData
local questID = questData[i]
local questName
inspectScantip:SetHyperlink("quest:"..questID)
--local link = "\124cffffff00\124Hquest:%s\124h[%s]\124h\124r"
if inspectScantip:NumLines() > 0 then
local tooltipLine = _G[addonName.."ScanningTooltipTextLeft1"]
local text = tooltipLine:GetText()
if text and text ~= "" then
questName = text
--link = link:format(questID,questName)
end
end
inspectScantip:ClearLines()
--local zoneName = ("%s: "):format(locationDB[questID][1]) --GetZoneName(QuestToZone[questID],"%s: ")
local zoneName = locationDB[questID][1] or "" --GetZoneName(QuestToZone[questID],"%s: ")
if questName then
return questName or "", zoneName
--GameTooltip:AddLine(zoneName..questName)
--else
--GameTooltip:AddLine(zoneName.."Quest: "..questID)
end
end]]
end
local function BuildSourceList(visualID)
if not IsAddOnLoaded("BetterWardrobe_SourceData") then
EnableAddOn("BetterWardrobe_SourceData")
LoadAddOn("BetterWardrobe_SourceData")
vendorDB = (_G.BetterWardrobeData and _G.BetterWardrobeData.vendorDB) or {}
locationDB = (_G.BetterWardrobeData and _G.BetterWardrobeData.locationDB) or {}
end
local itemSourceDB =( _G.BetterWardrobeData and _G.BetterWardrobeData.sourceDB) or {}
local sources = C_TransmogCollection.GetAllAppearanceSources(visualID)
local sourceID = sources and sources.sourceID
local data = {}
local data_index = 1
if sources then
for i=1,#sources do
local sourceInfo = C_TransmogCollection.GetSourceInfo(sources[i])
local _,_,_,_,_,itemLink = C_TransmogCollection.GetAppearanceSourceInfo(sources[i])
if itemLink then
local itemID = itemLink:match("item:(%d+)")
itemID = tonumber(itemID)
local sourceData = itemID and itemSourceDB[itemID] or sourceInfo
local sourceType = sourceInfo.sourceType
--Don't want to list items with hidden sources
if sourceType then
data[data_index] = {
["itemID"] = itemID ,
["itemLink"] = itemLink,
["sourceType"] = sourceType,
["sourceData"] = sourceData,
["sourceID"] = sources[i],
}
data_index = data_index + 1
end
end
end
end
return data
end
local function GetZoneName(zone)
return ""
end
local function GetPrice(itemID)
local itemCostDB = (_G.BetterWardrobeData and _G.BetterWardrobeData.itemCostDB) or {}
local data = itemCostDB[tonumber(itemID)] or "NoData"
local prices, item, currency = 0, {}, {}
local index = 0
for price in string.gmatch(data, '([%d,]-):') do
index = index + 1
if index == 1 then
prices = price
elseif index == 2 then
for itemID, cost in string.gmatch(price, '(%d+),(%d+)') do
if tonumber(itemID) ~= 0 then
table.insert(currency, tonumber(itemID))
table.insert(currency, tonumber(cost))
end
end
elseif index == 3 then
for itemID, cost in string.gmatch(price, '(%d+),(%d+)') do
if tonumber(itemID) ~= 0 then
table.insert(item, tonumber(itemID))
table.insert(item, cost)
end
end
end
end
return prices, currency, item
end
local refresh_count = 0
local function AddAdditional(parent, index, data, itemID)
local f = {}
local Collected = AceGUI:Create("Icon")
Collected:SetImageSize(20,20)
Collected:SetWidth(30)
parent:AddChild(Collected)
local SourceInfo = AceGUI:Create("InteractiveLabel")
SourceInfo:SetHeight(20)
local link, sourceName
--Boss Drop
if index == 0 then
sourceName = data
transmogSource = _G["TRANSMOG_SOURCE_1"] or ""
SourceInfo:SetText(("-%s: %s"):format(transmogSource, sourceName or L["No Data Available"]))
--World Drop
elseif index == 1 then
sourceName = data
transmogSource = _G["TRANSMOG_SOURCE_4"] or ""
local zoneList = ""
for index, zone in ipairs(data) do
if locationDB[zone] then
zoneList = zoneList .. (locationDB[zone])..", "
end
end
SourceInfo:SetText(("-%s: %s"):format(transmogSource, zoneList))
--Container
elseif index == 2 then
local item = Item:CreateFromItemID(tonumber(data))
item:ContinueOnItemLoad(function()
local name = item:GetItemName()
SourceInfo:SetText(("-%s: %s"):format(L["Created by"], name))
end)
elseif index == 3 then
local item = Item:CreateFromItemID(tonumber(data))
item:ContinueOnItemLoad(function()
local name = item:GetItemName()
SourceInfo:SetText(("-%s: %s"):format(L["Contained in"], name))
end)
--Quest
elseif index == 4 then
sourceName, zoneName, questID, link = GetQuestnfo(data)
transmogSource = _G["TRANSMOG_SOURCE_2"] or ""
if sourceName then
sourceName = ACHIEVEMENT_COLOR_CODE..sourceName..L.ENDCOLOR
else
if refresh_count < 100 then
sourceName = RetrievingDataText..L.ENDCOLOR
else
end
end
if zoneName then
SourceInfo:SetText(("-%s: %s - [%s] "):format(transmogSource, zoneName, sourceName or L["No Data Available"].." (QuestID:"..questID..")"))
else
SourceInfo:SetText(("-%s: [%s] "):format(transmogSource, sourceName or "Quest"..questID))
end
--Achievement
elseif index == 5 then
local id, name, points = GetAchievementInfo(data)
sourceName = name
link = GetAchievementLink(id)
transmogSource = _G["TRANSMOG_SOURCE_5"] or ""
sourceName = ACHIEVEMENT_COLOR_CODE..sourceName..L.ENDCOLOR
SourceInfo:SetText(("-%s: [%s]"):format(transmogSource, sourceName))
--Profession
elseif index == 6 then
spellID = data[1]
profession = data[2]
link = GetSpellLink(spellID)
local name, rank, icon, castTime, minRange, maxRange, spellId = GetSpellInfo(spellID)
--local id, name, points = GetAchievementInfo(sourceName)
sourceName = name
sourceName = ACHIEVEMENT_COLOR_CODE..sourceName..L.ENDCOLOR
SourceInfo:SetText(("-%s: [%s]"):format(L[profession], sourceName or L["No Data Available"]))
--Vendor
elseif index == 7 then
sourceName = data[1]
vendorName = data[2]
local zonedata = vendorDB[tonumber(sourceName)] or {}
local zones = ""
for i, zondID in ipairs(zonedata) do
if locationDB[tonumber(zondID)] then
zones = zones..locationDB[tonumber(zondID)]..","
end
end
transmogSource = _G["TRANSMOG_SOURCE_3"] or ""
prices, currency, items = GetPrice(itemID)
price_text = ""
local goldCost = tonumber(prices)
if goldCost > 0 then
price_text = price_text .. GetCoinTextureString(goldCost).." "
SourceInfo:SetText(("-%s: %s - %s: %s - Price: %s"):format( transmogSource, L[vendorName] or L["No Data Available"], L["Zone"], zones or "?", price_text))
end
for i = 1, #currency, 2 do
if currency[i] then
local currencyInfo = C_CurrencyInfo.GetCurrencyInfo(tonumber(currency[i]))
local name = currencyInfo.name
local icon = currencyInfo.iconFileID
local cost = currency[i + 1] or 0
local text = price_text
price_text = price_text..cost.." |T"..icon..":0|t ".."["..name.."] "
SourceInfo:SetText(("-%s: %s - %s: %s - Price: %s"):format( transmogSource, L[vendorName] or L["No Data Available"], L["Zone"], zones or "?", price_text))
end
end
for i = 1, #items, 2 do
if items[i] then
local item = Item:CreateFromItemID(tonumber(items[i]))
local cost = items[i + 1]
item:ContinueOnItemLoad(function()
local name = item:GetItemName()
local icon = item:GetItemIcon()
local text = price_text
text = text..cost.." |T"..icon..":0|t ".."["..name.."] "
SourceInfo:SetText(("-%s: %s - %s: %s - Price: %s"):format( transmogSource, L[vendorName] or L["No Data Available"], L["Zone"], zones or "?", text))
end)
end
end
else
if data then
transmogSource = _G["TRANSMOG_SOURCE_"..data] or ""
SourceInfo:SetText(("-%s: %s"):format(transmogSource,L["No Data Available"]))
else
SourceInfo:SetText(("-%s"):format(L["No Data Available"]))
end
end
SourceInfo:SetCallback("OnEnter", function()
GameTooltip:SetOwner(UIParent, "ANCHOR_CURSOR", 0, 0)
if (link) then
GameTooltip:SetHyperlink(link)
GameTooltip:Show()
end
end)
SourceInfo:SetCallback("OnLeave", function() GameTooltip:Hide() end)
SourceInfo:SetRelativeWidth(.86)
parent:AddChild(SourceInfo)
local LinkButton = AceGUI:Create("InteractiveLabel")
LinkButton:SetWidth(60)
LinkButton:SetHeight(20)
parent:AddChild(LinkButton)
local sourceName = ""
local zoneName, questlink
end
local refresh_VisID
function CollectionList:GenerateSourceListView(visualID)
if self.LISTWINDOW then self.LISTWINDOW:Hide() end
local f = AceGUI:Create("Window")
f:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end)
f:SetCallback("OnHide",function(widget) AceGUI:Release(widget) end)
f:SetTitle(L["Sources"])
f:SetStatusText("Status Bar")
f:SetLayout("LIST")
f:EnableResize(false)
_G["BetterWardrobeCollectionListWindow"] = f.frame
self.LISTWINDOW = f
tinsert(UISpecialFrames, "BetterWardrobeCollectionListWindow")
local scrollcontainer = AceGUI:Create("SimpleGroup")
scrollcontainer:SetFullWidth(true)
scrollcontainer:SetHeight(f.frame:GetHeight()-85)
scrollcontainer:SetLayout("Fill") -- important!
f:AddChild(scrollcontainer)
local MultiLineEditBox = AceGUI:Create("MultiLineEditBox")
MultiLineEditBox:SetFullWidth(true)
MultiLineEditBox:SetLabel("")
MultiLineEditBox.button:Hide()
MultiLineEditBox.scrollBar:Hide()
MultiLineEditBox:SetHeight(25)
f:AddChild(MultiLineEditBox)
MultiLineEditBox.frame:ClearAllPoints()
local scroll = AceGUI:Create("ScrollFrame")
scroll:SetLayout("Flow")
scroll:SetFullWidth(true)
scroll:SetFullHeight(true)
scrollcontainer:AddChild(scroll)
local list = BuildSourceList(visualID)
for i, data in ipairs(list) do
if data then
local categoryID, visualID, canEnchant, itemIcon, isCollected, itemLink, transmogLink = C_TransmogCollection.GetAppearanceSourceInfo(data.sourceID)
local collectedStatus = ""
if isCollected then
collectedStatus = GREEN_FONT_COLOR_CODE.."["..L["Collected"].."]"..L.ENDCOLOR
else
collectedStatus = RED_FONT_COLOR_CODE.."["..L["Not Collected"].."]"..L.ENDCOLOR
end
local itemName, _, itemQuality = GetItemInfo(itemLink)
--local itemID =GetItemInfoFromHyperlink(itemLink)
local nameColor = ITEM_QUALITY_COLORS[itemQuality] or ""
local transmogSource = data.sourceType and _G["TRANSMOG_SOURCE_"..(data.sourceType)] or ""
local bossInfo = ""
--Additionals:SetText(("|TInterface\\RaidFrame\\ReadyCheck-Ready:0|t +%s More"):format(total_count-1))
local Collected = AceGUI:Create("Icon")
if isCollected then
Collected:SetImage("Interface\\RaidFrame\\ReadyCheck-Ready")
else
Collected:SetImage("Interface\\RaidFrame\\ReadyCheck-NotReady")
end
Collected:SetImageSize(20, 20)
Collected:SetWidth(25)
scroll:AddChild(Collected)
local icon = AceGUI:Create("Icon")
icon:SetImage(itemIcon)
icon:SetImageSize(20,20)
scroll:AddChild(icon)
icon:SetWidth(25)
local CheckBox = AceGUI:Create("InteractiveLabel")
CheckBox:SetHeight(25)
local priceText = ""
itemName = itemName and nameColor.hex..itemName..L.ENDCOLOR or ""
CheckBox:SetText(itemName)
CheckBox:SetCallback("OnClick", function()
if IsModifiedClick("CHATLINK") then
if itemLink then
HandleModifiedItemClick(itemLink)
end
elseif IsModifiedClick("DRESSUP") then
DressUpVisual(data.sourceID)
end
end)
CheckBox:SetCallback("OnEnter", function()
GameTooltip:SetOwner(UIParent, "ANCHOR_CURSOR", 0, 0)
if (itemLink) then
GameTooltip:SetHyperlink(itemLink)
GameTooltip:Show()
end
end)
CheckBox:SetCallback("OnLeave", function()
GameTooltip:Hide()
end)
CheckBox:SetRelativeWidth(.83)
scroll:AddChild(CheckBox)
local LinkButton = AceGUI:Create("Button")
LinkButton:SetText("Link")
LinkButton:SetWidth(60)
LinkButton:SetHeight(25)
LinkButton:SetCallback("OnClick", function()
local url = "https://www.wowhead.com/item="
MultiLineEditBox:SetText(url..data.itemID)
end)
scroll:AddChild(LinkButton)
local sourceName = ""
local zoneName, questlink
local datafound = false
if data.sourceType and data.sourceType == 1 then
sourceName = GetBossInfo(data.sourceID)
AddAdditional(scroll, 0, sourceName, data.itemID)
datafound = true
end
local zonelist, objectlist, containerlist, questList, achievementList, professionList, vendorList = GetSourceInfo(data.itemID) if #zonelist > 0 then
AddAdditional(scroll, 1, zonelist, data.itemID)
datafound = true
end
local DB_List = {objectlist,containerlist,questList,achievementList ,professionList,vendorList}
for index, list in ipairs(DB_List) do
for _, db_data in ipairs(list) do
AddAdditional(scroll, index + 1, db_data, data.itemID)
datafound = true
end
end
if not datafound then
AddAdditional(scroll, 10, data.sourceType, data.itemID)
end
end
end
MultiLineEditBox.frame:SetPoint("BOTTOM", f.frame,"BOTTOM", 0, -15)
if needsRefresh and refresh_count < 100 then
refresh_VisID = visualID
refresh_count = refresh_count + 1
C_Timer.After(0, function() CollectionList:GenerateSourceListView(refresh_VisID) end)
else
refresh_VisID = nil
refresh_count = 0
end
end
function CollectionListTooltip_OnEnter(self)
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetText(L["Click: Show Collection List"])
GameTooltip:AddLine(L["Shift Click: Show Detail List"])
GameTooltip:Show()
end
BW_CollectionListDropDownMixin = {}