From ba47c2db1ca5bfe19f0302d715f05fc4ac78687c Mon Sep 17 00:00:00 2001 From: Paul Schifferer Date: Sun, 5 Dec 2010 11:02:16 -0800 Subject: [PATCH] Main UI updates --- Bindings.xml | 3 + Cauldron.toc | 5 +- CauldronCommon.xml | 27 + CauldronMain.lua | 25 +- CauldronMain.xml | 1660 ++++++++++++++++++++++++++++++------------------ CauldronMainUI.lua | 862 +++++++------------------ CauldronQueue.xml | 673 ++++++++++++++++++++ CauldronQueueUI.lua | 477 ++++++++++++++ CauldronTradeskill.lua | 82 ++- 9 files changed, 2573 insertions(+), 1241 deletions(-) create mode 100644 CauldronCommon.xml create mode 100644 CauldronQueue.xml create mode 100644 CauldronQueueUI.lua diff --git a/Bindings.xml b/Bindings.xml index 08fccc1..e96216e 100644 --- a/Bindings.xml +++ b/Bindings.xml @@ -3,6 +3,9 @@ Cauldron:ShoppingList_Toggle(); + + Cauldron:Queue_Toggle(); + Cauldron:Reset(); diff --git a/Cauldron.toc b/Cauldron.toc index 6ed5d53..2431aca 100755 --- a/Cauldron.toc +++ b/Cauldron.toc @@ -1,5 +1,5 @@ ## Interface: 40000 -## Title: Cauldron2 |cff7fff7f -Ace3-|r +## Title: Cauldron |cff7fff7f -Ace3-|r ## Version: @project-revision@ ## Author: Caendra of Silver Hand ## Notes: An improved interface for your trade skills @@ -31,9 +31,12 @@ CauldronUtil.lua CauldronData.lua CauldronMainUI.lua +CauldronQueueUI.lua CauldronShoppingListUI.lua +CauldronCommon.xml CauldronMain.xml +CauldronQueue.xml CauldronShoppingList.xml #@alpha@ diff --git a/CauldronCommon.xml b/CauldronCommon.xml new file mode 100644 index 0000000..c9b536e --- /dev/null +++ b/CauldronCommon.xml @@ -0,0 +1,27 @@ + + + + + + diff --git a/CauldronMain.lua b/CauldronMain.lua index 107c484..38c4edd 100644 --- a/CauldronMain.lua +++ b/CauldronMain.lua @@ -2,6 +2,7 @@ -- Cauldron main file UIPanelWindows["CauldronQueueWindowFrame"] = { area = "left", pushable = 6 }; +UIPanelWindows["CauldronFrame"] = { area = "left", pushable = 3 }; Cauldron = LibStub("AceAddon-3.0"):NewAddon("Cauldron", "AceEvent-3.0", "AceTimer-3.0", "AceConsole-3.0", "AceHook-3.0", "LibLogger-1.0"); local L = LibStub("AceLocale-3.0"):GetLocale("Cauldron"); @@ -12,14 +13,17 @@ Cauldron.date = string.sub("$Date: 2010-08-27 21:03:36 -0700 (Fri, 27 Aug 2010) -- key binding names BINDING_HEADER_CAULDRON = "Cauldron"; BINDING_NAME_TOGGLE_CAULDRONSHOPPINGLIST = "Toggle Shopping List Window"; +BINDING_NAME_TOGGLE_CAULDRONQUEUE = "Toggle Queue"; BINDING_NAME_CAULDRONRESET = "Reset Cauldron"; -Cauldron.options = {}; -Cauldron.options.buttons = {}; +Cauldron.options = { + buttons = {}, +}; Cauldron.vars = { enabled = true, - inventory = {}; + showQueue = true, + inventory = {}, }; Cauldron.libs = {}; @@ -312,6 +316,9 @@ function Cauldron:OnEnable() -- clear init flag self.initializing = false; + + -- upset the standard tradeskill frame + UIPanelWindows["TradeSkillFrame"] = { area = "center" }; end @@ -354,9 +361,9 @@ function Cauldron:OnTradeShow() self:debug("OnTradeShow: update known skills"); -- self:ScheduleTimer(self.UpdateSkills,1,self); if not Cauldron.updatingSkills then - self.updatingSkills = true; - self:UpdateSkills(); - self.updatingSkills = false; +-- Cauldron:info("Requesting skill update on trade show"); + Cauldron.updatingSkills = Cauldron:NeedsSkillUpdate(); + Cauldron:UpdateSkills(); end -- register for events that are needed when the window is open @@ -410,7 +417,8 @@ function Cauldron:OnSkillUpdate() -- Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[CURRENT_TRADESKILL].window.selected = 0; if not Cauldron.updatingSkills then - Cauldron.updatingSkills = true; +-- Cauldron:info("Requesting skill update for skill update"); + Cauldron.updatingSkills = Cauldron:NeedsSkillUpdate(); Cauldron:UpdateSkills(); Cauldron.updatingSkills = false; end @@ -1287,6 +1295,9 @@ end }, ["skills"] = { [""] = { + ["skillLevel"] = , + ["skillCount"] = , + ["lastScanDate"] = , ["window"] = { -- window metadata ["categories"] = { -- category cache of the tradeskill [""] = { -- name of the category diff --git a/CauldronMain.xml b/CauldronMain.xml index 0fe31f4..c9cbaee 100755 --- a/CauldronMain.xml +++ b/CauldronMain.xml @@ -2,69 +2,156 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> - - + + + + + CursorOnUpdate(self); + + + HandleModifiedItemClick(self.link); + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - --> - - - - HandleModifiedItemClick(self.link); - - + + PlaySound("igMainMenuOptionCheckBoxOn"); + HandleModifiedItemClick(GetTradeSkillRecipeLink(self.skillIndex)); + Cauldron:SkillItem_OnClick(self, button, down); + - - - - - - - - - + + + + + + + + - - + + + + - + + + + + - - - - - - - - - - - - --> + + + + + + + + + + + + + + + + + + + + + + + + -- CauldronSkillNameText:SetText("skill name"); + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - + + + + + + + if ( (not PartialPlayTime()) and (not NoPlayTime()) ) then + CauldronInputBox:SetNumber(CauldronFrame.numAvailable); + DoTradeSkill(CauldronFrame.selectedSkill, CauldronFrame.numAvailable); + CauldronInputBox:ClearFocus(); + end + + + - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + if ( self:GetText() == "0" ) then + self:SetText("1"); + end + + + + + + - - + + - - + + + + - + + + + + + + + + + - - - return; - - - PlaySound("igCharacterInfoOpen"); - - - --HideUIPanel(CauldronFrame); - PlaySound("igCharacterInfoClose"); - - - return; - - - - diff --git a/CauldronMainUI.lua b/CauldronMainUI.lua index 606277a..a824951 100644 --- a/CauldronMainUI.lua +++ b/CauldronMainUI.lua @@ -1,5 +1,5 @@ -- $Revision: 213 $ --- Cauldron user interface logic +-- Cauldron main user interface logic local L = LibStub("AceLocale-3.0"):GetLocale("Cauldron") @@ -7,6 +7,29 @@ local L = LibStub("AceLocale-3.0"):GetLocale("Cauldron") local SLOT_NONE = "none"; +function CauldronFrame_OnLoad() + +-- ButtonFrameTemplate_HideButtonBar(CauldronFrame); + ButtonFrameTemplate_HideAttic(CauldronFrame); +-- CauldronFrameInsetBg:Hide(); + +end + +function CauldronFrame_OnEvent() +end + +function CauldronFrame_OnShow() +end + +function CauldronFrame_OnHide() +end + +function CauldronSearch_OnTextChanged() +end + +function CauldronFrame_Update() +end + function CauldronFrame_Show() Cauldron:Frame_Show(); end @@ -85,10 +108,17 @@ self:debug("frame show: "..tostring(CauldronQueueWindowFrame)); CauldronClearQueueButton:SetText(L["Clear Queue"]); --]==] - ShowUIPanel(CauldronQueueWindowFrame); - SetPortraitToTexture(CauldronQueueWindowFramePortrait, GetTradeSkillTexture()); --- table.insert(UISpecialFrames, CauldronQueueWindowFrame:GetName()); - CauldronQueueWindowFrameTitleText:SetText(L["Queue"]); + -- show main UI + ShowUIPanel(CauldronFrame); + SetPortraitToTexture(CauldronFramePortrait, GetTradeSkillTexture()); + CauldronFrameTitleText:SetText(L["Cauldron"].." "..Cauldron.version); + + -- show queue UI + if Cauldron.vars.showQueue then + ShowUIPanel(CauldronQueueWindowFrame); + SetPortraitToTexture(CauldronQueueWindowFramePortrait, GetTradeSkillTexture()); + CauldronQueueWindowFrameTitleText:SetText(L["Queue"]); + end self:RegisterMessage("Cauldron_Update", "OnCauldronUpdate"); @@ -99,8 +129,9 @@ end function Cauldron:Frame_Hide() - self:UnregisterEvent("Cauldron_Update") + self:UnregisterEvent("Cauldron_Update"); HideUIPanel(CauldronQueueWindowFrame); + HideUIPanel(CauldronFrame); --[[ if TradeSkillFrame then @@ -135,8 +166,7 @@ function Cauldron:Frame_Update() return; end ---[==[ - Cauldron:UpdateSkills(); +-- Cauldron:UpdateSkills(); if CURRENT_TRADESKILL ~= name then @@ -156,15 +186,16 @@ function Cauldron:Frame_Update() -- display skill name, level/progress self:UpdateSkillInfo(name, rank, maxRank); +--[==[ -- update search text box self:UpdateSearchText(); -- TODO: update dropdowns self:UpdateFilterDropDowns(); +--]==] -- display list of matching skills self:UpdateSkillList(); ---]==] -- display queue self:UpdateQueue(); @@ -179,16 +210,24 @@ function Cauldron:UpdateSkillInfo(skillName, rank, maxRank) self:debug("UpdateSkillInfo enter"); --@end-alpha@ ---[==[ local skillCount = Cauldron:GetSkillCount(skillName); +--[==[ CauldronRankFrameSkillName:SetText(skillName.." ("..skillCount.." "..L["skills"]..")"); +--]==] + CauldronSkillNameText:SetText(skillName); + local prof_title = ""; + for i=1,#PROFESSION_RANKS do + local value,title = PROFESSION_RANKS[i][1], PROFESSION_RANKS[i][2]; + if maxRank < value then break end + prof_title = title; + end + CauldronRankInfoText:SetText(prof_title..", "..skillCount.." "..L["skills"]); CauldronRankFrame:SetStatusBarColor(0.0, 0.0, 1.0, 0.5); CauldronRankFrameBackground:SetVertexColor(0.0, 0.0, 0.75, 0.5); CauldronRankFrame:SetMinMaxValues(0, maxRank); CauldronRankFrame:SetValue(rank); - CauldronRankFrameSkillRank:SetText(rank.."/"..maxRank); ---]==] + CauldronRankFrameText:SetText(rank.."/"..maxRank); end @@ -224,9 +263,6 @@ end function Cauldron:UpdateSkillList() --- Cauldron:info("Updating skill list: "..debugstack()); - ---[==[ local skillName = CURRENT_TRADESKILL; if IsTradeSkillLinked() then skillName = "Linked-"..skillName; @@ -247,12 +283,18 @@ function Cauldron:UpdateSkillList() -- check if we have a frame for this position if not skillFrame then -- create a new frame for the skill information + if self.db.realm.userdata[self.vars.playername].options.compactView then + -- TODO + else + -- TODO + end skillFrame = CreateFrame("Button", "CauldronSkillItem"..i, - CauldronSkillListFrameScrollFrameScrollChild, - "CauldronSkillItemFrameTemplate"); + CauldronSkillListScrollFrameScrollChild, + "CauldronSkillItemNormalCollapsedFrameTemplate"); end + --[[ if self.db.realm.userdata[self.vars.playername].options.compactView then -- set the height of frame skillFrame:SetHeight(25); @@ -282,6 +324,7 @@ function Cauldron:UpdateSkillList() -- show the category info _G["CauldronSkillItem"..i.."SkillCategory"]:Show(); end + --]] skillFrame:SetID(i); skillFrame.skillIndex = skillInfo.index; @@ -295,161 +338,217 @@ function Cauldron:UpdateSkillList() -- populate the frame local frame = nil; - + -- set name and difficulty color frame = _G["CauldronSkillItem"..i.."SkillName"]; - local nameText = skillInfo.name; - local potentialCount = Cauldron:GetPotentialCraftCount(skillInfo); - if (potentialCount > 0) and (potentialCount > skillInfo.available) then - nameText = nameText.." ["..skillInfo.available.."/"..potentialCount.."]"; - elseif skillInfo.available > 0 then - nameText = nameText.." ["..skillInfo.available.."]"; - end - local achievements = Cauldron:GetAchievementsForSkill(skillInfo); - if achievements and #achievements > 0 then - nameText = nameText.." [A]"; - end - frame:SetText(nameText); - if TradeSkillTypeColor then - local color = TradeSkillTypeColor[skillInfo.difficulty]; - if color then - frame:SetFontObject(color.font); - frame.r = color.r; - frame.g = color.g; - frame.b = color.b; + if frame then + local nameText = skillInfo.name; + local skillNamePrefix = ""; + if ( ENABLE_COLORBLIND_MODE == "1" ) then + skillNamePrefix = TradeSkillTypePrefix[skillType].." " or ""; + end + frame:SetText(skillNamePrefix..nameText); + if TradeSkillTypeColor then + local color = TradeSkillTypeColor[skillInfo.difficulty]; + if color then + frame:SetFontObject(color.font); + frame.r = color.r; + frame.g = color.g; + frame.b = color.b; + end end end -- set category frame = _G["CauldronSkillItem"..i.."SkillCategory"]; - frame:SetText(skillInfo.defaultCategory); - if TradeSkillTypeColor then - frame:SetFontObject(TradeSkillTypeColor.header.font); - frame.r = TradeSkillTypeColor.header.r; - frame.g = TradeSkillTypeColor.header.g; - frame.b = TradeSkillTypeColor.header.b; + if frame then + frame:SetText(skillInfo.defaultCategory); + if TradeSkillTypeColor then + frame:SetFontObject(TradeSkillTypeColor.header.font); + frame.r = TradeSkillTypeColor.header.r; + frame.g = TradeSkillTypeColor.header.g; + frame.b = TradeSkillTypeColor.header.b; + end end -- set favorite check button frame = _G["CauldronSkillItem"..i.."FavoriteButton"]; - frame:SetChecked(self.db.realm.userdata[self.vars.playername].skills[skillName].window.skills[skillInfo.name].favorite); - frame.skillInfo = skillInfo; - - -- set cooldown - frame = _G["CauldronSkillItem"..i.."SkillCooldown"]; - local cooldown = GetTradeSkillCooldown(skillInfo.index); - if cooldown then - if not frame:IsVisible() then - frame:Show(); - end - frame:SetText(SecondsToTime(cooldown)); - else - if frame:IsVisible() then - frame:Hide(); + if frame then + frame:SetChecked(self.db.realm.userdata[self.vars.playername].skills[skillName].window.skills[skillInfo.name].favorite); + frame.skillInfo = skillInfo; + + -- set cooldown + --[[ + frame = _G["CauldronSkillItem"..i.."SkillCooldown"]; + local cooldown = GetTradeSkillCooldown(skillInfo.index); + if cooldown then + if not frame:IsVisible() then + frame:Show(); + end + frame:SetText(SecondsToTime(cooldown)); + else + if frame:IsVisible() then + frame:Hide(); + end end + --]] end -- set the icon frame = _G["CauldronSkillItem"..i.."SkillIcon"]; - frame:SetNormalTexture(skillInfo.icon); - frame.itemLink = skillInfo.link; - frame.skillIndex = skillInfo.index; + if frame then + frame:SetNormalTexture(skillInfo.icon); + frame.itemLink = skillInfo.link; + frame.skillIndex = skillInfo.index; + end -- set the craft count frame = _G["CauldronSkillItem"..i.."SkillIconCount"]; - local minMade, maxMade = skillInfo.minMade, skillInfo.maxMade; - if maxMade > 1 then - if minMade == maxMade then - frame:SetText(minMade); + if frame then + local minMade, maxMade = skillInfo.minMade, skillInfo.maxMade; + if maxMade > 1 then + if minMade == maxMade then + frame:SetText(minMade); + else + frame:SetText(minMade.."-"..maxMade); + end + if frame:GetWidth() > 39 then + frame:SetText("~"..floor((minMade + maxMade)/2)); + end else - frame:SetText(minMade.."-"..maxMade); - end - if frame:GetWidth() > 39 then - frame:SetText("~"..floor((minMade + maxMade)/2)); + frame:SetText(""); end - else - frame:SetText(""); end -- set the disclosure button texture frame = _G["CauldronSkillItem"..i.."DiscloseButton"]; - frame.skillInfo = skillInfo; - local reagentsExpanded = self.db.realm.userdata[self.vars.playername].skills[skillName].window.skills[skillInfo.name].expanded; - if reagentsExpanded then - frame:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up"); - - _G["CauldronSkillItem"..i.."Reagents"]:Show(); - - -- fill in the tools info - local spellFocus = BuildColoredListString(GetTradeSkillTools(skillInfo.index)); - local toolsFrame = _G["CauldronSkillItem"..i.."ReagentsToolsInfo"]; - if spellFocus then - toolsFrame:Show(); - toolsFrame:SetText(L["Requires"]..": "..spellFocus); - toolsFrame:SetHeight(15); - else - toolsFrame:Hide(); - toolsFrame:SetText(""); - toolsFrame:SetHeight(0); - end - - -- fill in the reagents - _G["CauldronSkillItem"..i.."Reagents"]:SetScale(0.86); - - -- get reagents table - local reagents = skillInfo.reagents; - local reagentCount = #reagents; - - for j=1,8 do - local reagentFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j]; - - if j > reagentCount then - reagentFrame:Hide(); + if frame then + frame.skillInfo = skillInfo; + local reagentsExpanded = self.db.realm.userdata[self.vars.playername].skills[skillName].window.skills[skillInfo.name].expanded; + -- if reagentsExpanded then + frame:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up"); + + -- _G["CauldronSkillItem"..i.."Reagents"]:Show(); + + -- fill in the tools info + --[[ + local spellFocus = BuildColoredListString(GetTradeSkillTools(skillInfo.index)); + local toolsFrame = _G["CauldronSkillItem"..i.."ReagentsToolsInfo"]; + if spellFocus then + toolsFrame:Show(); + toolsFrame:SetText(L["Requires"]..": "..spellFocus); + toolsFrame:SetHeight(15); else - local reagentInfo = reagents[j]; - - reagentFrame.skillIndex = skillInfo.index; - reagentFrame.reagentIndex = reagentInfo.index; - reagentFrame.link = reagentInfo.link; - - local reagentNameFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j.."Name"]; - local reagentCountFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j.."Count"]; - - -- PARANOIA: check if the reagent name, icon, or link are missing - if not reagentInfo.name or not reagentInfo.icon or not reagentInfo.link then - -- Cauldron:error("Reagent info missing; marking recipe for rescan: "..skillInfo.name); - Cauldron:MarkRecipeForRescan(self.db.realm.userdata[self.vars.playername].skills[skillName], skillInfo.name); - end - - reagentFrame:Show(); - SetItemButtonTexture(reagentFrame, reagentInfo.icon); - reagentNameFrame:SetText(reagentInfo.name); - - local playerReagentCount = GetItemCount(reagentInfo.name); - - if playerReagentCount < reagentInfo.numRequired then - -- Gray out items - SetItemButtonTextureVertexColor(reagentFrame, 0.5, 0.5, 0.5); - reagentNameFrame:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); - else - SetItemButtonTextureVertexColor(reagentFrame, 1.0, 1.0, 1.0); - reagentNameFrame:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); - end - if playerReagentCount >= 100 then - playerReagentCount = "*"; + toolsFrame:Hide(); + toolsFrame:SetText(""); + toolsFrame:SetHeight(0); + end + --]] + + -- fill in the reagents + -- _G["CauldronSkillItem"..i.."Reagents"]:SetScale(0.86); + + -- get reagents table + local reagents = skillInfo.reagents; + local reagentCount = #reagents; + + for j=1,8 do + local reagentFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j]; + + if reagentFrame then + if j > reagentCount then + reagentFrame:Hide(); + else + local reagentInfo = reagents[j]; + + reagentFrame.skillIndex = skillInfo.index; + reagentFrame.reagentIndex = reagentInfo.index; + reagentFrame.link = reagentInfo.link; + + local reagentNameFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j.."Name"]; + local reagentIconFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j.."IconTexture"]; + Cauldron:info("reagentIconFrame="..tostring(reagentIconFrame)); + local reagentCountFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j.."Count"]; + + -- PARANOIA: check if the reagent name, icon, or link are missing + if not reagentInfo.name or not reagentInfo.icon or not reagentInfo.link then + -- Cauldron:error("Reagent info missing; marking recipe for rescan: "..skillInfo.name); + Cauldron:MarkRecipeForRescan(self.db.realm.userdata[self.vars.playername].skills[skillName], skillInfo.name); + end + + reagentFrame:Show(); + SetItemButtonTexture(reagentFrame, reagentInfo.icon); + if reagentNameFrame then + reagentNameFrame:SetText(reagentInfo.name); + end + + local playerReagentCount = GetItemCount(reagentInfo.name); + + if playerReagentCount < reagentInfo.numRequired then + -- Gray out items + SetItemButtonTextureVertexColor(reagentFrame, 0.5, 0.5, 0.5); + if reagentNameFrame then + reagentNameFrame:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); + end + else + SetItemButtonTextureVertexColor(reagentFrame, 1.0, 1.0, 1.0); + if reagentNameFrame then + reagentNameFrame:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); + end + end + if playerReagentCount >= 100 then + playerReagentCount = "*"; + end + if reagentCountFrame then + reagentCountFrame:SetText(playerReagentCount.."/"..reagentInfo.numRequired); + end + end end - reagentCountFrame:SetText(playerReagentCount.."/"..reagentInfo.numRequired); end + + --[[ TODO: only adjust height for expanded views + local reagentRows = math.floor((reagentCount - 1) / 2) + 1; + _G["CauldronSkillItem"..i.."Reagents"]:SetHeight(toolsFrame:GetHeight() + (reagentRows * _G["CauldronSkillItem"..i.."ReagentsItemDetail1"]:GetHeight())); + _G["CauldronSkillItem"..i]:SetHeight(_G["CauldronSkillItem"..i.."SkillIcon"]:GetHeight() + _G["CauldronSkillItem"..i.."Reagents"]:GetHeight()); + --]] + --[[ + else + _G["CauldronSkillItem"..i.."Reagents"]:Hide(); + + frame:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up"); + _G["CauldronSkillItem"..i]:SetHeight(_G["CauldronSkillItem"..i.."SkillIcon"]:GetHeight()); end + --]] + end - local reagentRows = math.floor((reagentCount - 1) / 2) + 1; - _G["CauldronSkillItem"..i.."Reagents"]:SetHeight(toolsFrame:GetHeight() + (reagentRows * _G["CauldronSkillItem"..i.."ReagentsItemDetail1"]:GetHeight())); - _G["CauldronSkillItem"..i]:SetHeight(_G["CauldronSkillItem"..i.."SkillIcon"]:GetHeight() + _G["CauldronSkillItem"..i.."Reagents"]:GetHeight()); - else - _G["CauldronSkillItem"..i.."Reagents"]:Hide(); + -- craft count + frame = _G["CauldronSkillItem"..i.."MiscInfoCount"]; + if frame then + local potentialCount = Cauldron:GetPotentialCraftCount(skillInfo); + local text = ""; + if (potentialCount > 0) and (potentialCount > skillInfo.available) then + text = skillInfo.available.."/"..potentialCount; + elseif skillInfo.available > 0 then + text = skillInfo.available; + end + frame:SetText(text); + end + + -- special skill-ups + frame = _G["CauldronSkillItem"..i.."MiscInfoNumSkillUpsIcon"]; + if frame then + -- TODO + end - frame:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up"); - _G["CauldronSkillItem"..i]:SetHeight(_G["CauldronSkillItem"..i.."SkillIcon"]:GetHeight()); + -- achievement indicator + frame = _G["CauldronSkillItem"..i.."MiscInfoAchievement"]; + if frame then + local achievements = Cauldron:GetAchievementsForSkill(skillInfo); + local text = ""; + if achievements and #achievements > 0 then + text = "A"; + end + frame:SetText(text); end -- place the frame in the scroll view @@ -463,7 +562,7 @@ function Cauldron:UpdateSkillList() -- adjust the scroll child size height = height + skillFrame:GetHeight(); - CauldronSkillListFrameScrollFrameScrollChild:SetHeight(height); + CauldronSkillListScrollFrameScrollChild:SetHeight(height); -- show the frame skillFrame:Show(); @@ -482,7 +581,6 @@ function Cauldron:UpdateSkillList() j = j + 1; end ---]==] end @@ -552,484 +650,6 @@ function Cauldron:UpdateButtons() end -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(12); - 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:SaveFramePosition() - --- TODO - -end - function Cauldron:OnCauldronUpdate() --[[ diff --git a/CauldronQueue.xml b/CauldronQueue.xml new file mode 100644 index 0000000..08a50c5 --- /dev/null +++ b/CauldronQueue.xml @@ -0,0 +1,673 @@ + + + + + + + + + + HandleModifiedItemClick(self.link); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + return; + + + PlaySound("igCharacterInfoOpen"); + + + --HideUIPanel(CauldronFrame); + PlaySound("igCharacterInfoClose"); + + + return; + + + + + diff --git a/CauldronQueueUI.lua b/CauldronQueueUI.lua new file mode 100644 index 0000000..8d42ce5 --- /dev/null +++ b/CauldronQueueUI.lua @@ -0,0 +1,477 @@ +-- $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(12); + 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 + diff --git a/CauldronTradeskill.lua b/CauldronTradeskill.lua index f1f6f15..9efcb7a 100644 --- a/CauldronTradeskill.lua +++ b/CauldronTradeskill.lua @@ -3,18 +3,68 @@ local L = LibStub("AceLocale-3.0"):GetLocale("Cauldron") +function Cauldron:NeedsSkillUpdate() + +-- Cauldron:info("checking for skill update"); + + if CURRENT_TRADESKILL == "UNKNOWN" or CURRENT_TRADESKILL == "" then +-- Cauldron:info("no current tradeskill; no update needed"); + return false; + end + local skillName = CURRENT_TRADESKILL; + + -- initialize the trade skill entry + if not Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName] then + Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName] = {}; +-- Cauldron:info("no skill entry; update needed"); + return true; + end + + -- initialize the reagent map + if not Cauldron.db.realm.userdata[Cauldron.vars.playername].reagentMap then + Cauldron.db.realm.userdata[Cauldron.vars.playername].reagentMap = {}; +-- Cauldron:info("no reagent map; update needed"); + return true; + end + + -- save the skill entry in a local var + local skillDB = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName]; + if not skillDB.recipes then + skillDB.recipes = {}; + end + + local numTradeSkills = GetNumTradeSkills(); + local name, rank, maxRank = GetTradeSkillLine(); + + if (tonumber(numTradeSkills) ~= tonumber(skillDB.skillCount)) then +-- Cauldron:info("skill count mismatch; update needed"); + return true; + end + if (tonumber(rank) ~= tonumber(skillDB.skillLevel)) then +-- Cauldron:info("skill level mismatch; update needed"); + return true; + end + if ((time() - tonumber(skillDB.lastScanDate)) > 184000) then +-- Cauldron:info("time since last scan > 184000 seconds; update needed"); + end + +-- Cauldron:info("all checks passed; no updated needed"); + return false; +end + function Cauldron:UpdateSkills() self:debug("UpdateSkills enter"); -- self:info("updating skills: "..debugstack()); --- self:info("updatingSkills="..tostring(self.updatingSkills)); +-- Cauldron:info("updatingSkills="..tostring(self.updatingSkills)); if not self.updatingSkills then self:debug("not updating skills; return"); return; end - local skillName = GetTradeSkillLine(); + local numTradeSkills = GetNumTradeSkills(); + local skillName, rank, maxRank = GetTradeSkillLine(); local baseSkillName = skillName; self:debug("UpdateSkills: skillName="..skillName); @@ -22,6 +72,7 @@ function Cauldron:UpdateSkills() return; end +-- Cauldron:info("scanningSkills="..tostring(self.scanningSkills)); if not Cauldron.scanningSkills then Cauldron.scanningSkills = true; @@ -46,6 +97,11 @@ function Cauldron:UpdateSkills() skillDB.recipes = {}; end + -- record skill stats + skillDB.skillLevel = rank; + skillDB.skillCount = numTradeSkills; + skillDB.lastScanDate = time(); + local rescanNotify = false; -- initialize window information, if necessary @@ -80,6 +136,18 @@ function Cauldron:UpdateSkills() -- make sure we're getting a full list SetTradeSkillItemNameFilter(nil); SetTradeSkillItemLevelFilter(0, 0); + TradeSkillOnlyShowSkillUps(false); + TradeSkillOnlyShowMakeable(false); + --[[ + local slots = { GetTradeSkillSubClassFilteredSlots(0) }; + for i,slot in pairs(slots) do + SetTradeSkillInvSlotFilter(i, 0, 0); + end + local subClasses = { GetTradeSkillSubClasses() }; + for i,subClass in pairs(subClasses) do + SetTradeSkillSubClassFilter(i, 0, 0); + end + --]] local category = ""; @@ -260,11 +328,15 @@ function Cauldron:UpdateSkills() Cauldron.scanningSkills = false; end + --[[ if rescanNotify then Cauldron:error(L["Cauldron had issues with some recipes for this profession."]); local msg = string.format(L["Please close and re-open the %1$s window again to re-scan."], baseSkillName); Cauldron:info(msg); end + --]] + + self.updatingSkills = false; self:debug("UpdateSkills exit"); end @@ -354,16 +426,15 @@ function Cauldron:GetSkillList(playername, skillName) if (not playername) or (not skillName) then self:warn("GetSkillList: playername ("..tostring(playername)..") or skillName ("..tostring(skillName)..") not set!"); - return; + return {}; end if (not self.db.realm.userdata[playername]) or (not self.db.realm.userdata[playername].skills[skillName]) then - return; + return {}; end local skills = {}; ---[====[ for name, recipe in pairs(self.db.realm.userdata[playername].skills[skillName].recipes) do self:debug("GetSkillList: name="..name); @@ -583,7 +654,6 @@ function Cauldron:GetSkillList(playername, skillName) --@alpha@ self:debug("GetSkillList exit"); ---]====] return skills; end -- 1.7.9.5