915 lines
27 KiB
Lua
915 lines
27 KiB
Lua
NUM_CONTAINER_FRAMES = 13;
|
|
NUM_BAG_FRAMES = 4;
|
|
MAX_CONTAINER_ITEMS = 36;
|
|
NUM_CONTAINER_COLUMNS = 4;
|
|
ROWS_IN_BG_TEXTURE = 6;
|
|
MAX_BG_TEXTURES = 2;
|
|
BG_TEXTURE_HEIGHT = 512;
|
|
CONTAINER_WIDTH = 192;
|
|
CONTAINER_SPACING = 0;
|
|
VISIBLE_CONTAINER_SPACING = 3;
|
|
CONTAINER_OFFSET_Y = 70;
|
|
CONTAINER_OFFSET_X = 0;
|
|
CONTAINER_SCALE = 0.75;
|
|
BACKPACK_HEIGHT = 240;
|
|
|
|
function ContainerFrame_OnLoad(self)
|
|
self:RegisterEvent("BAG_OPEN");
|
|
self:RegisterEvent("BAG_CLOSED");
|
|
self:RegisterEvent("QUEST_ACCEPTED");
|
|
self:RegisterEvent("UNIT_QUEST_LOG_CHANGED");
|
|
ContainerFrame1.bagsShown = 0;
|
|
ContainerFrame1.bags = {};
|
|
end
|
|
|
|
function ContainerFrame_OnEvent(self, event, ...)
|
|
local arg1, arg2 = ...;
|
|
if ( event == "BAG_OPEN" ) then
|
|
if ( self:GetID() == arg1 ) then
|
|
self:Show();
|
|
end
|
|
elseif ( event == "BAG_CLOSED" ) then
|
|
if ( self:GetID() == arg1 ) then
|
|
self:Hide();
|
|
end
|
|
elseif ( event == "BAG_UPDATE" ) then
|
|
if ( self:GetID() == arg1 ) then
|
|
ContainerFrame_Update(self);
|
|
end
|
|
elseif ( event == "ITEM_LOCK_CHANGED" ) then
|
|
local bag, slot = arg1, arg2;
|
|
if ( bag and slot and (bag == self:GetID()) ) then
|
|
ContainerFrame_UpdateLockedItem(self, slot);
|
|
end
|
|
elseif ( event == "BAG_UPDATE_COOLDOWN" ) then
|
|
ContainerFrame_UpdateCooldowns(self);
|
|
elseif ( event == "QUEST_ACCEPTED" or (event == "UNIT_QUEST_LOG_CHANGED" and arg1 == "player") ) then
|
|
for i = 1, ContainerFrame1.bagsShown do
|
|
local bag = _G[ContainerFrame1.bags[i]];
|
|
ContainerFrame_Update(bag);
|
|
end
|
|
elseif ( event == "DISPLAY_SIZE_CHANGED" ) then
|
|
updateContainerFrameAnchors();
|
|
end
|
|
end
|
|
|
|
function ToggleBag(id)
|
|
if ( IsOptionFrameOpen() ) then
|
|
return;
|
|
end
|
|
|
|
local size = GetContainerNumSlots(id);
|
|
if ( size > 0 or id == KEYRING_CONTAINER ) then
|
|
local containerShowing;
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
local frame = _G["ContainerFrame"..i];
|
|
if ( frame:IsShown() and frame:GetID() == id ) then
|
|
containerShowing = i;
|
|
frame:Hide();
|
|
end
|
|
end
|
|
if ( not containerShowing ) then
|
|
ContainerFrame_GenerateFrame(ContainerFrame_GetOpenFrame(), size, id);
|
|
end
|
|
end
|
|
end
|
|
|
|
function ToggleBackpack()
|
|
if ( IsOptionFrameOpen() ) then
|
|
return;
|
|
end
|
|
|
|
if ( IsBagOpen(0) ) then
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
local frame = _G["ContainerFrame"..i];
|
|
if ( frame:IsShown() ) then
|
|
frame:Hide();
|
|
end
|
|
-- Hide the token bar if closing the backpack
|
|
if ( BackpackTokenFrame ) then
|
|
BackpackTokenFrame:Hide();
|
|
end
|
|
end
|
|
else
|
|
ToggleBag(0);
|
|
-- If there are tokens watched then show the bar
|
|
if ( ManageBackpackTokenFrame ) then
|
|
BackpackTokenFrame_Update();
|
|
ManageBackpackTokenFrame();
|
|
end
|
|
end
|
|
end
|
|
|
|
function ContainerFrame_OnHide(self)
|
|
self:UnregisterEvent("BAG_UPDATE");
|
|
self:UnregisterEvent("ITEM_LOCK_CHANGED");
|
|
self:UnregisterEvent("BAG_UPDATE_COOLDOWN");
|
|
self:UnregisterEvent("DISPLAY_SIZE_CHANGED");
|
|
|
|
if ( self:GetID() == 0 ) then
|
|
MainMenuBarBackpackButton:SetChecked(0);
|
|
else
|
|
local bagButton = _G["CharacterBag"..(self:GetID() - 1).."Slot"];
|
|
if ( bagButton ) then
|
|
bagButton:SetChecked(0);
|
|
else
|
|
-- If its a bank bag then update its highlight
|
|
|
|
UpdateBagButtonHighlight(self:GetID());
|
|
end
|
|
end
|
|
ContainerFrame1.bagsShown = ContainerFrame1.bagsShown - 1;
|
|
-- Remove the closed bag from the list and collapse the rest of the entries
|
|
local index = 1;
|
|
while ContainerFrame1.bags[index] do
|
|
if ( ContainerFrame1.bags[index] == self:GetName() ) then
|
|
local tempIndex = index;
|
|
while ContainerFrame1.bags[tempIndex] do
|
|
if ( ContainerFrame1.bags[tempIndex + 1] ) then
|
|
ContainerFrame1.bags[tempIndex] = ContainerFrame1.bags[tempIndex + 1];
|
|
else
|
|
ContainerFrame1.bags[tempIndex] = nil;
|
|
end
|
|
tempIndex = tempIndex + 1;
|
|
end
|
|
end
|
|
index = index + 1;
|
|
end
|
|
updateContainerFrameAnchors();
|
|
|
|
if ( self:GetID() == KEYRING_CONTAINER ) then
|
|
UpdateMicroButtons();
|
|
PlaySound("KeyRingClose");
|
|
else
|
|
PlaySound("igBackPackClose");
|
|
end
|
|
end
|
|
|
|
function ContainerFrame_OnShow(self)
|
|
self:RegisterEvent("BAG_UPDATE");
|
|
self:RegisterEvent("ITEM_LOCK_CHANGED");
|
|
self:RegisterEvent("BAG_UPDATE_COOLDOWN");
|
|
self:RegisterEvent("DISPLAY_SIZE_CHANGED");
|
|
|
|
if ( self:GetID() == 0 ) then
|
|
MainMenuBarBackpackButton:SetChecked(1);
|
|
elseif ( self:GetID() <= NUM_BAG_SLOTS ) then
|
|
local button = _G["CharacterBag"..(self:GetID() - 1).."Slot"];
|
|
if ( button ) then
|
|
button:SetChecked(1);
|
|
end
|
|
else
|
|
UpdateBagButtonHighlight(self:GetID());
|
|
end
|
|
ContainerFrame1.bagsShown = ContainerFrame1.bagsShown + 1;
|
|
if ( self:GetID() == KEYRING_CONTAINER ) then
|
|
UpdateMicroButtons();
|
|
PlaySound("KeyRingOpen");
|
|
else
|
|
PlaySound("igBackPackOpen");
|
|
end
|
|
ContainerFrame_Update(self);
|
|
|
|
-- If there are tokens watched then decide if we should show the bar
|
|
if ( ManageBackpackTokenFrame ) then
|
|
ManageBackpackTokenFrame();
|
|
end
|
|
end
|
|
|
|
function OpenBag(id)
|
|
if ( not CanOpenPanels() ) then
|
|
if ( UnitIsDead("player") ) then
|
|
NotWhileDeadError();
|
|
end
|
|
return;
|
|
end
|
|
|
|
local size = GetContainerNumSlots(id);
|
|
if ( size > 0 ) then
|
|
local containerShowing;
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
local frame = _G["ContainerFrame"..i];
|
|
if ( frame:IsShown() and frame:GetID() == id ) then
|
|
containerShowing = i;
|
|
end
|
|
end
|
|
if ( not containerShowing ) then
|
|
ContainerFrame_GenerateFrame(ContainerFrame_GetOpenFrame(), size, id);
|
|
end
|
|
end
|
|
end
|
|
|
|
function CloseBag(id)
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
local containerFrame = _G["ContainerFrame"..i];
|
|
if ( containerFrame:IsShown() and (containerFrame:GetID() == id) ) then
|
|
containerFrame:Hide();
|
|
return;
|
|
end
|
|
end
|
|
end
|
|
|
|
function IsBagOpen(id)
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
local containerFrame = _G["ContainerFrame"..i];
|
|
if ( containerFrame:IsShown() and (containerFrame:GetID() == id) ) then
|
|
return i;
|
|
end
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
function OpenBackpack()
|
|
if ( not CanOpenPanels() ) then
|
|
if ( UnitIsDead("player") ) then
|
|
NotWhileDeadError();
|
|
end
|
|
return;
|
|
end
|
|
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
local containerFrame = _G["ContainerFrame"..i];
|
|
if ( containerFrame:IsShown() and (containerFrame:GetID() == 0) ) then
|
|
ContainerFrame1.backpackWasOpen = 1;
|
|
return;
|
|
else
|
|
ContainerFrame1.backpackWasOpen = nil;
|
|
end
|
|
end
|
|
|
|
if ( not ContainerFrame1.backpackWasOpen ) then
|
|
ToggleBackpack();
|
|
end
|
|
|
|
return ContainerFrame1.backpackWasOpen;
|
|
end
|
|
|
|
function CloseBackpack()
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
local containerFrame = _G["ContainerFrame"..i];
|
|
if ( containerFrame:IsShown() and (containerFrame:GetID() == 0) and (ContainerFrame1.backpackWasOpen == nil) ) then
|
|
containerFrame:Hide();
|
|
return;
|
|
end
|
|
end
|
|
end
|
|
|
|
function ContainerFrame_GetOpenFrame()
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
local frame = _G["ContainerFrame"..i];
|
|
if ( not frame:IsShown() ) then
|
|
return frame;
|
|
end
|
|
-- If all frames open return the last frame
|
|
if ( i == NUM_CONTAINER_FRAMES ) then
|
|
frame:Hide();
|
|
return frame;
|
|
end
|
|
end
|
|
end
|
|
|
|
function ContainerFrame_Update(frame)
|
|
local id = frame:GetID();
|
|
local name = frame:GetName();
|
|
local itemButton;
|
|
local texture, itemCount, locked, quality, readable;
|
|
local isQuestItem, questId, isActive, questTexture;
|
|
local tooltipOwner = GameTooltip:GetOwner();
|
|
for i=1, frame.size, 1 do
|
|
itemButton = _G[name.."Item"..i];
|
|
|
|
texture, itemCount, locked, quality, readable = GetContainerItemInfo(id, itemButton:GetID());
|
|
isQuestItem, questId, isActive = GetContainerItemQuestInfo(id, itemButton:GetID());
|
|
|
|
SetItemButtonTexture(itemButton, texture);
|
|
SetItemButtonCount(itemButton, itemCount);
|
|
SetItemButtonDesaturated(itemButton, locked, 0.5, 0.5, 0.5);
|
|
|
|
questTexture = _G[name.."Item"..i.."IconQuestTexture"];
|
|
if ( questId and not isActive ) then
|
|
questTexture:SetTexture(TEXTURE_ITEM_QUEST_BANG);
|
|
questTexture:Show();
|
|
elseif ( questId or isQuestItem ) then
|
|
questTexture:SetTexture(TEXTURE_ITEM_QUEST_BORDER);
|
|
questTexture:Show();
|
|
else
|
|
questTexture:Hide();
|
|
end
|
|
|
|
if ( texture ) then
|
|
ContainerFrame_UpdateCooldown(id, itemButton);
|
|
itemButton.hasItem = 1;
|
|
else
|
|
_G[name.."Item"..i.."Cooldown"]:Hide();
|
|
itemButton.hasItem = nil;
|
|
end
|
|
itemButton.readable = readable;
|
|
|
|
if ( itemButton == tooltipOwner ) then
|
|
itemButton.UpdateTooltip(itemButton);
|
|
end
|
|
end
|
|
end
|
|
|
|
function ContainerFrame_UpdateLocked(frame)
|
|
local id = frame:GetID();
|
|
local name = frame:GetName();
|
|
local itemButton;
|
|
local texture, itemCount, locked, quality, readable;
|
|
for i=1, frame.size, 1 do
|
|
itemButton = _G[name.."Item"..i];
|
|
|
|
texture, itemCount, locked, quality, readable = GetContainerItemInfo(id, itemButton:GetID());
|
|
|
|
SetItemButtonDesaturated(itemButton, locked, 0.5, 0.5, 0.5);
|
|
end
|
|
end
|
|
|
|
function ContainerFrame_UpdateLockedItem(frame, slot)
|
|
local index = frame.size + 1 - slot;
|
|
local itemButton = _G[frame:GetName().."Item"..index];
|
|
local texture, itemCount, locked, quality, readable = GetContainerItemInfo(frame:GetID(), itemButton:GetID());
|
|
|
|
SetItemButtonDesaturated(itemButton, locked, 0.5, 0.5, 0.5);
|
|
end
|
|
|
|
function ContainerFrame_UpdateCooldowns(frame)
|
|
local id = frame:GetID();
|
|
local name = frame:GetName();
|
|
for i=1, frame.size, 1 do
|
|
local itemButton = _G[name.."Item"..i];
|
|
if ( GetContainerItemInfo(id, itemButton:GetID()) ) then
|
|
ContainerFrame_UpdateCooldown(id, itemButton);
|
|
else
|
|
_G[name.."Item"..i.."Cooldown"]:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
function ContainerFrame_UpdateCooldown(container, button)
|
|
local cooldown = _G[button:GetName().."Cooldown"];
|
|
local start, duration, enable = GetContainerItemCooldown(container, button:GetID());
|
|
CooldownFrame_SetTimer(cooldown, start, duration, enable);
|
|
if ( duration > 0 and enable == 0 ) then
|
|
SetItemButtonTextureVertexColor(button, 0.4, 0.4, 0.4);
|
|
else
|
|
SetItemButtonTextureVertexColor(button, 1, 1, 1);
|
|
end
|
|
end
|
|
|
|
function ContainerFrame_GenerateFrame(frame, size, id)
|
|
frame.size = size;
|
|
local name = frame:GetName();
|
|
local bgTextureTop = _G[name.."BackgroundTop"];
|
|
local bgTextureMiddle = _G[name.."BackgroundMiddle1"];
|
|
local bgTextureMiddle2 = _G[name.."BackgroundMiddle2"];
|
|
local bgTextureBottom = _G[name.."BackgroundBottom"];
|
|
local bgTexture1Slot = _G[name.."Background1Slot"];
|
|
local columns = NUM_CONTAINER_COLUMNS;
|
|
local rows = ceil(size / columns);
|
|
-- if id = 0 then its the backpack
|
|
if ( id == 0 ) then
|
|
bgTexture1Slot:Hide();
|
|
_G[name.."MoneyFrame"]:Show();
|
|
-- Set Backpack texture
|
|
bgTextureTop:SetTexture("Interface\\ContainerFrame\\UI-BackpackBackground");
|
|
bgTextureTop:SetHeight(256);
|
|
bgTextureTop:SetTexCoord(0, 1, 0, 1);
|
|
bgTextureTop:Show();
|
|
|
|
-- Hide unused textures
|
|
for i=1, MAX_BG_TEXTURES do
|
|
_G[name.."BackgroundMiddle"..i]:Hide();
|
|
end
|
|
bgTextureBottom:Hide();
|
|
frame:SetHeight(BACKPACK_HEIGHT);
|
|
else
|
|
if (size == 1) then
|
|
-- Halloween gag gift
|
|
bgTexture1Slot:Show();
|
|
bgTextureTop:Hide();
|
|
bgTextureMiddle:Hide();
|
|
bgTextureMiddle2:Hide();
|
|
bgTextureBottom:Hide();
|
|
_G[name.."MoneyFrame"]:Hide();
|
|
else
|
|
bgTexture1Slot:Hide();
|
|
bgTextureTop:Show();
|
|
|
|
-- Not the backpack
|
|
-- Set whether or not its a bank bag
|
|
local bagTextureSuffix = "";
|
|
if ( id > NUM_BAG_FRAMES ) then
|
|
bagTextureSuffix = "-Bank";
|
|
elseif ( id == KEYRING_CONTAINER ) then
|
|
bagTextureSuffix = "-Keyring";
|
|
end
|
|
|
|
-- Set textures
|
|
bgTextureTop:SetTexture("Interface\\ContainerFrame\\UI-Bag-Components"..bagTextureSuffix);
|
|
for i=1, MAX_BG_TEXTURES do
|
|
_G[name.."BackgroundMiddle"..i]:SetTexture("Interface\\ContainerFrame\\UI-Bag-Components"..bagTextureSuffix);
|
|
_G[name.."BackgroundMiddle"..i]:Hide();
|
|
end
|
|
bgTextureBottom:SetTexture("Interface\\ContainerFrame\\UI-Bag-Components"..bagTextureSuffix);
|
|
-- Hide the moneyframe since its not the backpack
|
|
_G[name.."MoneyFrame"]:Hide();
|
|
|
|
local bgTextureCount, height;
|
|
local rowHeight = 41;
|
|
-- Subtract one, since the top texture contains one row already
|
|
local remainingRows = rows-1;
|
|
|
|
-- See if the bag needs the texture with two slots at the top
|
|
local isPlusTwoBag;
|
|
if ( mod(size,columns) == 2 ) then
|
|
isPlusTwoBag = 1;
|
|
end
|
|
|
|
-- Bag background display stuff
|
|
if ( isPlusTwoBag ) then
|
|
bgTextureTop:SetTexCoord(0, 1, 0.189453125, 0.330078125);
|
|
bgTextureTop:SetHeight(72);
|
|
else
|
|
if ( rows == 1 ) then
|
|
-- If only one row chop off the bottom of the texture
|
|
bgTextureTop:SetTexCoord(0, 1, 0.00390625, 0.16796875);
|
|
bgTextureTop:SetHeight(86);
|
|
else
|
|
bgTextureTop:SetTexCoord(0, 1, 0.00390625, 0.18359375);
|
|
bgTextureTop:SetHeight(94);
|
|
end
|
|
end
|
|
-- Calculate the number of background textures we're going to need
|
|
bgTextureCount = ceil(remainingRows/ROWS_IN_BG_TEXTURE);
|
|
|
|
local middleBgHeight = 0;
|
|
-- If one row only special case
|
|
if ( rows == 1 ) then
|
|
bgTextureBottom:SetPoint("TOP", bgTextureMiddle:GetName(), "TOP", 0, 0);
|
|
bgTextureBottom:Show();
|
|
-- Hide middle bg textures
|
|
for i=1, MAX_BG_TEXTURES do
|
|
_G[name.."BackgroundMiddle"..i]:Hide();
|
|
end
|
|
else
|
|
-- Try to cycle all the middle bg textures
|
|
local firstRowPixelOffset = 9;
|
|
local firstRowTexCoordOffset = 0.353515625;
|
|
for i=1, bgTextureCount do
|
|
bgTextureMiddle = _G[name.."BackgroundMiddle"..i];
|
|
if ( remainingRows > ROWS_IN_BG_TEXTURE ) then
|
|
-- If more rows left to draw than can fit in a texture then draw the max possible
|
|
height = ( ROWS_IN_BG_TEXTURE*rowHeight ) + firstRowTexCoordOffset;
|
|
bgTextureMiddle:SetHeight(height);
|
|
bgTextureMiddle:SetTexCoord(0, 1, firstRowTexCoordOffset, ( height/BG_TEXTURE_HEIGHT + firstRowTexCoordOffset) );
|
|
bgTextureMiddle:Show();
|
|
remainingRows = remainingRows - ROWS_IN_BG_TEXTURE;
|
|
middleBgHeight = middleBgHeight + height;
|
|
else
|
|
-- If not its a huge bag
|
|
bgTextureMiddle:Show();
|
|
height = remainingRows*rowHeight-firstRowPixelOffset;
|
|
bgTextureMiddle:SetHeight(height);
|
|
bgTextureMiddle:SetTexCoord(0, 1, firstRowTexCoordOffset, ( height/BG_TEXTURE_HEIGHT + firstRowTexCoordOffset) );
|
|
middleBgHeight = middleBgHeight + height;
|
|
end
|
|
end
|
|
-- Position bottom texture
|
|
bgTextureBottom:SetPoint("TOP", bgTextureMiddle:GetName(), "BOTTOM", 0, 0);
|
|
bgTextureBottom:Show();
|
|
end
|
|
|
|
-- Set the frame height
|
|
frame:SetHeight(bgTextureTop:GetHeight()+bgTextureBottom:GetHeight()+middleBgHeight);
|
|
end
|
|
end
|
|
|
|
if (size == 1) then
|
|
-- Halloween gag gift
|
|
frame:SetHeight(70);
|
|
frame:SetWidth(99);
|
|
_G[frame:GetName().."Name"]:SetText("");
|
|
SetBagPortraitTexture(_G[frame:GetName().."Portrait"], id);
|
|
local itemButton = _G[name.."Item1"];
|
|
itemButton:SetID(1);
|
|
itemButton:SetPoint("BOTTOMRIGHT", name, "BOTTOMRIGHT", -10, 5);
|
|
itemButton:Show();
|
|
else
|
|
frame:SetWidth(CONTAINER_WIDTH);
|
|
|
|
--Special case code for keyrings
|
|
if ( id == KEYRING_CONTAINER ) then
|
|
_G[frame:GetName().."Name"]:SetText(KEYRING);
|
|
SetPortraitToTexture(frame:GetName().."Portrait", "Interface\\ContainerFrame\\KeyRing-Bag-Icon");
|
|
else
|
|
_G[frame:GetName().."Name"]:SetText(GetBagName(id));
|
|
SetBagPortraitTexture(_G[frame:GetName().."Portrait"], id);
|
|
end
|
|
|
|
local index, itemButton;
|
|
for i=1, size, 1 do
|
|
index = size - i + 1;
|
|
itemButton = _G[name.."Item"..i];
|
|
itemButton:SetID(index);
|
|
-- Set first button
|
|
if ( i == 1 ) then
|
|
-- Anchor the first item differently if its the backpack frame
|
|
if ( id == 0 ) then
|
|
itemButton:SetPoint("BOTTOMRIGHT", name, "TOPRIGHT", -12, -208);
|
|
else
|
|
itemButton:SetPoint("BOTTOMRIGHT", name, "BOTTOMRIGHT", -12, 9);
|
|
end
|
|
|
|
else
|
|
if ( mod((i-1), columns) == 0 ) then
|
|
itemButton:SetPoint("BOTTOMRIGHT", name.."Item"..(i - columns), "TOPRIGHT", 0, 4);
|
|
else
|
|
itemButton:SetPoint("BOTTOMRIGHT", name.."Item"..(i - 1), "BOTTOMLEFT", -5, 0);
|
|
end
|
|
end
|
|
itemButton:Show();
|
|
end
|
|
end
|
|
for i=size + 1, MAX_CONTAINER_ITEMS, 1 do
|
|
_G[name.."Item"..i]:Hide();
|
|
end
|
|
|
|
frame:SetID(id);
|
|
_G[frame:GetName().."PortraitButton"]:SetID(id);
|
|
|
|
-- Add the bag to the baglist
|
|
ContainerFrame1.bags[ContainerFrame1.bagsShown + 1] = frame:GetName();
|
|
updateContainerFrameAnchors();
|
|
frame:Show();
|
|
end
|
|
|
|
function updateContainerFrameAnchors()
|
|
local frame, xOffset, yOffset, screenHeight, freeScreenHeight, leftMostPoint, column;
|
|
local screenWidth = GetScreenWidth();
|
|
local containerScale = 1;
|
|
local leftLimit = 0;
|
|
if ( BankFrame:IsShown() ) then
|
|
leftLimit = BankFrame:GetRight() - 25;
|
|
end
|
|
|
|
while ( containerScale > CONTAINER_SCALE ) do
|
|
screenHeight = GetScreenHeight() / containerScale;
|
|
-- Adjust the start anchor for bags depending on the multibars
|
|
xOffset = CONTAINER_OFFSET_X / containerScale;
|
|
yOffset = CONTAINER_OFFSET_Y / containerScale;
|
|
-- freeScreenHeight determines when to start a new column of bags
|
|
freeScreenHeight = screenHeight - yOffset;
|
|
leftMostPoint = screenWidth - xOffset;
|
|
column = 1;
|
|
local frameHeight;
|
|
for index, frameName in ipairs(ContainerFrame1.bags) do
|
|
frameHeight = _G[frameName]:GetHeight();
|
|
if ( freeScreenHeight < frameHeight ) then
|
|
-- Start a new column
|
|
column = column + 1;
|
|
leftMostPoint = screenWidth - ( column * CONTAINER_WIDTH * containerScale ) - xOffset;
|
|
freeScreenHeight = screenHeight - yOffset;
|
|
end
|
|
freeScreenHeight = freeScreenHeight - frameHeight - VISIBLE_CONTAINER_SPACING;
|
|
end
|
|
if ( leftMostPoint < leftLimit ) then
|
|
containerScale = containerScale - 0.01;
|
|
else
|
|
break;
|
|
end
|
|
end
|
|
|
|
if ( containerScale < CONTAINER_SCALE ) then
|
|
containerScale = CONTAINER_SCALE;
|
|
end
|
|
|
|
screenHeight = GetScreenHeight() / containerScale;
|
|
-- Adjust the start anchor for bags depending on the multibars
|
|
xOffset = CONTAINER_OFFSET_X / containerScale;
|
|
yOffset = CONTAINER_OFFSET_Y / containerScale;
|
|
-- freeScreenHeight determines when to start a new column of bags
|
|
freeScreenHeight = screenHeight - yOffset;
|
|
column = 0;
|
|
for index, frameName in ipairs(ContainerFrame1.bags) do
|
|
frame = _G[frameName];
|
|
frame:SetScale(containerScale);
|
|
if ( index == 1 ) then
|
|
-- First bag
|
|
frame:SetPoint("BOTTOMRIGHT", frame:GetParent(), "BOTTOMRIGHT", -xOffset, yOffset );
|
|
elseif ( freeScreenHeight < frame:GetHeight() ) then
|
|
-- Start a new column
|
|
column = column + 1;
|
|
freeScreenHeight = screenHeight - yOffset;
|
|
frame:SetPoint("BOTTOMRIGHT", frame:GetParent(), "BOTTOMRIGHT", -(column * CONTAINER_WIDTH) - xOffset, yOffset );
|
|
else
|
|
-- Anchor to the previous bag
|
|
frame:SetPoint("BOTTOMRIGHT", ContainerFrame1.bags[index - 1], "TOPRIGHT", 0, CONTAINER_SPACING);
|
|
end
|
|
freeScreenHeight = freeScreenHeight - frame:GetHeight() - VISIBLE_CONTAINER_SPACING;
|
|
end
|
|
end
|
|
|
|
function ContainerFrameItemButton_OnLoad(self)
|
|
self:RegisterForClicks("LeftButtonUp", "RightButtonUp");
|
|
self:RegisterForDrag("LeftButton");
|
|
|
|
self.SplitStack = function(button, split)
|
|
SplitContainerItem(button:GetParent():GetID(), button:GetID(), split);
|
|
end
|
|
self.UpdateTooltip = ContainerFrameItemButton_OnEnter;
|
|
end
|
|
|
|
function ContainerFrameItemButton_OnDrag (self)
|
|
ContainerFrameItemButton_OnClick(self, "LeftButton");
|
|
end
|
|
|
|
function ContainerFrame_GetExtendedPriceString(itemButton, isEquipped, quantity)
|
|
quantity = (quantity or 1);
|
|
local slot = itemButton:GetID();
|
|
local bag = itemButton:GetParent():GetID();
|
|
|
|
local money, honorPoints, arenaPoints, itemCount, refundSec = GetContainerItemPurchaseInfo(bag, slot, isEquipped);
|
|
if ( not refundSec or ((honorPoints == 0) and (arenaPoints == 0) and (itemCount == 0) and (money == 0)) ) then
|
|
return false;
|
|
end
|
|
|
|
local count = itemButton.count or 1;
|
|
honorPoints, arenaPoints, itemCount = (honorPoints or 0) * quantity, (arenaPoints or 0) * quantity, (itemCount or 0) * quantity;
|
|
local itemsString;
|
|
|
|
if ( honorPoints and honorPoints ~= 0 ) then
|
|
local factionGroup = UnitFactionGroup("player");
|
|
if ( factionGroup ) then
|
|
local pointsTexture = "Interface\\PVPFrame\\PVP-Currency-"..factionGroup;
|
|
itemsString = " |T" .. pointsTexture .. ":0:0:0:-1|t" .. honorPoints .. " " .. HONOR_POINTS;
|
|
end
|
|
end
|
|
if ( arenaPoints and arenaPoints ~= 0 ) then
|
|
if ( itemsString ) then
|
|
-- adding an extra space here because it looks nicer
|
|
itemsString = itemsString .. " |TInterface\\PVPFrame\\PVP-ArenaPoints-Icon:0:0:0:-1|t" .. arenaPoints .. " " .. ARENA_POINTS;
|
|
else
|
|
itemsString = " |TInterface\\PVPFrame\\PVP-ArenaPoints-Icon:0:0:0:-1|t" .. arenaPoints .. " " .. ARENA_POINTS;
|
|
end
|
|
end
|
|
|
|
local maxQuality = 0;
|
|
for i=1, itemCount, 1 do
|
|
local itemTexture, itemQuantity, itemLink = GetContainerItemPurchaseItem(bag, slot, i, isEquipped);
|
|
if ( itemLink ) then
|
|
local _, _, itemQuality = GetItemInfo(itemLink);
|
|
maxQuality = math.max(itemQuality, maxQuality);
|
|
if ( itemsString ) then
|
|
itemsString = itemsString .. ", " .. format(ITEM_QUANTITY_TEMPLATE, (itemQuantity or 0) * quantity, itemLink);
|
|
else
|
|
itemsString = format(ITEM_QUANTITY_TEMPLATE, (itemQuantity or 0) * quantity, itemLink);
|
|
end
|
|
end
|
|
end
|
|
if(itemsString == nil) then
|
|
itemsString = "";
|
|
end
|
|
MerchantFrame.price = money;
|
|
MerchantFrame.refundBag = bag;
|
|
MerchantFrame.refundSlot = slot;
|
|
MerchantFrame.honorPoints = honorPoints;
|
|
MerchantFrame.arenaPoints = arenaPoints;
|
|
|
|
local refundItemTexture, refundItemLink;
|
|
if ( isEquipped ) then
|
|
refundItemTexture = GetInventoryItemTexture("player", slot);
|
|
refundItemLink = GetInventoryItemLink("player", slot);
|
|
else
|
|
refundItemTexture, _, _, _, _, _, refundItemLink = GetContainerItemInfo(bag, slot);
|
|
end
|
|
local itemName, _, itemQuality = GetItemInfo(refundItemLink);
|
|
local r, g, b = GetItemQualityColor(itemQuality);
|
|
StaticPopupDialogs["CONFIRM_REFUND_TOKEN_ITEM"].hasMoneyFrame = (money ~= 0) and 1 or nil;
|
|
StaticPopup_Show("CONFIRM_REFUND_TOKEN_ITEM", itemsString, "", {["texture"] = refundItemTexture, ["name"] = itemName, ["color"] = {r, g, b, 1}, ["link"] = refundItemLink, ["index"] = index, ["count"] = count * quantity});
|
|
return true;
|
|
end
|
|
|
|
function ContainerFrameItemButton_OnClick(self, button)
|
|
MerchantFrame_ResetRefundItem();
|
|
|
|
if ( button == "LeftButton" ) then
|
|
local type, money = GetCursorInfo();
|
|
if ( SpellCanTargetItem() ) then
|
|
-- Target the spell with the selected item
|
|
UseContainerItem(self:GetParent():GetID(), self:GetID());
|
|
elseif ( type == "guildbankmoney" ) then
|
|
WithdrawGuildBankMoney(money);
|
|
ClearCursor();
|
|
elseif ( type == "money" ) then
|
|
DropCursorMoney();
|
|
ClearCursor();
|
|
elseif ( type == "merchant" ) then
|
|
if ( MerchantFrame.extendedCost ) then
|
|
MerchantFrame_ConfirmExtendedItemCost(MerchantFrame.extendedCost);
|
|
elseif ( MerchantFrame.price and MerchantFrame.price >= MERCHANT_HIGH_PRICE_COST ) then
|
|
MerchantFrame_ConfirmHighCostItem(self);
|
|
else
|
|
PickupContainerItem(self:GetParent():GetID(), self:GetID());
|
|
end
|
|
else
|
|
PickupContainerItem(self:GetParent():GetID(), self:GetID());
|
|
if ( CursorHasItem() ) then
|
|
MerchantFrame_SetRefundItem(self);
|
|
end
|
|
end
|
|
StackSplitFrame:Hide();
|
|
else
|
|
if ( MerchantFrame:IsShown() ) then
|
|
if ( MerchantFrame.selectedTab == 2 ) then
|
|
-- Don't sell the item if the buyback tab is selected
|
|
return;
|
|
end
|
|
if ( ContainerFrame_GetExtendedPriceString(self)) then
|
|
-- a confirmation dialog has been shown
|
|
return;
|
|
end
|
|
end
|
|
UseContainerItem(self:GetParent():GetID(), self:GetID());
|
|
StackSplitFrame:Hide();
|
|
end
|
|
end
|
|
|
|
function ContainerFrameItemButton_OnModifiedClick(self, button)
|
|
if ( HandleModifiedItemClick(GetContainerItemLink(self:GetParent():GetID(), self:GetID())) ) then
|
|
return;
|
|
end
|
|
if ( IsModifiedClick("SOCKETITEM") ) then
|
|
SocketContainerItem(self:GetParent():GetID(), self:GetID());
|
|
end
|
|
if ( IsModifiedClick("SPLITSTACK") ) then
|
|
local texture, itemCount, locked = GetContainerItemInfo(self:GetParent():GetID(), self:GetID());
|
|
if ( not locked ) then
|
|
self.SplitStack = function(button, split)
|
|
SplitContainerItem(button:GetParent():GetID(), button:GetID(), split);
|
|
end
|
|
OpenStackSplitFrame(itemCount, self, "BOTTOMRIGHT", "TOPRIGHT");
|
|
end
|
|
return;
|
|
end
|
|
end
|
|
|
|
function ContainerFrameItemButton_OnEnter(self)
|
|
local x;
|
|
x = self:GetRight();
|
|
if ( x >= ( GetScreenWidth() / 2 ) ) then
|
|
GameTooltip:SetOwner(self, "ANCHOR_LEFT");
|
|
else
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
end
|
|
|
|
-- Keyring specific code
|
|
if ( self:GetParent():GetID() == KEYRING_CONTAINER ) then
|
|
GameTooltip:SetInventoryItem("player", KeyRingButtonIDToInvSlotID(self:GetID()));
|
|
CursorUpdate(self);
|
|
return;
|
|
end
|
|
|
|
local showSell = nil;
|
|
local hasCooldown, repairCost = GameTooltip:SetBagItem(self:GetParent():GetID(), self:GetID());
|
|
if ( InRepairMode() and (repairCost and repairCost > 0) ) then
|
|
GameTooltip:AddLine(REPAIR_COST, "", 1, 1, 1);
|
|
SetTooltipMoney(GameTooltip, repairCost);
|
|
GameTooltip:Show();
|
|
elseif ( MerchantFrame:IsShown() and MerchantFrame.selectedTab == 1 ) then
|
|
showSell = 1;
|
|
end
|
|
|
|
if ( IsModifiedClick("DRESSUP") and self.hasItem ) then
|
|
ShowInspectCursor();
|
|
elseif ( showSell ) then
|
|
ShowContainerSellCursor(self:GetParent():GetID(),self:GetID());
|
|
elseif ( self.readable ) then
|
|
ShowInspectCursor();
|
|
else
|
|
ResetCursor();
|
|
end
|
|
end
|
|
|
|
function OpenAllBags(forceOpen)
|
|
if ( not UIParent:IsShown() ) then
|
|
return;
|
|
end
|
|
|
|
local bagsOpen = 0;
|
|
local totalBags = 1;
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
local containerFrame = _G["ContainerFrame"..i];
|
|
local bagButton = _G["CharacterBag"..(i -1).."Slot"];
|
|
if ( (i <= NUM_BAG_FRAMES) and GetContainerNumSlots(bagButton:GetID() - CharacterBag0Slot:GetID() + 1) > 0) then
|
|
totalBags = totalBags + 1;
|
|
end
|
|
if ( containerFrame:IsShown() ) then
|
|
containerFrame:Hide();
|
|
if ( containerFrame:GetID() ~= KEYRING_CONTAINER ) then
|
|
bagsOpen = bagsOpen + 1;
|
|
end
|
|
end
|
|
end
|
|
if ( bagsOpen >= totalBags and not forceOpen ) then
|
|
return;
|
|
else
|
|
ToggleBackpack();
|
|
ToggleBag(1);
|
|
ToggleBag(2);
|
|
ToggleBag(3);
|
|
ToggleBag(4);
|
|
if ( BankFrame:IsShown() ) then
|
|
ToggleBag(5);
|
|
ToggleBag(6);
|
|
ToggleBag(7);
|
|
ToggleBag(8);
|
|
ToggleBag(9);
|
|
ToggleBag(10);
|
|
ToggleBag(11);
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function CloseAllBags()
|
|
CloseBackpack();
|
|
for i=1, NUM_CONTAINER_FRAMES, 1 do
|
|
CloseBag(i);
|
|
end
|
|
end
|
|
|
|
--KeyRing functions
|
|
|
|
function PutKeyInKeyRing()
|
|
local texture;
|
|
local emptyKeyRingSlot;
|
|
for i=1, GetKeyRingSize() do
|
|
texture = GetContainerItemInfo(KEYRING_CONTAINER, i);
|
|
if ( not texture ) then
|
|
emptyKeyRingSlot = i;
|
|
break;
|
|
end
|
|
end
|
|
if ( emptyKeyRingSlot ) then
|
|
PickupContainerItem(KEYRING_CONTAINER, emptyKeyRingSlot);
|
|
else
|
|
UIErrorsFrame:AddMessage(NO_EMPTY_KEYRING_SLOTS, 1.0, 0.1, 0.1, 1.0);
|
|
end
|
|
end
|
|
|
|
function ToggleKeyRing()
|
|
if ( IsOptionFrameOpen() ) then
|
|
return;
|
|
end
|
|
|
|
local shownContainerID = IsBagOpen(KEYRING_CONTAINER);
|
|
if ( shownContainerID ) then
|
|
_G["ContainerFrame"..shownContainerID]:Hide();
|
|
else
|
|
ContainerFrame_GenerateFrame(ContainerFrame_GetOpenFrame(), GetKeyRingSize(), KEYRING_CONTAINER);
|
|
|
|
-- Stop keyring button pulse
|
|
SetButtonPulse(KeyRingButton, 0, 1);
|
|
end
|
|
end
|
|
|
|
function GetKeyRingSize()
|
|
local numKeyringSlots = GetContainerNumSlots(KEYRING_CONTAINER);
|
|
local maxSlotNumberFilled = 0;
|
|
local numItems = 0;
|
|
for i=1, numKeyringSlots do
|
|
local texture = GetContainerItemInfo(KEYRING_CONTAINER, i);
|
|
-- Update max slot
|
|
if ( texture and i > maxSlotNumberFilled) then
|
|
maxSlotNumberFilled = i;
|
|
end
|
|
-- Count how many items you have
|
|
if ( texture ) then
|
|
numItems = numItems + 1;
|
|
end
|
|
end
|
|
|
|
-- Round to the nearest 4 rows that will hold the keys
|
|
local modulo = maxSlotNumberFilled % 4;
|
|
local size;
|
|
if ( (modulo == 0) and (numItems < maxSlotNumberFilled) ) then
|
|
size = maxSlotNumberFilled;
|
|
else
|
|
-- Only expand if the number of keys in the keyring exceed or equal the max slot filled
|
|
size = maxSlotNumberFilled + (4 - modulo);
|
|
end
|
|
size = min(size, numKeyringSlots);
|
|
|
|
return size;
|
|
end
|
|
|
|
function GetBackpackFrame()
|
|
local index = IsBagOpen(0);
|
|
if ( index ) then
|
|
return _G["ContainerFrame"..index];
|
|
else
|
|
return nil;
|
|
end
|
|
end
|