Files
Endfield-Data/LuaScripts/UI/Panels/Base/AutoCalcOrderUICtrl.lua
2025-12-02 20:37:18 +07:00

139 lines
2.8 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
AutoCalcOrderUICtrl = HL.Class('AutoCalcOrderUICtrl', uiCtrl.UICtrl)
AutoCalcOrderUICtrl.m_curArgs = HL.Field(HL.Table)
AutoCalcOrderUICtrl.m_attachedPanels = HL.Field(HL.Table)
AutoCalcOrderUICtrl.m_tailUpdateTickKey = HL.Field(HL.Number) << -1
AutoCalcOrderUICtrl.m_calcOrderDirty = HL.Field(HL.Boolean) << false
AutoCalcOrderUICtrl.CheckCalcOrderDirty = HL.Method() << function(self)
if self.m_calcOrderDirty and not self:IsPlayingAnimationOut() then
self:CalcPanelOrder()
end
end
AutoCalcOrderUICtrl.OnShow = HL.Override() << function(self)
self.m_tailUpdateTickKey = LuaUpdate:Add("TailTick", function()
self:CheckCalcOrderDirty()
end)
end
AutoCalcOrderUICtrl.OnClose = HL.Override() << function(self)
self.m_tailUpdateTickKey = LuaUpdate:Remove(self.m_tailUpdateTickKey)
end
AutoCalcOrderUICtrl.OnHide = HL.Override() << function(self)
self.m_tailUpdateTickKey = LuaUpdate:Remove(self.m_tailUpdateTickKey)
end
AutoCalcOrderUICtrl._CustomHide = HL.Virtual(HL.Number) << function(self, panelId)
if not self.m_attachedPanels[panelId] then
return
end
self.m_attachedPanels[panelId] = nil
self:CalcPanelOrder()
end
AutoCalcOrderUICtrl._AttachToPanel = HL.Virtual(HL.Table) << function(self, args)
self.m_attachedPanels[args.panelId] = args
self:CalcPanelOrder()
end
AutoCalcOrderUICtrl.PanelOrderChanged = HL.Method(HL.Opt(HL.Any)) << function(self)
self.m_calcOrderDirty = true
end
AutoCalcOrderUICtrl.CalcPanelOrder = HL.Virtual(HL.Opt(HL.Boolean)) << function(self, fromOutAni)
self.m_calcOrderDirty = false
local maxOrder, curArgs
for panelId, args in pairs(self.m_attachedPanels) do
local isOpen, panel = UIManager:IsOpen(panelId)
if isOpen and panel:IsShow() and not panel:IsPlayingAnimationOut() then
local order = panel:GetSortingOrder() + args.offset
if not maxOrder or order > maxOrder then
maxOrder = order
curArgs = args
end
end
end
if maxOrder then
self:CustomSetPanelOrder(maxOrder, curArgs)
if fromOutAni then
self:PlayAnimationIn()
end
else
self.m_curArgs = nil
self:Hide()
end
end
AutoCalcOrderUICtrl.CustomSetPanelOrder = HL.Virtual(HL.Opt(HL.Number, HL.Table)) << function(self, maxOrder, args)
end
AutoCalcOrderUICtrl.PlayOutAnim = HL.Method(HL.Number) << function(self, panelId)
if self:IsHide() then
return
end
if not self.m_curArgs or self.m_curArgs.panelId ~= panelId then
return
end
self:PlayAnimationOutWithCallback(function()
self:CalcPanelOrder(true)
end)
end
HL.Commit(AutoCalcOrderUICtrl)