local ex = Examiner; local cfg; local gtt = GameTooltip; -- Module local mod = ex:CreateModule("ItemSlots"); mod.slotBtns = {}; -- Variables local ITEM_ICON_UNKNOWN = "Interface\\Icons\\INV_Misc_QuestionMark"; -- Options mod:AddOption({ var = "alwaysShowItemLevel", default = true, label = "Always Show Item Levels", tip = "With this enabled, the items will always show their item levels, instead of having to hold down the ALT key." }); -------------------------------------------------------------------------------------------------------- -- Module Scripts -- -------------------------------------------------------------------------------------------------------- -- OnInitialize function mod:OnInitialize() cfg = ex.cfg; end -- OnInspectReady function mod:OnInspectReady(unit,guid) self:UpdateItemSlots(); self:ShowItemSlotButtons(); end mod.OnInspect = mod.OnInspectReady; -- OnCacheLoaded function mod:OnCacheLoaded(entry,unit) self:UpdateItemSlots(); self:ShowItemSlotButtons(); end -- OnPageChanged function mod:OnPageChanged(module,shown) self:ShowItemSlotButtons(); end -- OnConfigChanged function mod:OnConfigChanged(var,value) if (var == "alwaysShowItemLevel") then for index, button in ipairs(self.slotBtns) do if (value) and (button.link) then button.level:Show(); else button.level:Hide(); end end end end -------------------------------------------------------------------------------------------------------- -- Helper Functions -- -------------------------------------------------------------------------------------------------------- -- Show the Item Slot Buttons function mod:ShowItemSlotButtons() local shownMod = (cfg.activePage and ex.modules[cfg.activePage]); local visible = (ex.itemsLoaded) and (not shownMod or shownMod.showItems or not shownMod.page:IsShown()); for _, button in ipairs(self.slotBtns) do if (visible) then button:Show(); else button:Hide(); end end end -- UpdateSlot: Updates slot from "button.link" function mod:UpdateItemSlots() for index, button in ipairs(self.slotBtns) do local link = ex.info.Items[button.slotName]; if (cfg.alwaysShowItemLevel) then button.level:Show(); end button.realLink = nil; button.link = link; if (not link) then button.texture:SetTexture(button.bgTexture); button.border:Hide(); button.level:SetText(""); else local _, _, itemRarity, itemLevel, _, _, _, _, _, itemTexture = GetItemInfo(link); if (itemTexture) then button.texture:SetTexture(itemTexture or ITEM_ICON_UNKNOWN); local r,g,b = GetItemQualityColor(itemRarity and itemRarity > 0 and itemRarity or 0); button.border:SetVertexColor(r,g,b); button.border:Show(); itemLevel = GetDetailedItemLevelInfo(link); button.level:SetText(itemLevel); else button.realLink = link; button.link = nil; button.texture:SetTexture(ITEM_ICON_UNKNOWN); button.border:Hide(); button.level:SetText(""); end end end end -------------------------------------------------------------------------------------------------------- -- Item Slot Scripts -- -------------------------------------------------------------------------------------------------------- -- OnEvent -- MODIFIER_STATE_CHANGED local function OnEvent(self,event,key,state) -- Update Tip if (gtt:IsOwned(self)) then self:GetScript("OnEnter")(self); end -- Toggle ItemLevel if (not cfg.alwaysShowItemLevel) then if (self.link) and (IsAltKeyDown()) then self.level:Show(); else self.level:Hide(); end end end -- OnDrag local function OnDrag(self) if (ex:ValidateUnit() and UnitIsUnit(ex.unit,"player")) then PickupInventoryItem(self.id); end end -- OnClick local function OnClick(self,button) if (CursorHasItem()) then OnDrag(self); elseif (self.link) then if (button == "RightButton") then -- AzMsg("---|2 Gem Overview for "..select(2,GetItemInfo(self.link)).." |r---"); -- for i = 1, 3 do -- local _, gemLink = GetItemGem(self.link,i); -- if (gemLink) then -- AzMsg(format("Gem |1%d|r = %s",i,gemLink)); -- end -- end elseif (button == "LeftButton") then local editBox = ChatEdit_GetActiveWindow(); if (IsModifiedClick("DRESSUP")) then DressUpItemLink(self.link); elseif (IsModifiedClick("CHATLINK")) and (editBox) and (editBox:IsVisible()) then local _, itemLink = GetItemInfo(self.link); editBox:Insert(itemLink); else OnDrag(self); end end elseif (self.realLink) then -- Az: this needs to be changed, look at shared onenter func for more info -- Az: should not be like this anymore, a single call to GetItemInfo() would make the client cache the item, so just make some kind of postcacheload thingie, or just redo the OnCacheLoaded event? local entryName = ex:GetEntryName(); ex:ClearInspect(); ex:LoadPlayerFromCache(entryName); self:GetScript("OnEnter")(self); end end -- OnShow local function OnShow(self) self:RegisterEvent("MODIFIER_STATE_CHANGED"); end -- OnHide local function OnHide(self) self:UnregisterEvent("MODIFIER_STATE_CHANGED"); if (not cfg.alwaysShowItemLevel) then self.level:Hide(); end end -------------------------------------------------------------------------------------------------------- -- Widget Creation -- -------------------------------------------------------------------------------------------------------- for index, slot in ipairs(LibGearExam.Slots) do local btn = CreateFrame("Button","ExaminerItemButton"..slot,ex.model); -- Some other mods bug if you create this nameless btn:SetSize(37,37); btn:RegisterForClicks("LeftButtonUp","RightButtonUp"); btn:RegisterForDrag("LeftButton"); btn:SetPushedTexture("Interface\\Buttons\\UI-Quickslot-Depress"); btn:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square"); btn:SetScript("OnShow",OnShow); btn:SetScript("OnHide",OnHide); btn:SetScript("OnClick",OnClick); btn:SetScript("OnEnter",ex.ItemButton_OnEnter); btn:SetScript("OnLeave",ex.ItemButton_OnLeave); btn:SetScript("OnEvent",OnEvent); btn:SetScript("OnDragStart",OnDrag); btn:SetScript("OnReceiveDrag",OnDrag); btn.id, btn.bgTexture = GetInventorySlotInfo(slot); btn.slotName = slot; btn.texture = btn:CreateTexture(nil,"BACKGROUND"); btn.texture:SetAllPoints(); btn.border = btn:CreateTexture(nil,"OVERLAY"); btn.border:SetTexture("Interface\\Addons\\Examiner\\Textures\\Border"); btn.border:SetSize(41,41); btn.border:SetPoint("CENTER"); btn.level = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight"); btn.level:SetFont(GameFontHighlight:GetFont(),12,"OUTLINE"); btn.level:SetPoint("BOTTOM",0,4); btn.level:Hide(); if (index == 1) then btn:SetPoint("TOPLEFT",4,-3); elseif (index == 9) then btn:SetPoint("TOPRIGHT",-4,-3); elseif (index == 17) then btn:SetPoint("BOTTOM",-41.5,27); elseif (index <= 16) then btn:SetPoint("TOP",mod.slotBtns[index - 1],"BOTTOM",0,-4); else btn:SetPoint("LEFT",mod.slotBtns[index - 1],"RIGHT",5,0); end mod.slotBtns[index] = btn; end