vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
function KC_LW(frame,link)
        local self = KC_Tooltip

        self.fmerge = true
        self.curlink = link
        self.itemEntered = true
        self:DisplayInfo(frame, link, 1)
end

local locals = KC_ITEMS_LOCALS.modules.tooltip

local linkFuncs = {
        SetAuctionItem          = GetAuctionItemLink,
        SetBagItem                      = GetContainerItemLink,
        SetCraftItem            = function(skill, id) return (id) and GetCraftReagentItemLink(skill, id) or GetCraftItemLink(skill) end,
        SetHyperlink            = function(link) return link end,
        SetInventoryItem        = function(type, slot) if (not this) then return end return (type) and GetInventoryItemLink(type, slot) or GetContainerItemLink(BANK_CONTAINER,this:GetID()) end,
        SetLootItem                     = GetLootSlotLink,
        SetMerchantItem         = GetMerchantItemLink,
        SetQuestItem            = GetQuestItemLink,
        SetQuestLogItem         = GetQuestLogItemLink,
        SetTradePlayerItem      = GetTradePlayerItemLink,
        SetTradeSkillItem       = function(skill, id) return (id) and GetTradeSkillReagentItemLink(skill, id) or GetTradeSkillItemLink(skill) end,
        SetTradeTargetItem      = GetTradeTargetItemLink,
}

local qtyFuncs = {
        SetAuctionItem          = function(type, slot) local _,_,qty = GetAuctionItemInfo(type, slot); return qty; end,
        SetBagItem                      = function(bag, slot) local _, qty = GetContainerItemInfo(bag, slot); return qty;  end,
        SetCraftItem            = function(skill, id) if (id) then local _, _, qty = GetCraftReagentInfo(skill, id); return qty else local info = KC_Items.common:GetItemInfo(KC_Items.common:GetCode(GetCraftItemLink(skill))); if (info) then return info["maxstack"] else return 1 end end end,
        SetHyperlink            = function() return 1 end,
        SetInventoryItem        = function(type, slot) if (not this) then return end if (type) then return GetInventoryItemCount(type, slot) else local _, qty = GetContainerItemInfo(BANK_CONTAINER,this:GetID()); return qty; end end,
        SetLootItem                     = function(slot) local _,_, qty = GetLootSlotInfo(slot); return qty; end,
        SetMerchantItem         = function(id) local _,_,_, qty = GetMerchantItemInfo(id); return qty; end,
        SetQuestItem            = function(type, slot) local _,_, qty = GetQuestItemInfo(type, slot); return qty; end,
        SetQuestLogItem         = function(type, slot) return 1 end,
        SetTradePlayerItem      = function(id) local _,_, qty = GetTradeTargetItemInfo(id); return qty; end,
        SetTradeSkillItem       = function(skill, id) if (id) then local _, _, qty = GetTradeSkillReagentInfo(skill, id); return qty else local info = KC_Items.common:GetItemInfo(KC_Items.common:GetCode(GetTradeSkillItemLink(skill))); if (info) then return info["maxstack"] else return 1 end end end,
        SetTradeTargetItem      = function(id) local _,_, qty = GetTradeTargetItemInfo(id); return qty; end,
}


KC_Tooltip = KC_ItemsModule:new({
        type             = "tooltip",
        name             = locals.name,
        desc             = locals.description,
        cmdOptions       = locals.chat,
        dependencies = {"common"},
        optPath          = {"tooltip", "options"},
})

KC_Items:Register(KC_Tooltip)

function KC_Tooltip:Enable()
        self:HookTooltips()
        
        if (IsAddOnLoaded('LinkWrangler')) then
                LINK_WRANGLER_CALLER['KC_Items'] = 'KC_LW'
        else
                self:Hook("SetItemRef")
        end

        self:Hook("GameTooltip_OnHide")
        self:Hook("GameTooltip_ClearMoney")
        self:HookScript(ItemRefTooltip, "OnHide", "ItemRefTooltip_OnHide")
end

function KC_Tooltip:GameTooltip_OnHide()
    self.Hooks["GameTooltip_OnHide"].orig()
        self:OnHide()
        KCTooltip:Hide()
        for i=1, 20 do
                getglobal("KCTooltipMoneyFrame" .. i):Hide()
                getglobal("GameTooltipMoneyFrame" .. i):Hide()
        end
end

function KC_Tooltip:ItemRefTooltip_OnHide()
    self.Hooks[ItemRefTooltip]["OnHide"].orig()
        self:OnHide()
        KCItemRef:Hide()
        for i=1, 20 do
                getglobal("KCItemRefMoneyFrame" .. i):Hide()
                getglobal("ItemRefTooltipMoneyFrame" .. i):Hide()
        end
end

function KC_Tooltip:OnHide()
    self.itemEntered = false
    self.priceAdded  = false
        self.sepneeded   = false
        self.showneeded  = false
end

function KC_Tooltip:GameTooltip_ClearMoney()
    self.Hooks["GameTooltip_ClearMoney"].orig()
    self.priceAdded = false
end

function KC_Tooltip:SetItemRef(link, text, button)
        self.Hooks["SetItemRef"].orig(link, text, button)
        if (not strfind(link, "item") or IsControlKeyDown() or IsShiftKeyDown()) then return; end

        if (self.curlink == link) then
                KCItemRef:Hide()
                self.curlink = nil
        else
                self.curlink = link
                self.itemEntered = true
                self:DisplayInfo(ItemRefTooltip, link, 1)
        end
end

