TradeSkillMaster/Core/UI/MainUI/Core.lua

92 lines
2.6 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local MainUI = TSM:NewPackage("MainUI")
local Settings = TSM.Include("Service.Settings")
local UIElements = TSM.Include("UI.UIElements")
local private = {
settings = nil,
topLevelPages = {},
frame = nil,
}
local MIN_FRAME_SIZE = { width = 720, height = 588 }
-- ============================================================================
-- Module Functions
-- ============================================================================
function MainUI.OnInitialize()
private.settings = Settings.NewView()
:AddKey("global", "mainUIContext", "frame")
end
function MainUI.OnDisable()
-- hide the frame
if private.frame then
MainUI.Toggle()
end
end
function MainUI.RegisterTopLevelPage(name, callback)
tinsert(private.topLevelPages, { name = name, callback = callback })
end
function MainUI.Toggle()
if private.frame then
-- it's already shown, so hide it
private.frame:Hide()
assert(not private.frame)
else
private.frame = private.CreateMainFrame()
private.frame:Draw()
private.frame:Show()
end
end
-- ============================================================================
-- Main Frame
-- ============================================================================
function private.CreateMainFrame()
TSM.UI.AnalyticsRecordPathChange("main")
-- Always show the Dashboard first
private.settings.frame.page = 1
local frame = UIElements.New("LargeApplicationFrame", "base")
:SetParent(UIParent)
:SetSettingsContext(private.settings, "frame")
:SetMinResize(MIN_FRAME_SIZE.width, MIN_FRAME_SIZE.height)
:SetStrata("HIGH")
:AddPlayerGold()
:AddAppStatusIcon()
:SetScript("OnHide", private.BaseFrameOnHide)
for _, info in ipairs(private.topLevelPages) do
frame:AddNavButton(info.name, info.callback)
end
local whatsNewDialog = TSM.UI.WhatsNew.GetDialog()
if whatsNewDialog then
frame:ShowDialogFrame(whatsNewDialog)
end
return frame
end
-- ============================================================================
-- Local Script Handlers
-- ============================================================================
function private.BaseFrameOnHide(frame)
assert(frame == private.frame)
frame:Release()
private.frame = nil
TSM.UI.AnalyticsRecordClose("main")
end