Quantcast
-- $Revision: 213 $
-- Cauldron queue user interface logic

local L = LibStub("AceLocale-3.0"):GetLocale("Cauldron")

function Cauldron:UpdateQueue()

	if (not CauldronQueueWindowFrame) or (not CauldronQueueWindowFrame:IsShown()) then
		return;
	end

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

	local skillName = CURRENT_TRADESKILL;
	if not IsTradeSkillLinked() and not IsTradeSkillGuild() then
		itemQueue = CauldronQueue:GetItems(queue);
	end

	if #itemQueue == 0 then
		-- queue is empty, display the empty message
		CauldronQueueFrameQueueEmpty:Show();
		CauldronQueueFrameScrollFrame:Hide();

		if IsTradeSkillLinked() then
			CauldronQueueFrameQueueEmptyText:SetText(L["No queue for linked tradeskills."]);
		else
			CauldronQueueFrameQueueEmptyText:SetText(L["The queue is empty!\nMake something."]);
		end

		return;
	end

	-- queue has items, show them
	CauldronQueueFrameQueueEmpty:Hide();
	CauldronQueueFrameScrollFrame:Show();

	local itemFrameHeight = 39;

	local height = 0;

	CauldronQueueFrameScrollFrameQueueSectionsMainItemsHeaderText:SetText(L["In order to make:"]);
	-- adjust the scroll child size
	CauldronQueueFrameScrollFrameQueueSectionsMainItems:SetHeight(#itemQueue * itemFrameHeight);

	for i, queueInfo in ipairs(itemQueue) do
		local queueItemFrame = _G["CauldronQueueItem"..i];

		-- check if we have a frame for this position
		if not queueItemFrame then
			-- create a new frame for the queue information
			queueItemFrame = CreateFrame("Button",
									 	 "CauldronQueueItem"..i,
									 	 CauldronQueueFrameScrollFrameQueueSectionsMainItems,
									 	 "CauldronQueueItemFrameTemplate");
	    else
	    	-- set the frame's parent
	    	queueItemFrame:SetParent(CauldronQueueFrameScrollFrameQueueSectionsMainItems);
		end

		-- initialize the frame
--		queueItemFrame:SetAlpha(1.0);
--		queueItemFrame:SetHeight(itemFrameHeight);

		-- set some basic properties
		queueItemFrame:SetID(i);
		queueItemFrame.itemName = queueInfo.name;
		queueItemFrame.removeable = true;
		queueItemFrame.shoppable = false;
		queueItemFrame.inHoverButtons = false;

		-- _G["CauldronQueueItem"..i.."RemoveItem"]:Hide();
		_G["CauldronQueueItem"..i.."RemoveItem"]:SetScale(0.75);
		--[[
		_G["CauldronQueueItem"..i.."IncreasePriority"]:Hide();
		_G["CauldronQueueItem"..i.."DecreasePriority"]:Hide();
		_G["CauldronQueueItem"..i.."DecrementCount"]:Hide();
		_G["CauldronQueueItem"..i.."IncrementCount"]:Hide();
		_G["CauldronQueueItem"..i.."IncrementCount"]:SetScale(0.75);
		_G["CauldronQueueItem"..i.."AddToShoppingList"]:Hide();
		_G["CauldronQueueItem"..i.."AddToShoppingList"]:SetScale(0.5);
		--]]

		local skillInfo = Cauldron:GetSkillInfo(queueInfo.tradeskill, queueInfo.name);
		if not skillInfo then
			-- the skill isn't available (character doesn't know it?)
			self:warn("No skill available for "..queueInfo.name.." ("..queueInfo.tradeskill..")");
		end

		-- initialize the frame object
		local frame = nil;

		-- set name and difficulty color
		frame = _G["CauldronQueueItem"..i.."ItemName"];
		local nameText = queueInfo.name;
		if skillInfo and (skillInfo.available > 0) then
			nameText = nameText.." ["..skillInfo.available.."]";
		end
		frame:SetText(nameText);
		if skillInfo then
			local color = TradeSkillTypeColor[skillInfo.difficulty];
			if color then
				frame:SetFontObject(color.font);
				frame:SetTextColor(color.r, color.g, color.b, 1.0);
				frame.r = color.r;
				frame.g = color.g;
				frame.b = color.b;
			end
		else
			-- TODO: default color info
		end

		-- set quantity info
		frame = _G["CauldronQueueItem"..i.."Info"];
		local infoText = queueInfo.tradeskill;
		-- TODO: alts/bank/etc.
		frame:SetText(infoText);
