-- $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];
self:debug("queueItemFrame: "..tostring(queueItemFrame));
-- check if we have a frame for this position
if not queueItemFrame then
-- create a new frame for the queue information
self:debug("create a new frame for item "..i..": "..queueInfo.name);
queueItemFrame = CreateFrame("Button",
"CauldronQueueItem"..i,
CauldronQueueFrameScrollFrameQueueSectionsMainItems,
"CauldronQueueItemFrameTemplate");
else
self:debug("use existing frame for item "..i..": "..queueInfo.name);
-- 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
self:debug("Using 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
self:debug("use existing frame for item "..i..": "..queueInfo.name);
-- 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