mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-26 17:36:04 +00:00
00292ca3b4
commit70b1e66c2dAuthor: Brues <5278969+brues-code@users.noreply.github.com> Date: Sun Jul 26 18:30:18 2026 -0500 Use SetSize/SetShown and simplify minimap/map commit7b6bfe9975Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 11:27:14 2026 -0500 Include raidpet frames in /pftest test mode The unit-frame test toggle (showall) only previews frames that exist and are positioned. Raidpet frames are created when raidpet.visible == "1", but LayoutPets' collapse mode only positions pets whose raidpet<N> unit actually exists, so solo/in test mode they stayed hidden. Add a showall branch to LayoutPets that mirror-lays every pet cell and shows it (bypassing collapse and the roster gate), still guarded by the existing showpets check so nothing happens when raidpet is disabled. Call LayoutPets from the /pftest handler so the grid updates immediately on toggle-on and restores to the normal layout on toggle-off. commit4c65c38647Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 10:34:33 2026 -0500 Remove unused RangeCache local in UnitInRange commit6c96bbbe6cAuthor: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 10:34:33 2026 -0500 Use Clamp() for the two-sided clamps in ui-widgets Replace the hand-rolled math.min/math.max and if/elseif clamp idioms in the status bar and scroll frame with Clamp(). Equivalent for every value seen (min <= max always holds), just clearer. commit830e0a0be1Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 10:34:33 2026 -0500 Drop vanilla GetItemInfo shim for C_Item.GetItemInfo The compat/vanilla.lua GetItemInfo override reshaped vanilla's tuple into retail order by inserting nil at slot 4 (itemLevel), but truncated at 8 fields, dropping itemEquipLoc/itemTexture. ClassicAPI's global GetItemInfo keeps the vanilla shape (its hook only warms the item cache), so the shim stayed necessary but incomplete. Remove it and point the three callers at ClassicAPI's C_Item.GetItemInfo, which returns the full 18-field retail tuple. Positions 1-8 are identical to the old shim output, so bags/roll are unchanged; character.lua's itemSlot (equipLoc, field 9) was always nil under the truncating shim and now resolves correctly for ShaguScore. commitc0da63657dAuthor: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 10:09:34 2026 -0500 Various cleanup Removes version compatibility checks for TBC/Vanilla, consolidating code to target a single WoW version. Refactors repetitive SetWidth/SetHeight calls to SetSize for cleaner code. Removes duplicate function definitions from unitxp module and simplifies conditional show/hide operations using SetShown. commit11a6302c2dAuthor: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 09:53:37 2026 -0500 Delegate pfUI.api.strsplit to ClassicAPI's strsplit Replace the Lua pattern-based implementation with a thin wrapper around ClassicAPI's C-level strsplit. Keeps the pfUI.api.strsplit entry point for backwards compatibility with addons that call it, while dropping the redundant reimplementation. Behavioral note: the old version used ([^delim]+) which silently collapsed empty fields; delegating to real strsplit now preserves them ("a,,b" -> "a", "", "b"). All in-repo callers split numeric color tuples, version strings, or build name-keyed lookup tables, none of which are affected by empty-field preservation. commit67c126eac8Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 01:01:02 2026 -0500 Bump ClassicAPI minimum version to 1.8.0 commita6cf157518Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 00:49:50 2026 -0500 read spell rank via C_Spell.GetSpellSubtext The rank string comes from the spell subtext ("Rank N"), which ClassicAPI's C_Spell.GetSpellSubtext returns directly -- so drop nampower's GetSpellRecField(spellId, "rank") here. The existing "Rank " gsub parse is unchanged. commit4b1ba99b4fAuthor: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 00:33:20 2026 -0500 Move player info overlay onto ClassicAPI (drop Nampower) The haste/spell-power overlay read both values through Nampower and disabled itself entirely without it. Move both to ClassicAPI so it works on any ClassicAPI client: - Spell power: GetSpellPower("net") (nampower) -> GetSpellBonusDamage(i) (ClassicAPI, same per-school field). Merged the build+scan into one loop; the default school seeds the tiebreak so equal schools still favor it. - Haste: GetUnitField("player", "modCastSpeed") -> UnitSpellHaste("player"), which returns the haste percentage directly (the (1/modCastSpeed-1)*100 conversion is now baked in, off the same UNIT_MOD_CAST_SPEED field, signed). - Dropped the "if not GetUnitField then return" gate -- UpdateInfoText no longer touches Nampower, so the overlay runs everywhere. commit7df4aa6d50Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat Jul 25 00:32:44 2026 -0500 Hook the real global _G.UnitHealth for feign death Inside a RegisterModule body, `function UnitHealth(...)` defines UnitHealth on the pfUI environment, not the real global -- so the feign-death real-HP fix only reached callers that resolve UnitHealth through pfUI's env, and missed _G consumers (Blizzard frames, other addons). Hook _G.UnitHealth explicitly (and capture oldUnitHealth from _G) so the un-gate applies everywhere. commitb0bf2fd869Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Fri Jul 24 21:10:58 2026 -0500 Refactor nampower module Simplify reactive spell storage by using spell IDs instead of texture/name tables. Update to use modern C_Spell APIs (GetSpellTexture, GetSpellName) instead of manual texture paths. Consolidate SetWidth/SetHeight calls to SetSize and use print() instead of DEFAULT_CHAT_FRAME:AddMessage(). commit0b06961333Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Fri Jul 24 20:54:23 2026 -0500 Use GetNamePlateForUnit for target lookups; drop dead ScanGuid block - Replace the three GetNamePlateForGUID(UnitGUID("target")) round-trips with GetNamePlateForUnit("target"), which resolves the token to a GUID internally -- no UnitGUID string detour, and it returns nil for no-target/no-plate so the UnitExists guards collapse. GetNamePlateForGUID is left for raw-GUID cases. - Remove the dead libunitscan.ScanGuid nameplate block (ScanGuid was deleted from libunitscan long ago, so the guard was never true) -- it carried the last GetUnitField("npcFlags") read. commit3e6210086eAuthor: Brues <5278969+brues-code@users.noreply.github.com> Date: Fri Jul 24 20:54:23 2026 -0500 Drop Nampower stats system and polling from unit frames GetUnitStats now reads health/power straight from UnitHealth/UnitPower (the descriptor fields the server broadcasts) -- for a real unit token GetUnitField read nothing different, so the whole Nampower-vs-fallback apparatus was measuring a distinction that no longer exists. Removed: - The stats system: pfUI.uf.stats, pfUIStatsFrame + UpdateStatsDisplay, the lastUnitStats change-cache, the /pfuistats slash command, and every counter increment (event/heartbeat/earlyReturn/throttledSkip/nampower/fallback). - All GetUnitField health reads (GetUnitStats, heal-prediction, health-gradient color) -- collapsed to the UnitHealth/UnitHealthMax they already fell back to. - The heartbeat-polling backstop and its fallbackThrottle/lastEventUpdate deps. Frames now refresh on events only; eventless frames still use their own tick, and range/aggro still run in the eventless-actions block. commit63001b7b0cAuthor: Brues <5278969+brues-code@users.noreply.github.com> Date: Fri Jul 24 20:09:42 2026 -0500 Move nameplates onto ClassicAPI stable nameplate tokens ClassicAPI now assigns retail-exact, per-plate-stable "nameplateN" tokens and fires vanilla UNIT_* events for them, so the nameplate module can key off the token instead of Nampower/SuperWoW GUID primitives: - Events: UNIT_AURA_GUID/UNIT_FLAGS_GUID -> UNIT_AURA/UNIT_FLAGS, matched by the "nameplateN" token (guarded on the token prefix, since these also fire for target/party/raid). Registered unconditionally -- no GetUnitField gate. - Health: GetUnitField(guid, "health"/"maxHealth") -> UnitHealth/UnitHealthMax on the plate's cached token. Same UNIT_FIELD_HEALTH the server broadcasts (real HP on Turtle; the ~= 100 scaled-vs-real guard is unchanged). - Combat/target in GetCombatStateColor: GetUnitField("flags") + HasFlag -> UnitAffectingCombat(token); GetUnitField("target") + SuperWoW "<guid>target" -> the "nameplateNtarget" chain. Dropped the now-dead HasFlag, UNIT_FLAG_IN_COMBAT, and guidTargetTokenCache. - GetCastInfo now takes the token directly; every caller already holds it, so the UnitTokenFromGUID(guid) round-trip is gone (unused module-wide now). NAME_PLATE_UNIT_ADDED caches the token as plate.nameplate.unit alongside the GUID; REMOVED clears both. GUID is retained only as the stable cache key (debuffCache/threatMemory/combatColorCache). Only GetUnitField("npcFlags") remains -- it has no token/vanilla equivalent. commitce1c49fcbbAuthor: Brues <5278969+brues-code@users.noreply.github.com> Date: Fri Jul 24 18:20:06 2026 -0500 Make focus/focustarget event-driven via ClassicAPI unit events ClassicAPI now fires UNIT_* (health/mana/aura/...) with arg1 == "focus" and arg1 == "focustarget", observed per-unit like target/party/raid. Both frames already registered those events (focus/focustarget are in pfValidUnits) and their OnEvent already matches arg1 == label, so the 0.2s polling ticks were pure workarounds for the missing events. Drop both ticks; the frames now refresh on-event like target, with range/glow still on the shared 0.5s state pass and PLAYER_FOCUS_CHANGED still driving assign/clear.
1240 lines
45 KiB
Lua
1240 lines
45 KiB
Lua
pfUI:RegisterModule("bags", function ()
|
|
local rawborder, default_border = GetBorderSize("bags")
|
|
|
|
local extractSpells = {
|
|
[13262] = {frame="disenchant"},
|
|
[1804] = {frame="picklock"},
|
|
}
|
|
|
|
local scanner = libtipscan:GetScanner("input_search")
|
|
|
|
-- function to detect openable items in inventory
|
|
local openable = { bag = nil, slot = nil, icon = nil }
|
|
local function GetNextOpenable()
|
|
if openable.icon and openable.icon == GetContainerItemInfo(openable.bag, openable.slot) then
|
|
return openable.bag, openable.slot
|
|
end
|
|
|
|
for bag=-2, 11 do
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
for slot=1, bagsize do
|
|
local _, canOpen = C_Container.IsContainerItemOpenable(bag, slot)
|
|
if canOpen then
|
|
openable.bag = bag
|
|
openable.slot = slot
|
|
openable.icon = GetContainerItemInfo(bag, slot)
|
|
return openable.bag, openable.slot
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- prevent from being placed offscreen
|
|
_G.StackSplitFrame:SetClampedToScreen(true)
|
|
|
|
-- overwrite some bag functions
|
|
function _G.OpenAllBags()
|
|
if pfUI.bag.right:IsShown() then
|
|
pfUI.bag.right:Hide()
|
|
else
|
|
pfUI.bag.right:Show()
|
|
end
|
|
end
|
|
|
|
function _G.CloseAllBags()
|
|
pfUI.bag.right:Hide()
|
|
end
|
|
|
|
function _G.ToggleBackpack()
|
|
if pfUI.bag.right:IsShown() then
|
|
pfUI.bag.right:Hide()
|
|
else
|
|
pfUI.bag.right:Show()
|
|
end
|
|
end
|
|
|
|
function _G.OpenBackpack()
|
|
if ( pfUI.bag.right:IsShown() ) then
|
|
ContainerFrame1.backpackWasOpen = 1
|
|
return
|
|
else
|
|
ContainerFrame1.backpackWasOpen = nil
|
|
end
|
|
|
|
if ( not ContainerFrame1.backpackWasOpen ) then
|
|
ToggleBackpack()
|
|
end
|
|
end
|
|
|
|
function _G.ToggleBag()
|
|
return
|
|
end
|
|
|
|
-- hide blizzard's bankframe
|
|
BankFrame:SetScale(0.001)
|
|
BankFrame:SetPoint("TOPLEFT", 0,0)
|
|
BankFrame:SetAlpha(0)
|
|
|
|
pfUI.bag = CreateFrame("Frame", "pfUIBag")
|
|
pfUI.bag:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
pfUI.bag:RegisterEvent("BAG_UPDATE")
|
|
pfUI.bag:RegisterEvent("PLAYERBANKSLOTS_CHANGED")
|
|
pfUI.bag:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED")
|
|
pfUI.bag:RegisterEvent("BAG_UPDATE_COOLDOWN")
|
|
pfUI.bag:RegisterEvent("BAG_CLOSED")
|
|
pfUI.bag:RegisterEvent("BANKFRAME_CLOSED")
|
|
pfUI.bag:RegisterEvent("BANKFRAME_OPENED")
|
|
pfUI.bag:RegisterEvent("ITEM_LOCK_CHANGED")
|
|
pfUI.bag:RegisterEvent("SPELLS_CHANGED")
|
|
pfUI.bag:RegisterEvent("MERCHANT_CLOSED")
|
|
|
|
pfUI.bag.delay = { UpdateBag = {} }
|
|
|
|
pfUI.bag:SetScript("OnUpdate", function()
|
|
-- update delayed ones every 0.1s
|
|
if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + .1 end
|
|
|
|
if this.delay.RefreshSpells then
|
|
this.delay.RefreshSpells = nil
|
|
pfUI.bag:RefreshSpells()
|
|
end
|
|
|
|
if this.delay.CheckFullUpdate then
|
|
this.delay.CheckFullUpdate = nil
|
|
pfUI.bag:CheckFullUpdate()
|
|
end
|
|
|
|
if this.delay.UpdateCooldowns then
|
|
this.delay.UpdateCooldowns = nil
|
|
pfUI.bag:UpdateCooldowns()
|
|
end
|
|
|
|
if this.delay.UpdateItemLock then
|
|
this.delay.UpdateItemLock = nil
|
|
pfUI.bag:UpdateItemLock()
|
|
end
|
|
|
|
for bag in pairs(this.delay.UpdateBag) do
|
|
this.delay.UpdateBag[bag] = nil
|
|
pfUI.bag:UpdateBag(bag)
|
|
end
|
|
end)
|
|
|
|
pfUI.bag:SetScript("OnEvent", function()
|
|
if event == "PLAYER_ENTERING_WORLD" then
|
|
pfUI.bag:CreateBags()
|
|
pfUI.bag.right:Hide()
|
|
|
|
pfUI.bag:CreateBags("bank")
|
|
pfUI.bag.left:Hide()
|
|
|
|
pfUI.bag:CreateBagSlots(pfUI.bag.right)
|
|
pfUI.bag:CreateBagSlots(pfUI.bag.left)
|
|
pfUI.bag:RefreshSpells()
|
|
end
|
|
|
|
if event == "SPELLS_CHANGED" then
|
|
this.delay.RefreshSpells = true
|
|
end
|
|
|
|
if event == "BAG_CLOSED" or event == "PLAYERBANKSLOTS_CHANGED" or
|
|
event == "PLAYERBANKBAGSLOTS_CHANGED" or event == "BAG_UPDATE" or
|
|
event == "BANKFRAME_OPENED" or event == "BANKFRAME_CLOSED" then
|
|
this.delay.CheckFullUpdate = true
|
|
end
|
|
|
|
if event == "BAG_UPDATE_COOLDOWN" then
|
|
this.delay.UpdateCooldowns = true
|
|
end
|
|
|
|
if event == "ITEM_LOCK_CHANGED" then
|
|
this.delay.UpdateItemLock = true
|
|
end
|
|
|
|
if event == "PLAYERBANKSLOTS_CHANGED" then
|
|
this.delay.UpdateBag[-1] = true
|
|
end
|
|
|
|
if event == "BAG_UPDATE" then
|
|
this.delay.UpdateBag[arg1] = true
|
|
end
|
|
|
|
if event == "PLAYERBANKBAGSLOTS_CHANGED" then
|
|
pfUI.bag:CreateBagSlots(pfUI.bag.left)
|
|
end
|
|
|
|
if event == "BANKFRAME_OPENED" then
|
|
pfUI.bag.left:Show()
|
|
OpenBackpack()
|
|
end
|
|
|
|
if event == "BANKFRAME_CLOSED" then
|
|
pfUI.bag.left:Hide()
|
|
end
|
|
|
|
if event == "MERCHANT_CLOSED" then
|
|
if not ContainerFrame1.backpackWasOpen then
|
|
pfUI.bag.right:Hide()
|
|
end
|
|
end
|
|
end)
|
|
|
|
tinsert(UISpecialFrames,"pfBag")
|
|
|
|
pfUI.BACKPACK = { -2, 0, 1, 2, 3, 4 }
|
|
pfUI.BANK = { -1, 5, 6, 7, 8, 9, 10, 11 }
|
|
|
|
pfUI.bags = {}
|
|
pfUI.slots = {}
|
|
|
|
function pfUI.bag:CheckFullUpdate()
|
|
local maxslots = 0
|
|
|
|
for bag = -2,11 do
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
|
|
maxslots = maxslots + bagsize
|
|
end
|
|
|
|
if maxslots ~= pfUI.bag.maxslots then
|
|
for bag = -2,11 do
|
|
for slot, f in ipairs(pfUI.bags[bag].slots) do
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
|
|
if slot > bagsize then
|
|
pfUI.bags[bag].slots[slot].frame:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
pfUI.bag:CreateBags()
|
|
pfUI.bag:CreateBags("bank")
|
|
pfUI.bag.maxslots = maxslots
|
|
end
|
|
end
|
|
|
|
function pfUI.bag:CreateBags(object)
|
|
local x = 0
|
|
local y = 0
|
|
local frame = {}
|
|
local iterate = {}
|
|
local anchor, rowlength, cwidth
|
|
|
|
if object == "bank" then
|
|
if not pfUI.bag.left then pfUI.bag.left = CreateFrame("Frame", "pfBank", UIParent) end
|
|
anchor = { "BOTTOMLEFT", (pfUI.chat and pfUI.chat.left or nil), "BOTTOMRIGHT", "TOPLEFT", "TOPRIGHT" }
|
|
rowlength = tonumber(C.appearance.bags.bankrowlength)
|
|
cwidth = C.chat.left.width
|
|
iterate = pfUI.BANK
|
|
frame = pfUI.bag.left
|
|
else
|
|
if not pfUI.bag.right then pfUI.bag.right = CreateFrame("Frame", "pfBag", UIParent) end
|
|
rowlength = tonumber(C.appearance.bags.bagrowlength)
|
|
anchor = { "BOTTOMRIGHT", (pfUI.chat and pfUI.chat.right or nil), "BOTTOMLEFT", "TOPRIGHT", "TOPLEFT" }
|
|
cwidth = C.chat.right.width
|
|
iterate = pfUI.BACKPACK
|
|
frame = pfUI.bag.right
|
|
end
|
|
|
|
if not frame.init then
|
|
pfUI.bag:CreateAdditions(frame)
|
|
frame:SetFrameStrata("HIGH")
|
|
CreateBackdrop(frame, default_border)
|
|
CreateBackdropShadow(frame)
|
|
frame.init = true
|
|
end
|
|
|
|
if pfUI.chat and C.appearance.bags.icon_size == "-1" then
|
|
-- align bags to chat if no custom size is set
|
|
frame:SetWidth(cwidth * anchor[2]:GetScale())
|
|
elseif C.appearance.bags.icon_size ~= "-1" then
|
|
-- use custom size if set
|
|
frame:SetWidth((C.appearance.bags.icon_size + default_border*3) * rowlength - default_border)
|
|
else
|
|
-- fallback to 22px without any anchor or custom setting
|
|
frame:SetWidth((22 + default_border*3) * rowlength - default_border)
|
|
end
|
|
|
|
if pfUI.chat and C.appearance.bags.icon_size ~= "-1" then
|
|
-- ignore custom icon size
|
|
frame:SetPoint(anchor[1], anchor[2], anchor[1], 0, 0)
|
|
elseif pfUI.chat then
|
|
-- use chat frame as anchor if existing
|
|
if C.appearance.bags.abovechat == "0" then
|
|
frame:SetPoint(anchor[1], anchor[2], anchor[1], 0, 0)
|
|
frame:SetPoint(anchor[3], anchor[2], anchor[3], 0, 0)
|
|
else
|
|
frame:SetPoint(anchor[3], anchor[2], anchor[5], 0, 3*default_border)
|
|
frame:SetPoint(anchor[1], anchor[2], anchor[4], 0, 3*default_border)
|
|
end
|
|
else
|
|
-- align frame to UIParent if no anchor is available
|
|
frame:SetPoint(anchor[1], UIParent, anchor[1], 5, 5)
|
|
end
|
|
|
|
if C.appearance.bags.movable == "1" then
|
|
-- enable movable bag frames
|
|
LoadMovable(frame)
|
|
frame:EnableMouse(1)
|
|
frame:SetMovable(1)
|
|
frame:RegisterForDrag("LeftButton")
|
|
frame:SetScript("OnDragStart", function()
|
|
this:StartMoving()
|
|
end)
|
|
|
|
frame:SetScript("OnDragStop", function()
|
|
this:StopMovingOrSizing()
|
|
SaveMovable(this)
|
|
end)
|
|
end
|
|
|
|
frame:EnableMouse(1)
|
|
|
|
if C.appearance.bags.movable == "1" and C.appearance.bags.icon_size ~= "-1" then
|
|
frame.button_size = C.appearance.bags.icon_size
|
|
else
|
|
frame.button_size = (frame:GetWidth() - 2*default_border - (rowlength-1)*default_border*3)/ rowlength
|
|
end
|
|
|
|
local topspace = pfUI.bag.right.close:GetHeight() + default_border * 2
|
|
local bottomspace = pfUI.panel and pfUI.panel.right:IsShown() and pfUI.panel.right:GetHeight() + default_border or 16 + default_border
|
|
|
|
for id, bag in pairs(iterate) do
|
|
if not pfUI.bags[bag] then
|
|
pfUI.bags[bag] = CreateFrame("Frame", "pfBag" .. bag, frame)
|
|
pfUI.bags[bag]:SetAllPoints(frame)
|
|
pfUI.bags[bag].slots = {}
|
|
end
|
|
pfUI.bags[bag]:SetID(bag)
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
for slot=1, bagsize do
|
|
pfUI.bag:UpdateSlot(bag, slot)
|
|
|
|
pfUI.bags[bag].slots[slot].frame:ClearAllPoints()
|
|
pfUI.bags[bag].slots[slot].frame:SetPoint("TOPLEFT",
|
|
default_border + x*(frame.button_size+default_border*3),
|
|
-default_border*2 - y*(frame.button_size+default_border*3) - topspace)
|
|
|
|
pfUI.bags[bag].slots[slot].frame:SetHeight(frame.button_size)
|
|
pfUI.bags[bag].slots[slot].frame:SetWidth(frame.button_size)
|
|
|
|
if x >= rowlength - 1 then
|
|
y = y + 1
|
|
x = 0
|
|
else
|
|
x = x + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
if x > 0 then y = y + 1 end
|
|
frame:SetHeight( default_border*2 + y*(frame.button_size+default_border*3) + topspace + bottomspace)
|
|
|
|
local chat = pfUI.chat and ( object == "bank" and pfUI.chat.left or pfUI.chat.right) or nil
|
|
|
|
frame:SetScript("OnShow", function()
|
|
frame.opened = true
|
|
if C.appearance.bags.hidechat == "1" and chat and chat:IsVisible() then
|
|
frame.chatWasOpen = true
|
|
chat:Hide()
|
|
end
|
|
if C.appearance.bags.autoSortOnOpen == "1" then
|
|
libbagsort:Sort({0, 1, 2, 3, 4})
|
|
end
|
|
pfUI.bag:CreateBags(object)
|
|
PlaySound("INTERFACESOUND_BACKPACKOPEN")
|
|
end)
|
|
|
|
frame:SetScript("OnHide", function()
|
|
if C.appearance.bags.hidechat == "1" and chat and frame.chatWasOpen then
|
|
chat:Show()
|
|
frame.chatWasOpen = false
|
|
end
|
|
pfUI.bag:CreateBags(object)
|
|
PlaySound("INTERFACESOUND_BACKPACKCLOSE")
|
|
if frame.opened then
|
|
frame.opened = nil
|
|
pfUI.events:TriggerEvent("bag:closed", object)
|
|
end
|
|
end)
|
|
end
|
|
|
|
function pfUI.bag:UpdateBag(bag)
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
for slot=1, bagsize do
|
|
pfUI.bag:UpdateSlot(bag, slot)
|
|
end
|
|
end
|
|
|
|
function pfUI.bag:UpdateSlot(bag, slot)
|
|
if not pfUI.bags[bag] then return end
|
|
|
|
if not pfUI.bags[bag].slots[slot] then
|
|
local tpl = "ContainerFrameItemButtonTemplate"
|
|
if bag == -1 then tpl = "BankItemButtonGenericTemplate" end
|
|
pfUI.bags[bag].slots[slot] = {}
|
|
pfUI.bags[bag].slots[slot].frame = CreateFrame("Button", "pfBag" .. bag .. "item" .. slot, pfUI.bags[bag], tpl)
|
|
pfUI.bags[bag].slots[slot].frame.qtext = pfUI.bags[bag].slots[slot].frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
|
|
|
pfUI.bags[bag].slots[slot].frame:SetNormalTexture("")
|
|
pfUI.bags[bag].slots[slot].bag = bag
|
|
pfUI.bags[bag].slots[slot].slot = slot
|
|
pfUI.bags[bag].slots[slot].frame:SetID(slot)
|
|
|
|
-- add cooldown frame to bankslots
|
|
if tpl == "BankItemButtonGenericTemplate" then
|
|
local bankslot = pfUI.bags[bag].slots[slot].frame
|
|
local name = "pfBag" .. bag .. "item" .. slot .. "Cooldown"
|
|
bankslot.cd = CreateFrame(COOLDOWN_FRAME_TYPE, name, bankslot, "CooldownFrameTemplate")
|
|
bankslot.cd:SetAllPoints(bankslot)
|
|
bankslot.cd.pfCooldownStyleAnimation = 1
|
|
bankslot.cd.pfCooldownType = "ALL"
|
|
else
|
|
local bagslot = pfUI.bags[bag].slots[slot].frame
|
|
bagslot.cd = _G[bagslot:GetName().."Cooldown"]
|
|
bagslot.cd.pfCooldownType = "ALL"
|
|
end
|
|
|
|
if not pfUI.bags[bag].slots[slot].frame.backdrop then
|
|
CreateBackdrop(pfUI.bags[bag].slots[slot].frame, default_border)
|
|
end
|
|
|
|
local highlight = pfUI.bags[bag].slots[slot].frame:GetHighlightTexture()
|
|
highlight:SetTexture(.5, .5, .5, .5)
|
|
|
|
local pushed = pfUI.bags[bag].slots[slot].frame:GetPushedTexture()
|
|
pushed:SetTexture(.5, .5, .5, .5)
|
|
|
|
local questText = pfUI.bags[bag].slots[slot].frame.qtext
|
|
questText:SetFont(pfUI.font_default, 13, "THICKOUTLINE")
|
|
questText:SetPoint("TOPLEFT", 0, 0)
|
|
questText:SetTextColor(1, .8, .2, 1)
|
|
|
|
local countFrame = _G[pfUI.bags[bag].slots[slot].frame:GetName() .. "Count"]
|
|
countFrame:SetFont(pfUI.font_unit, C.global.font_unit_size, "OUTLINE")
|
|
countFrame:SetAllPoints()
|
|
countFrame:SetJustifyH("RIGHT")
|
|
countFrame:SetJustifyV("BOTTOM")
|
|
|
|
local icon = _G[pfUI.bags[bag].slots[slot].frame:GetName() .. "IconTexture"]
|
|
icon:SetTexCoord(.08, .92, .08, .92)
|
|
icon:ClearAllPoints()
|
|
icon:SetPoint("TOPLEFT", 1, -1)
|
|
icon:SetPoint("BOTTOMRIGHT", -1, 1)
|
|
|
|
local border = _G[pfUI.bags[bag].slots[slot].frame:GetName() .. "NormalTexture"]
|
|
border:SetTexture("")
|
|
|
|
if ShaguScore then
|
|
pfUI.bags[bag].slots[slot].frame.scoreText = pfUI.bags[bag].slots[slot].frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
|
pfUI.bags[bag].slots[slot].frame.scoreText:SetFont(pfUI.font_default, 12, "OUTLINE")
|
|
pfUI.bags[bag].slots[slot].frame.scoreText:SetPoint("TOPRIGHT", 0, 0)
|
|
end
|
|
end
|
|
|
|
local itemID = C_Container.GetContainerItemID(bag, slot)
|
|
|
|
local texture, count, locked, quality = GetContainerItemInfo(bag, slot)
|
|
|
|
if count == 1 then
|
|
local charges = C_Container.GetContainerItemCharges(bag, slot)
|
|
if charges > 1 then
|
|
count = charges
|
|
end
|
|
end
|
|
|
|
local _, _, q, _, _, _, itype = C_Item.GetItemInfo(itemID)
|
|
|
|
-- running advanced item color scan
|
|
if C.appearance.bags.borderonlygear == "0" and texture and quality and quality < 1 then
|
|
if quality then quality = q end
|
|
end
|
|
|
|
SetItemButtonTexture(pfUI.bags[bag].slots[slot].frame, texture)
|
|
SetItemButtonCount(pfUI.bags[bag].slots[slot].frame, count)
|
|
SetItemButtonDesaturated(pfUI.bags[bag].slots[slot].frame, locked, 0.5, 0.5, 0.5)
|
|
|
|
local hasItem = texture and 1 or nil
|
|
pfUI.bags[bag].slots[slot].frame.hasItem = hasItem
|
|
pfUI.bags[bag].slots[slot].frame.qtext:SetText("")
|
|
|
|
ContainerFrame_UpdateCooldown(bag, pfUI.bags[bag].slots[slot].frame)
|
|
|
|
-- detect backdrop border color
|
|
if texture and itype == "Quest" then
|
|
pfUI.bags[bag].slots[slot].frame.backdrop:SetBackdropBorderColor(1, .8, .2, .8)
|
|
pfUI.bags[bag].slots[slot].frame.qtext:SetText("?")
|
|
elseif texture and quality and quality > tonumber(C.appearance.bags.borderlimit) then
|
|
pfUI.bags[bag].slots[slot].frame.backdrop:SetBackdropBorderColor(GetItemQualityColor(quality))
|
|
elseif texture and quality then
|
|
pfUI.bags[bag].slots[slot].frame.backdrop:SetBackdropBorderColor(.5,.5,.5,1)
|
|
else
|
|
local bagtype = GetBagFamily(bag)
|
|
|
|
if bagtype == "QUIVER" then
|
|
pfUI.bags[bag].slots[slot].frame.backdrop:SetBackdropBorderColor(1,1,.5,.5)
|
|
elseif bagtype == "SOULBAG" then
|
|
pfUI.bags[bag].slots[slot].frame.backdrop:SetBackdropBorderColor(1,.5,.5,.5)
|
|
elseif bagtype == "SPECIAL" then
|
|
pfUI.bags[bag].slots[slot].frame.backdrop:SetBackdropBorderColor(.5,.5,1,.5)
|
|
elseif bagtype == "KEYRING" then
|
|
pfUI.bags[bag].slots[slot].frame.backdrop:SetBackdropBorderColor(.5,1,1,.5)
|
|
else
|
|
pfUI.bags[bag].slots[slot].frame.backdrop:SetBackdropBorderColor(1,1,1,.2)
|
|
end
|
|
end
|
|
|
|
-- add shaguscore if we have it
|
|
if ShaguScore and pfUI.bags[bag].slots[slot].frame.scoreText then
|
|
if quality and quality > 0 then
|
|
local item = Item:CreateFromBagAndSlot(bag, slot)
|
|
local r,g,b = item:GetItemQualityColorRGB()
|
|
local itemID = item:GetItemID()
|
|
local itemLevel = ShaguScore.Database[itemID] or 0
|
|
local score = ShaguScore:Calculate(vslot, quality, itemLevel)
|
|
if score and score > 0 and count and count == 1 then
|
|
pfUI.bags[bag].slots[slot].frame.scoreText:SetText(score)
|
|
pfUI.bags[bag].slots[slot].frame.scoreText:SetTextColor(r, g, b)
|
|
else
|
|
pfUI.bags[bag].slots[slot].frame.scoreText:SetText("")
|
|
end
|
|
else
|
|
pfUI.bags[bag].slots[slot].frame.scoreText:SetText("")
|
|
end
|
|
end
|
|
|
|
pfUI.bags[bag].slots[slot].frame:Show()
|
|
end
|
|
|
|
function pfUI.bag:CreateBagSlots(frame)
|
|
if not frame.bagslots then
|
|
frame.bagslots = CreateFrame("Frame", "pfBagSlots", frame)
|
|
frame.bagslots.slots = {}
|
|
frame.bagslots:Hide()
|
|
end
|
|
|
|
local min, max = 0, 3
|
|
local tpl = "BagSlotButtonTemplate"
|
|
local name, append = "pfUIBagsBBag", "Slot"
|
|
local position = "RIGHT"
|
|
|
|
if frame == pfUI.bag.left then
|
|
min, max = 1, math.min(NUM_BANKBAGSLOTS, (GetNumBankSlots() or 0))
|
|
tpl = "BankItemButtonBagTemplate"
|
|
name, append = "pfUIBankBBag", ""
|
|
position = "LEFT"
|
|
end
|
|
|
|
frame.bagslots:SetPoint("BOTTOM"..position, frame, "TOP"..position, 0, default_border*3)
|
|
CreateBackdrop(frame.bagslots, default_border)
|
|
CreateBackdropShadow(frame.bagslots)
|
|
|
|
local extra = frame == pfUI.bag.left and GetNumBankSlots() < NUM_BANKBAGSLOTS and 1 or 0
|
|
local width = (frame.button_size/5*4 + default_border*2) * (max-min+1+extra)
|
|
local height = default_border + (frame.button_size/5*4 + default_border)
|
|
|
|
frame.bagslots:SetWidth(width)
|
|
frame.bagslots:SetHeight(height)
|
|
for slot=min, max do
|
|
if not frame.bagslots.slots[slot] then
|
|
frame.bagslots.slots[slot] = {}
|
|
frame.bagslots.slots[slot].frame = CreateFrame("CheckButton", name .. slot .. append, frame.bagslots, tpl)
|
|
|
|
local icon = _G[frame.bagslots.slots[slot].frame:GetName() .. "IconTexture"]
|
|
local border = _G[frame.bagslots.slots[slot].frame:GetName() .. "NormalTexture"]
|
|
icon:SetTexCoord(.08, .92, .08, .92)
|
|
icon:ClearAllPoints()
|
|
icon:SetPoint("TOPLEFT", 1, -1)
|
|
icon:SetPoint("BOTTOMRIGHT", -1, 1)
|
|
border:SetTexture("")
|
|
|
|
local highlight = frame.bagslots.slots[slot].frame:GetHighlightTexture()
|
|
highlight:SetTexture(.5, .5, .5, .5)
|
|
|
|
local pushed = frame.bagslots.slots[slot].frame:GetPushedTexture()
|
|
pushed:SetTexture(.5, .5, .5, .5)
|
|
|
|
if frame == pfUI.bag.left then
|
|
frame.bagslots.slots[slot].frame:SetID(slot + 4)
|
|
frame.bagslots.slots[slot].frame.slot = slot + 3
|
|
else
|
|
frame.bagslots.slots[slot].frame.slot = slot
|
|
frame.bagslots.slots[slot].slot = slot
|
|
end
|
|
|
|
local SlotEnter = frame.bagslots.slots[slot].frame:GetScript("OnEnter")
|
|
frame.bagslots.slots[slot].frame:SetScript("OnEnter", function()
|
|
for slot, f in ipairs(pfUI.bags[this.slot + 1].slots) do
|
|
CreateBackdrop(f.frame, default_border)
|
|
f.frame.backdrop:SetBackdropBorderColor(.2,1,.8,1)
|
|
end
|
|
SlotEnter(this)
|
|
end)
|
|
|
|
local SlotLeave = frame.bagslots.slots[slot].frame:GetScript("OnLeave")
|
|
frame.bagslots.slots[slot].frame:SetScript("OnLeave", function()
|
|
pfUI.bag:UpdateBag(this.slot + 1)
|
|
SlotLeave()
|
|
end)
|
|
|
|
-- On TBC, the OnEvent function of the template scans for framenames,
|
|
-- and obviously doesn't know the pf-Names. Therefore, triggering
|
|
-- the update function on each frame manually
|
|
if frame == pfUI.bag.left and BankFrameItemButton_Update then
|
|
local SlotUpdate = frame.bagslots.slots[slot].frame:GetScript("OnUpdate")
|
|
frame.bagslots.slots[slot].frame:SetScript("OnUpdate", function()
|
|
if SlotUpdate then SlotUpdate(this) end
|
|
BankFrameItemButton_Update(this)
|
|
end)
|
|
end
|
|
end
|
|
|
|
local left = (slot-min)*(frame.button_size/5*4+default_border*2) + default_border
|
|
local top = -default_border
|
|
|
|
frame.bagslots.slots[slot].frame:ClearAllPoints()
|
|
frame.bagslots.slots[slot].frame:SetPoint("TOPLEFT", frame.bagslots, "TOPLEFT", left, top)
|
|
frame.bagslots.slots[slot].frame:SetHeight(frame.button_size/5*4)
|
|
frame.bagslots.slots[slot].frame:SetWidth(frame.button_size/5*4)
|
|
|
|
CreateBackdrop(frame.bagslots.slots[slot].frame, default_border)
|
|
frame.bagslots.slots[slot].frame:Show()
|
|
|
|
if ( slot <= GetNumBankSlots() ) then
|
|
frame.bagslots.slots[slot].frame.tooltipText = BANK_BAG
|
|
else
|
|
frame.bagslots.slots[slot].frame.tooltipText = BANK_BAG_PURCHASE
|
|
end
|
|
end
|
|
|
|
if frame == pfUI.bag.left then
|
|
if GetNumBankSlots() < NUM_BANKBAGSLOTS then
|
|
if not frame.bagslots.buy then
|
|
frame.bagslots.buy = CreateFrame("Button", "pfBagSlotBuy", frame.bagslots)
|
|
end
|
|
frame.bagslots.buy:SetPoint("RIGHT", frame.bagslots, "RIGHT", -default_border, 0)
|
|
CreateBackdrop(frame.bagslots.buy, default_border)
|
|
frame.bagslots.buy:SetHeight(frame.button_size/5*4)
|
|
frame.bagslots.buy:SetWidth(frame.button_size/5*4)
|
|
frame.bagslots.buy:SetText("+")
|
|
frame.bagslots.buy:SetTextColor(.5,.5,1,1)
|
|
frame.bagslots.buy:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
frame.bagslots.buy:SetScript("OnEnter", function ()
|
|
frame.bagslots.buy:SetTextColor(1,1,1,1)
|
|
end)
|
|
frame.bagslots.buy:SetScript("OnLeave", function ()
|
|
frame.bagslots.buy:SetTextColor(.5,.5,1,1)
|
|
end)
|
|
frame.bagslots.buy:SetScript("OnClick", function()
|
|
StaticPopup_Show("CONFIRM_BUY_BANK_SLOT")
|
|
end)
|
|
else
|
|
if frame.bagslots.buy then frame.bagslots.buy:Hide() end
|
|
end
|
|
end
|
|
end
|
|
|
|
function pfUI.bag:ReanchorAdditions()
|
|
local frame = pfUI.bag.right
|
|
local show_disenchant = (frame.disenchant:GetID() > 0)
|
|
local show_picklock = (frame.picklock:GetID() > 0)
|
|
if not show_disenchant then
|
|
frame.disenchant:Hide()
|
|
frame.picklock:SetPoint("TOPRIGHT", frame.open, "TOPLEFT", -default_border*3, 0)
|
|
else
|
|
frame.disenchant:Show()
|
|
frame.picklock:SetPoint("TOPRIGHT", frame.disenchant, "TOPLEFT", -default_border*3, 0)
|
|
end
|
|
if not show_picklock then
|
|
frame.picklock:Hide()
|
|
if show_disenchant then
|
|
frame.keys:SetPoint("TOPRIGHT", frame.disenchant, "TOPLEFT", -default_border*3, 0)
|
|
else
|
|
frame.keys:SetPoint("TOPRIGHT", frame.open, "TOPLEFT", -default_border*3, 0)
|
|
end
|
|
else
|
|
frame.picklock:Show()
|
|
frame.keys:SetPoint("TOPRIGHT", frame.picklock, "TOPLEFT", -default_border*3, 0)
|
|
end
|
|
end
|
|
|
|
function pfUI.bag:UpdateCooldowns()
|
|
local frame
|
|
for bag=-2, 11 do
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
for slot=1, bagsize do
|
|
frame = pfUI.bags[bag] and pfUI.bags[bag].slots[slot] and pfUI.bags[bag].slots[slot].frame
|
|
if frame and frame.hasItem and _G[frame:GetName() .. "Cooldown"] then
|
|
ContainerFrame_UpdateCooldown(bag, frame)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function pfUI.bag:UpdateItemLock()
|
|
for bag=-2, 11 do
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
for slot=1, bagsize do
|
|
if pfUI.bags[bag] and pfUI.bags[bag].slots[slot] and pfUI.bags[bag].slots[slot].frame:IsShown() then
|
|
local _, _, locked, _ = GetContainerItemInfo(bag, slot)
|
|
if pfUI.bags[bag].slots[slot].locked ~= locked then
|
|
SetItemButtonDesaturated(pfUI.bags[bag].slots[slot].frame, locked, 0.5, 0.5, 0.5)
|
|
if pfUI.unusable then pfUI.unusable:UpdateSlot(bag, slot) end
|
|
pfUI.bags[bag].slots[slot].locked = locked
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function pfUI.bag:RefreshSpells()
|
|
if not (pfUI.bag and pfUI.bag.right) then return end
|
|
for spellID, widget in pairs(extractSpells) do
|
|
if IsSpellKnown(spellID) and pfUI.bag.right[widget.frame] then
|
|
pfUI.bag.right[widget.frame]:SetID(spellID)
|
|
end
|
|
end
|
|
pfUI.bag:ReanchorAdditions()
|
|
end
|
|
|
|
function pfUI.bag:CreateAdditions(frame)
|
|
-- bag additions
|
|
if frame == pfUI.bag.right then
|
|
-- bag close button
|
|
if not frame.close then
|
|
frame.close = CreateFrame("Button", "pfBagClose", frame)
|
|
frame.close:SetPoint("TOPRIGHT", -default_border*1,-default_border )
|
|
CreateBackdrop(frame.close, default_border)
|
|
frame.close:SetHeight(12)
|
|
frame.close:SetWidth(12)
|
|
frame.close.texture = frame.close:CreateTexture("pfBagClose")
|
|
frame.close.texture:SetTexture(pfUI.media["img:close"])
|
|
frame.close.texture:ClearAllPoints()
|
|
frame.close.texture:SetPoint("TOPLEFT", frame.close, "TOPLEFT", 2, -2)
|
|
frame.close.texture:SetPoint("BOTTOMRIGHT", frame.close, "BOTTOMRIGHT", -2, 2)
|
|
frame.close.texture:SetVertexColor(1,.25,.25,1)
|
|
frame.close:SetScript("OnEnter", function ()
|
|
frame.close.backdrop:SetBackdropBorderColor(1,.25,.25,1)
|
|
end)
|
|
|
|
frame.close:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.close, default_border)
|
|
end)
|
|
|
|
frame.close:SetScript("OnClick", function()
|
|
CloseAllBags()
|
|
end)
|
|
end
|
|
|
|
-- bags button
|
|
if not frame.bags then
|
|
frame.bags = CreateFrame("Button", "pfBagSlotShow", frame)
|
|
frame.bags:SetPoint("TOPRIGHT", frame.close, "TOPLEFT", -default_border*3, 0)
|
|
CreateBackdrop(frame.bags, default_border)
|
|
frame.bags:SetHeight(12)
|
|
frame.bags:SetWidth(12)
|
|
frame.bags:SetTextColor(1,1,.25,1)
|
|
frame.bags:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
frame.bags.texture = frame.bags:CreateTexture("pfBagArrowUp")
|
|
frame.bags.texture:SetTexture(pfUI.media["img:up"])
|
|
frame.bags.texture:ClearAllPoints()
|
|
frame.bags.texture:SetPoint("TOPLEFT", frame.bags, "TOPLEFT", 3, -1)
|
|
frame.bags.texture:SetPoint("BOTTOMRIGHT", frame.bags, "BOTTOMRIGHT", -3, 1)
|
|
frame.bags.texture:SetVertexColor(.25,.25,.25,1)
|
|
|
|
frame.bags:SetScript("OnEnter", function ()
|
|
frame.bags.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
|
frame.bags.texture:SetVertexColor(1,1,.25,1)
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
GameTooltip:SetText(_G.TUTORIAL_TITLE10)
|
|
GameTooltip:Show()
|
|
end)
|
|
|
|
frame.bags:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.bags, default_border)
|
|
frame.bags.texture:SetVertexColor(.25,.25,.25,1)
|
|
if GameTooltip:IsOwned(this) then
|
|
GameTooltip:Hide()
|
|
end
|
|
end)
|
|
|
|
frame.bags:SetScript("OnClick", function()
|
|
if pfUI.bag.right.bagslots:IsShown() then
|
|
pfUI.bag.right.bagslots:Hide()
|
|
else
|
|
pfUI.bag.right.bagslots:Show()
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- open button
|
|
if not frame.open then
|
|
frame.open = CreateFrame("Button", "pfBagSlotOpen", frame)
|
|
frame.open:SetPoint("TOPRIGHT", frame.bags, "TOPLEFT", -default_border*3, 0)
|
|
CreateBackdrop(frame.open, default_border)
|
|
frame.open:SetHeight(12)
|
|
frame.open:SetWidth(12)
|
|
frame.open:SetTextColor(1,1,.25,1)
|
|
frame.open:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
frame.open.texture = frame.open:CreateTexture("pfBagOpenContainer")
|
|
frame.open.texture:SetTexture(pfUI.media["img:empty"])
|
|
frame.open.texture:ClearAllPoints()
|
|
frame.open.texture:SetPoint("TOPLEFT", frame.open, "TOPLEFT", 3, -1)
|
|
frame.open.texture:SetPoint("BOTTOMRIGHT", frame.open, "BOTTOMRIGHT", -3, 1)
|
|
frame.open.texture:SetVertexColor(.25,.25,.25,1)
|
|
|
|
frame.open:SetScript("OnEnter", function ()
|
|
frame.open.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
|
frame.open.texture:SetVertexColor(1,1,.25,1)
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
|
|
local bag, slot = GetNextOpenable()
|
|
if bag and slot then
|
|
GameTooltip:SetBagItem(bag, slot)
|
|
else
|
|
GameTooltip:SetText(_G.EMPTY)
|
|
end
|
|
GameTooltip:Show()
|
|
end)
|
|
|
|
frame.open:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.open, default_border)
|
|
frame.open.texture:SetVertexColor(.25,.25,.25,1)
|
|
if GameTooltip:IsOwned(this) then
|
|
GameTooltip:Hide()
|
|
end
|
|
end)
|
|
|
|
frame.open:SetScript("OnClick", function()
|
|
-- open next container item
|
|
local bag, slot = GetNextOpenable()
|
|
if bag and slot then
|
|
ClearCursor()
|
|
if MerchantFrame:IsShown() then
|
|
HideUIPanel(MerchantFrame)
|
|
end
|
|
UseContainerItem(bag, slot)
|
|
end
|
|
|
|
-- reload tootltip
|
|
local bag, slot = GetNextOpenable()
|
|
if bag and slot then
|
|
GameTooltip:SetBagItem(bag, slot)
|
|
else
|
|
GameTooltip:SetText(_G.EMPTY)
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- disenchant button
|
|
if not frame.disenchant then
|
|
frame.disenchant = CreateFrame("Button", "pfBagSlotDisenchant", frame)
|
|
frame.disenchant:SetPoint("TOPRIGHT", frame.open, "TOPLEFT", -default_border*3, 0)
|
|
CreateBackdrop(frame.disenchant, default_border)
|
|
frame.disenchant:SetHeight(12)
|
|
frame.disenchant:SetWidth(12)
|
|
frame.disenchant:SetTextColor(1,1,.25,1)
|
|
frame.disenchant:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
frame.disenchant.texture = frame.disenchant:CreateTexture("pfBagDisenchant")
|
|
frame.disenchant.texture:SetTexture(pfUI.media["img:disenchant"])
|
|
frame.disenchant.texture:ClearAllPoints()
|
|
frame.disenchant.texture:SetPoint("TOPLEFT", frame.disenchant, "TOPLEFT", 3, -1)
|
|
frame.disenchant.texture:SetPoint("BOTTOMRIGHT", frame.disenchant, "BOTTOMRIGHT", -3, 1)
|
|
frame.disenchant.texture:SetVertexColor(.25,.25,.25,1)
|
|
|
|
frame.disenchant:SetScript("OnEnter", function ()
|
|
frame.disenchant.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
|
frame.disenchant.texture:SetVertexColor(1,1,.25,1)
|
|
local id = this:GetID()
|
|
if id and id > 0 then
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
GameTooltip:SetSpellByID(id)
|
|
GameTooltip:Show()
|
|
end
|
|
end)
|
|
|
|
frame.disenchant:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.disenchant, default_border)
|
|
frame.disenchant.texture:SetVertexColor(.25,.25,.25,1)
|
|
if GameTooltip:IsOwned(this) then
|
|
GameTooltip:Hide()
|
|
end
|
|
end)
|
|
|
|
frame.disenchant:SetScript("OnClick", function()
|
|
local id = this:GetID()
|
|
if id and id > 0 then
|
|
CastSpellByName(id)
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- pick lock button
|
|
if not frame.picklock then
|
|
frame.picklock = CreateFrame("Button", "pfBagSlotPicklock", frame)
|
|
frame.picklock:SetPoint("TOPRIGHT", frame.disenchant, "TOPLEFT", -default_border*3, 0)
|
|
CreateBackdrop(frame.picklock, default_border)
|
|
frame.picklock:SetHeight(12)
|
|
frame.picklock:SetWidth(12)
|
|
frame.picklock:SetTextColor(1,1,.25,1)
|
|
frame.picklock:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
frame.picklock.texture = frame.picklock:CreateTexture("pfBagPicklock")
|
|
frame.picklock.texture:SetTexture(pfUI.media["img:picklock"])
|
|
frame.picklock.texture:ClearAllPoints()
|
|
frame.picklock.texture:SetPoint("TOPLEFT", frame.picklock, "TOPLEFT", 3, -1)
|
|
frame.picklock.texture:SetPoint("BOTTOMRIGHT", frame.picklock, "BOTTOMRIGHT", -3, 1)
|
|
frame.picklock.texture:SetVertexColor(.25,.25,.25,1)
|
|
|
|
frame.picklock:SetScript("OnEnter", function ()
|
|
frame.picklock.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
|
frame.picklock.texture:SetVertexColor(1,1,.25,1)
|
|
local id = this:GetID()
|
|
if id and id > 0 then
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
GameTooltip:SetSpellByID(id)
|
|
GameTooltip:Show()
|
|
end
|
|
end)
|
|
|
|
frame.picklock:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.picklock, default_border)
|
|
frame.picklock.texture:SetVertexColor(.25,.25,.25,1)
|
|
if GameTooltip:IsOwned(this) then
|
|
GameTooltip:Hide()
|
|
end
|
|
end)
|
|
|
|
frame.picklock:SetScript("OnClick", function()
|
|
local id = this:GetID()
|
|
if id and id > 0 then
|
|
CastSpellByName(id)
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- key button
|
|
if not frame.keys then
|
|
frame.keys = CreateFrame("Button", "pfBagSlotShow", frame)
|
|
frame.keys:SetPoint("TOPRIGHT", frame.picklock, "TOPLEFT", -default_border*3, 0)
|
|
CreateBackdrop(frame.keys, default_border)
|
|
frame.keys:SetHeight(12)
|
|
frame.keys:SetWidth(12)
|
|
frame.keys:SetTextColor(1,1,.25,1)
|
|
frame.keys:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
frame.keys.texture = frame.keys:CreateTexture("pfBagArrowUp")
|
|
frame.keys.texture:SetTexture(pfUI.media["img:key"])
|
|
frame.keys.texture:ClearAllPoints()
|
|
frame.keys.texture:SetPoint("TOPLEFT", frame.keys, "TOPLEFT", 3, -1)
|
|
frame.keys.texture:SetPoint("BOTTOMRIGHT", frame.keys, "BOTTOMRIGHT", -3, 1)
|
|
frame.keys.texture:SetVertexColor(.25,.25,.25,1)
|
|
|
|
frame.keys:SetScript("OnEnter", function ()
|
|
frame.keys.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
|
frame.keys.texture:SetVertexColor(1,1,.25,1)
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
GameTooltip:SetText(_G.KEYRING)
|
|
GameTooltip:Show()
|
|
end)
|
|
|
|
frame.keys:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.keys, default_border)
|
|
frame.keys.texture:SetVertexColor(.25,.25,.25,1)
|
|
if GameTooltip:IsOwned(this) then
|
|
GameTooltip:Hide()
|
|
end
|
|
end)
|
|
|
|
frame.keys:SetScript("OnClick", function()
|
|
if not pfUI.bag.showKeyring then
|
|
pfUI.bag.showKeyring = true
|
|
else
|
|
pfUI.bag.showKeyring = nil
|
|
end
|
|
pfUI.bag:CheckFullUpdate()
|
|
end)
|
|
end
|
|
|
|
-- sort button (anchors to keys, which is the always-present leftmost
|
|
-- button in the dynamic chain — picklock and disenchant are class-gated)
|
|
if not frame.sort then
|
|
frame.sort = CreateFrame("Button", "pfBagSort", frame)
|
|
frame.sort:SetPoint("TOPRIGHT", frame.keys, "TOPLEFT", -default_border*3, 0)
|
|
CreateBackdrop(frame.sort, default_border)
|
|
frame.sort:SetHeight(12)
|
|
frame.sort:SetWidth(12)
|
|
frame.sort.texture = frame.sort:CreateTexture("pfBagSortIcon")
|
|
frame.sort.texture:SetTexture(pfUI.media["img:sort"])
|
|
frame.sort.texture:ClearAllPoints()
|
|
frame.sort.texture:SetPoint("TOPLEFT", frame.sort, "TOPLEFT", 2, -2)
|
|
frame.sort.texture:SetPoint("BOTTOMRIGHT", frame.sort, "BOTTOMRIGHT", -2, 2)
|
|
frame.sort.texture:SetVertexColor(.25,.25,.25,1)
|
|
|
|
frame.sort:SetScript("OnEnter", function ()
|
|
frame.sort.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
|
frame.sort.texture:SetVertexColor(1,1,.25,1)
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
GameTooltip:SetText("Sort Bags")
|
|
GameTooltip:Show()
|
|
end)
|
|
|
|
frame.sort:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.sort, default_border)
|
|
frame.sort.texture:SetVertexColor(.25,.25,.25,1)
|
|
if GameTooltip:IsOwned(this) then
|
|
GameTooltip:Hide()
|
|
end
|
|
end)
|
|
|
|
frame.sort:SetScript("OnClick", function()
|
|
libbagsort:Sort({0, 1, 2, 3, 4})
|
|
end)
|
|
end
|
|
|
|
-- gold string
|
|
if not frame.gold and (C.appearance.bags.movable == "1" or not pfUI.panel) then
|
|
frame.gold = CreateFrame("Frame", "pfBagGoldString", frame)
|
|
frame.gold:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -4, 1)
|
|
frame.gold:SetWidth(200)
|
|
frame.gold:SetHeight(18)
|
|
frame.gold:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
frame.gold:RegisterEvent("PLAYER_MONEY")
|
|
frame.gold:SetScript("OnEvent", function()
|
|
frame.gold.text:SetText(CreateGoldString(GetMoney()))
|
|
end)
|
|
|
|
frame.gold.text = frame.gold.text or frame.gold:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
|
frame.gold.text:SetFontObject(GameFontWhite)
|
|
frame.gold.text:SetJustifyH("RIGHT")
|
|
frame.gold.text:SetAllPoints()
|
|
end
|
|
|
|
-- bag search
|
|
if not frame.search then
|
|
frame.search = CreateFrame("Frame", "pfBagSearch", frame)
|
|
frame.search.db = {}
|
|
frame.search:SetHeight(12)
|
|
frame.search:SetPoint("TOPLEFT", frame, "TOPLEFT", default_border, -default_border)
|
|
frame.search:SetPoint("TOPRIGHT", frame.sort, "TOPLEFT", -default_border*3, -default_border)
|
|
CreateBackdrop(frame.search, default_border)
|
|
|
|
frame.search.edit = CreateFrame("EditBox", "pfUIBagSearch", frame.search, "InputBoxTemplate")
|
|
pfUIBagSearchLeft:SetTexture(nil)
|
|
pfUIBagSearchMiddle:SetTexture(nil)
|
|
pfUIBagSearchRight:SetTexture(nil)
|
|
frame.search.edit:ClearAllPoints()
|
|
frame.search.edit:SetPoint("TOPLEFT", frame.search, "TOPLEFT", default_border*2, 0)
|
|
frame.search.edit:SetPoint("BOTTOMRIGHT", frame.search, "BOTTOMRIGHT", -default_border*2, 0)
|
|
|
|
frame.search.edit:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
frame.search.edit:SetAutoFocus(false)
|
|
frame.search.edit:SetText(T["Search"])
|
|
frame.search.edit:SetTextColor(.5,.5,.5,1)
|
|
|
|
frame.search.edit:SetScript("OnEditFocusGained", function()
|
|
this:SetText("")
|
|
end)
|
|
|
|
frame.search.edit:SetScript("OnEditFocusLost", function()
|
|
this:SetText(T["Search"])
|
|
for bag=-2, 11 do
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
for slot=1, bagsize do
|
|
pfUI.bags[bag].slots[slot].frame:SetAlpha(1)
|
|
end
|
|
end
|
|
end)
|
|
|
|
frame.search.edit:SetScript("OnTextChanged", function()
|
|
if this:GetText() == T["Search"] then return end
|
|
for bag=-2, 11 do
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
for slot=1, bagsize do
|
|
pfUI.bags[bag].slots[slot].frame:SetAlpha(.25)
|
|
local texture, itemCount, locked, quality, readable = GetContainerItemInfo(bag, slot)
|
|
if itemCount then
|
|
local itemLink = GetContainerItemLink(bag, slot)
|
|
local itemstring = string.sub(itemLink, string.find(itemLink, "%[")+1, string.find(itemLink, "%]")-1)
|
|
|
|
if C.appearance.bags.fulltext == "1" then
|
|
if not frame.search.db[itemLink] then
|
|
scanner:SetBagItem(bag, slot)
|
|
local text = scanner:Text()
|
|
|
|
local str = ""
|
|
for k, v in pairs(text) do
|
|
str = str .. (v[1] or "") .. (v[2] or "")
|
|
end
|
|
|
|
frame.search.db[itemLink] = strlower(str)
|
|
end
|
|
|
|
if strfind(frame.search.db[itemLink], strlower(this:GetText()), 1, true) then
|
|
pfUI.bags[bag].slots[slot].frame:SetAlpha(1)
|
|
end
|
|
end
|
|
|
|
if strfind(strlower(itemstring), strlower(this:GetText()), 1, true) then
|
|
pfUI.bags[bag].slots[slot].frame:SetAlpha(1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
frame.search:SetScript("OnLeave", function()
|
|
frame.search.edit:ClearFocus()
|
|
end)
|
|
|
|
frame.search:SetScript("OnHide", function()
|
|
frame.search.edit:SetText(T["Search"])
|
|
for bag = -2, 11 do
|
|
if pfUI.bags[bag] then
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
for slot = 1, bagsize do
|
|
if pfUI.bags[bag] and pfUI.bags[bag].slots[slot] then
|
|
pfUI.bags[bag].slots[slot].frame:SetAlpha(1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
frame.search.edit:SetScript("OnMouseUp", function()
|
|
if arg1 == "RightButton" then
|
|
this:ClearFocus()
|
|
end
|
|
end)
|
|
|
|
frame.search:SetScript("OnHide", function()
|
|
frame.search.edit:SetText(T["Search"])
|
|
for bag = -2, 11 do
|
|
if pfUI.bags[bag] then
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
for slot = 1, bagsize do
|
|
if pfUI.bags[bag] and pfUI.bags[bag].slots[slot] then
|
|
pfUI.bags[bag].slots[slot].frame:SetAlpha(1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
else
|
|
-- bankframe
|
|
|
|
-- bag close button
|
|
if not frame.close then
|
|
frame.close = CreateFrame("Button", "pfBagClose", frame)
|
|
frame.close:SetPoint("TOPRIGHT", -default_border*1,-default_border )
|
|
CreateBackdrop(frame.close, default_border)
|
|
frame.close:SetHeight(12)
|
|
frame.close:SetWidth(12)
|
|
frame.close.texture = frame.close:CreateTexture("pfBagClose")
|
|
frame.close.texture:SetTexture(pfUI.media["img:close"])
|
|
frame.close.texture:ClearAllPoints()
|
|
frame.close.texture:SetPoint("TOPLEFT", frame.close, "TOPLEFT", 2, -2)
|
|
frame.close.texture:SetPoint("BOTTOMRIGHT", frame.close, "BOTTOMRIGHT", -2, 2)
|
|
frame.close.texture:SetVertexColor(1,.25,.25,1)
|
|
frame.close:SetScript("OnEnter", function ()
|
|
frame.close.backdrop:SetBackdropBorderColor(1,.25,.25,1)
|
|
end)
|
|
|
|
frame.close:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.close, default_border)
|
|
end)
|
|
|
|
frame.close:SetScript("OnClick", function()
|
|
CloseBankFrame()
|
|
end)
|
|
end
|
|
|
|
-- bags button
|
|
if not frame.bags then
|
|
frame.bags = CreateFrame("Button", "pfBagSlotShow", frame)
|
|
frame.bags:SetPoint("TOPRIGHT", frame.close, "TOPLEFT", -default_border*3, 0)
|
|
CreateBackdrop(frame.bags, default_border)
|
|
frame.bags:SetHeight(12)
|
|
frame.bags:SetWidth(12)
|
|
frame.bags:SetTextColor(1,1,.25,1)
|
|
frame.bags:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
frame.bags.texture = frame.bags:CreateTexture("pfBagArrowUp")
|
|
frame.bags.texture:SetTexture(pfUI.media["img:up"])
|
|
frame.bags.texture:ClearAllPoints()
|
|
frame.bags.texture:SetPoint("TOPLEFT", frame.bags, "TOPLEFT", 3, -1)
|
|
frame.bags.texture:SetPoint("BOTTOMRIGHT", frame.bags, "BOTTOMRIGHT", -3, 1)
|
|
frame.bags.texture:SetVertexColor(.25,.25,.25,1)
|
|
|
|
frame.bags:SetScript("OnEnter", function ()
|
|
frame.bags.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
|
frame.bags.texture:SetVertexColor(1,1,.25,1)
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
GameTooltip:SetText(_G.TUTORIAL_TITLE10)
|
|
GameTooltip:Show()
|
|
end)
|
|
|
|
frame.bags:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.bags, default_border)
|
|
frame.bags.texture:SetVertexColor(.25,.25,.25,1)
|
|
if GameTooltip:IsOwned(this) then
|
|
GameTooltip:Hide()
|
|
end
|
|
end)
|
|
|
|
frame.bags:SetScript("OnClick", function()
|
|
if pfUI.bag.left.bagslots:IsShown() then
|
|
pfUI.bag.left.bagslots:Hide()
|
|
else
|
|
pfUI.bag.left.bagslots:Show()
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- sort button (bank)
|
|
if not frame.sort then
|
|
frame.sort = CreateFrame("Button", "pfBankSort", frame)
|
|
frame.sort:SetPoint("TOPRIGHT", frame.bags, "TOPLEFT", -default_border*3, 0)
|
|
CreateBackdrop(frame.sort, default_border)
|
|
frame.sort:SetHeight(12)
|
|
frame.sort:SetWidth(12)
|
|
frame.sort.texture = frame.sort:CreateTexture("pfBankSortIcon")
|
|
frame.sort.texture:SetTexture(pfUI.media["img:sort"])
|
|
frame.sort.texture:ClearAllPoints()
|
|
frame.sort.texture:SetPoint("TOPLEFT", frame.sort, "TOPLEFT", 2, -2)
|
|
frame.sort.texture:SetPoint("BOTTOMRIGHT", frame.sort, "BOTTOMRIGHT", -2, 2)
|
|
frame.sort.texture:SetVertexColor(.25,.25,.25,1)
|
|
|
|
frame.sort:SetScript("OnEnter", function ()
|
|
frame.sort.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
|
frame.sort.texture:SetVertexColor(1,1,.25,1)
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
GameTooltip:SetText("Sort Bank")
|
|
GameTooltip:Show()
|
|
end)
|
|
|
|
frame.sort:SetScript("OnLeave", function ()
|
|
CreateBackdrop(frame.sort, default_border)
|
|
frame.sort.texture:SetVertexColor(.25,.25,.25,1)
|
|
if GameTooltip:IsOwned(this) then
|
|
GameTooltip:Hide()
|
|
end
|
|
end)
|
|
|
|
frame.sort:SetScript("OnClick", function()
|
|
libbagsort:Sort({-1, 5, 6, 7, 8, 9, 10})
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
end)
|