--		frame:SetTextColor(1.0, 1.0, 0.2, 1.0);
--		frame:SetShadowOffset(0, 0);

		-- set the icon
		frame = _G["CauldronQueueItem"..i.."Icon"];
		frame:SetNormalTexture(queueInfo.icon);
		frame.link = queueInfo.link;

		-- set the amount
		frame = _G["CauldronQueueItem"..i.."IconCount"];
		frame:SetText(queueInfo.amount);

		-- place the frame in the scroll view
		if i > 1 then
			-- anchor to the frame above
			queueItemFrame:SetPoint("TOPLEFT", _G["CauldronQueueItem"..(i-1)], "BOTTOMLEFT", 0, 0);
		else
			-- anchor to the parent
			queueItemFrame:SetPoint("TOPLEFT", CauldronQueueFrameScrollFrameQueueSectionsMainItems, "TOPLEFT", 0, 0);
		end

--		height = height + queueItemFrame:GetHeight() + 2;
--		self:debug("UpdateQueue: height="..height);

		-- show the frame
		queueItemFrame:Show();
	end

	-- hide any remaining frames
	local j = #itemQueue + 1;
	while true do
		local frame = _G["CauldronQueueItem"..j];
		if not frame then
			break;
		end

--		_G["CauldronQueueItem"..j] = nil;

		frame:SetParent(nil);
--		frame:SetAlpha(0.0);
		frame:Hide();
--		frame:SetHeight(0);

--		frame = nil;

		j = j + 1;
	end

	local intQueue = CauldronQueue:GetIntermediates(queue);
	local reagentList = CauldronQueue:GetReagents(queue);

	-- store the intermediate queue and the reagent list
--	self.db.realm.userdata[self.vars.playername].intQueue = intQueue;
--	self.db.realm.userdata[self.vars.playername].reagentList = reagentList;

	-- display intermediate queue, maybe
	if #intQueue == 0 then
		CauldronQueueFrameScrollFrameQueueSectionsSecondaryItemsHeader:SetHeight(1);
		CauldronQueueFrameScrollFrameQueueSectionsSecondaryItemsHeaderText:SetText("");
		CauldronQueueFrameScrollFrameQueueSectionsSecondaryItems:SetHeight(1);
	else
		CauldronQueueFrameScrollFrameQueueSectionsSecondaryItemsHeader:SetHeight(16);
		CauldronQueueFrameScrollFrameQueueSectionsSecondaryItemsHeaderText:SetText(L["You first have to make:"]);

		CauldronQueueFrameScrollFrameQueueSectionsSecondaryItems:SetHeight(#intQueue * itemFrameHeight);

		local intHeight = 0;

		for i, queueInfo in ipairs(intQueue) do
			local queueItemFrame = _G["CauldronQueueIntItem"..i];

			-- check if we have a frame for this position
			if not queueItemFrame then
				-- create a new frame for the skill information
				queueItemFrame = CreateFrame("Button",
											 "CauldronQueueIntItem"..i,
											 CauldronQueueFrameScrollFrameQueueSectionsSecondaryItems,
											 "CauldronQueueItemFrameTemplate");
			else
				-- set the frame's parent
				queueItemFrame:SetParent(CauldronQueueFrameScrollFrameQueueSectionsSecondaryItems);
			end

			queueItemFrame:SetID(100 + i);
			queueItemFrame.itemName = queueInfo.name;
			queueItemFrame.removeable = false;
			queueItemFrame.shoppable = true;
			queueItemFrame.inHoverButtons = false;

			-- don't show the "hover" buttons
		 	_G["CauldronQueueIntItem"..i.."RemoveItem"]:Hide();
			_G["CauldronQueueIntItem"..i.."RemoveItem"]:SetScale(0.75);
			--[[
			_G["CauldronQueueIntItem"..i.."IncreasePriority"]:Hide();
			_G["CauldronQueueIntItem"..i.."DecreasePriority"]:Hide();
			_G["CauldronQueueIntItem"..i.."DecrementCount"]:Hide();
			_G["CauldronQueueIntItem"..i.."IncrementCount"]:Hide();
			_G["CauldronQueueIntItem"..i.."IncrementCount"]:SetScale(0.75);
			_G["CauldronQueueIntItem"..i.."AddToShoppingList"]:Hide();
			_G["CauldronQueueIntItem"..i.."AddToShoppingList"]:SetScale(0.5);
			--]]

			local skillInfo = Cauldron:GetSkillInfo(queueInfo.tradeskill, queueInfo.name);
			if not skillInfo then
				-- the skill isn't available (character doesn't know it?)
				-- TODO
				self:error("No skill info available for: "..queueInfo.name.."!");
			end

			queueItemFrame.link = skillInfo.recipeLink;

			-- populate the frame
			local frame = nil;

			-- set name and difficulty color
			frame = _G["CauldronQueueIntItem"..i.."ItemName"];
			local nameText = queueInfo.name;
			if skillInfo then
				if (skillInfo.available > 0) then
					nameText = nameText.." ["..skillInfo.available.."]";
				end
				frame:SetText(nameText);

				local color = TradeSkillTypeColor[skillInfo.difficulty];
				if color then
					frame:SetFontObject(color.font);
					frame:SetTextColor(color.r, color.g, color.b, 1.0);
					frame.r = color.r;
					frame.g = color.g;
					frame.b = color.b;
				end
			else
				frame:SetFont("GameFontNormal", 12);
