244 lines
6.7 KiB
Lua
244 lines
6.7 KiB
Lua
|
-- ------------------------------------------------------------------------------ --
|
||
|
-- TradeSkillMaster --
|
||
|
-- https://tradeskillmaster.com --
|
||
|
-- All Rights Reserved - Detailed license information included with addon. --
|
||
|
-- ------------------------------------------------------------------------------ --
|
||
|
|
||
|
local _, TSM = ...
|
||
|
local MailingUI = TSM.UI:NewPackage("MailingUI")
|
||
|
local L = TSM.Include("Locale").GetTable()
|
||
|
local Delay = TSM.Include("Util.Delay")
|
||
|
local FSM = TSM.Include("Util.FSM")
|
||
|
local Event = TSM.Include("Util.Event")
|
||
|
local ScriptWrapper = TSM.Include("Util.ScriptWrapper")
|
||
|
local Settings = TSM.Include("Service.Settings")
|
||
|
local UIElements = TSM.Include("UI.UIElements")
|
||
|
local private = {
|
||
|
settings = nil,
|
||
|
topLevelPages = {},
|
||
|
frame = nil,
|
||
|
fsm = nil,
|
||
|
defaultUISwitchBtn = nil,
|
||
|
isVisible = false,
|
||
|
}
|
||
|
local MIN_FRAME_SIZE = { width = 575, height = 400 }
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- Module Functions
|
||
|
-- ============================================================================
|
||
|
|
||
|
function MailingUI.OnInitialize()
|
||
|
private.settings = Settings.NewView()
|
||
|
:AddKey("global", "mailingUIContext", "showDefault")
|
||
|
:AddKey("global", "mailingUIContext", "frame")
|
||
|
private.FSMCreate()
|
||
|
end
|
||
|
|
||
|
function MailingUI.OnDisable()
|
||
|
-- hide the frame
|
||
|
private.fsm:ProcessEvent("EV_FRAME_HIDE")
|
||
|
end
|
||
|
|
||
|
function MailingUI.RegisterTopLevelPage(name, callback)
|
||
|
tinsert(private.topLevelPages, { name = name, callback = callback })
|
||
|
end
|
||
|
|
||
|
function MailingUI.IsVisible()
|
||
|
return private.isVisible
|
||
|
end
|
||
|
|
||
|
function MailingUI.SetSelectedTab(buttonText, redraw)
|
||
|
private.frame:SetSelectedNavButton(buttonText, redraw)
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- Main Frame
|
||
|
-- ============================================================================
|
||
|
|
||
|
function private.CreateMainFrame()
|
||
|
TSM.UI.AnalyticsRecordPathChange("mailing")
|
||
|
-- Always show the Inbox 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")
|
||
|
:AddSwitchButton(private.SwitchBtnOnClick)
|
||
|
:SetScript("OnHide", private.BaseFrameOnHide)
|
||
|
|
||
|
for _, info in ipairs(private.topLevelPages) do
|
||
|
frame:AddNavButton(info.name, info.callback)
|
||
|
end
|
||
|
|
||
|
private.frame = frame
|
||
|
|
||
|
return frame
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- Local Script Handlers
|
||
|
-- ============================================================================
|
||
|
|
||
|
function private.BaseFrameOnHide()
|
||
|
TSM.UI.AnalyticsRecordClose("mailing")
|
||
|
private.fsm:ProcessEvent("EV_FRAME_HIDE")
|
||
|
end
|
||
|
|
||
|
function private.SwitchBtnOnClick(button)
|
||
|
private.settings.showDefault = button ~= private.defaultUISwitchBtn
|
||
|
private.fsm:ProcessEvent("EV_SWITCH_BTN_CLICKED")
|
||
|
end
|
||
|
|
||
|
function private.SwitchButtonOnEnter(button)
|
||
|
button:SetTextColor("TEXT")
|
||
|
:Draw()
|
||
|
end
|
||
|
|
||
|
function private.SwitchButtonOnLeave(button)
|
||
|
button:SetTextColor("TEXT_ALT")
|
||
|
:Draw()
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
-- ============================================================================
|
||
|
-- FSM
|
||
|
-- ============================================================================
|
||
|
|
||
|
function private.FSMCreate()
|
||
|
local function MailShowDelayed()
|
||
|
private.fsm:ProcessEvent("EV_MAIL_SHOW")
|
||
|
end
|
||
|
Event.Register("MAIL_SHOW", function()
|
||
|
Delay.AfterFrame("MAIL_SHOW_DELAYED", 0, MailShowDelayed)
|
||
|
end)
|
||
|
Event.Register("MAIL_CLOSED", function()
|
||
|
private.fsm:ProcessEvent("EV_MAIL_CLOSED")
|
||
|
end)
|
||
|
|
||
|
MailFrame:UnregisterEvent("MAIL_SHOW")
|
||
|
CancelEmote()
|
||
|
|
||
|
local fsmContext = {
|
||
|
frame = nil,
|
||
|
}
|
||
|
|
||
|
ScriptWrapper.Set(MailFrame, "OnHide", function()
|
||
|
private.fsm:ProcessEvent("EV_FRAME_HIDE")
|
||
|
end)
|
||
|
|
||
|
private.fsm = FSM.New("MAILING_UI")
|
||
|
:AddState(FSM.NewState("ST_CLOSED")
|
||
|
:AddTransition("ST_DEFAULT_OPEN")
|
||
|
:AddTransition("ST_FRAME_OPEN")
|
||
|
:AddEvent("EV_FRAME_TOGGLE", function(context)
|
||
|
assert(not private.settings.showDefault)
|
||
|
return "ST_FRAME_OPEN"
|
||
|
end)
|
||
|
:AddEvent("EV_MAIL_SHOW", function(context)
|
||
|
if private.settings.showDefault then
|
||
|
return "ST_DEFAULT_OPEN"
|
||
|
else
|
||
|
return "ST_FRAME_OPEN"
|
||
|
end
|
||
|
end)
|
||
|
)
|
||
|
:AddState(FSM.NewState("ST_DEFAULT_OPEN")
|
||
|
:SetOnEnter(function(context, isIgnored)
|
||
|
MailFrame_OnEvent(MailFrame, "MAIL_SHOW")
|
||
|
|
||
|
if not private.defaultUISwitchBtn then
|
||
|
private.defaultUISwitchBtn = UIElements.New("ActionButton", "switchBtn")
|
||
|
:SetSize(60, TSM.IsWowClassic() and 16 or 15)
|
||
|
:SetFont("BODY_BODY3")
|
||
|
:AddAnchor("TOPRIGHT", TSM.IsWowClassic() and -26 or -27, TSM.IsWowClassic() and -3 or -4)
|
||
|
:DisableClickCooldown()
|
||
|
:SetText(L["TSM4"])
|
||
|
:SetScript("OnClick", private.SwitchBtnOnClick)
|
||
|
:SetScript("OnEnter", private.SwitchButtonOnEnter)
|
||
|
:SetScript("OnLeave", private.SwitchButtonOnLeave)
|
||
|
private.defaultUISwitchBtn:_GetBaseFrame():SetParent(MailFrame)
|
||
|
end
|
||
|
|
||
|
if isIgnored then
|
||
|
private.defaultUISwitchBtn:Hide()
|
||
|
else
|
||
|
private.defaultUISwitchBtn:Show()
|
||
|
private.defaultUISwitchBtn:Draw()
|
||
|
end
|
||
|
end)
|
||
|
:AddTransition("ST_CLOSED")
|
||
|
:AddTransition("ST_FRAME_OPEN")
|
||
|
:AddEvent("EV_FRAME_HIDE", function(context)
|
||
|
OpenMailFrame:Hide()
|
||
|
CloseMail()
|
||
|
|
||
|
return "ST_CLOSED"
|
||
|
end)
|
||
|
:AddEventTransition("EV_MAIL_CLOSED", "ST_CLOSED")
|
||
|
:AddEvent("EV_SWITCH_BTN_CLICKED", function()
|
||
|
OpenMailFrame:Hide()
|
||
|
return "ST_FRAME_OPEN"
|
||
|
end)
|
||
|
)
|
||
|
:AddState(FSM.NewState("ST_FRAME_OPEN")
|
||
|
:SetOnEnter(function(context)
|
||
|
OpenAllBags()
|
||
|
CheckInbox()
|
||
|
DoEmote("READ", nil, true)
|
||
|
HideUIPanel(MailFrame)
|
||
|
|
||
|
assert(not context.frame)
|
||
|
context.frame = private.CreateMainFrame()
|
||
|
context.frame:Show()
|
||
|
context.frame:Draw()
|
||
|
private.isVisible = true
|
||
|
end)
|
||
|
:SetOnExit(function(context)
|
||
|
if context.frame then
|
||
|
context.frame:Hide()
|
||
|
context.frame:Release()
|
||
|
context.frame = nil
|
||
|
end
|
||
|
private.isVisible = false
|
||
|
end)
|
||
|
:AddTransition("ST_CLOSED")
|
||
|
:AddTransition("ST_DEFAULT_OPEN")
|
||
|
:AddEvent("EV_FRAME_HIDE", function(context)
|
||
|
CancelEmote()
|
||
|
CloseAllBags()
|
||
|
CloseMail()
|
||
|
|
||
|
return "ST_CLOSED"
|
||
|
end)
|
||
|
:AddEvent("EV_MAIL_SHOW", function(context)
|
||
|
OpenAllBags()
|
||
|
CheckInbox()
|
||
|
|
||
|
if not context.frame then
|
||
|
DoEmote("READ", nil, true)
|
||
|
context.frame = private.CreateMainFrame()
|
||
|
context.frame:Draw()
|
||
|
private.isVisible = true
|
||
|
end
|
||
|
end)
|
||
|
:AddEvent("EV_MAIL_CLOSED", function(context)
|
||
|
CancelEmote()
|
||
|
CloseAllBags()
|
||
|
|
||
|
return "ST_CLOSED"
|
||
|
end)
|
||
|
:AddEvent("EV_SWITCH_BTN_CLICKED", function()
|
||
|
return "ST_DEFAULT_OPEN"
|
||
|
end)
|
||
|
)
|
||
|
:Init("ST_CLOSED", fsmContext)
|
||
|
end
|