Quantcast

Tweaked the layout of reagents when a skill is expanded.

Paul Schifferer [12-21-10 - 06:08]
Tweaked the layout of reagents when a skill is expanded.
Eliminated some unneeded event registrations, and moved around some events so they're only registered when needed.
Eliminated rescans and isolated an issue where some reagents would be incomplete (and a client hiccup occurs).
Filename
CauldronMain.lua
CauldronMain.xml
CauldronMainUI.lua
CauldronTradeskill.lua
diff --git a/CauldronMain.lua b/CauldronMain.lua
index a40223a..368bd4f 100644
--- a/CauldronMain.lua
+++ b/CauldronMain.lua
@@ -284,28 +284,12 @@ function Cauldron:OnEnable()

 	-- register for events we're interested in
 	self:RegisterEvent("TRADE_SKILL_SHOW", "OnTradeShow");
-	self:RegisterEvent("TRADE_SKILL_UPDATE", "OnSkillUpdate");
 	self:RegisterEvent("TRADE_SKILL_CLOSE", "OnTradeClose");
---	self:RegisterEvent("TRADE_TARGET_ITEM_CHANGED", "OnTradeItemChanged");
-	self:RegisterEvent("SKILL_LINES_CHANGED", "OnSkillUpdate");
 	self:RegisterEvent("ADDON_LOADED", "OnAddonLoaded");
-	self:RegisterEvent("UNIT_PORTRAIT_UPDATE", "OnEvent");
 	self:RegisterEvent("BANKFRAME_OPENED", "OnBankOpened");
 	self:RegisterEvent("BANKFRAME_CLOSED", "OnBankClosed");
---	self:RegisterEvent("PLAYERBANKSLOTS_CHANGED");
---	self:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED");
 	self:RegisterEvent("MERCHANT_SHOW", "OnMerchantShow");
---	self:RegisterEvent("MERCHANT_UPDATE");
 	self:RegisterEvent("MERCHANT_CLOSED", "OnMerchantClose");
-	self:RegisterEvent("BAG_UPDATE", "OnBagUpdate");
---	self:RegisterEvent("TRAINER_CLOSED");
---	self:RegisterEvent("PLAYER_REGEN_DISABLED");
---	self:RegisterEvent("PLAYER_REGEN_ENABLED", "PlayerRegenEnabled");
---	self:RegisterEvent("AUCTION_HOUSE_CLOSED");
---	self:RegisterEvent("AUCTION_HOUSE_SHOW");
---	self:RegisterEvent("CRAFT_SHOW", "OnCraftShow");
---	self:RegisterEvent("CRAFT_CLOSE", "OnCraftClose");
---	self:RegisterEvent("PLAYER_LOGOUT");
 	self:RegisterEvent("UI_ERROR_MESSAGE", "OnError");
 	self:RegisterEvent("UNIT_QUEST_LOG_CHANGED", "OnQuestLogChanged");
 	self:RegisterEvent("ACHIEVEMENT_EARNED", "OnAchievementEarned");
@@ -366,7 +350,7 @@ function Cauldron:OnTradeShow()

 	-- update our known skills
 	if not Cauldron.updatingSkills then
-		Cauldron.updatingSkills = Cauldron:NeedsSkillUpdate();
+		Cauldron.updatingSkills = true; -- Cauldron:NeedsSkillUpdate();
 		Cauldron:UpdateSkills();
 	end

@@ -383,7 +367,7 @@ function Cauldron:OnTradeShow()

 end

-function Cauldron:OnTradeUpdate()
+function Cauldron:OnTradeUpdate(event)

 --	TODO

@@ -404,8 +388,8 @@ function Cauldron:OnTradeClose()
 end

 function Cauldron:OnSkillUpdate(event)
---Cauldron:info("skill update: event="..tostring(event));

