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