annotate SecureMenu.lua @ 46:40d6886d1966

Correct the number of items to craft (the formulae was wrong and has to take the number of item crafted into account)
author contrebasse
date Sat, 30 Apr 2011 01:31:19 +0200
parents 4e6492b19f4c
children 60871b43531d
rev   line source
contrebasse@0 1 local addonName, A = ...
contrebasse@0 2
contrebasse@0 3 -- Create the menu frame
contrebasse@34 4 local MenuFrame = CreateFrame("Frame","ReagentMaker_ExternalFrame",UIParent)
contrebasse@0 5 MenuFrame:Hide()
contrebasse@3 6 MenuFrame:SetSize(192,256)
contrebasse@2 7 MenuFrame:SetFrameStrata("DIALOG")
contrebasse@3 8 MenuFrame:EnableMouse(true)
contrebasse@3 9 MenuFrame:SetPoint("CENTER")
contrebasse@3 10 tinsert(UISpecialFrames,"ReagentMaker_ExternalFrame") -- make it closable with escape
contrebasse@2 11
contrebasse@20 12 local SCAN_DELAY = 0.2
contrebasse@20 13 local t_throttle = SCAN_DELAY
contrebasse@20 14 function MenuFrame.throttleUpdateCounts(self, t_elapsed)
contrebasse@20 15 t_throttle = t_throttle - t_elapsed
contrebasse@20 16 if t_throttle<0 then
contrebasse@20 17 self:SetScript("OnUpdate", nil)
contrebasse@20 18
contrebasse@20 19 -- Update counts
contrebasse@20 20 MenuFrame.updateCounts()
contrebasse@20 21 end
contrebasse@20 22 end
contrebasse@3 23 MenuFrame:SetScript("OnEvent",function(self,event,...)
contrebasse@20 24 if event == "BAG_UPDATE" then
contrebasse@20 25 t_throttle = SCAN_DELAY
contrebasse@20 26 self:SetScript("OnUpdate", MenuFrame.throttleUpdateCounts)
contrebasse@19 27 elseif event == "TRADE_SKILL_CLOSE" or event == "PLAYER_REGEN_DISABLED" then
contrebasse@3 28 MenuFrame:Hide()
contrebasse@3 29 end
contrebasse@3 30 end)
contrebasse@3 31 MenuFrame:RegisterEvent("TRADE_SKILL_CLOSE")
contrebasse@3 32 MenuFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
contrebasse@20 33 MenuFrame:RegisterEvent("BAG_UPDATE")
contrebasse@20 34 MenuFrame:SetScript("OnEnter",function(self)
contrebasse@20 35 if self.reagentLink then
contrebasse@20 36 GameTooltip:SetOwner(self)
contrebasse@20 37 GameTooltip:SetHyperlink(self.reagentLink)
contrebasse@20 38 GameTooltip:Show()
contrebasse@20 39 GameTooltip:ClearAllPoints()
contrebasse@20 40 GameTooltip:SetPoint("TOPRIGHT",self,"TOPLEFT",10,0)
contrebasse@32 41 if self.spellLink then
contrebasse@32 42 A.tooltipRecipe:SetOwner(GameTooltip)
contrebasse@32 43 A.tooltipRecipe:SetHyperlink(self.spellLink)
contrebasse@32 44 A.tooltipRecipe:Show()
contrebasse@32 45 A.tooltipRecipe:ClearAllPoints()
contrebasse@32 46 A.tooltipRecipe:SetPoint("TOPRIGHT",GameTooltip,"BOTTOMRIGHT")
contrebasse@32 47 end
contrebasse@20 48 end
contrebasse@20 49 end)
contrebasse@20 50 MenuFrame:SetScript("OnLeave",function()
contrebasse@20 51 GameTooltip:Hide()
contrebasse@32 52 A.tooltipRecipe:Hide()
contrebasse@20 53 end)
contrebasse@33 54
contrebasse@33 55 -- Hide frame when selecting a recipe which doesn't need this reagent
contrebasse@33 56 hooksecurefunc("SelectTradeSkill",function()
contrebasse@33 57 local selectedIndex = GetTradeSkillSelectionIndex()
contrebasse@33 58 for reagentRecipeIndex = 1,GetTradeSkillNumReagents(selectedIndex) do
contrebasse@33 59 local reagentID = A.link2ID(GetTradeSkillReagentItemLink(selectedIndex, reagentRecipeIndex))
contrebasse@33 60 if reagentID == MenuFrame.itemID or (MenuFrame.superItemID and reagentID == MenuFrame.superItemID) then
contrebasse@33 61 return
contrebasse@33 62 end
contrebasse@33 63 end
contrebasse@33 64 MenuFrame:Hide()
contrebasse@33 65 end)
contrebasse@3 66 A.MenuFrame = MenuFrame
contrebasse@3 67
contrebasse@3 68 -- Background adaptable vertically
contrebasse@3 69 local bg_top = MenuFrame:CreateTexture(nil,"BACKGROUND",nil,0)
contrebasse@3 70 bg_top:SetTexture("Interface\\LootFrame\\UI-LootPanel")
contrebasse@3 71 bg_top:SetSize(192,80)
contrebasse@3 72 bg_top:SetPoint("TOP")
contrebasse@3 73 bg_top:SetTexCoord(0,192/256,0,80/256)
contrebasse@3 74 local bg_bot = MenuFrame:CreateTexture(nil,"BACKGROUND",nil,0)
contrebasse@3 75 bg_bot:SetTexture("Interface\\LootFrame\\UI-LootPanel")
contrebasse@3 76 bg_bot:SetSize(192,16)
contrebasse@3 77 bg_bot:SetPoint("BOTTOM")
contrebasse@3 78 bg_bot:SetTexCoord(0,192/256,240/256,1)
contrebasse@3 79 local bg_mid = MenuFrame:CreateTexture(nil,"BACKGROUND",nil,0)
contrebasse@3 80 bg_mid:SetTexture("Interface\\LootFrame\\UI-LootPanel")
contrebasse@3 81 bg_mid:SetWidth(192)
contrebasse@3 82 bg_mid:SetPoint("TOP",bg_top,"BOTTOM")
contrebasse@3 83 bg_mid:SetPoint("BOTTOM",bg_bot,"TOP")
contrebasse@3 84 bg_mid:SetTexCoord(0,192/256,80/256,240/256)
contrebasse@3 85
contrebasse@3 86 -- Bouton de fermeture
contrebasse@3 87 local CloseButton = CreateFrame("Button",nil,MenuFrame,"UIPanelCloseButton");
contrebasse@3 88 CloseButton:SetPoint("TOPRIGHT",0,-10)
contrebasse@3 89
contrebasse@3 90 -- Main icon
contrebasse@3 91 local itemIcon = MenuFrame:CreateTexture(nil,"BACKGROUND",nil,-1)
contrebasse@3 92 itemIcon:SetSize(64,64)
contrebasse@3 93 itemIcon:SetPoint("TOPLEFT",8,-4)
contrebasse@3 94
contrebasse@3 95 -- Title
contrebasse@3 96 local TitleText = MenuFrame:CreateFontString(nil,"ARTWORK","GameFontHighlight")
contrebasse@45 97 --TitleText:SetSize(92,14)
contrebasse@45 98 TitleText:SetSize(92,36)
contrebasse@45 99 TitleText:SetPoint("TOPRIGHT",CloseButton,"TOPLEFT",4,-8)
contrebasse@45 100 TitleText:SetWordWrap(true)
contrebasse@45 101 TitleText:SetNonSpaceWrap(false)
contrebasse@45 102 TitleText:SetJustifyV("TOP")
contrebasse@45 103
contrebasse@3 104
contrebasse@3 105 local MENU_ENTRY_HEIGHT = 41
contrebasse@3 106 local MENU_ENTRY_WIDTH = 147
contrebasse@3 107 local MENU_ENTRY_ICON_RATIO = 40/48
contrebasse@2 108
contrebasse@0 109 local numActiveEntries = 0
contrebasse@0 110 local menuEntries = {}
contrebasse@0 111
contrebasse@3 112 -- Button hovering
contrebasse@5 113 local function btnEntered(btn)
contrebasse@20 114 if btn.numMakable and btn.numMakable>0 then
contrebasse@5 115 btn.textureHighlight:Show()
contrebasse@5 116 end
contrebasse@3 117
contrebasse@20 118 GameTooltip:SetOwner(btn,"ANCHOR_LEFT")
contrebasse@5 119 GameTooltip:SetHyperlink(btn.reagentLink)
contrebasse@5 120 GameTooltip:Show()
contrebasse@31 121 if btn.spellLink then
contrebasse@31 122 A.tooltipRecipe:SetOwner(GameTooltip)
contrebasse@31 123 A.tooltipRecipe:SetHyperlink(btn.spellLink)
contrebasse@31 124 A.tooltipRecipe:Show()
contrebasse@31 125 A.tooltipRecipe:ClearAllPoints()
contrebasse@31 126 A.tooltipRecipe:SetPoint("TOPRIGHT",GameTooltip,"BOTTOMRIGHT")
contrebasse@20 127 end
contrebasse@3 128 end
contrebasse@5 129 local function btnLeft(btn)
contrebasse@5 130 btn.textureHighlight:Hide()
contrebasse@5 131 GameTooltip:Hide()
contrebasse@5 132 A.tooltipRecipe:Hide()
contrebasse@3 133 end
contrebasse@3 134 local function createMenuEntry()
contrebasse@3 135 local btn = CreateFrame("Button", nil, MenuFrame, "SecureActionButtonTemplate")
contrebasse@3 136 table.insert(menuEntries,btn)
contrebasse@3 137
contrebasse@3 138 btn:Hide()
contrebasse@3 139 btn:SetSize(MENU_ENTRY_WIDTH,MENU_ENTRY_HEIGHT)
contrebasse@3 140 btn:SetFrameStrata("DIALOG")
contrebasse@3 141
contrebasse@3 142 -- Set its position
contrebasse@3 143 if #menuEntries>1 then
contrebasse@3 144 btn:SetPoint("TOP",menuEntries[#menuEntries-1],"BOTTOM",0,-2)
contrebasse@2 145 else
contrebasse@3 146 btn:SetPoint("TOPLEFT",MenuFrame,"TOPLEFT",24,-79)
contrebasse@2 147 end
contrebasse@3 148
contrebasse@3 149 local icon = btn:CreateTexture(nil,"BACKGROUND")
contrebasse@3 150 icon:SetPoint("TOPLEFT")
contrebasse@3 151 icon:SetSize(39,39)
contrebasse@3 152 btn.icon = icon
contrebasse@3 153
contrebasse@3 154 local itemNameBG = btn:CreateTexture(nil,"BACKGROUND")
contrebasse@3 155 itemNameBG:SetTexture("Interface\\QuestFrame\\UI-QuestItemNameFrame")
contrebasse@3 156 itemNameBG:SetSize(128,64)
contrebasse@3 157 itemNameBG:SetPoint("LEFT",icon,"RIGHT",-10,0)
contrebasse@3 158
contrebasse@3 159 local itemName = btn:CreateFontString(nil,"BACKGROUND","GameFontHighlight")
contrebasse@3 160 itemName:SetSize(90,36)
contrebasse@3 161 itemName:SetPoint("LEFT",itemNameBG,"LEFT",15,0)
contrebasse@3 162 itemName:SetJustifyH("LEFT")
contrebasse@3 163 itemName:SetWordWrap(true)
contrebasse@3 164 itemName:SetNonSpaceWrap(false)
contrebasse@3 165 btn.itemName = itemName
contrebasse@3 166
contrebasse@3 167 local textureHighlight = btn:CreateTexture(nil,"BORDER")
contrebasse@3 168 textureHighlight:Hide()
contrebasse@3 169 textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight")
contrebasse@3 170 textureHighlight:SetBlendMode("ADD")
contrebasse@3 171 textureHighlight:SetAllPoints(icon)
contrebasse@3 172 btn.textureHighlight = textureHighlight
contrebasse@5 173
contrebasse@5 174 local countDetail = btn:CreateFontString(nil,"ARTWORK","NumberFontNormal")
contrebasse@5 175 countDetail:SetPoint("BOTTOMRIGHT",icon,"BOTTOMRIGHT",-1,1)
contrebasse@5 176 countDetail:SetJustifyH("RIGHT")
contrebasse@5 177 countDetail:SetJustifyV("BOTTOM")
contrebasse@5 178 btn.countDetail = countDetail
contrebasse@5 179
contrebasse@10 180 local resultNumber = btn:CreateFontString(nil,"ARTWORK","NumberFontNormal")
contrebasse@11 181 resultNumber:SetPoint("TOPLEFT",icon,"TOPLEFT",1,-3)
contrebasse@10 182 resultNumber:SetJustifyH("LEFT")
contrebasse@10 183 resultNumber:SetJustifyV("TOP")
contrebasse@11 184 resultNumber:SetFont("Fonts\\ARIALN.TTF", 12, "OUTLINE")
contrebasse@10 185 btn.resultNumber = resultNumber
contrebasse@10 186
contrebasse@20 187 btn:SetScript("OnEnter", btnEntered)
contrebasse@20 188 btn:SetScript("OnLeave", btnLeft)
contrebasse@3 189
contrebasse@3 190 return btn
contrebasse@2 191 end
contrebasse@1 192
contrebasse@3 193 local function menuCraftItem()
contrebasse@3 194 action(itemID,reagentIndex,IsShiftKeyDown())
contrebasse@0 195 end
contrebasse@0 196
contrebasse@40 197 local function WarnNotMakable(btn)
contrebasse@40 198 A.Error("You do not have enough ["..btn.itemNameString.."] to craft ["..TitleText:GetText().."]")
contrebasse@40 199 end
contrebasse@40 200
contrebasse@40 201 -- Update counts and button actions
contrebasse@19 202 function MenuFrame.updateCounts()
contrebasse@3 203 local anyMakable
contrebasse@0 204 for i=1,numActiveEntries do
contrebasse@3 205 btn = menuEntries[i]
contrebasse@3 206 local itemCount = GetItemCount(btn.reagentID)
contrebasse@3 207
contrebasse@3 208 local numMakable = math.floor(itemCount/(btn.reagentsForOneRecipe or 1))
contrebasse@3 209 btn.countDetail:SetText(itemCount.."/"..(btn.reagentsForOneRecipe or 1))
contrebasse@3 210
contrebasse@3 211 if numMakable>0 then
contrebasse@40 212 -- Set action
contrebasse@40 213 if type(action)=="function" then
contrebasse@40 214 btn:SetScript("PreClick",btn.action)
contrebasse@40 215 btn:SetAttribute("type", nil)
contrebasse@40 216 btn:SetAttribute("macrotext", nil)
contrebasse@40 217 else --if type(action)=="string" then
contrebasse@40 218 btn:SetScript("PreClick",nil)
contrebasse@40 219 btn:SetAttribute("type", "macro")
contrebasse@40 220 btn:SetAttribute("macrotext", btn.action..btn.itemNameString)
contrebasse@40 221 end -- if
contrebasse@40 222
contrebasse@3 223 anyMakable = true
contrebasse@5 224 btn.countDetail:SetTextColor(1, 1, 1, 1)
contrebasse@3 225 btn.icon:SetVertexColor(1,1,1);
contrebasse@3 226 btn.itemName:SetTextColor(1,1,1,1)
contrebasse@3 227 else
contrebasse@5 228 -- Do not disable the button, to be able to show the tooltip
contrebasse@40 229 -- Disable only the effects
contrebasse@40 230 btn:SetScript("PreClick",WarnNotMakable)
contrebasse@40 231 btn:SetAttribute("type", nil)
contrebasse@40 232 btn:SetAttribute("macrotext", nil)
contrebasse@40 233
contrebasse@5 234 btn.countDetail:SetTextColor(1, 0.1, 0.1, 1)
contrebasse@3 235 btn.icon:SetVertexColor(0.5, 0.5, 0.5)
contrebasse@3 236 btn.itemName:SetTextColor(1,1,1,0.5)
contrebasse@3 237 end
contrebasse@5 238
contrebasse@5 239 btn.numMakable = numMakable
contrebasse@3 240 end
contrebasse@3 241
contrebasse@5 242 local r,g,b = TitleText:GetTextColor()
contrebasse@3 243 if anyMakable then
contrebasse@3 244 itemIcon:SetVertexColor(1,1,1)
contrebasse@5 245 TitleText:SetTextColor(r,g,b,1)
contrebasse@3 246 else
contrebasse@3 247 itemIcon:SetVertexColor(0.5, 0.5, 0.5)
contrebasse@5 248 TitleText:SetTextColor(r,g,b,0.7)
contrebasse@0 249 end
contrebasse@0 250 end
contrebasse@0 251
contrebasse@31 252 local function menuAddItem(action,itemID,reagent,spellLink)
contrebasse@0 253 local btn
contrebasse@0 254 -- Create a button only if necessary
contrebasse@0 255 if numActiveEntries >= #menuEntries then
contrebasse@3 256 btn = createMenuEntry()
contrebasse@0 257 else
contrebasse@0 258 btn = menuEntries[numActiveEntries+1]
contrebasse@0 259 end
contrebasse@0 260
contrebasse@3 261 -- Set text and icon
contrebasse@35 262 local name, link, _, _, _, _, _, _, _, texture = GetItemInfo(reagent[1])
contrebasse@3 263 if name then
contrebasse@3 264 btn.itemName:SetText(name)
contrebasse@3 265 else
contrebasse@34 266 --A.DEBUG("No item name : "..reagent[1])
contrebasse@5 267 return
contrebasse@3 268 end
contrebasse@0 269
contrebasse@3 270 if texture then
contrebasse@3 271 btn.icon:SetTexture(texture)
contrebasse@3 272 else
contrebasse@34 273 --A.DEBUG("No item texture : "..reagent[1])
contrebasse@5 274 return
contrebasse@3 275 end
contrebasse@3 276
contrebasse@10 277 -- Set chance to have the item or the number of items created
contrebasse@10 278 if reagent[3] then
contrebasse@10 279 if reagent[3]<1 then
contrebasse@10 280 btn.resultNumber:SetText((reagent[3]*100).."%")
contrebasse@11 281 elseif reagent[4] and reagent[3]~=reagent[4] then
contrebasse@11 282 btn.resultNumber:SetText(math.min(reagent[3],reagent[4]).."-"..math.max(reagent[3],reagent[4]))
contrebasse@10 283 elseif reagent[3]>1 then
contrebasse@10 284 btn.resultNumber:SetText(reagent[3])
contrebasse@10 285 end
contrebasse@10 286 end
contrebasse@10 287
contrebasse@3 288 -- Save params
contrebasse@3 289 btn.itemID = itemID
contrebasse@10 290 btn.reagentID = reagent[1]
contrebasse@5 291 btn.reagentLink = link
contrebasse@10 292 btn.reagentsForOneRecipe = reagent[2]
contrebasse@31 293 btn.spellLink = spellLink
contrebasse@40 294 btn.action = action
contrebasse@40 295 btn.itemNameString = name
contrebasse@0 296
contrebasse@3 297 btn:Show()
contrebasse@0 298
contrebasse@2 299 -- Increase the entry number
contrebasse@0 300 numActiveEntries = numActiveEntries + 1
contrebasse@34 301
contrebasse@34 302 -- Everything went well
contrebasse@34 303 return true
contrebasse@0 304 end -- function
contrebasse@3 305
contrebasse@34 306 -- Function used on OnUpdate tu update the frame if there were errors the previous time
contrebasse@34 307 local function reopen()
contrebasse@34 308 -- Release OnUpdate frame (could conflict with BAG_UPDATE)
contrebasse@34 309 MenuFrame:SetScript("OnUpdate",nil)
contrebasse@34 310
contrebasse@34 311 -- reopen
contrebasse@34 312 A.externalCraftWindow(MenuFrame.itemID,MenuFrame.superItemID)
contrebasse@34 313 end
contrebasse@34 314
contrebasse@3 315 -- Fill the window and open it
contrebasse@33 316 function A.externalCraftWindow(itemID,superItemID)
contrebasse@3 317 -- Do not open during combat
contrebasse@3 318 if InCombatLockdown() then return end
contrebasse@3 319
contrebasse@3 320 -- Save the tradeskill
contrebasse@3 321 A.currentTradeSkill = GetTradeSkillLine()
contrebasse@3 322
contrebasse@3 323 -- Close the previous menu
contrebasse@3 324 MenuFrame:Hide()
contrebasse@3 325 for i=1,numActiveEntries do
contrebasse@3 326 menuEntries[i]:Hide()
contrebasse@3 327 end
contrebasse@3 328 numActiveEntries = 0
contrebasse@3 329
contrebasse@3 330 -- Fill the info of the reagent to make
contrebasse@35 331 local name, link, quality, _, _, _, _, _, _, texture = GetItemInfo(itemID)
contrebasse@3 332 SetPortraitToTexture(itemIcon, texture)
contrebasse@3 333 TitleText:SetText(name)
contrebasse@5 334 local color = ITEM_QUALITY_COLORS[quality]
contrebasse@5 335 TitleText:SetTextColor(color.r, color.g, color.b)
contrebasse@3 336
contrebasse@20 337 -- Save vars to show the tooltip later
contrebasse@20 338 MenuFrame.reagentLink = link
contrebasse@32 339 MenuFrame.spellLink = A.data[itemID].spellLink
contrebasse@33 340 MenuFrame.itemID = itemID
contrebasse@33 341 MenuFrame.superItemID = superItemID -- optional
contrebasse@34 342
contrebasse@3 343 -- Loop over the available recipes
contrebasse@34 344 MenuFrame.state = true
contrebasse@3 345 for _,reagent in ipairs(A.data[itemID]) do
contrebasse@29 346 if A.data[itemID].spell then
contrebasse@29 347 -- Special spell
contrebasse@39 348 MenuFrame.state = menuAddItem(A.data[itemID].spell,itemID,reagent,A.data[itemID].spellLink) and MenuFrame.state
contrebasse@29 349 else
contrebasse@29 350 -- Standard tradeskill spell UNTESTED
contrebasse@39 351 MenuFrame.state = menuAddItem(A.craft,itemID,reagent) and MenuFrame.state
contrebasse@29 352 end -- if
contrebasse@3 353 end -- for
contrebasse@3 354
contrebasse@3 355 MenuFrame:SetHeight(89 + numActiveEntries*(MENU_ENTRY_HEIGHT+2))
contrebasse@3 356
contrebasse@3 357 MenuFrame:ClearAllPoints()
contrebasse@3 358 MenuFrame:SetPoint("TOPLEFT",TradeSkillFrame,"TOPRIGHT",-2,14)
contrebasse@3 359
contrebasse@40 360 -- Update counts and set actions
contrebasse@19 361 MenuFrame.updateCounts()
contrebasse@3 362
contrebasse@3 363 MenuFrame:Show()
contrebasse@34 364
contrebasse@34 365 if not MenuFrame.state then
contrebasse@34 366 MenuFrame:SetScript("OnUpdate",reopen)
contrebasse@34 367 end
contrebasse@3 368 end