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.
93 lines
2.4 KiB
93 lines
2.4 KiB
local MAJOR, MINOR = "DiesalMenu-2.0", 1
|
|
---@alias Diesal.Menu DiesalMenu-2.0
|
|
|
|
---@class DiesalMenu-2.0
|
|
local DiesalMenu = LibStub:NewLibrary(MAJOR, MINOR)
|
|
|
|
if not DiesalMenu then
|
|
return
|
|
end -- No Upgrade needed.
|
|
|
|
---@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")
|
|
|
|
local type, select, tonumber = type, select, tonumber
|
|
local setmetatable, getmetatable, next = setmetatable, getmetatable, next
|
|
local sub, format, lower, upper, match = string.sub, string.format, string.lower, string.upper, string.match
|
|
local pairs, ipairs = pairs, ipairs
|
|
local tinsert, tremove, tconcat, tsort = table.insert, table.remove, table.concat, table.sort
|
|
local floor, ceil, abs, modf = math.floor, math.ceil, math.abs, math.modf
|
|
|
|
local CreateFrame, UIParent = CreateFrame, UIParent
|
|
|
|
---@type Diesal.Menu.Menu
|
|
local MENU
|
|
local CLOSEDELAY = 2
|
|
|
|
---@class Diesal.Menu.CloseTimer : Frame
|
|
---@field closeDelay number
|
|
local closeTimer = CreateFrame("Frame", nil, DiesalGUI.UIParent)
|
|
closeTimer:Hide()
|
|
|
|
---@param this Diesal.Menu.CloseTimer
|
|
---@param elapsed number
|
|
closeTimer:SetScript("OnUpdate", function(this, elapsed)
|
|
if this.count < 0 then
|
|
DiesalMenu:Close()
|
|
this:Hide()
|
|
else
|
|
this.count = this.count - elapsed
|
|
end
|
|
end)
|
|
|
|
---@param menuData any
|
|
---@param anchor any
|
|
---@param x number
|
|
---@param y number
|
|
---@param closeDelay number
|
|
function DiesalMenu:Menu(menuData, anchor, x, y, closeDelay)
|
|
MENU = MENU or DiesalGUI:Create("DiesalMenu")
|
|
MENU:ResetSettings()
|
|
if not MENU:BuildMenu(menuData) then
|
|
MENU:Hide()
|
|
return
|
|
end
|
|
MENU:Show()
|
|
MENU:ClearAllPoints()
|
|
MENU:SetPoint("TOPLEFT", anchor, "TOPLEFT", x, y)
|
|
closeTimer.closeDelay = closeDelay or CLOSEDELAY
|
|
DiesalMenu:StartCloseTimer()
|
|
DiesalMenu:SetFocus()
|
|
end
|
|
|
|
function DiesalMenu:Close()
|
|
DiesalMenu:StopCloseTimer()
|
|
if not MENU or not MENU:IsVisible() then
|
|
return
|
|
end
|
|
MENU:ResetSettings()
|
|
MENU:ReleaseChildren()
|
|
MENU:Hide()
|
|
MENU:ClearAllPoints()
|
|
end
|
|
|
|
function DiesalMenu:StartCloseTimer()
|
|
closeTimer.count = closeTimer.closeDelay
|
|
closeTimer:Show()
|
|
end
|
|
|
|
function DiesalMenu:StopCloseTimer()
|
|
closeTimer:Hide()
|
|
end
|
|
|
|
function DiesalMenu:ClearFocus()
|
|
DiesalMenu:Close()
|
|
end
|
|
|
|
function DiesalMenu:SetFocus()
|
|
DiesalGUI:SetFocus(DiesalMenu)
|
|
end
|
|
|