Files
AtlasLoot/Core/WishList.lua
T
Spit 815ad7141e 3.1.6
fixed bugs after relogging/reloading UI when last opened page was WishList or Search
removed redundant menu of world epics, removed fashion table (I don't see the point of keeping it since you can preview everything in the turtle shop itself anyway)
tooltip source is now more accurate and lighter on performance
moved buttons in atlasloot panel in Atlas to save some space
2025-05-06 19:21:51 +03:00

290 lines
8.8 KiB
Lua

--File containing functions related to the wish list.
local AL = AceLibrary("AceLocale-2.2"):new("AtlasLoot");
AtlasLoot_WishList = nil;
local currentPage = 1;
-- Colours stored for code readability
local GREY = "|cff999999";
local RED = "|cffff0000";
local WHITE = "|cffFFFFFF";
local GREEN = "|cff1eff00";
local PURPLE = "|cff9F3FFF";
local BLUE = "|cff0070dd";
local ORANGE = "|cffFF8400";
--[[
AtlasLoot_ShowWishList()
Displays the WishList
]]
function AtlasLoot_ShowWishList()
AtlasLoot_ShowItemsFrame("WishList", "WishListPage"..currentPage, AL["WishList"], AtlasLoot_AnchorPoint);
CloseDropDownMenus();
AtlasLootDefaultFrame_SubMenu:Disable()
AtlasLootDefaultFrame_SelectedTable:Hide()
AtlasLootQuickLooksButton:Hide()
AtlasLoot_QuickLooks:Hide()
end
--[[
AtlasLoot_AddToWishlist(itemID, itemTexture, itemName, lootPage, sourcePage)
Looks for an empty slot in the wishlist and slots the item in
]]
function AtlasLoot_AddToWishlist(itemID, itemTexture, itemName, extraText, sourcePage)
for _, v in ipairs(AtlasLootCharDB["WishList"]) do
if v[1] == itemID then
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..AtlasLoot_FixText(itemName)..RED..AL[" already in the WishList!"]);
return;
end
end
table.insert(AtlasLootCharDB["WishList"], { itemID, itemTexture, itemName, extraText, sourcePage });
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..AtlasLoot_FixText(itemName)..GREY..AL[" added to the WishList."]);
AtlasLoot_WishList = AtlasLoot_CategorizeWishList(AtlasLootCharDB["WishList"]);
end
--[[
AtlasLoot_DeleteFromWishList(itemID)
Deletes the specified items from the wishlist
]]
function AtlasLoot_DeleteFromWishList(itemID)
if itemID and itemID == 0 then return end
for i, v in ipairs(AtlasLootCharDB["WishList"]) do
if v[1] == itemID then
DEFAULT_CHAT_FRAME:AddMessage(RED..AL["AtlasLoot"]..": "..AtlasLoot_FixText(v[3])..GREY..AL[" deleted from the WishList."]);
table.remove(AtlasLootCharDB["WishList"], i);
break;
end
end
AtlasLoot_WishList = AtlasLoot_CategorizeWishList(AtlasLootCharDB["WishList"]);
AtlasLootItemsFrame:Hide();
AtlasLoot_ShowItemsFrame("WishList", "WishListPage"..currentPage, AL["WishList"], AtlasLoot_AnchorPoint);
end
--[[
AtlasLoot_WishListSort()
Sorts the Wishlist
]]
function AtlasLoot_WishListSort()
local j = 0;
local P = 2;
local temp = {};
local check = false;
while (P < 31) do
temp = AtlasLootCharDB["WishList"][P];
j = P;
check = AtlasLoot_WishListSortCheck(AtlasLootCharDB["WishList"][j - 1], temp);
while ((j > 1) and check) do
AtlasLootCharDB["WishList"][j] = AtlasLootCharDB["WishList"][j - 1];
j = j - 1;
check = AtlasLoot_WishListSortCheck(AtlasLootCharDB["WishList"][j - 1], temp);
end
AtlasLootCharDB["WishList"][j] = temp;
P = P + 1;
end
end
--[[
AtlasLoot_WishListSortCheck(temp1, temp2)
Checks if temp1 > temp2
Sorts by rarity, then alphabetically.
]]
function AtlasLoot_WishListSortCheck(temp1, temp2)
if (temp1 == nil) then
return false;
elseif (temp2 == nil) then
return false;
end
if temp2[1] == 0 then
return false;
elseif temp1[1] == 0 then
return true;
else
local prefix1=string.lower(string.sub(temp1[3], 1, 10));
local prefix2=string.lower(string.sub(temp2[3], 1, 10));
if prefix1 ~= prefix2 then
if prefix1 == "|cffff0000" then
return false;
elseif (prefix1 == "|cffff8000") and (prefix2 ~= "|cffff0000") then
return false;
elseif (prefix1 == "|cffa335ee") then
if (prefix2 == "|cffff8000") or (prefix2 == "|cffff0000") then
return true;
else
return false;
end
elseif (prefix1 == "|cff0070dd") then
if (prefix2 == "|cffa335ee") or (prefix2 == "|cffff8000") or (prefix2 == "|cffff0000") then
return true;
else
return false;
end
elseif (prefix1 == "|cff1eff00") then
if (prefix2 == "|cffffffff") or (prefix2 == "|cff9d9d9d") then
return false;
else
return true;
end
elseif (prefix1 == "|cff9d9d9d") then
return true;
elseif (prefix1 == "|cffffffff") and (prefix2~="|cff9d9d9d") then
return true;
else
return false;
end
else
if(temp1[3] > temp2[3]) then
return true;
else
return false;
end
end
end
end
--[[
local RecursiveSearchZoneName(dataTable, zoneID):
A recursive function iterate AtlasLoot_HewdropDown table for the zone name
]]
local function RecursiveSearchZoneName(dataTable, zoneID)
if(dataTable[2] == zoneID) then
return dataTable[1];
end
for _, v in pairs(dataTable) do
if type(v) == "table" then
local result = RecursiveSearchZoneName(v, zoneID);
if result then return result end
end
end
end
--[[
AtlasLoot_GetWishListSubheading(dataID):
Iterating through dropdown data tables to search backward for zone name with specified dataID
]]
function AtlasLoot_GetWishListSubheading(dataID)
if not AtlasLoot_HewdropDown or not AtlasLoot_HewdropDown_SubTables then return end
local zoneID;
for subKey, subTable in pairs(AtlasLoot_HewdropDown_SubTables) do
for _, t in ipairs(subTable) do
if t[2] == dataID then
zoneID = subKey;
break;
end
end
if zoneID then break end
end
return RecursiveSearchZoneName(AtlasLoot_HewdropDown, zoneID or dataID);
end
function AtlasLoot_GetWishListSubheadingBoss(dataID)
if not AtlasLoot_TableNamesBoss then
return
end
local zoneID ;
for i, v in pairs(AtlasLoot_TableNamesBoss) do
for j,k in pairs(v) do
if dataID == j then
zoneID = k[1]
break;
end
end
end
--[[for i, v in pairs(AtlasLoot_TableNames) do
if dataID == i then
zoneID = v[1]
break;
end
end]]
return zoneID;
end
function GetLootTableParent(dataID)
local parentID ;
for i, v in pairs(AtlasLoot_TableNamesBoss) do
for j,k in pairs(v) do
if dataID == j then
parentID = i
break;
end
end
end
return parentID;
end
--[[
AtlasLoot_CategorizeWishList(wlTable):
Group items with zone/event name etc, and format them by adding subheadings and empty lines
This function returns a single table with all items, use AtlasLoot_GetWishListPage to split it
wlTable: is AtlasLootCharDB["WishList"], parameterized for flexible
]]
function AtlasLoot_CategorizeWishList(wlTable)
local subheadings, categories, result = {}, {}, {};
for _, v in pairs(wlTable) do
if v[5] and v[5] ~= "" then
local dataID = AtlasLoot_Strsplit("|", v[5]);
-- Build subheading table
if not subheadings[dataID] then
subheadings[dataID] = AtlasLoot_GetWishListSubheadingBoss(dataID);
-- If search failed, replace ID like "Aldor2" to "Aldor1" and try again
if not subheadings[dataID] and string.find(dataID, "^%a+%d?$") then
subheadings[dataID] = AtlasLoot_GetWishListSubheading(string.sub(dataID, 1, string.len(dataID) - 1).."1");
end
-- If still cant find it, mark it with Unknown
if not subheadings[dataID] then subheadings[dataID] = AL["Unknown"] end
end
-- Build category tables
if not categories[subheadings[dataID]] then categories[subheadings[dataID]] = {} end
table.insert(categories[subheadings[dataID]], v);
end
end
-- Sort and flatten categories
for k, v in pairs(categories) do
-- Add a empty line between categories when in a same column
if table.getn(result) > 1 and (table.getn(result) - math.floor(table.getn(result)/15)*15) > 0 then table.insert(result, { 0, "", "", "" }) end
-- If a subheading is on the last row of a column, push it to next column
if ((table.getn(result) + 1) - math.floor((table.getn(result) + 1)/15)*15) == 0 then table.insert(result, { 0, "", "", "" }) end
-- Subheading
-- some debug code that I've used to fix WishList errors before due to people adding drops to AtlasLoot incorrectly.
local box = k or "Unknown"
local cat = categories[k][1][5] or "Unknown"
local parent = GetLootTableParent(AtlasLoot_Strsplit("|", cat)) or "Unknown"
--print("box: "..box.." - cat: "..cat)
table.insert(result, { 0, "INV_Box_01", "=q6="..box, "=q0="..parent });
--table.insert(result, { 0, "INV_Box_01", "=q6="..k, "=q0="..GetLootTableParent(strsplit("|", categories[k][1][5])) });
-- Sort first then add items
table.sort(v, AtlasLoot_WishListSortCheck); -- not works?
for i = 1, table.getn(v) do table.insert(result, v[i]) end
end
collectgarbage();
return result;
end
--[[
AtlasLoot_GetWishListPage(page):
Return partial data of WishList table
page: the page number needed
]]
function AtlasLoot_GetWishListPage(page)
if not AtlasLoot_WishList then AtlasLoot_WishList = AtlasLoot_CategorizeWishList(AtlasLootCharDB["WishList"]) end
-- Calc for maximal pages
local pageMax = math.ceil(table.getn(AtlasLoot_WishList) / 30);
if page < 1 then page = 1 end
if page > pageMax then page = pageMax end
currentPage = page;
-- Table copy
local result = {};
local start = (page - 1) * 30 + 1;
for i = start, start + 29 do
if not AtlasLoot_WishList[i] then break end
table.insert(result, AtlasLoot_WishList[i]);
end
return result, pageMax;
end