| contrebasse@98 | 1 local addonName, A = ... | 
| contrebasse@98 | 2 | 
| contrebasse@111 | 3 -- @todo add support for cross tradeskill, like mining + forge/ingé | 
| contrebasse@98 | 4 -- @todo add support for dez ? | 
| contrebasse@111 | 5 -- @todo scroll to the selected recipe on opening ? | 
| contrebasse@111 | 6 -- @todo add a button to clear search ? | 
| contrebasse@111 | 7 | 
| contrebasse@111 | 8 -- @bug Enter when choosing number of crafts | 
| contrebasse@98 | 9 | 
| contrebasse@98 | 10 --------------------------------------------------- | 
| contrebasse@98 | 11 -- Variables | 
| contrebasse@98 | 12 --------------------------------------------------- | 
| contrebasse@98 | 13 -- Used by findglobals | 
| contrebasse@111 | 14 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME, UIParent | 
| contrebasse@98 | 15 | 
| contrebasse@98 | 16 -- Lua functions | 
| contrebasse@98 | 17 | 
| contrebasse@98 | 18 -- Wow functions | 
| contrebasse@111 | 19 local GetTradeSkillLine = GetTradeSkillLine | 
| contrebasse@111 | 20 local IsTradeSkillGuild = IsTradeSkillGuild | 
| contrebasse@111 | 21 local IsTradeSkillLinked = IsTradeSkillLinked | 
| contrebasse@111 | 22 local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex | 
| contrebasse@111 | 23 local GetTradeSkillNumReagents = GetTradeSkillNumReagents | 
| contrebasse@111 | 24 local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink | 
| contrebasse@98 | 25 | 
| contrebasse@98 | 26 -- constant vars | 
| contrebasse@111 | 27 local GameTooltip = GameTooltip | 
| contrebasse@98 | 28 | 
| contrebasse@98 | 29 --------------------------------------------------- | 
| contrebasse@111 | 30 -- Manage events and throttling | 
| contrebasse@98 | 31 --------------------------------------------------- | 
| contrebasse@98 | 32 A.EventsFrame = CreateFrame("Frame") | 
| contrebasse@98 | 33 | 
| contrebasse@98 | 34 local SCAN_DELAY = 0.2 | 
| contrebasse@98 | 35 local t_throttle = SCAN_DELAY | 
| contrebasse@98 | 36 local function throttleScan(self, t_elapsed) | 
| contrebasse@98 | 37 	t_throttle = t_throttle - t_elapsed | 
| contrebasse@98 | 38 	if t_throttle<0 then | 
| contrebasse@98 | 39 		self:SetScript("OnUpdate", nil) | 
| contrebasse@98 | 40 | 
| contrebasse@98 | 41 		-- Close the external window if the tradeskill changed | 
| contrebasse@98 | 42 		if A.currentTradeSkill ~= GetTradeSkillLine() then | 
| contrebasse@98 | 43 			A.MenuFrame:Hide() | 
| contrebasse@98 | 44 		end | 
| contrebasse@98 | 45 		if IsTradeSkillGuild() or IsTradeSkillLinked() then | 
| contrebasse@98 | 46 			A.MenuFrame:Hide() | 
| contrebasse@98 | 47 			return | 
| contrebasse@98 | 48 		end | 
| contrebasse@98 | 49 | 
| contrebasse@98 | 50 		-- Scan availabe recipes | 
| contrebasse@98 | 51 		-- Rescan in case of problem | 
| contrebasse@98 | 52 		if not A:ScanSimpleRecipes() then | 
| contrebasse@98 | 53 			t_throttle = SCAN_DELAY | 
| contrebasse@98 | 54 			self:SetScript("OnUpdate", throttleScan) | 
| contrebasse@98 | 55 		end | 
| contrebasse@98 | 56 | 
| contrebasse@98 | 57 		-- Show makables reagents | 
| contrebasse@115 | 58 		A.updateCount_throttle() | 
| contrebasse@98 | 59 	end | 
| contrebasse@98 | 60 end | 
| contrebasse@98 | 61 A.EventsFrame:SetScript("OnEvent", function(self, event) | 
| contrebasse@98 | 62 	if event == "TRADE_SKILL_UPDATE" then | 
| contrebasse@98 | 63 		t_throttle = SCAN_DELAY | 
| contrebasse@98 | 64 		self:SetScript("OnUpdate", throttleScan) | 
| contrebasse@101 | 65 		A.ManageCampFireBtn() | 
| contrebasse@101 | 66 | 
| contrebasse@101 | 67 	elseif event == "PLAYER_REGEN_DISABLED" then | 
| contrebasse@101 | 68 		A.HideCampFireBtn() | 
| contrebasse@111 | 69 | 
| contrebasse@101 | 70 	elseif event == "PLAYER_REGEN_ENABLED" then | 
| contrebasse@101 | 71 		A.ManageCampFireBtn() | 
| contrebasse@98 | 72 | 
| contrebasse@98 | 73 	elseif event == "TRADE_SKILL_SHOW" then | 
| contrebasse@98 | 74 		A:Initialize() | 
| contrebasse@98 | 75 		A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW") | 
| contrebasse@98 | 76 	end -- if | 
| contrebasse@98 | 77 end) -- function | 
| contrebasse@111 | 78 | 
| contrebasse@98 | 79 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") | 
| contrebasse@98 | 80 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") | 
| contrebasse@98 | 81 | 
| contrebasse@111 | 82 | 
| contrebasse@98 | 83 --------------------------------------------------- | 
| contrebasse@98 | 84 -- Initialize | 
| contrebasse@98 | 85 --------------------------------------------------- | 
| contrebasse@98 | 86 function A:Initialize() | 
| contrebasse@98 | 87 | 
| contrebasse@98 | 88 	-- Register clics on reagent's buttons | 
| contrebasse@98 | 89 	for i=1,7 do | 
| contrebasse@98 | 90 		local btn = _G["TradeSkillReagent"..i] | 
| contrebasse@98 | 91 		btn:HookScript("OnDoubleClick", A.ProcessReagent) | 
| contrebasse@98 | 92 		btn:HookScript("OnEnter", A.btnEntered) | 
| contrebasse@98 | 93 		btn:HookScript("OnLeave", A.btnLeft) | 
| contrebasse@98 | 94 		btn.SplitStack = A.SplitStack | 
| contrebasse@98 | 95 | 
| contrebasse@98 | 96 		local textureHighlight = btn:CreateTexture() | 
| contrebasse@98 | 97 		textureHighlight:Hide() | 
| contrebasse@98 | 98 		textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight") | 
| contrebasse@110 | 99 		--textureHighlight:SetTexture("Interface\\BUTTONS\\ButtonHilight-Square") | 
| contrebasse@98 | 100 		textureHighlight:SetBlendMode("ADD") | 
| contrebasse@98 | 101 		textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture") | 
| contrebasse@98 | 102 		btn.textureHighlight = textureHighlight | 
| contrebasse@98 | 103 | 
| contrebasse@98 | 104 		local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight") | 
| contrebasse@98 | 105 		label:SetSize(100,20) | 
| contrebasse@98 | 106 		label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4) | 
| contrebasse@98 | 107 		label:SetJustifyH("LEFT") | 
| contrebasse@98 | 108 		label:SetJustifyV("TOP") | 
| contrebasse@98 | 109 		label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE") | 
| contrebasse@98 | 110 		btn.label = label | 
| contrebasse@98 | 111 	end -- for | 
| contrebasse@98 | 112 | 
| contrebasse@98 | 113 	-- Secondary Tooltip | 
| contrebasse@98 | 114 	A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate") | 
| contrebasse@98 | 115 	A.tooltipRecipe:SetFrameStrata("TOOLTIP") | 
| contrebasse@98 | 116 	A.tooltipRecipe:Hide() | 
| contrebasse@101 | 117 | 
| contrebasse@113 | 118 	-- Used for the campfire button only | 
| contrebasse@113 | 119 	A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED") | 
| contrebasse@113 | 120 	A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED") | 
| contrebasse@113 | 121 | 
| contrebasse@98 | 122 	-- Button for enchanting directy on a scroll | 
| contrebasse@98 | 123 	A.LoadEnchantOnScroll() | 
| contrebasse@98 | 124 end -- function | 
| contrebasse@98 | 125 | 
| contrebasse@98 | 126 --------------------------------------------------- | 
| contrebasse@111 | 127 -- Dynamic display | 
| contrebasse@98 | 128 --------------------------------------------------- | 
| contrebasse@111 | 129 -- Button hovering (entered) | 
| contrebasse@98 | 130 function A.btnEntered(btn) | 
| contrebasse@98 | 131 	-- Do not manage guild tradeskill | 
| contrebasse@98 | 132 	if IsTradeSkillGuild() or IsTradeSkillLinked() then return end | 
| contrebasse@98 | 133 | 
| contrebasse@98 | 134 	-- Index of the reagent in the recipe, taken from the button name | 
| contrebasse@111 | 135 	local reagentIndexInRecipe = A.buttonNumber(btn) | 
| contrebasse@98 | 136 | 
| contrebasse@98 | 137 	-- ID of the reagent we want to craft | 
| contrebasse@111 | 138 	local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentIndexInRecipe) | 
| contrebasse@98 | 139 	local reagentID = A.link2ID(reagentLink) | 
| contrebasse@98 | 140 | 
| contrebasse@98 | 141 	-- Continue only if the reagent is known | 
| contrebasse@98 | 142 	if not reagentID or not A.data[reagentID] then return end | 
| contrebasse@98 | 143 | 
| contrebasse@98 | 144 	btn.textureHighlight:Show() | 
| contrebasse@98 | 145 | 
| contrebasse@98 | 146 	-- Check if the item is made by only one recipe. If not, return | 
| contrebasse@98 | 147 	if not A.isRecipeUnique(A.data[reagentID]) then return end | 
| contrebasse@98 | 148 | 
| contrebasse@98 | 149 	-- Tooltips | 
| contrebasse@98 | 150 	local link = A.data[reagentID][1].spellLink | 
| contrebasse@98 | 151 	if link then | 
| contrebasse@98 | 152 		A.tooltipRecipe:SetOwner(btn) | 
| contrebasse@98 | 153 		A.tooltipRecipe:SetHyperlink(link) | 
| contrebasse@98 | 154 		A.tooltipRecipe:Show() | 
| contrebasse@98 | 155 		A.tooltipRecipe:ClearAllPoints() | 
| contrebasse@98 | 156 		A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") | 
| contrebasse@98 | 157 	end | 
| contrebasse@98 | 158 end | 
| contrebasse@98 | 159 | 
| contrebasse@111 | 160 -- Button hovering (left) | 
| contrebasse@98 | 161 function A.btnLeft(btn) | 
| contrebasse@98 | 162 	btn.textureHighlight:Hide() | 
| contrebasse@98 | 163 	A.tooltipRecipe:Hide() | 
| contrebasse@98 | 164 end -- function | 
| contrebasse@98 | 165 | 
| contrebasse@111 | 166 -- Show counts on buttons | 
| contrebasse@115 | 167 local CountThrottleFrame = CreateFrame("Frame") | 
| contrebasse@115 | 168 local COUNT_DELAY = 0.1 | 
| contrebasse@115 | 169 local t_throttleCount = SCAN_DELAY | 
| contrebasse@115 | 170 function UpdateCounts(recipeIndex) | 
| contrebasse@98 | 171 	-- Needs an argument | 
| contrebasse@98 | 172 	if not recipeIndex then return end | 
| contrebasse@98 | 173 | 
| contrebasse@98 | 174 	-- Do not manage guild tradeskill | 
| contrebasse@98 | 175 	if IsTradeSkillGuild() or IsTradeSkillLinked() then | 
| contrebasse@111 | 176 		for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do | 
| contrebasse@98 | 177 			-- If the normal tradeskill hasn't been opened yet, the field 'label' doesn't exists yet | 
| contrebasse@111 | 178 			local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label | 
| contrebasse@98 | 179 			if label then | 
| contrebasse@98 | 180 				label:Hide() | 
| contrebasse@98 | 181 			end | 
| contrebasse@98 | 182 		end | 
| contrebasse@98 | 183 		return | 
| contrebasse@98 | 184 	end | 
| contrebasse@98 | 185 | 
| contrebasse@98 | 186 	-- Count makable items and show it | 
| contrebasse@111 | 187 	for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do | 
| contrebasse@98 | 188 		-- ID of the reagent we want to craft | 
| contrebasse@111 | 189 		local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentIndexInRecipe)) | 
| contrebasse@98 | 190 | 
| contrebasse@111 | 191 		local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label | 
| contrebasse@111 | 192 		if label then | 
| contrebasse@111 | 193 			-- Continue only if the reagent is known | 
| contrebasse@111 | 194 			if not reagentID or not A.data[reagentID] then | 
| contrebasse@111 | 195 				label:Hide() | 
| contrebasse@98 | 196 			else | 
| contrebasse@111 | 197 				-- Count and show | 
| contrebasse@116 | 198 				local numMakableMin, numMakableMax, numMakableIsApprox = A.numMakable(reagentID) | 
| contrebasse@116 | 199 				if not numMakableMin then | 
| contrebasse@111 | 200 					label:SetText("?") | 
| contrebasse@111 | 201 					label:SetTextColor(0, 0.5, 1, 1) -- blue | 
| contrebasse@98 | 202 				else | 
| contrebasse@116 | 203 					local txt = numMakableIsApprox and "~" or "" | 
| contrebasse@116 | 204 					if numMakableMin == numMakableMax then | 
| contrebasse@116 | 205 						label:SetFormattedText("%s%.2g",txt,numMakableMin) | 
| contrebasse@116 | 206 					else | 
| contrebasse@116 | 207 						label:SetFormattedText("%s%.2g-%.2g",txt,numMakableMin,numMakableMax) | 
| contrebasse@116 | 208 					end | 
| contrebasse@116 | 209 					if numMakableMax==0 then | 
| contrebasse@111 | 210 						label:SetTextColor(1, 0, 0, 1) -- red | 
| contrebasse@111 | 211 					else | 
| contrebasse@111 | 212 						label:SetTextColor(0, 1, 0, 1) -- green | 
| contrebasse@111 | 213 					end | 
| contrebasse@111 | 214 				end -- if | 
| contrebasse@111 | 215 				label:Show() | 
| contrebasse@98 | 216 			end -- if | 
| contrebasse@98 | 217 		end -- if | 
| contrebasse@98 | 218 	end -- for | 
| contrebasse@98 | 219 end -- function | 
| contrebasse@115 | 220 local function throttleCount(self, t_elapsed) | 
| contrebasse@115 | 221 	t_throttle = t_throttle - t_elapsed | 
| contrebasse@115 | 222 	if t_throttle<0 then | 
| contrebasse@115 | 223 		self:SetScript("OnUpdate", nil) | 
| contrebasse@115 | 224 | 
| contrebasse@115 | 225 		-- Show makables reagents | 
| contrebasse@115 | 226 		UpdateCounts(GetTradeSkillSelectionIndex()) | 
| contrebasse@115 | 227 	end | 
| contrebasse@115 | 228 end | 
| contrebasse@115 | 229 function A.updateCount_throttle(self,event) | 
| contrebasse@115 | 230 	if not TradeSkillFrame or not TradeSkillFrame:IsVisible() or event=="TRADE_SKILL_CLOSE" then | 
| contrebasse@115 | 231 		CountThrottleFrame:UnregisterEvent("BAG_UPDATE") | 
| contrebasse@115 | 232 		t_throttleCount = 0 | 
| contrebasse@115 | 233 		CountThrottleFrame:SetScript("OnUpdate", nil) | 
| contrebasse@115 | 234 		return | 
| contrebasse@115 | 235 	else | 
| contrebasse@115 | 236 		CountThrottleFrame:RegisterEvent("BAG_UPDATE") | 
| contrebasse@115 | 237 	end | 
| contrebasse@115 | 238 	t_throttleCount = SCAN_DELAY | 
| contrebasse@115 | 239 	CountThrottleFrame:SetScript("OnUpdate", throttleCount) | 
| contrebasse@115 | 240 | 
| contrebasse@115 | 241 	A.MenuFrame.updateCounts() | 
| contrebasse@115 | 242 end | 
| contrebasse@115 | 243 CountThrottleFrame:SetScript("OnEvent", A.updateCount_throttle) | 
| contrebasse@115 | 244 CountThrottleFrame:RegisterEvent("TRADE_SKILL_SHOW") | 
| contrebasse@115 | 245 CountThrottleFrame:RegisterEvent("TRADE_SKILL_UPDATE") | 
| contrebasse@115 | 246 CountThrottleFrame:RegisterEvent("TRADE_SKILL_CLOSE") | 
| contrebasse@115 | 247 hooksecurefunc("SelectTradeSkill",A.updateCount_throttle) |