+	Cauldron:UpdateSkillItemCounts();
 --[[
 	if CURRENT_TRADESKILL ~= "" then
 		if not Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[CURRENT_TRADESKILL] then
@@ -435,12 +419,14 @@ function Cauldron:OnTradeSkillRecast()
 	-- keep the processing flag set
 	self.processing = true;

-	self:UpdateSkills();
+--	self:UpdateSkills();

---	CauldronAmountInputBox:SetNumber(GetTradeskillRepeatCount());
+	CauldronInputBox:SetNumber(GetTradeskillRepeatCount());

-	Cauldron.needsRedraw = true;
-	self:Frame_Update();
+	Cauldron:UpdateSkillItemCounts();
+	Cauldron:UpdateSkillList();
+--	Cauldron.needsRedraw = true;
+--	self:Frame_Update();

 end

@@ -453,88 +439,13 @@ function Cauldron:OnBagUpdate(event, bagid)

 	local queue = self.db.realm.userdata[self.vars.playername].queue;

---[==[
-	-- check if the item acquired is in the intermediate list or shopping list
-	local items = Cauldron:GetItemDeltas(bagid);
-	self:debug("items="..tostring(items));
-	local recalc = false;
-	for item, itemCount in pairs(items) do
-		if itemCount > 0 then
-			-- adjust shopping list
-			local amtRemoved = CauldronShopping:RemoveFromList(self.db.realm.shopping, self.vars.playername, item, itemCount);
-			if amtRemoved > 0 then
-				local str = string.format("%s: %s: %d", L["Shopping list"], item, amtRemoved);
-				UIErrorsFrame:AddMessage(str, 1.0, 0.5, 0.25, 86, 3);
-			end
-
-			-- adjust intermediate list
-			self:debug("OnBagUpdate: adjust intermediate list");
-			local intItem = CauldronQueue:GetIntermediateItem(queue, item);
-			if intItem then
-				-- the item is found in the intermediate list, so recalculate the queue
-				self:debug("OnBagUpdate: set recalc flag");
-				recalc = true;
-
-				local counts = Cauldron:ReagentCount(item);
-				local amount = math.min(counts.has, intItem.amount);
-				local str = string.format("%s: %s: %d, %d %s", L["Intermediate"], item, amount, intItem.amount, L["remaining"]);
-				if (counts.has - itemCount) < intItem.amount then
-					UIErrorsFrame:AddMessage(str, 0.0, 0.9, 0.4, 86, 3);
-				end
-			else
-				local rItem = CauldronQueue:GetReagentItem(queue, item);
-				if rItem then
-					local counts = Cauldron:ReagentCount(item);
-					local amount = math.min(counts.has, rItem.amount);
-					local str = string.format("%s: %s: %d/%d", L["Reagent"], item, amount, rItem.amount);
-					if amount <= rItem.amount then
-						UIErrorsFrame:AddMessage(str, 0.0, 0.9, 0.0, 86, 3);
-					end
-				end
-			end
-		end
-	end
-
-	if recalc then
-		self:debug("OnBagUpdate: recalculating queue");
-		CauldronQueue:CalculateAllRequiredItems(queue);
-		Cauldron:UpdateQueue();
-	end
+	CauldronQueue:CalculateAllRequiredItems(queue);
+	Cauldron:UpdateQueue();

-	-- check if we were making something, and then update the queue
-	--[[
-	if self.makingItem then
-		--@alpha@
-		self:debug("OnBagUpdate: self.makingItem="..self.makingItem);
-		--@end-alpha@
-		local count = GetItemCount(self.makingItem);
-		--@alpha@
-		self:debug("OnBagUpdate: count="..count);
-		self:debug("OnBagUpdate: self.itemCurrentCount="..self.itemCurrentCount);
-		--@end-alpha@
-		if count ~= self.itemCurrentCount then
-			local delta = self.itemCurrentCount - count; -- TODO: is this necessary?
-			--@alpha@
-			self:debug("OnBagUpdate: delta="..delta);
-			--@end-alpha@
-			CauldronQueue:AdjustItemCount(Cauldron:GetQueue(), self.queueInfo.name, -1);
-			self.itemCurrentCount = count;
-		end
-	else
-		--
-	end
-	--]]
-
-	-- Cauldron:UpdateSkills();
-
-	self:Frame_Update();
-	Cauldron:UpdateShoppingList();
-
-	-- update the bags
-	Cauldron:ScanBags();
-	--]==]
-
+	Cauldron:UpdateSkillItemCounts();
 	Cauldron:UpdateSkillList();
+
+	Cauldron:UpdateShoppingList();

 end

@@ -630,6 +541,10 @@ function Cauldron:OnSpellcastSucceed(event, unit, spell, rank)
 			Cauldron.makingItemCount = count;
 		end
 	end
+
+	Cauldron:UpdateSkillItemCounts();
+	Cauldron:UpdateSkillList();
+
 --[[
 	-- adjust queue, but only if window is open
 	if CauldronFrame:IsShown() then
@@ -734,7 +649,7 @@ function Cauldron:QueueTradeSkillItem()
 	local skillInfo = Cauldron:GetSelectedSkill();

 	if skillInfo then
-		local amount = TradeSkillInputBox:GetNumber();
+		local amount = CauldronInputBox:GetNumber();
 		if not amount or amount < 1 then
 			amount = 1;
 		end
@@ -751,26 +666,32 @@ end
 function Cauldron:CreateAllTradeSkillItem()

 	if (not PartialPlayTime()) and (not NoPlayTime()) then
-		CauldronAmountInputBox:ClearFocus();
+		CauldronInputBox:ClearFocus();

 		local skillInfo = Cauldron:GetSelectedSkill();

-		CauldronAmountInputBox:SetNumber(skillInfo.available);
+		CauldronInputBox:SetNumber(skillInfo.available);

 		DoTradeSkill(skillInfo.index, skillInfo.available);
+
+		Cauldron:UpdateSkillItemCounts();
+		Cauldron:UpdateSkillList();
 	end

 end

 function Cauldron:CreateTradeSkillItem()

-	if ( (not PartialPlayTime()) and (not NoPlayTime()) ) then
-		CauldronAmountInputBox:ClearFocus();
+	if ((not PartialPlayTime()) and (not NoPlayTime())) then
+		CauldronInputBox:ClearFocus();

 		local skillInfo = Cauldron:GetSelectedSkill();
-		local amount = CauldronAmountInputBox:GetNumber();
+		local amount = CauldronInputBox:GetNumber();

 		DoTradeSkill(skillInfo.index, amount);
+
+		Cauldron:UpdateSkillItemCounts();
+		Cauldron:UpdateSkillList();
 	end

 end
@@ -936,6 +857,7 @@ function Cauldron:FirstPage()
 	end

 	self.db.realm.userdata[self.vars.playername].skills[skillName].window.offset = 0;
+	CauldronSkillListScrollFrame:SetVerticalScroll(0);
 end

 function Cauldron:PrevPage()
@@ -957,6 +879,7 @@ function Cauldron:PrevPage()
 	else
 		self.db.realm.userdata[self.vars.playername].skills[skillName].window.offset = math.max(0, offset - CAULDRON_SKILL_LIST_MAX);
 	end
+	CauldronSkillListScrollFrame:SetVerticalScroll(0);
 end

 function Cauldron:NextPage()
@@ -982,6 +905,7 @@ function Cauldron:NextPage()
 			self.db.realm.userdata[self.vars.playername].skills[skillName].window.offset = offset + CAULDRON_SKILL_LIST_MAX;
 		end
 	end
+	CauldronSkillListScrollFrame:SetVerticalScroll(0);
 end

 function Cauldron:LastPage()
@@ -999,6 +923,7 @@ function Cauldron:LastPage()

 	local numSkills = table.getn(Cauldron:GetSkillList(self.vars.playername, skillName));
 	self.db.realm.userdata[self.vars.playername].skills[skillName].window.offset = math.floor(numSkills / CAULDRON_SKILL_LIST_MAX) * CAULDRON_SKILL_LIST_MAX;
+	CauldronSkillListScrollFrame:SetVerticalScroll(0);
 end

 function Cauldron:GetQueue(player)
diff --git a/CauldronMain.xml b/CauldronMain.xml
index 034bb1d..8354f2b 100755
--- a/CauldronMain.xml
+++ b/CauldronMain.xml
@@ -317,7 +317,7 @@
     			<Size x="110" y="37" />
     			<Anchors>
     				<Anchor point="TOPRIGHT">
-    					<Offset x="-90" y="0" />
+    					<Offset x="-100" y="0" />
     				</Anchor>
     			</Anchors>
     			<Layers>
@@ -344,7 +344,7 @@
 						</FontString>
 						<FontString name="$parentCount" inherits="GameFontNormalLarge"
 									justifyH="CENTER" justifyV="CENTER">
-							<Size x="40" y="37"/>
+							<Size x="70" y="37"/>
 							<Anchors>
 								<Anchor point="LEFT" relativeTo="$parentNumSkillUps" relativePoint="RIGHT">
 									<Offset x="0" y="0"/>
@@ -409,6 +409,7 @@
 							</Anchors>
 						</FontString>
 						<FontString name="$parentSkillCooldown" inherits="GameFontRedSmall">
+							<Size x="490" y="0" />
 							<Anchors>
 								<Anchor point="TOPLEFT" relativeTo="$parentRequirementLabel" relativePoint="BOTTOMLEFT">
 									<Offset x="0" y="0"/>
@@ -437,7 +438,7 @@
 							<Size x="490" y="0"/>
 							<Anchors>
 								<Anchor point="TOPLEFT">
-									<Offset x="5" y="-10"/>
+									<Offset x="0" y="-10"/>
 								</Anchor>
 							</Anchors>
 						</FontString>
@@ -1177,11 +1178,7 @@
 				</Frames>
 				<Scripts>
 					<OnClick>
-						if ( (not PartialPlayTime()) and (not NoPlayTime()) ) then
-							CauldronInputBox:SetNumber(CauldronFrame.numAvailable);
-							DoTradeSkill(CauldronFrame.selectedSkill, CauldronFrame.numAvailable);
-							CauldronInputBox:ClearFocus();
-						end
+						Cauldron:CreateAllTradeSkillItem();
 					</OnClick>
 				</Scripts>
 			</Button>
@@ -1313,10 +1310,7 @@
 				</Frames>
 				<Scripts>
 					<OnClick>
-						if ( (not PartialPlayTime()) and (not NoPlayTime()) ) then
-							DoTradeSkill(CauldronFrame.selectedSkill, CauldronInputBox:GetNumber());
-							CauldronInputBox:ClearFocus();
-						end
+						Cauldron:CreateTradeSkillItem();
 					</OnClick>
 				</Scripts>
 			</Button>
diff --git a/CauldronMainUI.lua b/CauldronMainUI.lua
index e597276..51ca9b9 100644
--- a/CauldronMainUI.lua
+++ b/CauldronMainUI.lua
@@ -59,10 +59,15 @@ function Cauldron:Frame_Show()
 		end
 		--]]

-	 	self:RegisterMessage("Cauldron_Update", "OnCauldronUpdate");
+--	 	self:RegisterMessage("Cauldron_Update", "OnCauldronUpdate");

 		Cauldron.needsRedraw = true;
 		self:Frame_Update();
+
+		self:RegisterEvent("TRADE_SKILL_UPDATE", "OnSkillUpdate");
+		self:RegisterEvent("SKILL_LINES_CHANGED", "OnSkillUpdate");
+		self:RegisterEvent("UNIT_PORTRAIT_UPDATE", "OnEvent");
+		self:RegisterEvent("BAG_UPDATE", "OnBagUpdate");
 	else
 		-- show the Blizzard frame
 		Cauldron.blizzTradeSkillShow();
@@ -72,7 +77,7 @@ end

 function Cauldron:Frame_Hide()

- 	self:UnregisterEvent("Cauldron_Update");
+-- 	self:UnregisterEvent("Cauldron_Update");
  	HideUIPanel(CauldronQueueWindowFrame);
  	HideUIPanel(CauldronFrame);

@@ -86,6 +91,11 @@ function Cauldron:Frame_Hide()

 -- 	CloseTradeSkill();

+	self:UnregisterEvent("TRADE_SKILL_UPDATE");
+	self:UnregisterEvent("SKILL_LINES_CHANGED");
+	self:UnregisterEvent("UNIT_PORTRAIT_UPDATE");
+	self:UnregisterEvent("BAG_UPDATE");
+
 end

 function Cauldron:Frame_Toggle()
@@ -129,10 +139,10 @@ function Cauldron:Frame_Update()
 	self:UpdateStatus();

 	-- display list of matching skills
-	if CAULDRON_TRADESKILL_NAME ~= CURRENT_TRADESKILL then
-		CAULDRON_TRADESKILL_NAME = CURRENT_TRADESKILL;
+--	if CAULDRON_TRADESKILL_NAME ~= CURRENT_TRADESKILL then
+--		CAULDRON_TRADESKILL_NAME = CURRENT_TRADESKILL;
 		self:UpdateSkillList();
-	end
+--	end

 	-- display queue
 	self:UpdateQueue();
@@ -269,7 +279,7 @@ function Cauldron:UpdateFilterDropDowns()
 end

 function Cauldron:UpdateSkillList()
-
+
 	if Cauldron.updatingSkillList then
 		return;
 	end
@@ -610,7 +620,13 @@ function Cauldron:UpdateSkillList()
 				-- only adjust height for expanded views
 				if reagentsExpanded then
 					local reagentRows = math.floor((reagentCount - 1) / 4);
-					reagentDetailsFrame:SetHeight(52 + (_G["CauldronSkillItem"..i.."ItemDetailsReagent1"]:GetHeight() * reagentRows));
+					local reqHeight = _G["CauldronSkillItem"..i.."ItemDetailsRequirementText"]:GetHeight();
+					local cooldownHeight = _G["CauldronSkillItem"..i.."ItemDetailsSkillCooldown"]:GetHeight();
+					local descHeight = _G["CauldronSkillItem"..i.."ItemDetailsDescription"]:GetHeight();
+					local detail1Frame = _G["CauldronSkillItem"..i.."ItemDetailsReagent1"];
+					local detailHeight = detail1Frame:GetHeight();
+					detail1Frame:SetPoint("TOPLEFT", _G["CauldronSkillItem"..i.."ItemDetailsDescription"], "BOTTOMLEFT", 0, -5);
+					reagentDetailsFrame:SetHeight(40 + (reqHeight + cooldownHeight + descHeight) + (detailHeight * reagentRows));
 					skillFrame:SetHeight(reagentDetailsFrame:GetHeight() + CAULDRON_SKILLITEM_COLLAPSED_HEIGHT + 2);
 				else
 					skillFrame:SetHeight(CAULDRON_SKILLITEM_COLLAPSED_HEIGHT);
diff --git a/CauldronTradeskill.lua b/CauldronTradeskill.lua
index 7ba3a87..b2bf10f 100644
--- a/CauldronTradeskill.lua
+++ b/CauldronTradeskill.lua
@@ -58,6 +58,52 @@ function Cauldron:NeedsSkillUpdate()
 	return false;
 end

+function Cauldron:UpdateSkillItemCounts()
+
+	local skillName, rank, maxRank = GetTradeSkillLine();
+
+	if skillName == "UNKNOWN" then
+		return;
+	end
+	-- check for linked or guild lists
+	if IsTradeSkillLinked() then
+		skillName = "Linked-"..skillName;
+	end
+	if IsTradeSkillGuild() then
+		skillName = "Guild-"..skillName;
+	end
+
+	local skillDB = self.db.realm.userdata[self.vars.playername].skills[skillName];
+	if not skillDB then
+		return;
+	end
+
+	for i=1,GetNumTradeSkills() do
+		local name, difficulty, avail, expanded, verb, numSkillUps = GetTradeSkillInfo(i);
+
+		if name and difficulty ~= "header" then
+
+			local minMade, maxMade = GetTradeSkillNumMade(i);
+
+			if skillDB.recipes[name] then
+				-- update the recipe info
+				skillDB.recipes[name].index = i;
+				skillDB.recipes[name].difficulty = difficulty;
+				skillDB.recipes[name].available = avail;
+				skillDB.recipes[name].minMade = minMade;
+				skillDB.recipes[name].maxMade = maxMade;
+				skillDB.recipes[name].numSkillUps = numSkillUps;
+
+				-- update reagent skill index
+				for _,r in ipairs(skillDB.recipes[name].reagents) do
+					r.skillIndex = i;
+				end
+			end
+		end
+	end
+
+end
+
 function Cauldron:UpdateSkills(firstIndex, lastIndex)

 	if not self.updatingSkills then
@@ -181,6 +227,7 @@ function Cauldron:UpdateSkills(firstIndex, lastIndex)
 				-- adjust min/max made for specialities
 				-- TODO

+--[[
 				-- check if we're rescanning, updating or adding
 				local rescan = false;
 				if skillDB.rescan then
@@ -188,7 +235,7 @@ function Cauldron:UpdateSkills(firstIndex, lastIndex)
 						rescan = true;
 					end
 				end
-
+
 				if skillDB.recipes[name] and not rescan then
 					-- update the recipe info
 					skillDB.recipes[name].index = i;
@@ -203,135 +250,140 @@ function Cauldron:UpdateSkills(firstIndex, lastIndex)
 						r.skillIndex = i;
 					end
 				else
-					-- add the recipe info and other miscellaneous info
-					local itemLink = GetTradeSkillItemLink(i);
-					local recipeLink = GetTradeSkillRecipeLink(i);
-					local _, _, _, _, _, itemType, itemSubType, _, slot, _ = GetItemInfo(itemLink);
-
-					local keywords = name;
-
-					if rescan then
-						-- local msg = string.format(L["Rescanning recipe: %1$s..."], name);
-						-- Cauldron:Print(msg);
-
-						-- remove it from the list
-						skillDB.rescan.failedRecipes[name] = nil;
-
-						-- populate the reagent list
-						local num = GetTradeSkillNumReagents(i);
-						for j=1,num do
-							local rName, rIcon, rCount, _ = GetTradeSkillReagentInfo(i, j);
-							local rLink = GetTradeSkillReagentItemLink(i, j);
-							local rItemId = Cauldron:GetIdFromLink(rLink);
-							local key = not Cauldron:IsVendorItem(rItemId);
-
-							if not skillDB.recipes[name].reagents[j].name then
-								if (not rName) or (not rIcon) or (not rLink) then
+--]]
+				-- add the recipe info and other miscellaneous info
+				local itemLink = GetTradeSkillItemLink(i);
+				local recipeLink = GetTradeSkillRecipeLink(i);
+				local _, _, _, _, _, itemType, itemSubType, _, slot, _ = GetItemInfo(itemLink);
+
+				local keywords = name;
+
+--[[
+				if rescan then
+					-- local msg = string.format(L["Rescanning recipe: %1$s..."], name);
+					-- Cauldron:Print(msg);
+
+					-- remove it from the list
+					skillDB.rescan.failedRecipes[name] = nil;
+
+					-- populate the reagent list
+					local num = GetTradeSkillNumReagents(i);
+					for j=1,num do
+						local rName, rIcon, rCount, _ = GetTradeSkillReagentInfo(i, j);
+						local rLink = GetTradeSkillReagentItemLink(i, j);
+						local rItemId = Cauldron:GetIdFromLink(rLink);
+						local key = not Cauldron:IsVendorItem(rItemId);
+
+						if not skillDB.recipes[name].reagents[j].name then
+							if (not rName) or (not rIcon) or (not rLink) then
 --									Cauldron:MarkRecipeForRescan(skillDB, name);
 --									rescanCount = rescanCount + 1;
-								else
-									local r = {
-										["index"] = j,
-										["name"] = rName,
-										["numRequired"] = rCount,
-										["skillIndex"] = i,
-										["icon"] = rIcon,
-										["link"] = rLink,
-										["key"] = key,
-									};
-
-									skillDB.recipes[name].reagents[j] = r;
-
-									if not self.db.realm.userdata[self.vars.playername].reagentMap[rName] then
-										self.db.realm.userdata[self.vars.playername].reagentMap[rName] = {};
-									end
-									table.insert(self.db.realm.userdata[self.vars.playername].reagentMap[rName], skillName..";"..recipeLink);
-
-									skillDB.recipes[name].keywords = skillDB.recipes[name].keywords..","..rName;
+							else
+								local r = {
+									["index"] = j,
+									["name"] = rName,
+									["numRequired"] = rCount,
+									["skillIndex"] = i,
+									["icon"] = rIcon,
+									["link"] = rLink,
+									["key"] = key,
+								};
+
+								skillDB.recipes[name].reagents[j] = r;
+
+								if not self.db.realm.userdata[self.vars.playername].reagentMap[rName] then
+									self.db.realm.userdata[self.vars.playername].reagentMap[rName] = {};
 								end
+								table.insert(self.db.realm.userdata[self.vars.playername].reagentMap[rName], skillName..";"..recipeLink);
+
+								skillDB.recipes[name].keywords = skillDB.recipes[name].keywords..","..rName;
 							end
-						end
-					else
-						-- fill in the db entry
-						skillDB.recipes[name] = {
-							['index'] = i,
-							['name'] = name,
-							['description'] = GetTradeSkillDescription(i),
-							['itemLink'] = itemLink,
-							['recipeLink'] = recipeLink,
-							['icon'] = GetTradeSkillIcon(i),
-							['tradeskill'] = baseSkillName,
-							['difficulty'] = difficulty,
-							['available'] = avail,
-							['minMade'] = minMade,
-							['maxMade'] = maxMade,
-							['numSkillUps'] = numSkillUps,
-							['verb'] = verb,
-
-							-- filter information
-							['slot'] = _G[slot],
-							['defaultCategory'] = category,
-							['type'] = itemType,
-							['subtype'] = itemSubType,
-
-							['reagents'] = {},
-						};
+						end
+					end
+				else
+--]]
+					-- fill in the db entry
+					skillDB.recipes[name] = {
+						['index'] = i,
+						['name'] = name,
+						['description'] = GetTradeSkillDescription(i),
+						['itemLink'] = itemLink,
+						['recipeLink'] = recipeLink,
+						['icon'] = GetTradeSkillIcon(i),
+						['tradeskill'] = baseSkillName,
+						['difficulty'] = difficulty,
+						['available'] = avail,
+						['minMade'] = minMade,
+						['maxMade'] = maxMade,
+						['numSkillUps'] = numSkillUps,
+						['verb'] = verb,

-						-- set the action verb for this skill
-	--					skillDB.recipes[name].verb = verb;
+						-- filter information
+						['slot'] = _G[slot],
+						['defaultCategory'] = category,
+						['type'] = itemType,
+						['subtype'] = itemSubType,

-						-- make sure the skill window info is initialized
-						if not skillDB.window.skills[name] then
-							skillDB.window.skills[name] = {
-								['expanded'] = false,
-								['favorite'] = false,
-							};
-						end
-
-						-- make sure the category for the window is initialized
-						if category ~= "" then
-							if not skillDB.window.categories[category] then
-								skillDB.window.categories[category] = {
-									['shown'] = true,
-									['expanded'] = true,
-								};
-							end
-						end
+						['reagents'] = {},
+					};
+
+					-- set the action verb for this skill
+--					skillDB.recipes[name].verb = verb;
+
+					-- make sure the skill window info is initialized
+					if not skillDB.window.skills[name] then
+						skillDB.window.skills[name] = {
+							['expanded'] = false,
+							['favorite'] = false,
+						};
+					end

-						--[[
-						-- populate the slot list
-						Cauldron:debug("slot: "..tostring(slot));
-						if slot and (slot ~= "") then
-							skillDB.window.slots[slot] = {
-								checked = true,
-							};
-						else
-							-- special slot representing items that don't have a slot
-							skillDB.window.slots.none = {
-								checked = true,
+					-- make sure the category for the window is initialized
+					if category ~= "" then
+						if not skillDB.window.categories[category] then
+							skillDB.window.categories[category] = {
+								['shown'] = true,
+								['expanded'] = true,
 							};
 						end
-						--]]
-
-						-- populate the reagent list
-						local num = GetTradeSkillNumReagents(i);
-						for j=1,num do
-							local rName, rIcon, rCount, _ = GetTradeSkillReagentInfo(i, j);
-							local rLink = GetTradeSkillReagentItemLink(i, j);
-							local rItemId = Cauldron:GetIdFromLink(rLink);
-							local key = not Cauldron:IsVendorItem(rItemId);
-
-							if (not rName) or (not rIcon) or (not rLink) then
-								rescanNotify = true;
-
-								-- store the info if it's not already from rescanning
-								if not rescan then
-									-- Cauldron:error("Failed to retrieve reagent info; marking recipe for rescan: "..name);
+					end
+
+					--[[
+					-- populate the slot list
+					Cauldron:debug("slot: "..tostring(slot));
+					if slot and (slot ~= "") then
+						skillDB.window.slots[slot] = {
+							checked = true,
+						};
+					else
+						-- special slot representing items that don't have a slot
+						skillDB.window.slots.none = {
+							checked = true,
+						};
+					end
+					--]]
+
+					-- populate the reagent list
+					local num = GetTradeSkillNumReagents(i);
+					for j=1,num,1 do
+						local rName, rIcon, rCount, playerAmount = GetTradeSkillReagentInfo(i, j);
+						local rLink = GetTradeSkillReagentItemLink(i, j);
+						local rItemId = Cauldron:GetIdFromLink(rLink);
+						local key = not Cauldron:IsVendorItem(rItemId);
+
+						if (not rName) or (not rIcon) or (not rLink) then
+							rescanNotify = true;
+Cauldron:error("Failed to retrieve reagent info; marking recipe for rescan: "..name);
+Cauldron:warn("i="..tostring(i).."; j="..tostring(j));
+--[[
+							-- store the info if it's not already from rescanning
+							if not rescan then
+								-- Cauldron:error("Failed to retrieve reagent info; marking recipe for rescan: "..name);
 --									Cauldron:MarkRecipeForRescan(skillDB, name);
 --									rescanCount = rescanCount + 1;
-								end
 							end
-
+--]]
+						else
 							local r = {
 								["index"] = j,
 								["name"] = rName,
@@ -340,6 +392,7 @@ function Cauldron:UpdateSkills(firstIndex, lastIndex)
 								["icon"] = rIcon,
 								["link"] = rLink,
 								["key"] = key,
+								["amount"] = playerAmount,
 							};

 							table.insert(skillDB.recipes[name].reagents, r);
@@ -354,11 +407,12 @@ function Cauldron:UpdateSkills(firstIndex, lastIndex)
 								keywords = keywords..","..rName;
 							end
 						end
-
-						-- fill in the keywords db entry
-						skillDB.recipes[name].keywords = keywords;
 					end
-				end
+
+					-- fill in the keywords db entry
+					skillDB.recipes[name].keywords = keywords;
+--				end
+--				end
 			else
 				-- save the header name
 				if name then