vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        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.