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.

370 lines
11 KiB

5 years ago
-- ========================================================================= --
-- 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