Files
Endfield-Data/LuaScripts/UI/Panels/HudLayout/HudLayoutCtrl.lua
2026-01-31 21:42:01 +07:00

383 lines
12 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.HudLayout
HudLayoutCtrl = HL.Class('HudLayoutCtrl', uiCtrl.UICtrl)
local D_PAD_CONFIG = {
["btnUp"] = Vector2.up,
["btnDown"] = Vector2.down,
["btnLeft"] = Vector2.left,
["btnRight"] = Vector2.right,
}
local LayoutType = CS.Beyond.UI.UICustomLayoutElement.LayoutType
local COMBO_SKILL_LAYOUT_ELEMENT_KEY = "layout_battle_combo_skill"
local comboSkillLayoutConfig = {
{
getName = function()
return Language.ui_set_layout_combo_skill_right_to_left
end,
layoutType = LayoutType.None,
},
{
getName = function()
return Language.ui_set_layout_combo_skill_left_to_right
end,
layoutType = LayoutType.LeftToRight,
},
}
HudLayoutCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_HUD_LAYOUT_CHANGED] = "_OnHudLayoutChanged",
}
HudLayoutCtrl.m_layoutHandleList = HL.Field(HL.Userdata)
HudLayoutCtrl.m_selectedLayoutHandle = HL.Field(HL.Userdata)
HudLayoutCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_layoutHandleList = self.view.layout.layoutHandles
self.view.selectedNode.gameObject:SetActive(false)
self:_InitAction()
self:_RefreshOperationNode()
self.m_oriScreenRatioInt = DeviceInfo:GetCurRatioInt()
PhaseManager:ExitPhaseFastTo(PhaseId.Level)
end
HudLayoutCtrl._InitAction = HL.Method() << function(self)
self.view.operationNode.btnBack.onClick:AddListener(function()
if self.view.layout:IsDirty() then
Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_CHANGE_NOT_SAVED_CONFIRM,
onConfirm = function()
self:_CloseToMainHud()
end,
})
else
self:_CloseToMainHud()
end
end)
for i = 0, self.m_layoutHandleList.Count - 1 do
local handle = self.m_layoutHandleList[i]
if handle then
handle.onClick:AddListener(function()
self:_OnLayoutHandleClicked(handle)
end)
handle.onBeginDrag:AddListener(function()
self:_OnLayoutHandleClicked(handle)
end)
if handle.Element.elementKey == COMBO_SKILL_LAYOUT_ELEMENT_KEY then
handle.Element.onLayoutDataLoaded:AddListener(function()
self:_RefreshComboSkillLayoutType(handle.layoutType)
end)
end
end
end
self.view.operationNode.sliderAlpha.minValue = self.view.config.ALPHA_RANGE.x
self.view.operationNode.sliderAlpha.maxValue = self.view.config.ALPHA_RANGE.y
self.view.operationNode.sliderAlpha.onValueChanged:AddListener(function(value)
if self.m_selectedLayoutHandle then
self.m_selectedLayoutHandle.alpha = value
end
self.view.operationNode.txtAlphaNumber.text = string.format("%d%%", math.floor(value * 100))
end)
self.view.operationNode.sliderScale.minValue = self.view.config.SCALE_RANGE.x
self.view.operationNode.sliderScale.maxValue = self.view.config.SCALE_RANGE.y
self.view.operationNode.sliderScale.onValueChanged:AddListener(function(value)
if self.m_selectedLayoutHandle then
self.m_selectedLayoutHandle.scale = value
end
self.view.operationNode.txtScaleNumber.text = string.format("%d%%", math.floor(value * 100))
end)
for btnName, dir in pairs(D_PAD_CONFIG) do
self.view.operationNode[btnName].onClick:AddListener(function()
if self.m_selectedLayoutHandle then
local pos = self.m_selectedLayoutHandle.position
pos = pos + dir * self.view.config.MOVE_STEP
self.m_selectedLayoutHandle.position = pos
end
end)
self.view.operationNode[btnName].onLongPress:AddListener(function()
if self.m_selectedLayoutHandle then
self:_StartMoveTick(dir * self.view.config.MOVE_SPEED)
end
end)
self.view.operationNode[btnName].onPressEnd:AddListener(function()
self:_StopMoveTick()
end)
end
self.view.operationNode.btnRest.onClick:AddListener(function()
Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_HUD_LAYOUT_RESET_CONFIRM,
onConfirm = function()
self.view.layout:ResetToDefault(true)
self:_RefreshOperationNode()
self:_SetCanSave(false)
end,
})
end)
self.view.operationNode.btnSave.onClick:AddListener(function()
self.view.layout:Save()
Notify(MessageConst.SHOW_TOAST, Language.LUA_HUD_LAYOUT_SAVED)
self:_SetCanSave(false)
end)
self.view.operationNode.hideBtn.onClick:AddListener(function()
self.view.operationAnim:ClearTween()
self.view.operationAnim:PlayOutAnimation(function()
self.view.operationNode.gameObject:SetActive(false)
end)
self.view.expandBtn.transform.localPosition = self.view.operationNode.transform.localPosition
self.view.expandBtn.gameObject:SetActive(true)
end)
self.view.expandBtn.gameObject:SetActive(false)
self.view.expandBtn.onClick:AddListener(function()
self.view.expandBtn.gameObject:SetActive(false)
self.view.operationAnim:ClearTween()
self.view.operationNode.gameObject:SetActive(true)
self.view.operationAnim:PlayInAnimation()
self.view.operationNode.transform.localPosition = self.view.expandBtn.transform.localPosition
self.view.operationNode.drag:ApplyDragArea()
end)
self.view.expandBtn.gameObject:SetActive(false)
self.view.operationNode.gameObject:SetActive(true)
self:_SetCanSave(false)
local isFacMode = Utils.isInFactoryMode()
self.view.operationNode.commonToggle:InitCommonToggle(function(isOn)
self:_ActiveFacMode(not isOn)
end, not isFacMode, true)
self:_ActiveFacMode(isFacMode)
end
HudLayoutCtrl._CloseToMainHud = HL.Method() << function(self)
self.view.selectedNode.gameObject:SetActive(false)
self:PlayAnimationOutAndClose()
PhaseManager:ExitPhaseFastTo(PhaseId.Level)
Notify(MessageConst.TRY_SWITCH_FAC_MODE, self.view.switchModeNode.isOn)
end
HudLayoutCtrl._OnLayoutHandleClicked = HL.Method(HL.Userdata) << function(self, layoutHandle)
if self.m_selectedLayoutHandle == layoutHandle then
return
end
self.m_selectedLayoutHandle = layoutHandle
if self.m_selectedLayoutHandle then
self.view.selectedNode.gameObject:SetActive(true)
self.view.selectedNodeAnim:PlayInAnimation()
self.view.selectedNode:SetParent(self.m_selectedLayoutHandle.Element.highlightRect, false)
self.view.selectedNode.anchoredPosition = Vector2.zero
self.view.selectedNode.sizeDelta = Vector2.zero
else
self.view.selectedNode.gameObject:SetActive(false)
end
self:_RefreshOperationNode()
end
HudLayoutCtrl._RefreshOperationNode = HL.Method() << function(self)
local isSelected = self.m_selectedLayoutHandle ~= nil
local view = self.view.operationNode
view.controlNode.gameObject:SetActive(isSelected)
view.emptyNode.gameObject:SetActive(not isSelected)
if not isSelected then
return
end
local hintText = ''
if not string.isEmpty(self.m_selectedLayoutHandle.hintTextId) then
hintText = Language[self.m_selectedLayoutHandle.hintTextId]
end
view.currentSelectTxt.text = hintText
view.sliderAlpha:SetValueWithoutNotify(self.m_selectedLayoutHandle.alpha)
view.sliderScale:SetValueWithoutNotify(self.m_selectedLayoutHandle.scale)
view.txtAlphaNumber.text = string.format("%d%%", math.floor(self.m_selectedLayoutHandle.alpha * 100))
view.txtScaleNumber.text = string.format("%d%%", math.floor(self.m_selectedLayoutHandle.scale * 100))
if self.m_selectedLayoutHandle.Element.elementKey == COMBO_SKILL_LAYOUT_ELEMENT_KEY then
view.styleNode.gameObject:SetActive(true)
view.dropDown:ClearComponent()
view.dropDown:Init(
function(csIndex, option, _)
option:SetText(comboSkillLayoutConfig[LuaIndex(csIndex)].getName())
end,
function(csIndex)
local layoutType = comboSkillLayoutConfig[LuaIndex(csIndex)].layoutType
self:_RefreshComboSkillLayoutType(layoutType)
LayoutRebuilder.ForceRebuildLayoutImmediate(self.view.comboSkillStateController.transform)
self.m_selectedLayoutHandle.layoutType = layoutType
end
)
local selectedIndex = 1
for i, config in pairs(comboSkillLayoutConfig) do
if config.layoutType == self.m_selectedLayoutHandle.Element.layoutType then
selectedIndex = i
break
end
end
view.dropDown:Refresh(#comboSkillLayoutConfig, CSIndex(selectedIndex), false)
else
view.styleNode.gameObject:SetActive(false)
end
end
HudLayoutCtrl.m_moveTickKey = HL.Field(HL.Number) << -1
HudLayoutCtrl._StartMoveTick = HL.Method(Vector2) << function(self, velocity)
self:_StopMoveTick()
self.m_moveTickKey = LuaUpdate:Add("Tick", function(deltaTime)
if self.m_selectedLayoutHandle then
local pos = self.m_selectedLayoutHandle.position
pos = pos + velocity * deltaTime
self.m_selectedLayoutHandle.position = pos
end
end)
end
HudLayoutCtrl._StopMoveTick = HL.Method() << function(self)
LuaUpdate:Remove(self.m_moveTickKey)
end
HudLayoutCtrl._OnHudLayoutChanged = HL.Method() << function(self)
self:_SetCanSave(true)
end
HudLayoutCtrl._SetCanSave = HL.Method(HL.Boolean) << function(self, canSave)
self.view.operationNode.btnSave.gameObject:SetActive(canSave)
self.view.operationNode.btnSaveDisable.gameObject:SetActive(not canSave)
end
HudLayoutCtrl._ActiveFacMode = HL.Method(HL.Boolean) << function(self, isFactory)
self.view.factory.gameObject:SetActive(isFactory)
self.view.battle.gameObject:SetActive(not isFactory)
if self.m_selectedLayoutHandle and not self.m_selectedLayoutHandle.gameObject.activeInHierarchy then
self:_OnLayoutHandleClicked(nil)
end
self.view.switchModeNode.isOn = isFactory
end
HudLayoutCtrl._RefreshComboSkillLayoutType = HL.Method(HL.Userdata) << function(self, layoutType)
local stateName = "RightToLeft"
if layoutType == CS.Beyond.UI.UICustomLayoutElement.LayoutType.LeftToRight then
stateName = "LeftToRight"
end
self.view.comboSkillStateController:SetState(stateName)
end
HudLayoutCtrl.m_oriScreenRatioInt = HL.Field(HL.Number) << -1
HudLayoutCtrl.OnScreenSizeChanged = HL.StaticMethod() << function()
local isOpen, self = UIManager:IsOpen(PANEL_ID)
if isOpen then
self:_OnScreenSizeChanged()
else
CS.Beyond.UI.UICustomLayoutElement.RefreshAll()
end
end
HudLayoutCtrl._OnScreenSizeChanged = HL.Method() << function(self)
local curRatio = DeviceInfo:GetCurRatioInt()
if curRatio == self.m_oriScreenRatioInt or not self.view.operationNode.btnSave.gameObject.activeInHierarchy then
Notify(MessageConst.HIDE_POP_UP)
self.m_oriScreenRatioInt = DeviceInfo:GetCurRatioInt()
CS.Beyond.UI.UICustomLayoutElement.RefreshAll()
return
end
local refreshAct = function()
CS.Beyond.UI.UICustomLayoutElement.RefreshAll()
self:_RefreshOperationNode()
self:_SetCanSave(false)
self.m_oriScreenRatioInt = DeviceInfo:GetCurRatioInt()
end
Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_CUSTOM_HUD_LAYOUT_SCREEN_SIZE_CHANGE_HINT,
warningContent = Language.LUA_CUSTOM_HUD_LAYOUT_SCREEN_SIZE_CHANGE_WARNING_HINT,
confirmText = Language.LUA_CUSTOM_HUD_LAYOUT_SCREEN_SIZE_CHANGE_CONFIRM,
onConfirm = function()
self.view.layout:Save(self.m_oriScreenRatioInt)
Notify(MessageConst.SHOW_TOAST, Language.LUA_HUD_LAYOUT_SAVED)
refreshAct()
end,
onCancel = function()
refreshAct()
end,
})
end
HL.Commit(HudLayoutCtrl)