vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[--------------------------------------------------------------------------------
  ItemSyncCore BagView Framework

  Author:  Derkyle
  Website: http://www.manaflux.com
-----------------------------------------------------------------------------------]]

local ISync_BVList      = { };

---------------------------------------------------
-- ISync:BV_Load
---------------------------------------------------
function ISync:BV_Load()
        ---------------------------------------------------
        -- Register our slash command
        SLASH_ISYNCBAGVIEW1 = "/bagview";
        SLASH_ISYNCBAGVIEW2 = "/bv";
        SLASH_ISYNCBAGVIEW3 = "/bagv";
        SlashCmdList["ISYNCBAGVIEW"] = function(msg)

                if(ISYNC_LOADYES == 1) then
                        if ( ISync_BV_Frame:IsVisible() ) then ISync_BV_Frame:Hide(); else ISync_BV_Frame:Show(); end
                end
        end
        tinsert(UISpecialFrames, "ISync_BV_Frame");  
end

---------------------------------------------------
-- ISync:BV_Binding
---------------------------------------------------
function ISync:BV_Unload()
        ISync_BVList = nil;
end


---------------------------------------------------
-- ISync:BV_Binding
---------------------------------------------------
function ISync:BV_Binding()
        if(ISYNC_LOADYES == 1) then
                if ( ISync_BV_Frame:IsVisible() ) then ISync_BV_Frame:Hide(); else ISync_BV_Frame:Show(); end
        end
end


---------------------------------------------------
-- ISync:BV_Refresh()
---------------------------------------------------
function ISync:BV_Refresh()

        ISync_BVList = nil; --reset
        
        local offset = FauxScrollFrame_GetOffset(ISync_IC_ScrollFrame);
        
        if( offset ) then
                --set to last offset
                FauxScrollFrame_SetOffset(ISync_IC_ScrollFrame, offset);        
        else
                --set to zero offset
                FauxScrollFrame_SetOffset(ISync_IC_ScrollFrame, 0);
        end
        
        ISync:BV_BuildIndex();
        ISync:BV_UpdateScrollFrame();

end


---------------------------------------------------
-- ISync:BV_BuildIndex()
---------------------------------------------------
function ISync:BV_BuildIndex()

        if(not ISyncDB) then return nil; end
        if(not ISyncDB[ISYNC_REALM_NUM]) then return nil; end
                
        --reset inven array
        ISync_BVList =  nil;
        ISync_BVList = { };

        local iNew = 1;
        local costOfItem, sColor, sParseLink;
        
        --do the loops through all the bags
        for bag=0,NUM_BAG_FRAMES do
                for slot=1,GetContainerNumSlots(bag) do
                    local link = GetContainerItemLink(bag, slot);

                    if (link) then

                        local sID = ISync:GetCoreID(link);
                        local name = ISync:NameFromLink(link);
                        local link = ISync:GetItemID(link);
                        
                        if(ISync:FetchDB(sID, "price")) then
                        
                                --grab the item information from the bag, slot
                                local texture, itemCount, locked, quality, readable = GetContainerItemInfo(bag, slot);
                                
                                --we have to have an item count
                                if(itemCount) then

                                        costOfItem = 0;
                                        costOfItem = tonumber(ISync:FetchDB(sID, "price"));
                                        
                                        --show stacked
                                        if(costOfItem > 0 and itemCount > 0 and ISync:SetVar({"BAGVIEW","SHOWSTACKED"}, 1, "COMPARE")) then
                                                 costOfItem = floor(tonumber(costOfItem) * tonumber(itemCount));
                                        end
                                        
                                        if(not costOfItem or costOfItem < 1 and ISync:SetVar({"BAGVIEW","SHOWNIL"}, 1, "COMPARE")) then
                                                --do nothing cause we want to hide value for this item
                                        else
                                                if(not costOfItem or costOfItem < 1) then costOfItem = 0; end
                                                --insert into table
                                                ISync_BVList[iNew] = { };
                                                ISync_BVList[iNew].name = name;
                                                ISync_BVList[iNew].money = costOfItem;
                                                ISync_BVList[iNew].bag = bag;
                                                ISync_BVList[iNew].slot = slot;
                                                ISync_BVList[iNew].count = itemCount;
                                                ISync_BVList[iNew].quality = tonumber(ISync:FetchDB(sID, "quality"));
                                                ISync_BVList[iNew].texture = texture;
                                                ISync_BVList[iNew].link = link;
                                                ISync_BVList[iNew].coreID = sID;

                                                iNew = iNew + 1;

                                        end
                                        

                                end--if(itemCount) then

                        end--if(name and name ~= "") then


                    end--if (link and link ~= "") then

                end--end for
        end--end for
    
    
        ISync_BVList.onePastEnd = iNew;

        ISync:BV_Sort();
  
  
