contrebasse@98: local addonName, A = ... contrebasse@98: contrebasse@111: -- @todo add support for cross tradeskill, like mining + forge/ingé contrebasse@98: -- @todo add support for dez ? contrebasse@111: -- @todo scroll to the selected recipe on opening ? contrebasse@111: -- @todo add a button to clear search ? contrebasse@111: contrebasse@111: -- @bug Enter when choosing number of crafts contrebasse@98: contrebasse@98: --------------------------------------------------- contrebasse@98: -- Variables contrebasse@98: --------------------------------------------------- contrebasse@98: -- Used by findglobals contrebasse@111: -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME, UIParent contrebasse@98: contrebasse@98: -- Lua functions contrebasse@98: contrebasse@98: -- Wow functions contrebasse@111: local GetTradeSkillLine = GetTradeSkillLine contrebasse@111: local IsTradeSkillGuild = IsTradeSkillGuild contrebasse@111: local IsTradeSkillLinked = IsTradeSkillLinked contrebasse@111: local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex contrebasse@111: local GetTradeSkillNumReagents = GetTradeSkillNumReagents contrebasse@111: local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink contrebasse@98: contrebasse@98: -- constant vars contrebasse@111: local GameTooltip = GameTooltip contrebasse@98: contrebasse@98: --------------------------------------------------- contrebasse@111: -- Manage events and throttling contrebasse@98: --------------------------------------------------- contrebasse@98: A.EventsFrame = CreateFrame("Frame") contrebasse@98: contrebasse@98: local SCAN_DELAY = 0.2 contrebasse@98: local t_throttle = SCAN_DELAY contrebasse@98: local function throttleScan(self, t_elapsed) contrebasse@98: t_throttle = t_throttle - t_elapsed contrebasse@98: if t_throttle<0 then contrebasse@98: self:SetScript("OnUpdate", nil) contrebasse@98: contrebasse@98: -- Close the external window if the tradeskill changed contrebasse@98: if A.currentTradeSkill ~= GetTradeSkillLine() then contrebasse@98: A.MenuFrame:Hide() contrebasse@98: end contrebasse@98: if IsTradeSkillGuild() or IsTradeSkillLinked() then contrebasse@98: A.MenuFrame:Hide() contrebasse@98: return contrebasse@98: end contrebasse@98: contrebasse@98: -- Scan availabe recipes contrebasse@98: -- Rescan in case of problem contrebasse@98: if not A:ScanSimpleRecipes() then contrebasse@98: t_throttle = SCAN_DELAY contrebasse@98: self:SetScript("OnUpdate", throttleScan) contrebasse@98: end contrebasse@98: contrebasse@98: -- Show makables reagents contrebasse@98: A.updateCounts(GetTradeSkillSelectionIndex()) contrebasse@98: end contrebasse@98: end contrebasse@98: A.EventsFrame:SetScript("OnEvent", function(self, event) contrebasse@98: if event == "TRADE_SKILL_UPDATE" then contrebasse@98: t_throttle = SCAN_DELAY contrebasse@98: self:SetScript("OnUpdate", throttleScan) contrebasse@101: A.ManageCampFireBtn() contrebasse@101: contrebasse@101: elseif event == "PLAYER_REGEN_DISABLED" then contrebasse@101: A.HideCampFireBtn() contrebasse@111: contrebasse@101: elseif event == "PLAYER_REGEN_ENABLED" then contrebasse@101: A.ManageCampFireBtn() contrebasse@98: contrebasse@98: elseif event == "TRADE_SKILL_SHOW" then contrebasse@98: A:Initialize() contrebasse@98: A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW") contrebasse@98: end -- if contrebasse@98: end) -- function contrebasse@111: contrebasse@111: --@todo Unregister events when not needed contrebasse@98: A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") contrebasse@98: A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") contrebasse@98: A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED") contrebasse@98: A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED") contrebasse@98: contrebasse@111: contrebasse@98: --------------------------------------------------- contrebasse@98: -- Initialize contrebasse@98: --------------------------------------------------- contrebasse@98: function A:Initialize() contrebasse@98: contrebasse@98: -- Register clics on reagent's buttons contrebasse@98: for i=1,7 do contrebasse@98: local btn = _G["TradeSkillReagent"..i] contrebasse@98: btn:HookScript("OnDoubleClick", A.ProcessReagent) contrebasse@98: btn:HookScript("OnEnter", A.btnEntered) contrebasse@98: btn:HookScript("OnLeave", A.btnLeft) contrebasse@98: btn.SplitStack = A.SplitStack contrebasse@98: contrebasse@98: local textureHighlight = btn:CreateTexture() contrebasse@98: textureHighlight:Hide() contrebasse@98: textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight") contrebasse@110: --textureHighlight:SetTexture("Interface\\BUTTONS\\ButtonHilight-Square") contrebasse@98: textureHighlight:SetBlendMode("ADD") contrebasse@98: textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture") contrebasse@98: btn.textureHighlight = textureHighlight contrebasse@98: contrebasse@98: local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight") contrebasse@98: label:SetSize(100,20) contrebasse@98: label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4) contrebasse@98: label:SetJustifyH("LEFT") contrebasse@98: label:SetJustifyV("TOP") contrebasse@98: label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE") contrebasse@98: btn.label = label contrebasse@98: end -- for contrebasse@98: contrebasse@98: -- Secondary Tooltip contrebasse@98: A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate") contrebasse@98: A.tooltipRecipe:SetFrameStrata("TOOLTIP") contrebasse@98: A.tooltipRecipe:Hide() contrebasse@101: contrebasse@98: -- Button for enchanting directy on a scroll contrebasse@98: A.LoadEnchantOnScroll() contrebasse@98: end -- function contrebasse@98: contrebasse@98: --------------------------------------------------- contrebasse@111: -- Dynamic display contrebasse@98: --------------------------------------------------- contrebasse@111: -- Button hovering (entered) contrebasse@98: function A.btnEntered(btn) contrebasse@98: -- Do not manage guild tradeskill contrebasse@98: if IsTradeSkillGuild() or IsTradeSkillLinked() then return end contrebasse@98: contrebasse@98: -- Index of the reagent in the recipe, taken from the button name contrebasse@111: local reagentIndexInRecipe = A.buttonNumber(btn) contrebasse@98: contrebasse@98: -- ID of the reagent we want to craft contrebasse@111: local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentIndexInRecipe) contrebasse@98: local reagentID = A.link2ID(reagentLink) contrebasse@98: contrebasse@98: -- Continue only if the reagent is known contrebasse@98: if not reagentID or not A.data[reagentID] then return end contrebasse@98: contrebasse@98: btn.textureHighlight:Show() contrebasse@98: contrebasse@98: -- Check if the item is made by only one recipe. If not, return contrebasse@98: if not A.isRecipeUnique(A.data[reagentID]) then return end contrebasse@98: contrebasse@98: -- Tooltips contrebasse@98: local link = A.data[reagentID][1].spellLink contrebasse@98: if link then contrebasse@98: A.tooltipRecipe:SetOwner(btn) contrebasse@98: A.tooltipRecipe:SetHyperlink(link) contrebasse@98: A.tooltipRecipe:Show() contrebasse@98: A.tooltipRecipe:ClearAllPoints() contrebasse@98: A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") contrebasse@98: end contrebasse@98: end contrebasse@98: contrebasse@111: -- Button hovering (left) contrebasse@98: function A.btnLeft(btn) contrebasse@98: btn.textureHighlight:Hide() contrebasse@98: A.tooltipRecipe:Hide() contrebasse@98: end -- function contrebasse@98: contrebasse@111: -- Show counts on buttons contrebasse@98: function A.updateCounts(recipeIndex) contrebasse@98: -- Needs an argument contrebasse@98: if not recipeIndex then return end contrebasse@98: contrebasse@98: -- Do not manage guild tradeskill contrebasse@98: if IsTradeSkillGuild() or IsTradeSkillLinked() then contrebasse@111: for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do contrebasse@98: -- If the normal tradeskill hasn't been opened yet, the field 'label' doesn't exists yet contrebasse@111: local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label contrebasse@98: if label then contrebasse@98: label:Hide() contrebasse@98: end contrebasse@98: end contrebasse@98: return contrebasse@98: end contrebasse@98: contrebasse@98: -- Count makable items and show it contrebasse@111: for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do contrebasse@98: -- ID of the reagent we want to craft contrebasse@111: local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentIndexInRecipe)) contrebasse@98: contrebasse@111: local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label contrebasse@111: if label then contrebasse@111: -- Continue only if the reagent is known contrebasse@111: if not reagentID or not A.data[reagentID] then contrebasse@111: label:Hide() contrebasse@98: else contrebasse@111: -- Count and show contrebasse@111: local numMakable = A.numMakable(reagentID) contrebasse@111: if not numMakable then contrebasse@111: label:SetText("?") contrebasse@111: label:SetTextColor(0, 0.5, 1, 1) -- blue contrebasse@98: else contrebasse@111: label:SetText(numMakable) contrebasse@111: if numMakable==0 then contrebasse@111: label:SetTextColor(1, 0, 0, 1) -- red contrebasse@111: else contrebasse@111: label:SetTextColor(0, 1, 0, 1) -- green contrebasse@111: end contrebasse@111: end -- if contrebasse@111: label:Show() contrebasse@98: end -- if contrebasse@98: end -- if contrebasse@98: end -- for contrebasse@98: end -- function contrebasse@98: hooksecurefunc("SelectTradeSkill",A.updateCounts)