| 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@98 | 58 		A.updateCounts(GetTradeSkillSelectionIndex()) | 
| 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@111 | 79 --@todo Unregister events when not needed | 
| contrebasse@98 | 80 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") | 
| contrebasse@98 | 81 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") | 
| contrebasse@98 | 82 | 
| contrebasse@111 | 83 | 
| contrebasse@98 | 84 --------------------------------------------------- | 
| contrebasse@98 | 85 -- Initialize | 
| contrebasse@98 | 86 --------------------------------------------------- | 
| contrebasse@98 | 87 function A:Initialize() | 
| contrebasse@98 | 88 | 
| contrebasse@98 | 89 	-- Register clics on reagent's buttons | 
| contrebasse@98 | 90 	for i=1,7 do | 
| contrebasse@98 | 91 		local btn = _G["TradeSkillReagent"..i] | 
| contrebasse@98 | 92 		btn:HookScript("OnDoubleClick", A.ProcessReagent) | 
| contrebasse@98 | 93 		btn:HookScript("OnEnter", A.btnEntered) | 
| contrebasse@98 | 94 		btn:HookScript("OnLeave", A.btnLeft) | 
| contrebasse@98 | 95 		btn.SplitStack = A.SplitStack | 
| contrebasse@98 | 96 | 
| contrebasse@98 | 97 		local textureHighlight = btn:CreateTexture() | 
| contrebasse@98 | 98 		textureHighlight:Hide() | 
| contrebasse@98 | 99 		textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight") | 
| contrebasse@110 | 100 		--textureHighlight:SetTexture("Interface\\BUTTONS\\ButtonHilight-Square") | 
| contrebasse@98 | 101 		textureHighlight:SetBlendMode("ADD") | 
| contrebasse@98 | 102 		textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture") | 
| contrebasse@98 | 103 		btn.textureHighlight = textureHighlight | 
| contrebasse@98 | 104 | 
| contrebasse@98 | 105 		local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight") | 
| contrebasse@98 | 106 		label:SetSize(100,20) | 
| contrebasse@98 | 107 		label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4) | 
| contrebasse@98 | 108 		label:SetJustifyH("LEFT") | 
| contrebasse@98 | 109 		label:SetJustifyV("TOP") | 
| contrebasse@98 | 110 		label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE") | 
| contrebasse@98 | 111 		btn.label = label | 
| contrebasse@98 | 112 	end -- for | 
| contrebasse@98 | 113 | 
| contrebasse@98 | 114 	-- Secondary Tooltip | 
| contrebasse@98 | 115 	A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate") | 
| contrebasse@98 | 116 	A.tooltipRecipe:SetFrameStrata("TOOLTIP") | 
| contrebasse@98 | 117 	A.tooltipRecipe:Hide() | 
| contrebasse@101 | 118 | 
| contrebasse@113 | 119 	-- Used for the campfire button only | 
| contrebasse@113 | 120 	A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED") | 
| contrebasse@113 | 121 	A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED") | 
| contrebasse@113 | 122 | 
| contrebasse@98 | 123 	-- Button for enchanting directy on a scroll | 
| contrebasse@98 | 124 	A.LoadEnchantOnScroll() | 
| contrebasse@98 | 125 end -- function | 
| contrebasse@98 | 126 | 
| contrebasse@98 | 127 --------------------------------------------------- | 
| contrebasse@111 | 128 -- Dynamic display | 
| contrebasse@98 | 129 --------------------------------------------------- | 
| contrebasse@111 | 130 -- Button hovering (entered) | 
| contrebasse@98 | 131 function A.btnEntered(btn) | 
| contrebasse@98 | 132 	-- Do not manage guild tradeskill | 
| contrebasse@98 | 133 	if IsTradeSkillGuild() or IsTradeSkillLinked() then return end | 
| contrebasse@98 | 134 | 
| contrebasse@98 | 135 	-- Index of the reagent in the recipe, taken from the button name | 
| contrebasse@111 | 136 	local reagentIndexInRecipe = A.buttonNumber(btn) | 
| contrebasse@98 | 137 | 
| contrebasse@98 | 138 	-- ID of the reagent we want to craft | 
| contrebasse@111 | 139 	local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentIndexInRecipe) | 
| contrebasse@98 | 140 	local reagentID = A.link2ID(reagentLink) | 
| contrebasse@98 | 141 | 
| contrebasse@98 | 142 	-- Continue only if the reagent is known | 
| contrebasse@98 | 143 	if not reagentID or not A.data[reagentID] then return end | 
| contrebasse@98 | 144 | 
| contrebasse@98 | 145 	btn.textureHighlight:Show() | 
| contrebasse@98 | 146 | 
| contrebasse@98 | 147 	-- Check if the item is made by only one recipe. If not, return | 
| contrebasse@98 | 148 	if not A.isRecipeUnique(A.data[reagentID]) then return end | 
| contrebasse@98 | 149 | 
| contrebasse@98 | 150 	-- Tooltips | 
| contrebasse@98 | 151 	local link = A.data[reagentID][1].spellLink | 
| contrebasse@98 | 152 	if link then | 
| contrebasse@98 | 153 		A.tooltipRecipe:SetOwner(btn) | 
| contrebasse@98 | 154 		A.tooltipRecipe:SetHyperlink(link) | 
| contrebasse@98 | 155 		A.tooltipRecipe:Show() | 
| contrebasse@98 | 156 		A.tooltipRecipe:ClearAllPoints() | 
| contrebasse@98 | 157 		A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") | 
| contrebasse@98 | 158 	end | 
| contrebasse@98 | 159 end | 
| contrebasse@98 | 160 | 
| contrebasse@111 | 161 -- Button hovering (left) | 
| contrebasse@98 | 162 function A.btnLeft(btn) | 
| contrebasse@98 | 163 	btn.textureHighlight:Hide() | 
| contrebasse@98 | 164 	A.tooltipRecipe:Hide() | 
| contrebasse@98 | 165 end -- function | 
| contrebasse@98 | 166 | 
| contrebasse@111 | 167 -- Show counts on buttons | 
| contrebasse@98 | 168 function A.updateCounts(recipeIndex) | 
| contrebasse@98 | 169 	-- Needs an argument | 
| contrebasse@98 | 170 	if not recipeIndex then return end | 
| contrebasse@98 | 171 | 
| contrebasse@98 | 172 	-- Do not manage guild tradeskill | 
| contrebasse@98 | 173 	if IsTradeSkillGuild() or IsTradeSkillLinked() then | 
| contrebasse@111 | 174 		for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do | 
| contrebasse@98 | 175 			-- If the normal tradeskill hasn't been opened yet, the field 'label' doesn't exists yet | 
| contrebasse@111 | 176 			local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label | 
| contrebasse@98 | 177 			if label then | 
| contrebasse@98 | 178 				label:Hide() | 
| contrebasse@98 | 179 			end | 
| contrebasse@98 | 180 		end | 
| contrebasse@98 | 181 		return | 
| contrebasse@98 | 182 	end | 
| contrebasse@98 | 183 | 
| contrebasse@98 | 184 	-- Count makable items and show it | 
| contrebasse@111 | 185 	for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do | 
| contrebasse@98 | 186 		-- ID of the reagent we want to craft | 
| contrebasse@111 | 187 		local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentIndexInRecipe)) | 
| contrebasse@98 | 188 | 
| contrebasse@111 | 189 		local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label | 
| contrebasse@111 | 190 		if label then | 
| contrebasse@111 | 191 			-- Continue only if the reagent is known | 
| contrebasse@111 | 192 			if not reagentID or not A.data[reagentID] then | 
| contrebasse@111 | 193 				label:Hide() | 
| contrebasse@98 | 194 			else | 
| contrebasse@111 | 195 				-- Count and show | 
| contrebasse@111 | 196 				local numMakable = A.numMakable(reagentID) | 
| contrebasse@111 | 197 				if not numMakable then | 
| contrebasse@111 | 198 					label:SetText("?") | 
| contrebasse@111 | 199 					label:SetTextColor(0, 0.5, 1, 1) -- blue | 
| contrebasse@98 | 200 				else | 
| contrebasse@111 | 201 					label:SetText(numMakable) | 
| contrebasse@111 | 202 					if numMakable==0 then | 
| contrebasse@111 | 203 						label:SetTextColor(1, 0, 0, 1) -- red | 
| contrebasse@111 | 204 					else | 
| contrebasse@111 | 205 						label:SetTextColor(0, 1, 0, 1) -- green | 
| contrebasse@111 | 206 					end | 
| contrebasse@111 | 207 				end -- if | 
| contrebasse@111 | 208 				label:Show() | 
| contrebasse@98 | 209 			end -- if | 
| contrebasse@98 | 210 		end -- if | 
| contrebasse@98 | 211 	end -- for | 
| contrebasse@98 | 212 end -- function | 
| contrebasse@98 | 213 hooksecurefunc("SelectTradeSkill",A.updateCounts) |