diff --git a/api/config.lua b/api/config.lua index 78f7f0df..f90c63e0 100644 --- a/api/config.lua +++ b/api/config.lua @@ -174,6 +174,8 @@ function pfUI:LoadConfig() pfUI:UpdateConfig("appearance", "bags", "bagrowlength", "10") pfUI:UpdateConfig("appearance", "bags", "bankrowlength", "10") pfUI:UpdateConfig("appearance", "bags", "autoSortOnOpen", "0") + pfUI:UpdateConfig("appearance", "bags", "sortreverse", "0") + pfUI:UpdateConfig("appearance", "bags", "sortprioreverse", "0") pfUI:UpdateConfig("appearance", "minimap", "size", "140") pfUI:UpdateConfig("appearance", "minimap", "arrowscale", "1") pfUI:UpdateConfig("appearance", "minimap", "zonetext", "off") diff --git a/libs/libbagsort.lua b/libs/libbagsort.lua index dbb99987..472b535c 100644 --- a/libs/libbagsort.lua +++ b/libs/libbagsort.lua @@ -53,10 +53,20 @@ end local function ClearSortData() libbagsort.itemGrid = {} libbagsort.bagList = nil + libbagsort.opts = nil libbagsort:UnregisterEvent("BAG_UPDATE_DELAYED") libbagsort:SetScript("OnEvent", nil) end +local function ReverseArray(t) + local i, j = 1, table.getn(t) + while i < j do + t[i], t[j] = t[j], t[i] + i = i + 1 + j = j - 1 + end +end + -- Two-pointer consolidation: sorts stacks largest-first, then merges from -- both ends toward the middle. n is set explicitly so table.getn / table.sort -- work correctly in Lua 5.0. @@ -181,10 +191,28 @@ local function BuildSortGrid() end end - table.sort(normalItems, function(a, b) return a.key < b.key end) - -- Sort poor items descending so they read in ascending order when placed - -- back-to-front (last poor item lands on the last slot). - table.sort(poorItems, function(a, b) return a.key > b.key end) + local opts = libbagsort.opts or {} + local reverse = opts.reverse + local reversePrio = opts.reversePrio + + if reverse then + ReverseArray(generalCells) + for _, cells in pairs(specialtyCells) do + ReverseArray(cells) + end + end + + if reversePrio then + table.sort(normalItems, function(a, b) return a.key > b.key end) + else + table.sort(normalItems, function(a, b) return a.key < b.key end) + end + + if reverse then + table.sort(poorItems, function(a, b) return a.key < b.key end) + else + table.sort(poorItems, function(a, b) return a.key > b.key end) + end -- Forward pass: route each normal item into the next free cell that -- accepts it -- a matching specialty bag first, overflowing to general. @@ -274,9 +302,15 @@ end -- BAG_UPDATE_DELAYED cycle), then place items by category/name/quality. -- e.g. `libbagsort:Sort({0, 1, 2, 3, 4})` for the main bags; -- `{-1, 5, 6, 7, 8, 9, 10}` for the bank. -function libbagsort:Sort(bagList) +-- +-- opts (optional): { reverse = bool, reversePrio = bool } +-- reverse - place the first-ranked item into the last slot of the last +-- bag (junk fills from the opposite end). +-- reversePrio - flip the category ranking (e.g. hearthstone sorts last). +function libbagsort:Sort(bagList, opts) ClearSortData() self.bagList = bagList + self.opts = opts -- Phase 1: fire every consolidation op in a single batch. local ops = BuildConsolidateOps(bagList) diff --git a/modules/bags.lua b/modules/bags.lua index 99116b88..f4c537ca 100644 --- a/modules/bags.lua +++ b/modules/bags.lua @@ -8,6 +8,13 @@ pfUI:RegisterModule("bags", function () local scanner = libtipscan:GetScanner("input_search") + local function BagSortOpts() + return { + reverse = C.appearance.bags.sortreverse == "1", + reversePrio = C.appearance.bags.sortprioreverse == "1", + } + end + -- function to detect openable items in inventory local openable = { bag = nil, slot = nil, icon = nil } local function GetNextOpenable() @@ -343,7 +350,7 @@ pfUI:RegisterModule("bags", function () chat:Hide() end if C.appearance.bags.autoSortOnOpen == "1" then - libbagsort:Sort({0, 1, 2, 3, 4}) + libbagsort:Sort({0, 1, 2, 3, 4}, BagSortOpts()) end pfUI.bag:CreateBags(object) PlaySound("INTERFACESOUND_BACKPACKOPEN") @@ -993,7 +1000,7 @@ pfUI:RegisterModule("bags", function () end) frame.sort:SetScript("OnClick", function() - libbagsort:Sort({0, 1, 2, 3, 4}) + libbagsort:Sort({0, 1, 2, 3, 4}, BagSortOpts()) end) end @@ -1231,7 +1238,7 @@ pfUI:RegisterModule("bags", function () end) frame.sort:SetScript("OnClick", function() - libbagsort:Sort({-1, 5, 6, 7, 8, 9, 10}) + libbagsort:Sort({-1, 5, 6, 7, 8, 9, 10}, BagSortOpts()) end) end end diff --git a/modules/gui.lua b/modules/gui.lua index 4d9ceb1f..6a65b3da 100644 --- a/modules/gui.lua +++ b/modules/gui.lua @@ -2435,6 +2435,8 @@ pfUI:RegisterModule("gui", function () CreateConfig(nil, T["Auto Sell Grey Items"], C.global, "autosell", "checkbox") CreateConfig(nil, T["Auto Repair Items"], C.global, "autorepair", "checkbox") CreateConfig(nil, T["Auto Sort When Opening Bags"], C.appearance.bags, "autoSortOnOpen", "checkbox") + CreateConfig(nil, T["Reverse Sort Direction (Last Bag First)"], C.appearance.bags, "sortreverse", "checkbox") + CreateConfig(nil, T["Reverse Sort Priority (Hearthstone Last)"], C.appearance.bags, "sortprioreverse", "checkbox") end) CreateGUIEntry(T["Loot"], nil, function()