vanilla-wow-addons – Rev 1

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

--[[ OnX Functions ]]--

function BagnonBag_OnLoad()
        this:RegisterForDrag("LeftButton");
        this:RegisterForClicks("LeftButtonUp", "RightButtonUp");
        
        this:RegisterEvent("BAG_UPDATE");
        this:RegisterEvent("ITEM_LOCK_CHANGED");
        this:RegisterEvent("CURSOR_UPDATE");
        this:RegisterEvent("BAG_UPDATE_COOLDOWN");
        
        if( Bagnon_IsBankBag(this:GetID() ) ) then
                this:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED");
        end
end

function BagnonBag_OnEvent()
        if( not this:IsVisible() or Bagnon_IsCachedFrame(this:GetParent():GetParent()) ) then
                return;
        end

        if ( event == "BAG_UPDATE" ) then
                if( arg1 == this:GetID() ) then
                        BagnonBag_Update(this);
                        BagnonBag_UpdateFrameSize(this:GetParent());
                end
        elseif (event == "ITEM_LOCK_CHANGED") then
                BagnonBag_UpdateLock(this);
        elseif (event == "CURSOR_UPDATE") then
                BagnonBag_UpdateCursor(this);
        elseif ( event == "PLAYERBANKBAGSLOTS_CHANGED") then
                BagnonBag_Update(this);
                BagnonBag_UpdateFrameSize(this:GetParent());
        end
end

function BagnonBag_OnShow()
        BagnonBag_UpdateTexture(this:GetParent():GetParent(), this:GetID());
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
        else
                BagnonFrame_ToggleBag(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()) );
        PlaySound("BAGMENUBUTTONPRESS");
end

--tooltip functions
function BagnonBag_OnEnter()
        local frame = this:GetParent():GetParent();
        
        BagnonFrame_HighlightSlots(frame, this:GetID());
        
        if( this:GetLeft() < ( UIParent:GetRight() / 2) ) then
                GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
        else
                GameTooltip:SetOwner(this, "ANCHOR_LEFT");
        end
        
        --mainmenubag specific code
        if( this:GetID() == 0 ) then
                GameTooltip:SetText(TEXT(BACKPACK_TOOLTIP), 1.0, 1.0, 1.0);
        --keyring specific code...again
        elseif ( this:GetID() == KEYRING_CONTAINER ) then
                GameTooltip:SetText(KEYRING, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
        --cached bags
        elseif( Bagnon_IsCachedBag(frame.player, this:GetID()) ) then
                local _, link = BagnonDB.GetBagData(frame.player, this:GetID());
                
                if(link) then
                        GameTooltip:SetHyperlink( link );
                        GameTooltip:Show();
                else
                        GameTooltip:SetText(TEXT(EQUIP_CONTAINER), 1.0, 1.0, 1.0);
                end
        elseif ( not GameTooltip:SetInventoryItem("player", ContainerIDToInventoryID(this:GetID()) ) ) then
                GameTooltip:SetText(TEXT(EQUIP_CONTAINER), 1.0, 1.0, 1.0);
        end
        
        if(not Bagnon_IsCachedBag(frame.player, this:GetID()) ) then
                --add the shift click to hide/show tooltip
                if(BagnonSets.showTooltips) then
                        if( Bagnon_FrameHasBag(frame:GetName(), this:GetID()) ) then
                                GameTooltip:AddLine(BAGNON_BAGS_HIDE);
                        else
                                GameTooltip:AddLine(BAGNON_BAGS_SHOW);
                        end
                end
        end
        
        GameTooltip:Show();
end

function BagnonBag_OnLeave()
        BagnonFrame_UnhighlightAll(this:GetParent():GetParent());
        GameTooltip:Hide();
end

--[[ Update Functions ]]--

function BagnonBag_Update(bag)
        local invID = ContainerIDToInventoryID(bag:GetID());
        
        local textureName = GetInventoryItemTexture("player", invID);
        if ( textureName ) then
                SetItemButtonTexture(bag, textureName);
                BagnonBag_SetCount(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_SetCount(bag, 0);
                SetItemButtonTextureVertexColor(bag, 1.0, 1.0, 1.0);
                SetItemButtonNormalTextureVertexColor(bag, 1.0, 1.0, 1.0);
                getglobal(bag:GetName().."Cooldown"):Hide();
                bag.hasItem = nil;
        end
        if ( GameTooltip:IsOwned(bag) ) then
                if ( textureName  ) 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_UpdateCursor(bag)
        if ( CursorCanGoInSlot( ContainerIDToInventoryID( bag:GetID() ) ) ) then
                bag:LockHighlight();
        else
                bag:UnlockHighlight();
        end
end


--[[
        Update the texture and count of the bag
                Used mainly for cached bags
--]]
function BagnonBag_UpdateTexture(frame, bagID)
        local bag = getglobal(frame:GetName() .. "Bags" .. bagID);
        if(not bag or bag:GetID() <= 0) then return; end
        
        if( Bagnon_IsCachedBag(frame.player, bagID) ) then
                local _, 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_SetCount(bag, count);
                end
        else
                local texture = GetInventoryItemTexture("player", ContainerIDToInventoryID(bagID));
                if(texture) then
                        SetItemButtonTexture(bag, texture);
                else
                        SetItemButtonTexture(bag, nil);
                end
                BagnonBag_SetCount(bag, GetInventoryItemCount("player", ContainerIDToInventoryID(bagID)));
        end
end

--this function is used when updating the frame's size based on a bag being replaced/removed/added, so we don't care about the keyring
function BagnonBag_UpdateFrameSize(bagFrame)
        local size = 0;
        for _, bag in pairs( { bagFrame:GetChildren() } ) do
                if(bag:GetID() ~= KEYRING_CONTAINER) then
                        size = size + GetContainerNumSlots(bag:GetID());
                end
        end

        --only generate the frame again if the size of the frame changed
        if(bagFrame.size ~= size) then
                BagnonFrame_Generate( bagFrame:GetParent() );
        end
        bagFrame.size = size;
end

function BagnonBag_SetCount(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

Generated by GNU Enscript 1.6.5.90.