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@3: local function btnEntered(self) contrebasse@3: --[[ contrebasse@3: -- Index of the reagent in the recipe, taken from the button name contrebasse@3: local reagentRecipeIndex = A.buttonNumber(self) 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@3: self.textureHighlight:Show() contrebasse@3: contrebasse@3: --[[ contrebasse@3: if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then contrebasse@3: local numMakable = A.numMakable(reagentID) contrebasse@3: self.itemName:SetText(numMakable) contrebasse@3: if numMakable==0 then contrebasse@3: self.itemName:SetTextColor(1, 0, 0, 1) contrebasse@3: else contrebasse@3: self.itemName:SetTextColor(0, 5, 0, 1) contrebasse@3: end contrebasse@3: self.itemName:Show() contrebasse@3: end contrebasse@3: --]] contrebasse@3: end contrebasse@3: local function btnLeft(self) contrebasse@3: self.textureHighlight:Hide() contrebasse@3: --self.itemName:Hide() contrebasse@3: end contrebasse@3: local function createMenuEntry() contrebasse@3: --local btn = CreateFrame("Button", "ReagentMakerMenuButton"..(#menuEntries+1), MenuFrame, "SecureActionButtonTemplate") 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: --textureHighlight:SetSize(MENU_ENTRY_HEIGHT,MENU_ENTRY_HEIGHT) contrebasse@3: btn.textureHighlight = textureHighlight contrebasse@3: btn:HookScript("OnEnter", btnEntered) contrebasse@3: btn:HookScript("OnLeave", btnLeft) contrebasse@3: contrebasse@3: local countTotal = btn:CreateFontString(nil,"ARTWORK","NumberFontNormal") contrebasse@3: --countTotal:SetSize(MENU_ENTRY_HEIGHT,MENU_ENTRY_HEIGHT/2) contrebasse@3: countTotal:SetPoint("TOPLEFT",icon,"TOPLEFT",1,-1) contrebasse@3: countTotal:SetJustifyH("LEFT") contrebasse@3: countTotal:SetJustifyV("TOP") contrebasse@3: --countTotal:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE") contrebasse@3: btn.countTotal = countTotal contrebasse@3: contrebasse@3: local countDetail = btn:CreateFontString(nil,"ARTWORK","NumberFontNormal") contrebasse@3: --countDetail:SetSize(MENU_ENTRY_HEIGHT,MENU_ENTRY_HEIGHT/2) contrebasse@3: countDetail:SetPoint("BOTTOMRIGHT",icon,"BOTTOMRIGHT",-1,1) contrebasse@3: countDetail:SetJustifyH("RIGHT") contrebasse@3: countDetail:SetJustifyV("BOTTOM") contrebasse@3: --countDetail:SetFont("Fonts\\FRIZQT__.TTF", 12, "OUTLINE") contrebasse@3: btn.countDetail = countDetail 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.countTotal:SetText(numMakable) contrebasse@3: btn.countDetail:SetText(itemCount.."/"..(btn.reagentsForOneRecipe or 1)) contrebasse@3: contrebasse@3: if numMakable>0 then contrebasse@3: anyMakable = true contrebasse@3: btn.countTotal:SetTextColor(0, 5, 0, 1) contrebasse@3: btn:Enable() contrebasse@3: --btn.icon:SetDesaturated(false) contrebasse@3: btn.icon:SetVertexColor(1,1,1); contrebasse@3: btn.itemName:SetTextColor(1,1,1,1) contrebasse@3: else contrebasse@3: btn.countTotal:SetTextColor(1, 0, 0, 1) contrebasse@3: btn:Disable() contrebasse@3: --btn.icon:SetDesaturated(true) 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@3: end contrebasse@3: contrebasse@3: if anyMakable then contrebasse@3: itemIcon:SetVertexColor(1,1,1) contrebasse@3: TitleText:SetTextColor(1,1,1,1) contrebasse@3: else contrebasse@3: itemIcon:SetVertexColor(0.5, 0.5, 0.5) contrebasse@3: TitleText:SetTextColor(1,1,1,0.5) contrebasse@0: end contrebasse@0: end contrebasse@0: contrebasse@3: local function menuAddItem(action,itemID,reagentID,reagentsForOneRecipe) 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@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@3: end contrebasse@3: contrebasse@3: -- Save params contrebasse@3: btn.itemID = itemID contrebasse@3: btn.reagentID = reagentID contrebasse@3: btn.reagentsForOneRecipe = reagentsForOneRecipe 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@0: btn:SetAttribute("spell", nil) contrebasse@3: btn:SetAttribute("target-item",nil) contrebasse@3: else --if type(action)=="string" then contrebasse@3: btn:SetScript("PreClick",nil) contrebasse@3: btn:SetAttribute("type", "macro") contrebasse@3: btn:SetAttribute("macrotext", action..GetItemInfo(reagentID)) contrebasse@3: --btn:SetAttribute("type", "macro") contrebasse@3: --btn:SetAttribute("macrotext1","/cast Mouture\n/use Gangrelette") contrebasse@0: end -- if contrebasse@0: contrebasse@0: -- Reposition MenuFrame contrebasse@1: --MenuFrame:SetPoint("BOTTOMRIGHT",btn,"BOTTOMRIGHT",0,0) contrebasse@3: --MenuFrame:SetHeight((numActiveEntries+1)*MENU_ENTRY_HEIGHT) contrebasse@3: 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@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@3: menuAddItem(A.data[itemID].spell,itemID,reagent[1],reagent[2]) 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