vanilla-wow-addons – Rev 1
?pathlinks?
--[[
item.lua
Functions used by the item slots in Bagnon
TODO:
Code review
Ability to disable item borders
--]]
--[[
Item Button Constructor
The dummyBag is purely for compatibility with mods that need the same structure as a blizzard bag
Blizzard bag functions use item:GetID() to reference the item slot, and item:GetParent():GetID() to reference their bag
I'm fairly certain that the memory impact is still quite minimal.
--]]
function BagnonItem_Create(name, parent)
--create the button
local button = CreateFrame("Button", name, parent, "BagnonItemTemplate");
button:SetAlpha(parent:GetParent():GetAlpha());
button:RegisterForClicks("LeftButtonUp", "RightButtonUp");
button:RegisterForDrag("LeftButton");
--Fix for AxuItemMenus
if(AxuItemMenus_DropDown) then
button.SplitStack = function(itemButton, split) SplitContainerItem( itemButton:GetParent():GetID() , itemButton:GetID(), split); end;
end
return button;
end
function BagnonItem_OnClick(mouseButton, ignoreModifiers)
if ( this.isLink ) then
if(this.hasItem) then
if ( mouseButton == "LeftButton" ) then
if ( IsControlKeyDown() ) then
local itemSlot = this:GetID();
local bagID = this:GetParent():GetID();
local player = this:GetParent():GetParent().player;
DressUpItemLink( (BagnonDB.GetItemData(player, bagID, itemSlot)) );
elseif( IsShiftKeyDown() ) then
local itemSlot = this:GetID();
local bagID = this:GetParent():GetID();
local player = this:GetParent():GetParent().player;
ChatFrameEditBox:Insert( BagnonDB.GetItemHyperlink(player, bagID, itemSlot) );
end
end
end
else
ContainerFrameItemButton_OnClick(mouseButton, ignoreModifiers);
end
end
--[[
Show tooltip on hover
--]]
function BagnonItem_OnEnter(item)
--link case
if(item.isLink) then
if(item.hasItem)then
GameTooltip:SetOwner(item);
local itemSlot = item:GetID();
local bagID = item:GetParent():GetID();
local player = item:GetParent():GetParent().player;
local link, count = BagnonDB.GetItemData(player, bagID, itemSlot);
GameTooltip:SetHyperlink( link, count );
Bagnon_AnchorTooltip(item);
end
--normal bag case
else
--blizzard totally needs to make the bank item not a special case
if( item:GetParent():GetID() == -1) then
GameTooltip:SetOwner(item);
GameTooltip:SetInventoryItem("player", BankButtonIDToInvSlotID( item:GetID() ) );
--normal item case
else
ContainerFrameItemButton_OnEnter(item);
end
--Don't reposition tooltips for things using EnhTooltip
if(not EnhTooltip) then
Bagnon_AnchorTooltip(item);
end
end
end
function BagnonItem_OnUpdate()
if ( GameTooltip:IsOwned(this) ) then
BagnonItem_OnEnter(this);
end
end
--[[
Update Functions
--]]
-- Update the texture, lock status, and other information about an item
function BagnonItem_Update(item)
local itemLink, texture, itemCount, readable, locked;
if( Bagnon_IsCachedItem(item) ) then
item.isLink = 1;
local itemSlot = item:GetID();
local bagID = item:GetParent():GetID();
local player = item:GetParent():GetParent().player;
_, itemCount, texture, quality = BagnonDB.GetItemData(player, bagID, itemSlot);
BagnonItem_UpdateLinkBorder(item, quality);
if ( texture ) then
item.hasItem = 1;
else
item.hasItem = nil;
end
--hide cooldown since there isn't one for linked items
BagnonItem_UpdateCooldown(bagID, item);
else
item.isLink = nil;
texture, itemCount, locked, _, readable = GetContainerItemInfo(item:GetParent():GetID(), item:GetID());
BagnonItem_UpdateBorder(item);
if ( texture ) then
BagnonItem_UpdateCooldown(item:GetParent():GetID() , item);
item.hasItem = 1;
else
getglobal(item:GetName() .. "Cooldown"):Hide();
item.hasItem = nil;
end
SetItemButtonDesaturated(item, locked, 0.5, 0.5, 0.5);
item.readable = readable;
end
--update texture and count
SetItemButtonTexture( item, texture );
SetItemButtonCount( item, itemCount );
end
function BagnonItem_UpdateBorder(button)
local bagID = button:GetParent():GetID();
if BagnonSets.qualityBorders then
--Adapted from OneBag. The author had a clever idea of using the link to generate the color
local link = ( GetContainerItemLink(bagID , button:GetID()) );
if link then
local _, _, hexString = strfind(link ,"|cff([%l%d]+)|H");
local red = tonumber(strsub(hexString, 1, 2), 16)/256;
local green = tonumber(strsub(hexString, 3, 4), 16)/256;
local blue = tonumber(strsub(hexString, 5, 6), 16)/256;
if red ~= green and red ~= blue then
getglobal(button:GetName() .. "Border"):SetVertexColor(red, green, blue, 0.5);
getglobal(button:GetName() .. "Border"):Show();
else
getglobal(button:GetName() .. "Border"):Hide();
end
else
getglobal(button:GetName() .. "Border"):Hide();
end
else
getglobal(button:GetName() .. "Border"):Hide();
end
--ammo slot coloring
if( bagID == KEYRING_CONTAINER ) then
getglobal(button:GetName() .. "NormalTexture"):SetVertexColor(1, 0.7, 0);
elseif( Bagnon_IsAmmoBag( bagID ) ) then
getglobal(button:GetName() .. "NormalTexture"):SetVertexColor(1, 1, 0);
elseif( Bagnon_IsProfessionBag( bagID ) ) then
getglobal(button:GetName() .. "NormalTexture"):SetVertexColor(0, 1, 0);
else
getglobal(button:GetName() .. "NormalTexture"):SetVertexColor(1, 1, 1);
end
end
function BagnonItem_UpdateLinkBorder(item, quality)
local itemSlot = item:GetID();
local bagID = item:GetParent():GetID();
local player = item:GetParent():GetParent().player;
if( BagnonSets.qualityBorders ) then
if(not quality) then
local link = (BagnonDB.GetItemData(player, bagID, itemSlot));
if(link) then
_, _, quality = GetItemInfo(link);
end
end
if(quality and quality > 1) then
local red, green, blue = GetItemQualityColor(quality);
getglobal(item:GetName() .. "Border"):SetVertexColor(red, green, blue, 0.5);
getglobal(item:GetName() .. "Border"):Show();
else
getglobal(item:GetName() .. "Border"):Hide();
end
else
getglobal(item:GetName() .. "Border"):Hide();
end
if( bagID == KEYRING_CONTAINER ) then
getglobal(item:GetName() .. "NormalTexture"):SetVertexColor(1, 0.7, 0);
elseif( Bagnon_IsAmmoBag(bagID, player) ) then
getglobal(item:GetName() .. "NormalTexture"):SetVertexColor(1, 1, 0);
elseif( Bagnon_IsProfessionBag(bagID , player) ) then
getglobal(item:GetName() .. "NormalTexture"):SetVertexColor(0, 1, 0);
else
getglobal(item:GetName() .. "NormalTexture"):SetVertexColor(1, 1, 1);
end
end
--Update cooldown
function BagnonItem_UpdateCooldown(container, button)
if(button.isLink) then
CooldownFrame_SetTimer(getglobal(button:GetName().."Cooldown"), 0, 0, 0);
else
local cooldown = getglobal(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);
end
end
end
Generated by GNU Enscript 1.6.5.90.