local _, ns = ... local settings = ns.settings local containers = ns.containers local button = {} button.__index = button local buttons = {} buttons.__index = buttons buttons.list = {} ns.buttons = buttons function buttons:GetButton(bag, slot) if not self.list[bag] then self.list[bag] = {} end if not self.list[bag][slot] then self.list[bag][slot] = button(bag, slot) end return self.list[bag][slot] end local mt = {} mt.__call = function(tbl, bag, slot) local parentFrame = CreateFrame("Frame", string.format("FJUIBagButtonParent%d_%d", bag, slot), nil) local btn = CreateFrame("Button", string.format("DJUIBagButton%d_%d", bag, slot), parentFrame, "ContainerFrameItemButtonTemplate") btn.parent = parentFrame parentFrame.button = btn for k, v in pairs(button) do parentFrame[k] = v end parentFrame:Init(bag, slot) return parentFrame end setmetatable(button, mt) function button:Init(bag, slot) self.bag = bag self.slot = slot self:SetID(bag) self.button:SetID(slot) self.button:SetAllPoints() self:Show() self.button:Show() end function button:GetInformation() local id = GetContainerItemID(self.bag, self.slot) if id then local texture, count, locked, quality, readable, lootable, link, isFiltered = GetContainerItemInfo(self.bag, self.slot) local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(id) return id, name, texture, count, quality, ilevel end end function button:GetContainerName() local id = GetContainerItemID(self.bag, self.slot) if id then local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(id) local isInSet, setName = GetContainerItemEquipmentSetInfo(self.bag, self.slot) if isInSet then settings.setNames[setName] = true end return settings.saved.types[id] or (isInSet and setName) or class end end function button:Update() local id, name, texture, count, quality, ilevel = self:GetInformation() if id then self:UpdateItem(id, name, texture, count, quality, ilevel) else self:Clear() end self:UpdateContainer() end function button:UpdateContainer() local name = self:GetContainerName() if self.container then if self.container.name == name then return end self.container:RemoveItem(self) end if name then local container = containers:GetContainer(name) container:AddItem(self) else self:Hide() -- TODO fix this!! end end function button:UpdateItem(id, name, texture, count, quality, ilevel) local button = self.button self.name = name self.quality = quality self.count = count button.icon:SetTexture(texture) if count > 1 then button.Count:SetText(count) button.Count:SetVertexColor(1, 1, 1, 1) button.Count:Show() elseif IsEquippableItem(id) then button.Count:SetText(ilevel) button.Count:SetVertexColor(GetItemQualityColor(quality)) button.Count:Show() else button.Count:Hide() end end function button:Clear() local button = self.button self.name = nil self.quality = nil self.count = nil button.icon:SetTexture(nil) button.Count:Hide() end