contrebasse@0: local addonName, A = ... contrebasse@0: contrebasse@0: -- Create the menu frame contrebasse@3: local MenuFrame = CreateFrame("Frame","ReagentMaker_ExternalFrame",UIParent) --, "ReagentMakerDropDownMenu"); -- Needs a global name ? contrebasse@0: MenuFrame:Hide() contrebasse@3: MenuFrame:SetSize(192,256) contrebasse@2: MenuFrame:SetFrameStrata("DIALOG") contrebasse@3: MenuFrame:EnableMouse(true) contrebasse@3: MenuFrame:SetPoint("CENTER") contrebasse@3: tinsert(UISpecialFrames,"ReagentMaker_ExternalFrame") -- make it closable with escape contrebasse@2: contrebasse@3: MenuFrame:SetScript("OnEvent",function(self,event,...) contrebasse@3: if event == "TRADE_SKILL_CLOSE" or event == "PLAYER_REGEN_DISABLED" then contrebasse@3: MenuFrame:Hide() contrebasse@3: end contrebasse@3: end) contrebasse@3: MenuFrame:RegisterEvent("TRADE_SKILL_CLOSE") contrebasse@3: MenuFrame:RegisterEvent("PLAYER_REGEN_ENABLED") contrebasse@3: A.MenuFrame = MenuFrame contrebasse@3: contrebasse@3: -- Background adaptable vertically contrebasse@3: local bg_top = MenuFrame:CreateTexture(nil,"BACKGROUND",nil,0) contrebasse@3: bg_top:SetTexture("Interface\\LootFrame\\UI-LootPanel") contrebasse@3: bg_top:SetSize(192,80) contrebasse@3: bg_top:SetPoint("TOP") contrebasse@3: bg_top:SetTexCoord(0,192/256,0,80/256) contrebasse@3: local bg_bot = MenuFrame:CreateTexture(nil,"BACKGROUND",nil,0) contrebasse@3: bg_bot:SetTexture("Interface\\LootFrame\\UI-LootPanel") contrebasse@3: bg_bot:SetSize(192,16) contrebasse@3: bg_bot:SetPoint("BOTTOM") contrebasse@3: bg_bot:SetTexCoord(0,192/256,240/256,1) contrebasse@3: local bg_mid = MenuFrame:CreateTexture(nil,"BACKGROUND",nil,0) contrebasse@3: bg_mid:SetTexture("Interface\\LootFrame\\UI-LootPanel") contrebasse@3: bg_mid:SetWidth(192) contrebasse@3: bg_mid:SetPoint("TOP",bg_top,"BOTTOM") contrebasse@3: bg_mid:SetPoint("BOTTOM",bg_bot,"TOP") contrebasse@3: bg_mid:SetTexCoord(0,192/256,80/256,240/256) contrebasse@3: contrebasse@3: -- Bouton de fermeture contrebasse@3: local CloseButton = CreateFrame("Button",nil,MenuFrame,"UIPanelCloseButton"); contrebasse@3: CloseButton:SetPoint("TOPRIGHT",0,-10) contrebasse@3: contrebasse@3: -- Main icon contrebasse@3: local itemIcon = MenuFrame:CreateTexture(nil,"BACKGROUND",nil,-1) contrebasse@3: itemIcon:SetSize(64,64) contrebasse@3: itemIcon:SetPoint("TOPLEFT",8,-4) contrebasse@3: contrebasse@3: -- Title contrebasse@3: local TitleText = MenuFrame:CreateFontString(nil,"ARTWORK","GameFontHighlight") contrebasse@3: TitleText:SetSize(92,14) contrebasse@3: TitleText:SetPoint("RIGHT",CloseButton,"LEFT",4,1) contrebasse@3: contrebasse@3: local MENU_ENTRY_HEIGHT = 41 contrebasse@3: local MENU_ENTRY_WIDTH = 147 contrebasse@3: local MENU_ENTRY_ICON_RATIO = 40/48 contrebasse@2: contrebasse@0: local numActiveEntries = 0 contrebasse@0: local menuEntries = {} contrebasse@0: contrebasse@3: -- Button hovering contrebasse@5: local function btnEntered(btn) contrebasse@3: --[[ contrebasse@3: -- Index of the reagent in the recipe, taken from the button name contrebasse@5: local reagentRecipeIndex = A.buttonNumber(btn) contrebasse@3: contrebasse@3: -- ID of the reagent we want to craft contrebasse@3: local reagentID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex)) contrebasse@3: contrebasse@3: -- Continue only if the reagent is known contrebasse@3: if not reagentID or not A.data[reagentID] then return end contrebasse@3: --]] contrebasse@3: contrebasse@5: if btn.numMakable>0 then contrebasse@5: btn.textureHighlight:Show() contrebasse@5: end contrebasse@3: contrebasse@5: GameTooltip:SetOwner(btn,"ANCHOR_TOPLEFT") contrebasse@5: GameTooltip:SetHyperlink(btn.reagentLink) contrebasse@5: GameTooltip:Show() contrebasse@5: local link, tradeLink = GetSpellLink(btn.spellID) contrebasse@5: A.tooltipRecipe:SetOwner(GameTooltip) contrebasse@5: A.tooltipRecipe:SetHyperlink(link) contrebasse@5: A.tooltipRecipe:Show() contrebasse@5: A.tooltipRecipe:ClearAllPoints() contrebasse@5: A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") contrebasse@3: end contrebasse@5: local function btnLeft(btn) contrebasse@5: btn.textureHighlight:Hide() contrebasse@5: GameTooltip:Hide() contrebasse@5: A.tooltipRecipe:Hide() contrebasse@3: end contrebasse@3: local function createMenuEntry() contrebasse@3: local btn = CreateFrame("Button", nil, MenuFrame, "SecureActionButtonTemplate") contrebasse@3: table.insert(menuEntries,btn) contrebasse@3: contrebasse@3: btn:Hide() contrebasse@3: btn:SetSize(MENU_ENTRY_WIDTH,MENU_ENTRY_HEIGHT) contrebasse@3: btn:SetFrameStrata("DIALOG") contrebasse@3: contrebasse@3: -- Set its position contrebasse@3: if #menuEntries>1 then contrebasse@3: btn:SetPoint("TOP",menuEntries[#menuEntries-1],"BOTTOM",0,-2) contrebasse@2: else contrebasse@3: btn:SetPoint("TOPLEFT",MenuFrame,"TOPLEFT",24,-79) contrebasse@2: end contrebasse@3: contrebasse@3: local icon = btn:CreateTexture(nil,"BACKGROUND") contrebasse@3: icon:SetPoint("TOPLEFT") contrebasse@3: icon:SetSize(39,39) contrebasse@3: btn.icon = icon contrebasse@3: contrebasse@3: local itemNameBG = btn:CreateTexture(nil,"BACKGROUND") contrebasse@3: itemNameBG:SetTexture("Interface\\QuestFrame\\UI-QuestItemNameFrame") contrebasse@3: itemNameBG:SetSize(128,64) contrebasse@3: itemNameBG:SetPoint("LEFT",icon,"RIGHT",-10,0) contrebasse@3: contrebasse@3: local itemName = btn:CreateFontString(nil,"BACKGROUND","GameFontHighlight") contrebasse@3: itemName:SetSize(90,36) contrebasse@3: itemName:SetPoint("LEFT",itemNameBG,"LEFT",15,0) contrebasse@3: itemName:SetJustifyH("LEFT") contrebasse@3: itemName:SetWordWrap(true) contrebasse@3: itemName:SetNonSpaceWrap(false) contrebasse@3: btn.itemName = itemName contrebasse@3: contrebasse@3: local textureHighlight = btn:CreateTexture(nil,"BORDER") contrebasse@3: textureHighlight:Hide() contrebasse@3: textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight") contrebasse@3: textureHighlight:SetBlendMode("ADD") contrebasse@3: textureHighlight:SetAllPoints(icon) contrebasse@3: btn.textureHighlight = textureHighlight contrebasse@5: contrebasse@5: local countDetail = btn:CreateFontString(nil,"ARTWORK","NumberFontNormal") contrebasse@5: countDetail:SetPoint("BOTTOMRIGHT",icon,"BOTTOMRIGHT",-1,1) contrebasse@5: countDetail:SetJustifyH("RIGHT") contrebasse@5: countDetail:SetJustifyV("BOTTOM") contrebasse@5: btn.countDetail = countDetail contrebasse@5: contrebasse@3: btn:HookScript("OnEnter", btnEntered) contrebasse@3: btn:HookScript("OnLeave", btnLeft) contrebasse@3: contrebasse@3: return btn contrebasse@2: end contrebasse@1: contrebasse@1: contrebasse@3: local function menuCraftItem() contrebasse@3: action(itemID,reagentIndex,IsShiftKeyDown()) contrebasse@0: end contrebasse@0: contrebasse@3: local function updateCounts() contrebasse@3: local anyMakable contrebasse@0: for i=1,numActiveEntries do contrebasse@3: btn = menuEntries[i] contrebasse@3: local itemCount = GetItemCount(btn.reagentID) contrebasse@3: contrebasse@3: local numMakable = math.floor(itemCount/(btn.reagentsForOneRecipe or 1)) contrebasse@3: btn.countDetail:SetText(itemCount.."/"..(btn.reagentsForOneRecipe or 1)) contrebasse@3: contrebasse@3: if numMakable>0 then contrebasse@3: anyMakable = true contrebasse@5: btn.countDetail:SetTextColor(1, 1, 1, 1) contrebasse@3: btn.icon:SetVertexColor(1,1,1); contrebasse@3: btn.itemName:SetTextColor(1,1,1,1) contrebasse@3: else contrebasse@5: -- Do not disable the button, to be able to show the tooltip contrebasse@5: btn.countDetail:SetTextColor(1, 0.1, 0.1, 1) contrebasse@3: btn.icon:SetVertexColor(0.5, 0.5, 0.5) contrebasse@3: btn.itemName:SetTextColor(1,1,1,0.5) contrebasse@3: end contrebasse@5: contrebasse@5: btn.numMakable = numMakable contrebasse@3: end contrebasse@3: contrebasse@5: local r,g,b = TitleText:GetTextColor() contrebasse@3: if anyMakable then contrebasse@3: itemIcon:SetVertexColor(1,1,1) contrebasse@5: TitleText:SetTextColor(r,g,b,1) contrebasse@3: else contrebasse@3: itemIcon:SetVertexColor(0.5, 0.5, 0.5) contrebasse@5: TitleText:SetTextColor(r,g,b,0.7) contrebasse@0: end contrebasse@0: end contrebasse@0: contrebasse@5: local function menuAddItem(action,itemID,reagentID,reagentsForOneRecipe,spellID) contrebasse@0: local btn contrebasse@0: -- Create a button only if necessary contrebasse@0: if numActiveEntries >= #menuEntries then contrebasse@3: btn = createMenuEntry() contrebasse@0: else contrebasse@0: btn = menuEntries[numActiveEntries+1] contrebasse@0: end contrebasse@0: contrebasse@3: -- Set text and icon contrebasse@3: local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(reagentID) contrebasse@3: if name then contrebasse@3: btn.itemName:SetText(name) contrebasse@3: else contrebasse@3: A.DEBUG("No item name : "..reagentID) contrebasse@5: return contrebasse@3: end contrebasse@0: contrebasse@3: if texture then contrebasse@3: btn.icon:SetTexture(texture) contrebasse@3: else contrebasse@3: A.DEBUG("No item texture : "..reagentID) contrebasse@5: return contrebasse@3: end contrebasse@3: contrebasse@3: -- Save params contrebasse@3: btn.itemID = itemID contrebasse@3: btn.reagentID = reagentID contrebasse@5: btn.reagentLink = link contrebasse@3: btn.reagentsForOneRecipe = reagentsForOneRecipe contrebasse@5: btn.spellID = spellID contrebasse@3: contrebasse@3: -- Set action contrebasse@0: if type(action)=="function" then contrebasse@3: btn:SetScript("PreClick",action) contrebasse@0: btn:SetAttribute("type", nil) contrebasse@5: btn:SetAttribute("macrotext", nil) contrebasse@3: else --if type(action)=="string" then contrebasse@3: btn:SetScript("PreClick",nil) contrebasse@3: btn:SetAttribute("type", "macro") contrebasse@5: btn:SetAttribute("macrotext", action..name) contrebasse@0: end -- if contrebasse@0: contrebasse@3: btn:Show() contrebasse@0: contrebasse@2: -- Increase the entry number contrebasse@0: numActiveEntries = numActiveEntries + 1 contrebasse@0: end -- function contrebasse@3: contrebasse@3: -- Fill the window and open it contrebasse@3: function A.externalCraftWindow(itemID) contrebasse@3: -- Do not open during combat contrebasse@3: if InCombatLockdown() then return end contrebasse@3: contrebasse@3: -- Save the tradeskill contrebasse@3: A.currentTradeSkill = GetTradeSkillLine() contrebasse@3: contrebasse@3: -- Close the previous menu contrebasse@3: MenuFrame:Hide() contrebasse@3: for i=1,numActiveEntries do contrebasse@3: menuEntries[i]:Hide() contrebasse@3: end contrebasse@3: numActiveEntries = 0 contrebasse@3: contrebasse@3: -- Fill the info of the reagent to make contrebasse@3: local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) contrebasse@3: SetPortraitToTexture(itemIcon, texture) contrebasse@3: TitleText:SetText(name) contrebasse@5: local color = ITEM_QUALITY_COLORS[quality] contrebasse@5: TitleText:SetTextColor(color.r, color.g, color.b) contrebasse@3: contrebasse@3: -- Loop over the available recipes contrebasse@3: for _,reagent in ipairs(A.data[itemID]) do contrebasse@3: if A.data[itemID].spell then contrebasse@3: -- Special spell contrebasse@5: menuAddItem(A.data[itemID].spell,itemID,reagent[1],reagent[2],A.data[itemID].spellID) contrebasse@3: else contrebasse@3: -- Standard tradeskill spell UNTESTED contrebasse@3: menuAddItem(A.craft,itemID,reagent[1],reagent[2]) contrebasse@3: end -- if contrebasse@3: end -- for contrebasse@3: contrebasse@3: MenuFrame:SetHeight(89 + numActiveEntries*(MENU_ENTRY_HEIGHT+2)) contrebasse@3: contrebasse@3: MenuFrame:ClearAllPoints() contrebasse@3: MenuFrame:SetPoint("TOPLEFT",TradeSkillFrame,"TOPRIGHT",-2,14) contrebasse@3: contrebasse@3: updateCounts() contrebasse@3: contrebasse@3: MenuFrame:Show() contrebasse@3: end