vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Bags.lua
                Functions used by Bagnon Bags
--]]

--This loading function and the event handler are actually called by the frame that contains all the bag buttons, not the bag buttons themselves
function BagnonBagMain_OnLoad()
        this:RegisterEvent("BAG_UPDATE");
        this:RegisterEvent("ITEM_LOCK_CHANGED");
        
        this:RegisterEvent("UNIT_INVENTORY_CHANGED");
        this:RegisterEvent("CURSOR_UPDATE");
        this:RegisterEvent("BAG_UPDATE_COOLDOWN");
        this:RegisterEvent("UPDATE_INVENTORY_ALERTS");
        
        this:RegisterEvent("BAG_UPDATE");
        this:RegisterEvent("ITEM_LOCK_CHANGED");
end

function BagnonBag_OnLoad()
        this:RegisterForDrag("LeftButton");
        this:RegisterForClicks("LeftButtonUp", "RightButtonUp");
end

function BagnonBag_OnEvent(event)
        if ( not this:IsVisible() or Bagnon_IsCachedFrame(this:GetParent())  ) then
                return;
        end
        
        if ( event == "UNIT_INVENTORY_CHANGED") then
                if ( arg1 == "player" ) then
                        BagnonBag_ForAllBags(BagnonBag_Update);
                end
        elseif ( event == "ITEM_LOCK_CHANGED" ) then
                BagnonBag_ForAllBags(BagnonBag_UpdateLock);
        elseif ( event == "BAG_UPDATE_COOLDOWN" ) then
                BagnonBag_ForAllBags(BagnonBag_UpdateLock, 1);
        elseif ( event == "CURSOR_UPDATE" ) then
                BagnonBag_UpdateCursor();
        elseif ( event == "BAG_UPDATE" ) then
                BagnonBag_UpdateBagsAndSize(this);
        elseif ( event == "UPDATE_INVENTORY_ALERTS" ) then
                BagnonBag_ForAllBags(BagnonBag_Update);
        end
end

function BagnonBag_UpdateCursor()
        local bags = { this:GetChildren() };
        for bag in bags do
                if ( CursorCanGoInSlot( ContainerIDToInventoryID( bags[bag]:GetID() ) ) ) then
                        bags[bag]:LockHighlight();
                else
                        bags[bag]:UnlockHighlight();
                end
        end
end

function BagnonBag_Update(bag, cooldownOnly)
        if(bag:GetID() == KEYRING_CONTAINER) then
                return;
        end
        
        local invID = ContainerIDToInventoryID(bag:GetID());
        
        local textureName = GetInventoryItemTexture("player", invID);
        local cooldown = getglobal(bag:GetName().."Cooldown");
        if ( textureName ) then
                SetItemButtonTexture(bag, textureName);
                BagnonBag_SetBagCount(bag, GetInventoryItemCount("player", invID));
                
                if ( not IsInventoryItemLocked(invID) ) then 
                        SetItemButtonTextureVertexColor(bag, 1.0, 1.0, 1.0);
                        SetItemButtonNormalTextureVertexColor(bag, 1.0, 1.0, 1.0);
                end
                bag.hasItem = 1;
        else
                SetItemButtonTexture(bag, nil);
                BagnonBag_SetBagCount(bag, 0);
                SetItemButtonTextureVertexColor(bag, 1.0, 1.0, 1.0);
                SetItemButtonNormalTextureVertexColor(bag, 1.0, 1.0, 1.0);
                cooldown:Hide();
                bag.hasItem = nil;
        end

        local start, duration, enable = GetInventoryItemCooldown("player", invID);
        CooldownFrame_SetTimer(cooldown, start, duration, enable);


        if ( GameTooltip:IsOwned(bag) ) then
                if ( textureName or cooldownOnly ) then
                        BagnonBag_OnEnter(bag);
                else
                        GameTooltip:Hide();
                        ResetCursor();
                end
        end
        BagnonBag_UpdateLock(bag);

        -- Update repair all button status
        if ( MerchantRepairAllIcon ) then
                local repairAllCost, canRepair = GetRepairAllCost();
                if ( canRepair ) then
                        SetDesaturation(MerchantRepairAllIcon, nil);
                        MerchantRepairAllButton:Enable();
                else
                        SetDesaturation(MerchantRepairAllIcon, 1);
                        MerchantRepairAllButton:Disable();
                end     
        end
end

function BagnonBag_UpdateLock(bag)
        if ( IsInventoryItemLocked( ContainerIDToInventoryID(bag:GetID()) ) ) then
                SetItemButtonDesaturated(bag, 1, 0.5, 0.5, 0.5);
        else 
                SetItemButtonDesaturated(bag, nil);
        end
end

function BagnonBag_OnClick()
        if ( Bagnon_IsCachedBag(this:GetParent():GetParent().player, this:GetID() ) ) then
                return;
        end

        if(not IsShiftKeyDown() ) then
                --damn you blizzard for making the keyring specific code!
                if( this:GetID() == KEYRING_CONTAINER ) then
                        PutKeyInKeyRing();
                else
                        PutItemInBag( ContainerIDToInventoryID(this:GetID()) );
                end
                BagnonCore_GenerateFrame(this:GetParent():GetParent());
        else
                BagnonCore_ToggleBagForFrame(this:GetParent():GetParent(), this:GetID());
        end
end