end


---------------------------------------------------
-- ISync:BV_Sort()
---------------------------------------------------
function ISync:BV_Sort()

        if not ISync_BVList then return; end

        if(ISync:SetVar({"BAGVIEW","SORT_VALUE"}, 1, "COMPARE")) then
                table.sort(ISync_BVList, ISync_BV_SortByValue);
        elseif(ISync:SetVar({"BAGVIEW","SORT_RARITY"}, 1, "COMPARE")) then
                table.sort(ISync_BVList, ISync_BV_SortByRarity);
        else
                table.sort(ISync_BVList, ISync_BV_SortByName);
        end

end


---------------------------------------------------
-- ISync_BV_SortByName
---------------------------------------------------
function ISync_BV_SortByName(a,b)

    return a.name < b.name;
    
end

---------------------------------------------------
-- ISync_BV_SortByValue
---------------------------------------------------
function ISync_BV_SortByValue(a,b)

        if(a.money and b.money) then
                return b.money < a.money;
        end

end

---------------------------------------------------
-- ISync_BV_SortByRarity
---------------------------------------------------
function ISync_BV_SortByRarity(elem1, elem2)

        local color1, color2;

        --get the corresponding quality
        color1 = elem1.quality;
        color2 = elem2.quality
        
        if(color1 and color2) then
        
                if( color1 == color2 ) then
                        return elem1.name < elem2.name;
                end
        
                return color2 < color1;
        
        else
                return nil;
        end
        
end


---------------------------------------------------
-- ISync:BV_UpdateScrollFrame()
---------------------------------------------------
function ISync:BV_UpdateScrollFrame()

        local iItem;

        if (not ISync_BV_Frame:IsVisible()) then return; end
        if (not ISync_BVList) then ISync:BV_BuildIndex(); end --make sure
        if (not ISync_BVList or not ISync_BVList.onePastEnd) then return nil; end

        --start the scroll process
        --15 items and height of 16 each
        FauxScrollFrame_Update(ISync_IC_ScrollFrame, ISync_BVList.onePastEnd - 1, 15, 16);

        --loop through the 15 frames
        for iItem = 1, 15, 1 do

                --grab the current item index and then get the itembar object itself
                local itemIndex = iItem + FauxScrollFrame_GetOffset(ISync_IC_ScrollFrame);
                local ISyncItemObj = getglobal("ISync_BrowseButton"..iItem);

                --if it's still within boundaries then procezz
                if( itemIndex < ISync_BVList.onePastEnd ) then

                        --make sure the item is even in the array and that it has an sID
                        if(ISync_BVList[itemIndex] and ISync_BVList[itemIndex].link) then

                                ISyncItemObj.storeID = ISync_BVList[itemIndex].link;

                                if(ISync_BVList[itemIndex].name) then
                                        getglobal("ISync_BrowseButton"..iItem.."Name"):SetText(ISync_BVList[itemIndex].name);
                                end

                                --set color
                                local color = { };
                                if(ISync_BVList[itemIndex].quality) then
                                        color = ITEM_QUALITY_COLORS[tonumber(ISync_BVList[itemIndex].quality)];
                                        getglobal("ISync_BrowseButton"..iItem.."Name"):SetTextColor(color.r, color.g, color.b);
                                        getglobal("ISync_BrowseButton"..iItem.."Name").r = color.r;
                                        getglobal("ISync_BrowseButton"..iItem.."Name").g = color.g;
                                        getglobal("ISync_BrowseButton"..iItem.."Name").b = color.b;
                                else
                                        getglobal("ISync_BrowseButton"..iItem.."Name").r = 0;
                                        getglobal("ISync_BrowseButton"..iItem.."Name").g = 0;
                                        getglobal("ISync_BrowseButton"..iItem.."Name").b = 0;
                                end


                                local moneyFrame = getglobal("ISync_BrowseButton"..iItem.."MoneyFrame");

                                --set price if available
                                if(ISync_BVList[itemIndex].money and moneyFrame) then

                                        MoneyFrame_Update(moneyFrame:GetName(), ISync_BVList[itemIndex].money);
                                        moneyFrame:Show();
                                end


                                --set texture
                                if(ISync_BVList[itemIndex].texture) then
                                        getglobal("ISync_BrowseButton"..iItem.."ItemIconTexture"):SetTexture(ISync_BVList[itemIndex].texture);
                                end

                                --show stacked items
                                if(ISync_BVList[itemIndex].count > 1 and ISync:SetVar({"BAGVIEW","SHOWSTACKED"}, 1, "COMPARE") == 1) then
                                        getglobal("ISync_BrowseButton"..iItem.."ItemCount"):SetText(ISync_BVList[itemIndex].count);
                                        getglobal("ISync_BrowseButton"..iItem.."ItemCount"):Show();
                                        
                                        --store the count
                                        ISyncItemObj.storeCount = ISync_BVList[itemIndex].count;

                                else
                                        getglobal("ISync_BrowseButton"..iItem.."ItemCount"):Hide();
                                        ISyncItemObj.storeCount = 1; --default
                                end
                                
                                
                                --store the item array in both the item bar and texture
                                ISyncItemObj.itemInfo = ISync_BVList[itemIndex];
                                
                                
                                --show the item
                                ISyncItemObj:Show(); 

                        else
                                --nothing to show then hide it
                                ISyncItemObj:Hide();


                        end

                else
                        --error occured hide it
                        ISyncItemObj:Hide();

                end

        end --end for
        

