You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
369 lines
11 KiB
369 lines
11 KiB
-- ========================================================================= --
|
|
-- SylingTracker --
|
|
-- https://www.curseforge.com/wow/addons/sylingtracker --
|
|
-- --
|
|
-- Repository: --
|
|
-- https://github.com/Skamer/SylingTracker --
|
|
-- --
|
|
-- ========================================================================= --
|
|
Syling "SylingTracker.Core.ItemBar" ""
|
|
-- ========================================================================= --
|
|
namespace "SLT"
|
|
-- ========================================================================= --
|
|
export {
|
|
GameTooltip = GameTooltip
|
|
}
|
|
-- ========================================================================= --
|
|
RegisterModel = API.RegisterModel
|
|
-- ========================================================================= --
|
|
_ItemModel = RegisterModel(Model, "items-data")
|
|
-- ========================================================================= --
|
|
DB_READ_ONLY = true
|
|
-- ========================================================================= --
|
|
__Recyclable__ "SylingTracker_ItemButton%d"
|
|
class "ItemButton" (function(_ENV)
|
|
inherit "Frame"
|
|
-----------------------------------------------------------------------------
|
|
-- Methods --
|
|
-----------------------------------------------------------------------------
|
|
function SetItemLink(self, itemLink)
|
|
self.__ActionButton:SetAttribute("type", "item")
|
|
self.__ActionButton:SetAttribute("item", itemLink)
|
|
self.__ActionButton:SetScript("OnLeave", function()
|
|
GameTooltip:Hide()
|
|
end)
|
|
self.__ActionButton:SetScript("OnEnter", function()
|
|
GameTooltip:SetOwner(self, "ANCHOR_LEFT")
|
|
GameTooltip:SetHyperlink(itemLink)
|
|
GameTooltip:Show()
|
|
end)
|
|
end
|
|
|
|
function SetItemTexture(self, texture)
|
|
self.__Texture:SetTexture(texture)
|
|
end
|
|
|
|
function OnAcquire(self)
|
|
self:Show()
|
|
end
|
|
|
|
function OnRelease(self)
|
|
self:Hide()
|
|
self:ClearAllPoints()
|
|
self:SetParent()
|
|
|
|
self.__ActionButton:SetScript("OnLeave", nil)
|
|
self.__ActionButton:SetScript("OnEnter", nil)
|
|
end
|
|
-----------------------------------------------------------------------------
|
|
-- Constructors --
|
|
-----------------------------------------------------------------------------
|
|
function __ctor(self, name, ...)
|
|
|
|
local actionButton = CreateFrame("Button", name.."ActionButton", self, "SecureActionButtonTemplate")
|
|
|
|
-- local actionButton = Button(name.."Action", self, "SecureActionButtonTemplate")
|
|
actionButton:SetAllPoints()
|
|
self.__ActionButton = actionButton
|
|
|
|
self:SetWidth(32)
|
|
self:SetHeight(32)
|
|
|
|
local texture = Texture(name.."Texture", self)
|
|
texture:SetAllPoints()
|
|
texture:SetTexCoord(0.07, 0.93, 0.07, 0.93)
|
|
self.__Texture = texture
|
|
|
|
local cooldown = Cooldown(name.."Cooldown", self)
|
|
cooldown:SetAllPoints()
|
|
self.__Cooldown = cooldown
|
|
end
|
|
end)
|
|
-- ========================================================================= --
|
|
class "ItemBarMover" (function(ENV)
|
|
inherit "Frame"
|
|
|
|
__Template__{
|
|
TextFS = SLTFontString
|
|
}
|
|
function __ctor() end
|
|
end)
|
|
-- ========================================================================= --
|
|
class "ItemBar" (function(_ENV)
|
|
inherit "Frame" extend "IView"
|
|
-----------------------------------------------------------------------------
|
|
-- Methods --
|
|
-----------------------------------------------------------------------------
|
|
function OnViewUpdate(self, data)
|
|
local itemIndex = 0
|
|
|
|
|
|
wipe(self.itemButtonsID)
|
|
wipe(self.itemButtonsOrder)
|
|
|
|
if data.items then
|
|
for _, itemData in pairs(data.items) do
|
|
tinsert(self.itemButtonsOrder, itemData)
|
|
end
|
|
|
|
table.sort(self.itemButtonsOrder, function(a, b)
|
|
local aOrder, bOrder = a.order or 100, b.order or 100
|
|
return aOrder < bOrder
|
|
end)
|
|
|
|
local previousItemButton
|
|
for _, itemButtonData in ipairs(self.itemButtonsOrder) do
|
|
itemIndex = itemIndex + 1
|
|
|
|
local id = itemButtonData.id
|
|
|
|
local itemButton = self:AcquireItemButton(id)
|
|
|
|
if itemIndex > 1 then
|
|
itemButton:SetPoint("LEFT", previousItemButton, "RIGHT", 5, 0)
|
|
else
|
|
itemButton:SetPoint("LEFT", 5, 0)
|
|
end
|
|
|
|
itemButton:SetItemLink(itemButtonData.link)
|
|
itemButton:SetItemTexture(itemButtonData.texture)
|
|
|
|
previousItemButton = itemButton
|
|
|
|
self.itemButtonsID[id] = true
|
|
end
|
|
end
|
|
|
|
self:ReleaseUnusedItemButtons()
|
|
end
|
|
|
|
function AcquireItemButton(self, id)
|
|
local itemButton = self.itemButtonsCache[id]
|
|
if not itemButton then
|
|
itemButton = ItemButton.Acquire()
|
|
itemButton:SetParent(self)
|
|
|
|
self.itemButtonsCache[id] = itemButton
|
|
end
|
|
|
|
return itemButton
|
|
end
|
|
|
|
|
|
function ReleaseUnusedItemButtons(self)
|
|
for itemButtonID, itemButton in pairs(self.itemButtonsCache) do
|
|
if not self.itemButtonsID[itemButtonID] then
|
|
itemButton:Release()
|
|
|
|
self.itemButtonsCache[itemButtonID] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
-- __Template__{}
|
|
function __ctor(self)
|
|
-- Keep in the cache the item buttons, to be reused
|
|
-- use: self.itemButtonsCache[id] = ItemButton
|
|
self.itemButtonsCache = setmetatable({}, { __mode = "v"})
|
|
|
|
-- Get the current item button id list, used internally for releasing the
|
|
-- unused items
|
|
self.itemButtonsID = {}
|
|
|
|
-- Control the item order
|
|
self.itemButtonsOrder = {}
|
|
end
|
|
end)
|
|
-------------------------------------------------------------------------------
|
|
-- Styles --
|
|
-------------------------------------------------------------------------------
|
|
Style.UpdateSkin("Default", {
|
|
[ItemBarMover] = {
|
|
height = 26,
|
|
backdrop = {
|
|
bgFile = [[Interface\AddOns\SylingTracker\Media\Textures\LinearGradient]]
|
|
},
|
|
backdropColor = { r = 0, g = 1, b = 0, a = 0.3},
|
|
|
|
location = {
|
|
Anchor("BOTTOMLEFT", 0, 0, nil, "TOPLEFT"),
|
|
Anchor("BOTTOMRIGHT", 0, 0, nil, "TOPRIGHT")
|
|
},
|
|
|
|
TextFS = {
|
|
text = "Click here to move the Item Bar",
|
|
setAllPoints = true,
|
|
sharedMediaFont = FontType("PT Sans Narrow Bold", 13)
|
|
}
|
|
},
|
|
|
|
[ItemBar] = {
|
|
movable = true,
|
|
backdrop = {
|
|
bgFile = [[Interface\AddOns\SylingTracker\Media\Textures\LinearGradient]],
|
|
},
|
|
backdropColor = { r = 35/255, g = 40/255, b = 46/255, a = 0.73},
|
|
}
|
|
})
|
|
-------------------------------------------------------------------------------
|
|
-- Enchance the API --
|
|
-------------------------------------------------------------------------------
|
|
class "API" (function(_ENV)
|
|
__Static__() function ItemBar_AddItemData(id, data)
|
|
data.id = id
|
|
|
|
_ItemModel:AddData(data, "items", id)
|
|
end
|
|
|
|
__Static__() function ItemBar_SetItemData(id, data)
|
|
data.id = id
|
|
|
|
_ItemModel:SetData(data, "items", id)
|
|
end
|
|
|
|
__Static__() function ItemBar_RemoveItemData(id)
|
|
_ItemModel:RemoveData("items", id)
|
|
end
|
|
|
|
__Static__() function ItemBar_Update()
|
|
_ItemModel:SecureFlush()
|
|
end
|
|
end)
|
|
-- ========================================================================= --
|
|
function OnEnable(self)
|
|
self:NonCombatLoad()
|
|
end
|
|
|
|
__NoCombat__()
|
|
function NonCombatLoad(self)
|
|
-- Create the item bar
|
|
_ItemBar = ItemBar("SylingTracker_ItemBar", UIParent)
|
|
_ItemBar:SetWidth(250)
|
|
_ItemBar:SetHeight(34)
|
|
_ItemBar:SetPoint("CENTER", 200, 0)
|
|
_ItemBar:SetMovable(true)
|
|
|
|
-- Create the Item bar mover
|
|
_ItemBarMover = ItemBarMover("SylingTracker_ItemBarMover", _ItemBar)
|
|
_ItemBarMover:SetScript("OnMouseUp", function(f)
|
|
_ItemBar:StopMovingOrSizing()
|
|
|
|
local top = _ItemBar:GetTop()
|
|
local left = _ItemBar:GetLeft()
|
|
|
|
Profiles.PrepareDatabase()
|
|
if Database.SelectTable(true, "itemBar") then
|
|
Database.SetValue("xPos", left)
|
|
Database.SetValue("yPos", top)
|
|
end
|
|
end)
|
|
|
|
_ItemBarMover:SetScript("OnMouseDown", function(f)
|
|
_ItemBar:StartMoving()
|
|
end)
|
|
|
|
Profiles.PrepareDatabase()
|
|
local xPos, yPos, locked, hidden
|
|
if Database.SelectTable(false, "itemBar") then
|
|
xPos = Database.GetValue("xPos")
|
|
yPos = Database.GetValue("yPos")
|
|
locked = Database.GetValue("locked")
|
|
hidden = Database.GetValue("hidden")
|
|
end
|
|
|
|
if not xPos and not yPos then
|
|
_ItemBar:SetPoint("TOPRIGHT", -175, -190)
|
|
else
|
|
_ItemBar:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xPos or 0, yPos or 0)
|
|
end
|
|
|
|
if locked then
|
|
self:LockItemBar()
|
|
else
|
|
self:UnlockItemBar()
|
|
end
|
|
|
|
if hidden then
|
|
self:HideItemBar()
|
|
end
|
|
|
|
DB_READ_ONLY = false
|
|
|
|
_ItemModel:AddView(_ItemBar)
|
|
end
|
|
-- ========================================================================= --
|
|
-- Debug Utils Tools
|
|
-- ========================================================================= --
|
|
if ViragDevTool_AddData then
|
|
ViragDevTool_AddData(_ItemModel, "SLT Item Model")
|
|
end
|
|
|
|
|
|
__SystemEvent__ "SLT_LOCK_COMMAND"
|
|
__NoCombat__()
|
|
function LockItemBar()
|
|
_ItemBarMover:Hide()
|
|
|
|
_ItemBar:SetMovable(true)
|
|
Style[_ItemBar].backdropColor = { r = 0, g = 1, b = 0, a = 0}
|
|
|
|
|
|
if not DB_READ_ONLY then
|
|
Profiles.PrepareDatabase()
|
|
if Database.SelectTable(true, "itemBar") then
|
|
Database.SetValue("locked", true)
|
|
end
|
|
end
|
|
end
|
|
|
|
__SystemEvent__ "SLT_UNLOCK_COMMAND"
|
|
__NoCombat__()
|
|
function UnlockItemBar()
|
|
_ItemBarMover:Show()
|
|
|
|
_ItemBar:SetMovable(false)
|
|
Style[_ItemBar].backdropColor = nil
|
|
|
|
if not DB_READ_ONLY then
|
|
Profiles.PrepareDatabase()
|
|
if Database.SelectTable(true, "itemBar") then
|
|
Database.SetValue("locked", false)
|
|
end
|
|
end
|
|
end
|
|
|
|
__SystemEvent__ "SLT_SHOW_COMMAND"
|
|
__NoCombat__()
|
|
function ShowItemBar()
|
|
_ItemBar:Show()
|
|
|
|
if not DB_READ_ONLY then
|
|
Profiles.PrepareDatabase()
|
|
if Database.SelectTable(true, "itemBar") then
|
|
Database.SetValue("hidden", false)
|
|
end
|
|
end
|
|
end
|
|
|
|
__SystemEvent__ "SLT_HIDE_COMMAND"
|
|
__NoCombat__()
|
|
function HideItemBar()
|
|
_ItemBar:Hide()
|
|
|
|
if not DB_READ_ONLY then
|
|
Profiles.PrepareDatabase()
|
|
if Database.SelectTable(true, "itemBar") then
|
|
Database.SetValue("hidden", true)
|
|
end
|
|
end
|
|
end
|
|
|
|
__SystemEvent__ "SLT_TOGGLE_COMMAND"
|
|
__NoCombat__()
|
|
function ToggleItemBar()
|
|
if _ItemBar:IsShown() then
|
|
HideItemBar()
|
|
else
|
|
ShowItemBar()
|
|
end
|
|
end
|
|
|