vanilla-wow-addons – Rev 1
?pathlinks?
--[[
item.lua
Functions used by the item slots in Bagnon
TODO:
Code review
Ability to disable item borders
1.11 code improvements
--]]
BAGNON_HEX = {
["a"] = 10,
["b"] = 11,
["c"] = 12,
["d"] = 13,
["e"] = 14,
["f"] = 15,
["0"] = 0,
["1"] = 1,
["2"] = 2,
["3"] = 3,
["4"] = 4,
["5"] = 5,
["6"] = 6,
["7"] = 7,
["8"] = 8,
["9"] = 9,
};
--[[ Item Button Constructor ]]--
function BagnonItem_Create(name, parent)
--[[
this 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.
--]]
local dummyBag = CreateFrame("Frame", nil, parent);
--create the button
local button = CreateFrame("Button", name, dummyBag);
button:SetHeight(37);
button:SetWidth(37);
--[[ Textures ]]--
--border
local border = button:CreateTexture(name .. "Border", "OVERLAY");
border:SetTexture("Interface\\Buttons\\UI-ActionButton-Border");
border:SetBlendMode("ADD");
border:SetHeight(68);
border:SetWidth(68);
border:SetPoint("CENTER", button, "CENTER", 0, 1);
--icon texture
local iconTexture = button:CreateTexture(name .. "IconTexture", "BORDER");
iconTexture:SetAllPoints(button);
--normal, pushed, highlight
local normalTexture = button:CreateTexture(name .. "NormalTexture");
normalTexture:SetTexture("Interface\\Buttons\\UI-Quickslot2");
normalTexture:SetHeight(64);
normalTexture:SetWidth(64);
normalTexture:SetPoint("CENTER", button, "CENTER", 0, -1);
button:SetNormalTexture(normalTexture);
button:SetPushedTexture("Interface\\Buttons\\UI-Quickslot-Depress");
button:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square");
--[[ Font Strings ]]--
local count = button:CreateFontString(name .. "Count", "BORDER");
count:SetFontObject(NumberFontNormal);
count:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -2, 2);
count:SetJustifyH("RIGHT");
count:Hide();
local stock = button:CreateFontString(name .. "Stock", "BORDER");
stock:SetFontObject(NumberFontNormalYellow);
stock:SetPoint("TOPLEFT", button, "TOPLEFT", 0, -2);
stock:SetJustifyH("LEFT");
stock:Hide();
--[[ Frames ]]--
--cooldown model
local cooldown = CreateFrame("Model", name .. "Cooldown", button);
cooldown:SetScale(0.85);
cooldown:SetAllPoints(button);
cooldown:SetModel("Interface\\Cooldown\\UI-Cooldown-Indicator.mdx");
cooldown:Hide();
cooldown:SetScript("OnUpdateModel", CooldownFrame_OnUpdateModel);
cooldown:SetScript("OnAnimFinished", CooldownFrame_OnAnimFinished);
button:Hide();
--[[ Scripts ]]--
button:SetScript("OnUpdate", function()
BagnonItem_OnUpdate()
end);
button:SetScript("OnClick", function()
BagnonItem_OnClick(arg1);
end);
button:SetScript("OnHide", function()
if ( this.hasStackSplit and (this.hasStackSplit == 1) ) then
StackSplitFrame:Hide();
end
end);
button:SetScript("OnEnter", function()
BagnonItem_OnEnter(this);
end);
button:SetScript("OnLeave", function()
this.updateTooltip = nil;
GameTooltip:Hide();
ResetCursor();
end);
button:SetScript("OnDragStart", function()
BagnonItem_OnClick("LeftButton", 1);
end);
button:SetScript("OnReceiveDrag", function()
BagnonItem_OnClick("LeftButton", 1);
end);
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
DressUpItemLink( BagnonDB_GetItemData(this) );
elseif( IsShiftKeyDown() ) then
ChatFrameEditBox:Insert( BagnonDB_GetFullItemLink(this) );
end
end
end
else
ContainerFrameItemButton_OnClick(mouseButton, ignoreModifiers);
end
end
--[[
Show tooltip on hover
--]]
function BagnonItem_OnEnter(button)
--link case
if(button.isLink) then
if(button.hasItem)then
GameTooltip:SetOwner(button);
local link, _, count = BagnonDB_GetItemData(button);
--this is a tweak for one of my personal mods, Ludwig. It allows for mods to add sellvalue to linked items.
GameTooltip:SetHyperlink( link, count );
Bagnon_AnchorTooltip(button);
end
--normal bag case
else
--blizzard totally needs to make the bank button not a special case
if( button:GetParent():GetID() == -1) then
GameTooltip:SetOwner(button);
GameTooltip:SetInventoryItem("player", BankButtonIDToInvSlotID( button:GetID() ) );
--normal item case
else
ContainerFrameItemButton_OnEnter(button);
end
--Don't reposition tooltips for things using EnhTooltip
if(not EnhTooltip) then
Bagnon_AnchorTooltip(button);
end
end
end
function BagnonItem_OnUpdate()
if ( GameTooltip:IsOwned(this) ) then
BagnonItem_OnEnter(this);
end
end
--[[
Update tooltip info
--]]
--Adapted from OneBag. The author had a clever idea of using the link to generate the color instead of getting the quality, then the color
function BagnonItem_UpdateBorder(button)
local link = GetContainerItemLink(button:GetParent():GetID() , button:GetID());
if(link) then
--item border coloring
local _, _, hexString = strfind( link ,"|cff(%w+)|H");
local red = ( 16 * BAGNON_HEX[string.sub(hexString, 1, 1)] + BAGNON_HEX[string.sub(hexString, 2, 2)] ) / 256;
local green = ( 16 * BAGNON_HEX[string.sub(hexString, 3, 3)] + BAGNON_HEX[string.sub(hexString, 4, 4)] ) / 256;
local blue = ( 16 * BAGNON_HEX[string.sub(hexString, 5, 5)] + BAGNON_HEX[string.sub(hexString, 6, 6)] ) / 256;
local border = getglobal(button:GetName() .. "Border");
if( border and (red ~= green and red ~= blue ) ) then
border:SetVertexColor(red, green, blue, 0.4);
border:Show();
else
border:Hide();
end
else
--ammo slot coloring
getglobal(button:GetName() .. "Border"):Hide();
local bagID = button:GetParent():GetID();
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
end
function BagnonItem_UpdateLinkBorder(item)
local iLink = ( BagnonDB_GetItemData(item) );
if(iLink) then
local name, link, quality = GetItemInfo( iLink );
local red, green, blue;
if(quality) then
red, green, blue = GetItemQualityColor(quality);
end
if( getglobal(item:GetName() .. "Border") and (red ~= green and red ~= blue) ) then
getglobal(item:GetName() .. "Border"):SetVertexColor(red, green, blue, 0.4);
getglobal(item:GetName() .. "Border"):Show();
else
getglobal(item:GetName() .. "Border"):Hide();
end
else
getglobal(item:GetName() .. "Border"):Hide();
end
getglobal(item:GetName() .. "NormalTexture"):SetVertexColor(1, 1, 1);
end
--[[
Update cooldown
It mainly handles the special case of
--]]
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.