end



--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------


---------------------------------------------------
-- ISync:BV_ItemEnter()
---------------------------------------------------
function ISync:BV_ItemEnter()
local iItem;

        if(not ISyncDB) then return nil; end
        if(not ISyncDB[ISYNC_REALM_NUM]) then return nil; end
        
        local storeID;
        local sFrame;

        --get the item info
        if(this.itemInfo) then
                iItem = this.itemInfo;
                storeID = this.storeID;
                sFrame = this;
        elseif(this:GetParent():GetName()) then
                iItem = getglobal(this:GetParent():GetName()).itemInfo;
                storeID =  getglobal(this:GetParent():GetName()).storeID;
                sFrame = getglobal(this:GetParent():GetName());
        else
                return nil;
        end
        
        if(not iItem) then return; end

        if(storeID) then
        
                local name_X, link_X, quality_X, minLevel_X, class_X, subclass_X, maxStack_X = GetItemInfo("item:"..storeID);

                if(link_X) then
                
                        --show the sell cursor
                        if(MerchantFrame:IsVisible() and not InRepairMode()) then
                                ShowContainerSellCursor(iItem.bag, iItem.slot);
                        elseif(not MerchantFrame:IsVisible() and InRepairMode()) then
                                ResetCursor();
                        end

                        ISync_BV_Frame.TooltipButton = sFrame:GetID();
                        GameTooltip:SetOwner(sFrame, "ANCHOR_RIGHT");
                        GameTooltip:SetHyperlink(link_X);

                        --update the search information
                        ISync:Do_Parse(UIParent, ISyncTooltip, iItem.coreID, "item:"..storeID);
                        
                        --check counter
                        if(ISync_AddTooltip and sFrame.storeCount) then
                                
                                --update another mod if available
                                ISync:SendtoMods(GameTooltip, name_X, "item:"..storeID, sFrame.storeCount, quality_X);
                                ISync:AddTooltipInfo(GameTooltip, "item:"..storeID, sFrame.storeCount, 1);
                        else
                                --update another mod if available
                                ISync:SendtoMods(GameTooltip, name_X, "item:"..storeID, 1, quality_X);
                                ISync:AddTooltipInfo(GameTooltip, "item:"..storeID, 1, 1);
                        end

                end
                        
        end--end
        
end



---------------------------------------------------
-- ISync:BV_ItemClick()
---------------------------------------------------
function ISync:BV_ItemClick(sButton)
local iItem;

        if(not ISyncDB) then return nil; end
        if(not ISyncDB[ISYNC_REALM_NUM]) then return nil; end

        --get the item info
        if(this.itemInfo) then
                iItem = this.itemInfo;
        elseif(this:GetParent():GetName()) then
                iItem = getglobal(this:GetParent():GetName()).itemInfo;
        else
                iItem = nil;
        end

        if(not iItem) then return; end
        
        --special thanks to Axu for the code :)  Support for AxuItemMenus
        if (AxuItemMenus_EvocationTest and AxuItemMenus_EvocationTest(sButton, "isync")) then
                
                AxuItemMenus_FillFromLink(GetContainerItemLink(iItem.bag, iItem.slot));
                AxuItemMenus_OpenMenu();
        
        elseif sButton == "LeftButton" then
        
                if IsShiftKeyDown() then
                
                    if ChatFrameEditBox:IsVisible() then
                        local link = GetContainerItemLink(iItem.bag, iItem.slot);
                        if link then ChatFrameEditBox:Insert(link); end
                    end
                    
                elseif( IsControlKeyDown()) then

                        DressUpItemLink(GetContainerItemLink(iItem.bag, iItem.slot));
                else
                        PickupContainerItem(iItem.bag, iItem.slot);
                end
                
        elseif sButton == "RightButton" then
                UseContainerItem(iItem.bag, iItem.slot);
        end
        
end