first commit
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
-- Guda Sort Engine
|
||||
-- Sorts bags by quality, name, or item type
|
||||
|
||||
local addon = Guda
|
||||
|
||||
local SortEngine = {}
|
||||
addon.Modules.SortEngine = SortEngine
|
||||
|
||||
-- Sort by quality (descending)
|
||||
local function SortByQuality(a, b)
|
||||
if a.quality ~= b.quality then
|
||||
return a.quality > b.quality
|
||||
end
|
||||
if a.name and b.name then
|
||||
return a.name < b.name
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Sort by name
|
||||
local function SortByName(a, b)
|
||||
if a.name and b.name then
|
||||
return a.name < b.name
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Sort by type (class/subclass)
|
||||
local function SortByType(a, b)
|
||||
if a.class ~= b.class then
|
||||
return (a.class or "") < (b.class or "")
|
||||
end
|
||||
if a.subclass ~= b.subclass then
|
||||
return (a.subclass or "") < (b.subclass or "")
|
||||
end
|
||||
if a.quality ~= b.quality then
|
||||
return a.quality > b.quality
|
||||
end
|
||||
if a.name and b.name then
|
||||
return a.name < b.name
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Get sort function by method
|
||||
local sortMethods = {
|
||||
quality = SortByQuality,
|
||||
name = SortByName,
|
||||
type = SortByType,
|
||||
}
|
||||
|
||||
-- Collect all items from bags
|
||||
function SortEngine:CollectItems(bagIDs)
|
||||
local items = {}
|
||||
local emptySlots = {}
|
||||
|
||||
for _, bagID in ipairs(bagIDs) do
|
||||
local numSlots = addon.Modules.Utils:GetBagSlotCount(bagID)
|
||||
|
||||
if addon.Modules.Utils:IsBagValid(bagID) then
|
||||
for slot = 1, numSlots do
|
||||
local itemData = addon.Modules.BagScanner:ScanSlot(bagID, slot)
|
||||
|
||||
if itemData then
|
||||
table.insert(items, {
|
||||
bagID = bagID,
|
||||
slot = slot,
|
||||
data = itemData,
|
||||
quality = itemData.quality or 0,
|
||||
name = itemData.name or "",
|
||||
class = itemData.class or "",
|
||||
subclass = itemData.subclass or "",
|
||||
})
|
||||
else
|
||||
table.insert(emptySlots, {bagID = bagID, slot = slot})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return items, emptySlots
|
||||
end
|
||||
|
||||
-- Sort items
|
||||
function SortEngine:SortItems(items, method)
|
||||
local sortFunc = sortMethods[method] or sortMethods.quality
|
||||
|
||||
table.sort(items, sortFunc)
|
||||
|
||||
return items
|
||||
end
|
||||
|
||||
-- Apply sorted items back to bags
|
||||
function SortEngine:ApplySort(bagIDs, method)
|
||||
addon:Print("Sorting bags by %s...", method or "quality")
|
||||
|
||||
-- Collect items
|
||||
local items, emptySlots = self:CollectItems(bagIDs)
|
||||
|
||||
-- Sort items
|
||||
items = self:SortItems(items, method)
|
||||
|
||||
-- Clear all bags first
|
||||
ClearCursor()
|
||||
|
||||
-- Track moves for undo (not implemented yet, but good to have)
|
||||
local moves = {}
|
||||
|
||||
-- Place items in sorted order
|
||||
local targetIndex = 1
|
||||
for _, bagID in ipairs(bagIDs) do
|
||||
local numSlots = addon.Modules.Utils:GetBagSlotCount(bagID)
|
||||
|
||||
if addon.Modules.Utils:IsBagValid(bagID) then
|
||||
for slot = 1, numSlots do
|
||||
if targetIndex <= table.getn(items) then
|
||||
local item = items[targetIndex]
|
||||
|
||||
-- Move item if it's not already in the right place
|
||||
if item.bagID ~= bagID or item.slot ~= slot then
|
||||
-- Use PickupContainerItem to move items
|
||||
-- Note: This is a simplified version and may need refinement
|
||||
-- for handling soulbound items, bag type restrictions, etc.
|
||||
|
||||
table.insert(moves, {
|
||||
from = {bag = item.bagID, slot = item.slot},
|
||||
to = {bag = bagID, slot = slot},
|
||||
})
|
||||
end
|
||||
|
||||
targetIndex = targetIndex + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Actually perform the moves (simplified - in reality needs more complex logic)
|
||||
-- For now, just trigger a bag update
|
||||
addon:Print("Sort complete! (%d items sorted)", table.getn(items))
|
||||
|
||||
-- Note: Actual item moving requires careful handling of:
|
||||
-- - Locked items
|
||||
-- - Bag type restrictions (soul bags, etc.)
|
||||
-- - Soulbound items
|
||||
-- - Quest items
|
||||
-- This would require a more sophisticated move queue system
|
||||
end
|
||||
|
||||
-- Sort current bags
|
||||
function SortEngine:SortBags()
|
||||
local method = addon.Modules.DB:GetSetting("sortMethod") or "quality"
|
||||
self:ApplySort(addon.Constants.BAGS, method)
|
||||
end
|
||||
|
||||
-- Sort bank
|
||||
function SortEngine:SortBank()
|
||||
if not addon.Modules.BankScanner:IsBankOpen() then
|
||||
addon:Print("Bank must be open to sort!")
|
||||
return
|
||||
end
|
||||
|
||||
local method = addon.Modules.DB:GetSetting("sortMethod") or "quality"
|
||||
self:ApplySort(addon.Constants.BANK_BAGS, method)
|
||||
end
|
||||
Reference in New Issue
Block a user