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@115: A.updateCount_throttle() contrebasse@98: end contrebasse@98: end contrebasse@98: A.EventsFrame:SetScript("OnEvent", function(self, event) contrebasse@115: --print("Throttle Scan :",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: 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@113: -- Used for the campfire button only contrebasse@113: A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED") contrebasse@113: A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED") contrebasse@113: 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@115: local CountThrottleFrame = CreateFrame("Frame") contrebasse@115: local COUNT_DELAY = 0.1 contrebasse@115: local t_throttleCount = SCAN_DELAY contrebasse@115: function 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@116: local numMakableMin, numMakableMax, numMakableIsApprox = A.numMakable(reagentID) contrebasse@116: if not numMakableMin then contrebasse@111: label:SetText("?") contrebasse@111: label:SetTextColor(0, 0.5, 1, 1) -- blue contrebasse@98: else contrebasse@116: local txt = numMakableIsApprox and "~" or "" contrebasse@116: if numMakableMin == numMakableMax then contrebasse@116: label:SetFormattedText("%s%.2g",txt,numMakableMin) contrebasse@116: else contrebasse@116: label:SetFormattedText("%s%.2g-%.2g",txt,numMakableMin,numMakableMax) contrebasse@116: end contrebasse@116: if numMakableMax==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@115: local function throttleCount(self, t_elapsed) contrebasse@115: t_throttle = t_throttle - t_elapsed contrebasse@115: if t_throttle<0 then contrebasse@115: self:SetScript("OnUpdate", nil) contrebasse@115: contrebasse@115: -- Show makables reagents contrebasse@115: UpdateCounts(GetTradeSkillSelectionIndex()) contrebasse@115: end contrebasse@115: end contrebasse@115: function A.updateCount_throttle(self,event) contrebasse@115: if not TradeSkillFrame or not TradeSkillFrame:IsVisible() or event=="TRADE_SKILL_CLOSE" then contrebasse@115: CountThrottleFrame:UnregisterEvent("BAG_UPDATE") contrebasse@115: t_throttleCount = 0 contrebasse@115: CountThrottleFrame:SetScript("OnUpdate", nil) contrebasse@115: return contrebasse@115: else contrebasse@115: CountThrottleFrame:RegisterEvent("BAG_UPDATE") contrebasse@115: end contrebasse@115: t_throttleCount = SCAN_DELAY contrebasse@115: CountThrottleFrame:SetScript("OnUpdate", throttleCount) contrebasse@115: contrebasse@115: A.MenuFrame.updateCounts() contrebasse@115: end contrebasse@115: CountThrottleFrame:SetScript("OnEvent", A.updateCount_throttle) contrebasse@115: CountThrottleFrame:RegisterEvent("TRADE_SKILL_SHOW") contrebasse@115: CountThrottleFrame:RegisterEvent("TRADE_SKILL_UPDATE") contrebasse@115: CountThrottleFrame:RegisterEvent("TRADE_SKILL_CLOSE") contrebasse@115: hooksecurefunc("SelectTradeSkill",A.updateCount_throttle)