function BagnonBag_OnDrag()
        if (Bagnon_IsCachedBag(this:GetParent():GetParent().player, this:GetID()) )  then 
                return;
        end

        PickupBagFromSlot( ContainerIDToInventoryID(this:GetID()) );
        BagnonCore_GenerateFrame(this:GetParent():GetParent());
        PlaySound("BAGMENUBUTTONPRESS");
end

function BagnonBag_OnEnter(bag)
        if(not bag) then
                bag = this;
        end
        
        local frame = bag:GetParent():GetParent();
        
        BagnonCore_HighlightSlots(frame, bag:GetID());
        
        if( bag:GetLeft() < ( UIParent:GetRight() / 2) ) then
                GameTooltip:SetOwner(bag, "ANCHOR_RIGHT");
        else
                GameTooltip:SetOwner(bag, "ANCHOR_LEFT");
        end
        
        if( Bagnon_IsCachedBag(frame.player, bag:GetID()) ) then
                local size, link = BagnonDB_GetBagData(frame.player, bag:GetID());
                
                if(link) then
                        GameTooltip:SetHyperlink( link );
                        GameTooltip:Show();
                        return;
                end
        --keyring specific code...again
        elseif ( bag:GetID() == KEYRING_CONTAINER ) then
                GameTooltip:SetText(KEYRING, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
                GameTooltip:AddLine();
                
                --add the usage tooltip
                if(BagnonSets.showTooltips) then
                        if( Bagnon_FrameHasBag(frame:GetName(), bag:GetID()) ) then
                                GameTooltip:AddLine(BAGNON_BAGS_HIDE);
                        else
                                GameTooltip:AddLine(BAGNON_BAGS_SHOW);
                        end
                end
                GameTooltip:Show();
                return;
        elseif ( GameTooltip:SetInventoryItem("player", ContainerIDToInventoryID(bag:GetID()) ) ) then
        
                --add the usage tooltip
                if(BagnonSets.showTooltips) then
                        if( Bagnon_FrameHasBag(frame:GetName(), bag:GetID()) ) then
                                GameTooltip:AddLine(BAGNON_BAGS_HIDE);
                        else
                                GameTooltip:AddLine(BAGNON_BAGS_SHOW);
                        end
                end
                
                GameTooltip:Show();
                return;
        end
        GameTooltip:SetText(TEXT(EQUIP_CONTAINER), 1.0, 1.0, 1.0);
end


function BagnonBag_OnShow()
        local bags = { this:GetChildren() };
        local parent = this:GetParent();
        
        for bag in bags do
                BagnonBag_UpdateTexture(parent, bags[bag]:GetID());
        end
end


--[[
        Update the texture and count of the bag
                Used mainly for cached bags
--]]

function BagnonBag_UpdateTexture(frame, bagID)
        if(bagID == KEYRING_CONTAINER) then
                return;
        end
        
        local bag = getglobal(frame:GetName() .. "Bags" .. bagID);
        if(not bag ) then 
                return; 
        end
        
        if( Bagnon_IsCachedBag(frame.player, bagID) ) then
                local size, link, count = BagnonDB_GetBagData(frame.player, bagID);
                if(link) then
                        local _, _, _, _, _, _, _, _, texture = GetItemInfo(link);
                        SetItemButtonTexture(bag, texture);
                else
                        SetItemButtonTexture(bag, nil);
                end
                if(count) then
                        BagnonBag_SetBagCount(bag, count);
                end
        else
                local texture = GetInventoryItemTexture("player", ContainerIDToInventoryID(bagID));
                if(texture) then
                        SetItemButtonTexture(bag, texture);
                else
                        SetItemButtonTexture(bag, nil);
                end
                BagnonBag_SetBagCount(bag, GetInventoryItemCount("player", ContainerIDToInventoryID(bagID)));
        end
end

function BagnonBag_UpdateBagsAndSize(frame)
        local bags = { frame:GetChildren() };

        local size = 0;
        for bag in bags do
                BagnonBag_Update(bags[bag]);
                size = size + GetContainerNumSlots(bags[bag]:GetID());
        end
        
        --only generate the frame again if the size of the frame changed
        if(frame.size ~= size) then
                BagnonCore_GenerateFrame(frame:GetParent());
        end
end

function BagnonBag_SetBagCount(button, count)
        if ( not button ) then
                return;
        end

        if ( not count ) then
                count = 0;
        end

        button.count = count;
        if ( count > 1 or (button.isBag and count > 0) ) then
                local countText = getglobal(button:GetName().."Count");
                if(count > 9999) then
                        countText:SetFont(NumberFontNormal:GetFont(), 10, "OUTLINE");
                elseif(count > 999) then
                        countText:SetFont(NumberFontNormal:GetFont(), 11, "OUTLINE");
                else
                        countText:SetFont(NumberFontNormal:GetFont(), 12, "OUTLINE");
                end
                countText:SetText(count);
                countText:Show();
        else
                getglobal(button:GetName().."Count"):Hide();
        end
end

--does an action to all bags, except the keyring
function BagnonBag_ForAllBags(action, arg1)
        local bags = { this:GetChildren() };
        for bag in bags do
                if(bags[bag]:GetID() ~= KEYRING_CONTAINER) then
                        action(bags[bag], arg1);
                end
        end
end

Generated by GNU Enscript 1.6.5.90.