192 lines
6.0 KiB
Lua
192 lines
6.0 KiB
Lua
-- ------------------------------------------------------------------------------ --
|
|
-- TradeSkillMaster --
|
|
-- https://tradeskillmaster.com --
|
|
-- All Rights Reserved - Detailed license information included with addon. --
|
|
-- ------------------------------------------------------------------------------ --
|
|
|
|
local _, TSM = ...
|
|
local ProfessionState = TSM.Crafting:NewPackage("ProfessionState")
|
|
local Event = TSM.Include("Util.Event")
|
|
local Delay = TSM.Include("Util.Delay")
|
|
local FSM = TSM.Include("Util.FSM")
|
|
local Log = TSM.Include("Util.Log")
|
|
local private = {
|
|
fsm = nil,
|
|
updateCallbacks = {},
|
|
isClosed = true,
|
|
craftOpen = nil,
|
|
tradeSkillOpen = nil,
|
|
professionName = nil,
|
|
}
|
|
local WAIT_FRAME_DELAY = 5
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Module Functions
|
|
-- ============================================================================
|
|
|
|
function ProfessionState.OnInitialize()
|
|
private.CreateFSM()
|
|
end
|
|
|
|
function ProfessionState.RegisterUpdateCallback(callback)
|
|
tinsert(private.updateCallbacks, callback)
|
|
end
|
|
|
|
function ProfessionState.GetIsClosed()
|
|
return private.isClosed
|
|
end
|
|
|
|
function ProfessionState.IsClassicCrafting()
|
|
return TSM.IsWowClassic() and private.craftOpen
|
|
end
|
|
|
|
function ProfessionState.SetCraftOpen(open)
|
|
private.craftOpen = open
|
|
end
|
|
|
|
function ProfessionState.GetCurrentProfession()
|
|
return private.professionName
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- FSM
|
|
-- ============================================================================
|
|
|
|
function private.CreateFSM()
|
|
if TSM.IsWowClassic() and not IsAddOnLoaded("Blizzard_CraftUI") then
|
|
LoadAddOn("Blizzard_CraftUI")
|
|
end
|
|
Event.Register("TRADE_SKILL_SHOW", function()
|
|
private.tradeSkillOpen = true
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_SHOW")
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_DATA_SOURCE_CHANGING")
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_DATA_SOURCE_CHANGED")
|
|
end)
|
|
Event.Register("TRADE_SKILL_CLOSE", function()
|
|
private.tradeSkillOpen = false
|
|
if not private.craftOpen then
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_CLOSE")
|
|
end
|
|
end)
|
|
if not TSM.IsWowClassic() then
|
|
Event.Register("GARRISON_TRADESKILL_NPC_CLOSED", function()
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_CLOSE")
|
|
end)
|
|
Event.Register("TRADE_SKILL_DATA_SOURCE_CHANGED", function()
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_DATA_SOURCE_CHANGED")
|
|
end)
|
|
Event.Register("TRADE_SKILL_DATA_SOURCE_CHANGING", function()
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_DATA_SOURCE_CHANGING")
|
|
end)
|
|
else
|
|
Event.Register("CRAFT_SHOW", function()
|
|
private.craftOpen = true
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_SHOW")
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_DATA_SOURCE_CHANGING")
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_DATA_SOURCE_CHANGED")
|
|
end)
|
|
Event.Register("CRAFT_CLOSE", function()
|
|
private.craftOpen = false
|
|
if not private.tradeSkillOpen then
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_CLOSE")
|
|
end
|
|
end)
|
|
Event.Register("CRAFT_UPDATE", function()
|
|
private.fsm:ProcessEvent("EV_TRADE_SKILL_DATA_SOURCE_CHANGED")
|
|
end)
|
|
end
|
|
local function ToggleDefaultCraftButton()
|
|
if not CraftCreateButton then
|
|
return
|
|
end
|
|
if private.craftOpen then
|
|
CraftCreateButton:Show()
|
|
else
|
|
CraftCreateButton:Hide()
|
|
end
|
|
end
|
|
local function FrameDelayCallback()
|
|
private.fsm:ProcessEvent("EV_FRAME_DELAY")
|
|
end
|
|
private.fsm = FSM.New("PROFESSION_STATE")
|
|
:AddState(FSM.NewState("ST_CLOSED")
|
|
:SetOnEnter(function()
|
|
private.isClosed = true
|
|
private.RunUpdateCallbacks()
|
|
end)
|
|
:SetOnExit(function()
|
|
private.isClosed = false
|
|
private.RunUpdateCallbacks()
|
|
end)
|
|
:AddTransition("ST_WAITING_FOR_DATA")
|
|
:AddEventTransition("EV_TRADE_SKILL_SHOW", "ST_WAITING_FOR_DATA")
|
|
)
|
|
:AddState(FSM.NewState("ST_WAITING_FOR_DATA")
|
|
:AddTransition("ST_WAITING_FOR_READY")
|
|
:AddTransition("ST_CLOSED")
|
|
:AddEventTransition("EV_TRADE_SKILL_DATA_SOURCE_CHANGED", "ST_WAITING_FOR_READY")
|
|
:AddEventTransition("EV_TRADE_SKILL_CLOSE", "ST_CLOSED")
|
|
)
|
|
:AddState(FSM.NewState("ST_WAITING_FOR_READY")
|
|
:SetOnEnter(function()
|
|
Delay.AfterFrame("PROFESSION_STATE_TIME", WAIT_FRAME_DELAY, FrameDelayCallback, WAIT_FRAME_DELAY)
|
|
end)
|
|
:SetOnExit(function()
|
|
Delay.Cancel("PROFESSION_STATE_TIME")
|
|
end)
|
|
:AddTransition("ST_SHOWN")
|
|
:AddTransition("ST_DATA_CHANGING")
|
|
:AddTransition("ST_CLOSED")
|
|
:AddEvent("EV_FRAME_DELAY", function()
|
|
if TSM.Crafting.ProfessionUtil.IsDataStable() then
|
|
return "ST_SHOWN"
|
|
end
|
|
end)
|
|
:AddEventTransition("EV_TRADE_SKILL_DATA_SOURCE_CHANGING", "ST_DATA_CHANGING")
|
|
:AddEventTransition("EV_TRADE_SKILL_CLOSE", "ST_CLOSED")
|
|
)
|
|
:AddState(FSM.NewState("ST_SHOWN")
|
|
:SetOnEnter(function()
|
|
local name = TSM.Crafting.ProfessionUtil.GetCurrentProfessionName()
|
|
assert(name)
|
|
Log.Info("Showing profession: %s", name)
|
|
private.professionName = name
|
|
if TSM.IsWowClassic() then
|
|
ToggleDefaultCraftButton()
|
|
end
|
|
private.RunUpdateCallbacks()
|
|
end)
|
|
:SetOnExit(function()
|
|
private.professionName = nil
|
|
private.RunUpdateCallbacks()
|
|
end)
|
|
:AddTransition("ST_DATA_CHANGING")
|
|
:AddTransition("ST_CLOSED")
|
|
:AddEventTransition("EV_TRADE_SKILL_DATA_SOURCE_CHANGING", "ST_DATA_CHANGING")
|
|
:AddEventTransition("EV_TRADE_SKILL_CLOSE", "ST_CLOSED")
|
|
)
|
|
:AddState(FSM.NewState("ST_DATA_CHANGING")
|
|
:AddTransition("ST_WAITING_FOR_READY")
|
|
:AddTransition("ST_CLOSED")
|
|
:AddEventTransition("EV_TRADE_SKILL_DATA_SOURCE_CHANGED", "ST_WAITING_FOR_READY")
|
|
:AddEventTransition("EV_TRADE_SKILL_CLOSE", "ST_CLOSED")
|
|
)
|
|
:Init("ST_CLOSED")
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Private Helper Functions
|
|
-- ============================================================================
|
|
|
|
function private.RunUpdateCallbacks()
|
|
for _, callback in ipairs(private.updateCallbacks) do
|
|
callback(private.professionName)
|
|
end
|
|
end
|