--				frame:SetTextColor(1.0, 1.0, 1.0, 1.0);
				frame.r = 1.0;
				frame.g = 1.0;
				frame.b = 1.0;
			end

			-- set quantity info
			frame = _G["CauldronQueueIntItem"..i.."Info"];
			local countInfo = Cauldron:ReagentCount(queueInfo.name);
			local infoText = queueInfo.tradeskill;
			--[[ string.format(queueInfo.tradeskill.."; "..L["Have %d"], countInfo.has);
			if countInfo.bank > 0 then
				infoText = infoText..string.format(L[" (%d in bank)"], countInfo.bank);
			end
			local need = math.max(0, queueInfo.amount - countInfo.has);
			if need > 0 then
				infoText = infoText..string.format(L[", need %d"], need);
			end --]]
			-- alts/bank/etc.
			frame:SetText(infoText);
			frame:SetTextColor(0.6, 0.6, 0.6, 1.0);
			frame:SetShadowOffset(0, 0);

			-- set the icon
			frame = _G["CauldronQueueIntItem"..i.."Icon"];
			frame:SetNormalTexture(queueInfo.icon);
			frame.link = queueInfo.link;

			-- set the amount
			frame = _G["CauldronQueueIntItem"..i.."IconCount"];
			frame:SetText(queueInfo.amount);

			-- place the frame in the scroll view
			if i > 1 then
				-- anchor to the frame above
				queueItemFrame:SetPoint("TOPLEFT", _G["CauldronQueueIntItem"..(i-1)], "BOTTOMLEFT", 0, 0);
			else
				-- anchor to the parent
				queueItemFrame:SetPoint("TOPLEFT", CauldronQueueFrameScrollFrameQueueSectionsSecondaryItems, "TOPLEFT", 0, 0);
			end

			-- adjust the scroll child size
--			intHeight = intHeight + queueItemFrame:GetHeight() + 2;
--			self:debug("UpdateQueue: height="..height);
--			CauldronQueueFrameScrollFrameQueueSectionsSecondaryItems:SetHeight(intHeight);

			-- show the frame
			queueItemFrame:Show();
		end
	end

	-- hide any remaining frames
	j = #intQueue + 1;
	while true do
		local frame = _G["CauldronQueueIntItem"..j];
		if not frame then
			break;
		end

--		_G["CauldronQueueIntItem"..j] = nil;

		frame:SetParent(nil);
--		frame:SetAlpha(0.0);
		frame:Hide();
--		frame:SetHeight(0);