function KC_Tooltip:HookTooltips()
        for key, value in linkFuncs do
        local orig, linkFunc = key,value
                local qtyFunc = qtyFuncs[key]

                local func = function(tooltip,a,b,c)
                        local r1,r2,r3 = self.Hooks[tooltip][orig].orig(tooltip,a,b,c)
                        self.itemEntered = true
                        self:DisplayInfo(tooltip,linkFunc(a,b,c),qtyFunc(a,b,c))
                        return r1,r2,r3
                end
                self:Hook(GameTooltip,orig,func)
        end
end

function KC_Tooltip:DisplayInfo(tooltip, link, qty)
        if( (not self.itemEntered) or self.priceAdded or not tooltip or not link or not self._funcs) then return end

        local mode  = self:GetOpt(self.optPath, "separated")
        local sep   = self:GetOpt(self.optPath, "separator")
        local code  = self.common:GetCode(link)
        local lcode = self.common:GetCode(link, true)
        local info  = self.common:GetItemInfo(code)
        local moneyframe = self:GetOpt(self.optPath, "moneyframe")
        local targetTooltip
 
        if (mode and not self.fmerge) then
                targetTooltip = (tooltip == GameTooltip) and KCTooltip or KCItemRef
                targetTooltip:ClearLines()
                targetTooltip:SetScale(1)
                targetTooltip:SetOwner(tooltip, "ANCHOR_NONE")
                targetTooltip:SetPoint("TOPLEFT", tooltip, "BOTTOMLEFT")
                targetTooltip:AddLine(format("%s x %s", info["name"] or "", qty)) 
        else 
                targetTooltip = tooltip
                self.sepneeded = true
        end

        for i = 1, 20 do
                getglobal("KCTooltipMoneyFrame" .. i):Hide()
                getglobal("KCItemRefMoneyFrame" .. i):Hide()
                getglobal("GameTooltipMoneyFrame" .. i):Hide()
                getglobal("ItemRefTooltipMoneyFrame" .. i):Hide()
        end

        for index, func in self._funcs do
                if (sep and self.sepneeded) then targetTooltip:AddLine(" ", 0, 0, 0); self.sepneeded = false end
                self.sepneeded = false
                func(targetTooltip, code, lcode, qty, self)
                if (sep and self.sepneeded) then targetTooltip:AddLine(" ", 0, 0, 0); self.sepneeded = false end
        end

        if (self.showneeded) then targetTooltip:Show(); self.showneeded = false; end


        if (moneyframe and targetTooltip:GetWidth() < (self.mWidth or 0)) then
                targetTooltip:SetWidth(self.mWidth or 0)
                self.mWidth = nil
        end
        if (mode and targetTooltip:GetWidth() < tooltip:GetWidth()) then
                targetTooltip:SetWidth(tooltip:GetWidth())
        end
        
        self.fmerge = nil
end

function KC_Tooltip:RegisterFunc(addon, func)
        if (not self._funcs) then self._funcs = {}; end
        self._funcs[tostring(addon) .. "->" .. func] = ace:call(addon,func)
end

function KC_Tooltip:UnregisterFunc(addon, func)
        if (not self._funcs) then return end
        self._funcs[tostring(addon) .. "->" .. func] = nil
end

function KC_Tooltip:AddPriceLine(tooltip, amt, label, sep, sepcolor)
        local splitline  = self:GetOpt(self.optPath, "splitline")
        local moneyframe = self:GetOpt(self.optPath, "moneyframe")
        local pricetext  = self.common:CashTextLetters(amt)
        
        if (moneyframe and not self.fmerge) then
                tooltip:AddDoubleLine(label, " ", 1, 1, 1, 1, 1, 1)

                local numLines = tooltip:NumLines()
                local moneyFrame = getglobal(tooltip:GetName() .. "MoneyFrame" .. numLines)
                moneyFrame:SetPoint("RIGHT", tooltip:GetName(), "RIGHT", 0, 0)
                moneyFrame:SetPoint("TOP", tooltip:GetName() .. "TextLeft".. numLines, "TOP", 0, 0)
                moneyFrame:Show()
                MoneyFrame_Update(moneyFrame:GetName(), floor(amt))
                
                local width = moneyFrame:GetWidth() + getglobal(tooltip:GetName() .. "TextLeft".. numLines):GetWidth() + 25
                self.mWidth = width > (self.mWidth or 0) and width or self.mWidth
        elseif (splitline) then
                tooltip:AddDoubleLine(label, pricetext, 1, 1, 1, 1, 1, 1)
        else            
                sep = ace.trim(sep or ""); sep = format(" %s%s |r", sepcolor, sep)
                tooltip:AddLine(format("%s%s%s", label, sep, pricetext), 1, 1, 1)
        end

        self.sepneeded  = true
        self.showneeded = true
end

function KC_Tooltip:AddTextLine(tooltip, left, right, sep, sepcolor)
        local splitline = self:GetOpt(self.optPath, "splitline")

        if (splitline) then
                tooltip:AddDoubleLine(left, right, 1, 1, 1, 1, 1, 1)
        else
                sep = ace.trim(sep or ""); sep = format(" %s%s |r", sepcolor or "", sep or "")
                tooltip:AddLine(format("%s%s%s", left, sep, right or ""), 1, 1, 1);
        end
        
        local numLines = tooltip:NumLines()
        local width = getglobal(tooltip:GetName() .. "TextRight".. numLines):GetWidth() + getglobal(tooltip:GetName() .. "TextLeft".. numLines):GetWidth() + 25
        self.mWidth = width > (self.mWidth or 0) and width or self.mWidth

        self.sepneeded  = true
        self.showneeded = true
end