| 
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)
 |