--		frame = nil;

		j = j + 1;
	end

	-- display reagent list

	CauldronQueueFrameScrollFrameQueueSectionsReagentsHeaderText:SetText(L["You will need:"]);
	CauldronQueueFrameScrollFrameQueueSectionsReagents:SetHeight(#reagentList * itemFrameHeight);

	local reagentHeight = 0;

	for i, queueInfo in ipairs(reagentList) do
		local queueItemFrame = _G["CauldronQueueReagentItem"..i];

		-- check if we have a frame for this position
		if not queueItemFrame then
			-- create a new frame for the skill information
			queueItemFrame = CreateFrame("Button",
										 "CauldronQueueReagentItem"..i,
										 CauldronQueueFrameScrollFrameQueueSectionsReagents,
										 "CauldronQueueItemFrameTemplate");
	    else
	    	self:debug("use existing frame for item "..i..": "..queueInfo.name);

	    	-- set the frame's parent
	    	queueItemFrame:SetParent(CauldronQueueFrameScrollFrameQueueSectionsReagents);
		end

		local countInfo = Cauldron:ReagentCount(queueInfo.name);
		local need = math.max(0, queueInfo.amount - countInfo.has);

		queueItemFrame:SetID(200 + i);
		queueItemFrame.skillIndex = queueInfo.skillIndex;
		queueItemFrame.index = queueInfo.index;
		queueItemFrame.itemName = queueInfo.name;
		queueItemFrame.removeable = false;
		queueItemFrame.shoppable = true;
		queueItemFrame.inHoverButtons = false;
		queueItemFrame.needAmount = need;

		-- don't show the "hover" buttons
		_G["CauldronQueueReagentItem"..i.."RemoveItem"]:Hide();
		_G["CauldronQueueReagentItem"..i.."RemoveItem"]:SetScale(0.75);
		--[[
		_G["CauldronQueueReagentItem"..i.."IncreasePriority"]:Hide();
		_G["CauldronQueueReagentItem"..i.."DecreasePriority"]:Hide();
		_G["CauldronQueueReagentItem"..i.."DecrementCount"]:Hide();
		_G["CauldronQueueReagentItem"..i.."IncrementCount"]:Hide();
		_G["CauldronQueueReagentItem"..i.."IncrementCount"]:SetScale(0.75);
		_G["CauldronQueueReagentItem"..i.."AddToShoppingList"]:Hide();
		_G["CauldronQueueReagentItem"..i.."AddToShoppingList"]:SetScale(0.5);
		--]]

		local skillInfo = Cauldron:GetSkillInfo(queueInfo.tradeskill, queueInfo.name);
		if not skillInfo then
			-- TODO
		end

		-- populate the frame
		local frame = nil;

		-- set name and difficulty color
		frame = _G["CauldronQueueReagentItem"..i.."ItemName"];
		frame:SetText(queueInfo.name);
		frame:SetShadowOffset(0, 0);
		frame:SetFont("GameFontNormal", 12);
		frame:SetTextColor(0.8, 0.8, 0.8, 1.0);
		frame.r = 1.0;
		frame.g = 1.0;
		frame.b = 1.0;

		-- set quantity info
		frame = _G["CauldronQueueReagentItem"..i.."Info"];
		local countInfo = Cauldron:ReagentCount(queueInfo.name);
		local qtyText = string.format(L["Have %d"], countInfo.has);
		if countInfo.bank > 0 then
			qtyText = qtyText..string.format(L[" (%d in bank)"], countInfo.bank);
		end
		if need > 0 then
			qtyText = qtyText..string.format(L[", need %d"], need);
		end
		-- TODO: alts/bank/etc.
		frame:SetText(qtyText);
		frame:SetTextColor(0.4, 0.4, 0.4, 1.0);
		frame:SetShadowOffset(0, 0);

		-- set the icon
		frame = _G["CauldronQueueReagentItem"..i.."Icon"];
		frame:SetNormalTexture(queueInfo.icon);
		frame.link = queueInfo.link;
--		local playerReagentCount = 0; -- TODO
--		if playerReagentCount < queueInfo.amount then
--			frame:SetVertexColor(0.5, 0.5, 0.5, 1.0);
--			frame:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
--		else
--			frame:SetVertexColor(1.0, 1.0, 1.0, 1.0);
--			frame:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
--		end

		-- set the amount
		frame = _G["CauldronQueueReagentItem"..i.."IconCount"];
		frame:SetText(queueInfo.amount);

		-- place the frame in the scroll view
		if i > 1 then
			-- anchor to the frame above
			queueItemFrame:SetPoint("TOPLEFT", _G["CauldronQueueReagentItem"..(i-1)], "BOTTOMLEFT", 0, 0);
		else
			-- anchor to the parent
			queueItemFrame:SetPoint("TOPLEFT", CauldronQueueFrameScrollFrameQueueSectionsReagents, "TOPLEFT", 0, 0);
		end

		-- adjust the scroll child size
--		reagentHeight = reagentHeight + queueItemFrame:GetHeight() + 2;
--		self:debug("UpdateQueue: height="..height);
--		CauldronQueueFrameScrollFrameQueueSectionsReagents:SetHeight(reagentHeight);

		-- show the frame
		queueItemFrame:Show();
	end

	-- hide any remaining frames
	j = #reagentList + 1;
	while true do
		local frame = _G["CauldronQueueReagentItem"..j];
		if not frame then
			break;
		end

--		_G["CauldronQueueReagentItem"..j] = nil;

		frame:SetParent(nil);
--		frame:SetAlpha(0.0);
		frame:Hide();
--		frame:SetHeight(0);

--		frame = nil;

		j = j + 1;
	end
--]]
	-- adjust the height of the scroll frame
	local h = CauldronQueueFrameScrollFrameQueueSectionsMainItemsHeader:GetHeight() +
			CauldronQueueFrameScrollFrameQueueSectionsMainItems:GetHeight() +
			CauldronQueueFrameScrollFrameQueueSectionsSecondaryItemsHeader:GetHeight() +
			CauldronQueueFrameScrollFrameQueueSectionsSecondaryItems:GetHeight() +
			CauldronQueueFrameScrollFrameQueueSectionsReagentsHeader:GetHeight() +
			CauldronQueueFrameScrollFrameQueueSectionsReagents:GetHeight();
	CauldronQueueFrameScrollFrameQueueSections:SetHeight(h);
	CauldronQueueFrameScrollFrame:UpdateScrollChildRect();

end

function Cauldron:QueueItem_OnDoubleClick(frame)
	Cauldron:AddItemToShoppingList(frame.itemName, frame.needAmount);
end