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.
187 lines
7.2 KiB
187 lines
7.2 KiB
---@type Diesal.Menu
|
|
local DiesalMenu = LibStub("DiesalMenu-2.0")
|
|
|
|
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
---@type Diesal.Tools
|
|
local DiesalTools = LibStub("DiesalTools-2.0")
|
|
---@type Diesal.Style
|
|
local DiesalStyle = LibStub("DiesalStyle-2.0")
|
|
---@type Diesal.GUI
|
|
local DiesalGUI = LibStub("DiesalGUI-2.0")
|
|
|
|
-- ~~| Diesal Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
local Colors = DiesalStyle.Colors
|
|
local HSL, ShadeColor, TintColor = DiesalTools.HSL, DiesalTools.ShadeColor, DiesalTools.TintColor
|
|
-- | Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
-- | WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
-- | MenuItem |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
local Type = "DiesalMenuItem"
|
|
local Version = 2
|
|
-- | Stylesheets |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
local Stylesheet = {
|
|
["frame-hover"] = {
|
|
type = "texture",
|
|
layer = "HIGHLIGHT",
|
|
color = Colors.UI_1000,
|
|
alpha = 0.1,
|
|
},
|
|
["text-color"] = {
|
|
type = "Font",
|
|
color = "cbcbcb",
|
|
},
|
|
}
|
|
-- | Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
-- | Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
---@class Diesal.Menu.MenuItem
|
|
local methods = {
|
|
["OnAcquire"] = function(self)
|
|
self:ApplySettings()
|
|
self:SetStylesheet(Stylesheet)
|
|
-- self:SetStylesheet(wireFrame)
|
|
self:Show()
|
|
end,
|
|
["OnRelease"] = function(self) end,
|
|
["ApplySettings"] = function(self)
|
|
if not self.settings.itemData then
|
|
return false
|
|
end
|
|
|
|
local settings = self.settings
|
|
local menuSettings = settings.parentObject.settings
|
|
local itemData = settings.itemData
|
|
local text = self.text
|
|
local check = self.check
|
|
local arrow = self.arrow
|
|
|
|
local checkWidth = menuSettings.check and settings.checkWidth or settings.textPadLeft
|
|
local arrowWidth = menuSettings.arrow and settings.arrowWidth or settings.textPadRight
|
|
local textWidthMax = settings.widthMax - arrowWidth - checkWidth
|
|
|
|
if settings.position == 1 then
|
|
self:SetPoint("TOPLEFT")
|
|
self:SetPoint("RIGHT")
|
|
else
|
|
self:SetPoint("TOPLEFT", settings.parentObject.children[settings.position - 1].frame, "BOTTOMLEFT", 0, 0)
|
|
self:SetPoint("RIGHT")
|
|
end
|
|
|
|
if itemData.type == "spacer" then
|
|
self.frame:EnableMouse(false)
|
|
self:SetHeight(settings.spacerHeight)
|
|
else
|
|
self.frame:EnableMouse(true)
|
|
self:SetHeight(settings.height)
|
|
end
|
|
|
|
self:SetText(itemData.name)
|
|
text:SetPoint("LEFT", checkWidth, 0)
|
|
text:SetPoint("RIGHT", -arrowWidth, 0)
|
|
|
|
arrow[menuSettings.arrow and itemData.menuData and "Show" or "Hide"](arrow)
|
|
check[menuSettings.check and itemData.check and itemData.check() and "Show" or "Hide"](check)
|
|
|
|
local textWidth = DiesalTools.Round(text:GetStringWidth()) + 10
|
|
local itemWidth = checkWidth + textWidth + arrowWidth
|
|
|
|
menuSettings.itemWidth = min(max(menuSettings.itemWidth, itemWidth), settings.widthMax)
|
|
end,
|
|
["SetText"] = function(self, text)
|
|
self.text:SetText(text or "")
|
|
end,
|
|
["OnClick"] = function(self)
|
|
local onClick = self.settings.itemData.onClick
|
|
if onClick then
|
|
onClick()
|
|
end
|
|
end,
|
|
["OnEnter"] = function(self)
|
|
DiesalMenu:StopCloseTimer()
|
|
local menuChildren = self.settings.parentObject.children
|
|
local menuData = self.settings.itemData.menuData
|
|
for i = 1, #menuChildren do
|
|
menuChildren[i]:ReleaseChildren()
|
|
end
|
|
self:BuildSubMenu(menuData)
|
|
end,
|
|
["BuildSubMenu"] = function(self, menuData)
|
|
if not menuData then
|
|
return
|
|
end
|
|
local subMenu = DiesalGUI:Create("DiesalMenu") --[[ @as Diesal.Menu.Menu ]]
|
|
if not subMenu:BuildMenu(menuData) then
|
|
DiesalGUI:Release(subMenu)
|
|
return
|
|
end
|
|
self:AddChild(subMenu)
|
|
subMenu:SetParent(self.frame)
|
|
subMenu:ClearAllPoints()
|
|
subMenu:SetPoint("TOPLEFT", self.frame, "TOPRIGHT", 0, 0)
|
|
subMenu:Show()
|
|
end,
|
|
}
|
|
---@alias DiesalMenuItem Diesal.Menu.MenuItem
|
|
-- | Constructor |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
local function Constructor()
|
|
---@class Diesal.Menu.MenuItem : Diesal.GUI.ObjectBase
|
|
---@field text FontString
|
|
---@field check Texture
|
|
---@field arrow Texture
|
|
local self = DiesalGUI:Create(Type, true)
|
|
local frame = CreateFrame("Button", nil, DiesalGUI.UIParent)
|
|
self.frame = frame
|
|
-- ~~ Default Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
self.defaults = {
|
|
widthMax = 250,
|
|
height = 16,
|
|
spacerHeight = 5,
|
|
checkWidth = 14,
|
|
arrowWidth = 14,
|
|
textPadLeft = 2,
|
|
textPadRight = 2,
|
|
}
|
|
-- ~~ Events ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
-- OnAcquire, OnRelease, OnHeightSet, OnWidthSet
|
|
-- ~~ Construct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
frame:SetScript("OnClick", function(this, button)
|
|
DiesalGUI:OnMouse(this, button)
|
|
self:OnClick()
|
|
end)
|
|
frame:SetScript("OnEnter", function(this)
|
|
self:OnEnter()
|
|
end)
|
|
frame:SetScript("OnLeave", function(this)
|
|
DiesalMenu:StartCloseTimer()
|
|
end)
|
|
|
|
local text = self:CreateRegion("FontString", "text", frame)
|
|
text:SetPoint("TOP", 0, -2)
|
|
text:SetPoint("BOTTOM", 0, 0)
|
|
--text:SetJustifyH("TOP")
|
|
text:SetJustifyH("LEFT")
|
|
text:SetWordWrap(false)
|
|
|
|
local check = self:CreateRegion("Texture", "check", frame)
|
|
DiesalStyle:StyleTexture(check, {
|
|
type = "texture",
|
|
position = { 1, nil, 0, nil },
|
|
height = 16,
|
|
width = 16,
|
|
image = { "DiesalGUIcons", { 10, 5, 16, 256, 128 }, "FFFF00" },
|
|
})
|
|
local arrow = self:CreateRegion("Texture", "arrow", frame)
|
|
DiesalStyle:StyleTexture(arrow, {
|
|
type = "texture",
|
|
position = { nil, 2, -1, nil },
|
|
height = 16,
|
|
width = 16,
|
|
image = { "DiesalGUIcons", { 7, 5, 16, 256, 128 }, "FFFF00" },
|
|
})
|
|
-- ~~ Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
for method, func in pairs(methods) do
|
|
self[method] = func
|
|
end
|
|
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
return self
|
|
end
|
|
DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version)
|
|
|