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