Files
Endfield-Data/LuaScripts/UI/Widgets/SortNode.lua
2025-12-02 20:37:18 +07:00

261 lines
6.1 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
SortNode = HL.Class('SortNode', UIWidgetBase)
SortNode.isIncremental = HL.Field(HL.Boolean) << false
SortNode.m_tmpNoCallback = HL.Field(HL.Boolean) << false
SortNode.m_sortOptions = HL.Field(HL.Table)
SortNode.m_onSortChanged = HL.Field(HL.Function)
SortNode.m_curCSOptionIndex = HL.Field(HL.Number) << -1
SortNode.m_filterBtn = HL.Field(HL.Userdata)
SortNode.m_onToggleOptList = HL.Field(HL.Function)
SortNode.m_changeIncrementalBindingId = HL.Field(HL.Number) << -1
SortNode._OnFirstTimeInit = HL.Override() << function(self)
self.view.mobilePCNode.isIncrementalButton.onClick:AddListener(function()
self:_ToggleIncremental()
end)
self.view.mobilePCNode.dropDown:Init(function(index, option, isSelected)
local sortOption = self.m_sortOptions[LuaIndex(index)]
if sortOption then
option:SetText(self.m_sortOptions[LuaIndex(index)].name)
end
end, function(index)
if not self.m_tmpNoCallback then
self:OnSortChanged()
end
end)
self.view.mobilePCNode.dropDown.onToggleOptList:AddListener(function(active)
self:_OnToggleOptList(active)
end)
end
SortNode._ToggleIncremental = HL.Method() << function(self)
self.isIncremental = not self.isIncremental
self:RefreshIncremental()
self:OnSortChanged()
end
SortNode._OnToggleOptList = HL.Method(HL.Boolean) << function(self, active)
if not DeviceInfo.usingController then
return
end
end
SortNode.InitSortNode = HL.Method(HL.Table, HL.Function, HL.Opt(HL.Number, HL.Boolean, HL.Boolean, HL.Userdata)) <<
function(self, sortOptions, onSortChanged, curCSOptionIndex, curIsIncremental, noCallback, filterBtn)
self:_FirstTimeInit()
if curIsIncremental == nil then
self.isIncremental = self.config.DEFAULT_IS_INCREMENTAL
else
self.isIncremental = curIsIncremental
end
self.m_onSortChanged = onSortChanged
self.m_sortOptions = sortOptions
self.m_onToggleOptList = nil
self.m_curCSOptionIndex = curCSOptionIndex or 0
self:RefreshIncremental()
self.m_tmpNoCallback = noCallback == true
self.m_filterBtn = filterBtn
if sortOptions ~= nil and next(sortOptions) ~= nil then
if curCSOptionIndex then
self.view.mobilePCNode.dropDown:Refresh(#self.m_sortOptions, curCSOptionIndex)
else
self.view.mobilePCNode.dropDown:Refresh(#self.m_sortOptions)
end
end
self.m_tmpNoCallback = false
self.view.mobilePCNode.dropDown:SetSelected(curCSOptionIndex, true, false)
self.view.controllerNode.filterBtn.onClick:AddListener(function()
if self.m_filterBtn and not self.m_filterBtn.m_args then
logger.error("SortNode的初始化需要在FilterBtn之后否则会导致CommonFilterPanel表现不正确")
end
if self.m_filterBtn and self.m_filterBtn.m_args then
self.m_filterBtn:_OpenFilterPanel()
else
local args = {}
args.sortNodeWidget = self
Notify(MessageConst.SHOW_COMMON_FILTER, args)
end
end)
self:UpdateDeviceState()
end
SortNode.SetOnToggleOptListCallback = HL.Method(HL.Function) << function(self, callback)
self.m_onToggleOptList = callback
end
SortNode.OnSortChanged = HL.Method() << function(self)
local sortOptData = self:GetCurSortData()
self.m_onSortChanged(sortOptData, self.isIncremental)
end
SortNode.GetCurSortData = HL.Method().Return(HL.Table) << function(self)
local data = self.m_sortOptions[LuaIndex(self.view.mobilePCNode.dropDown.selectedIndex)]
return data
end
SortNode.GetCurSelectedIndex = HL.Method().Return(HL.Number) << function(self)
return LuaIndex(self.view.mobilePCNode.dropDown.selectedIndex)
end
SortNode.GetCurSortKeys = HL.Method().Return(HL.Opt(HL.Table)) << function(self)
local sortOptData = self:GetCurSortData()
if self.isIncremental or not sortOptData.reverseKeys then
return sortOptData.keys
else
return sortOptData.reverseKeys
end
end
SortNode.SortCurData = HL.Method() << function(self)
if self.m_sortOptions then
self:OnSortChanged()
end
end
SortNode.RefreshIncremental = HL.Method() << function(self)
self.view.mobilePCNode.isIncrementalButton.text = self.isIncremental and Language.LUA_SORT_NODE_UP or Language.LUA_SORT_NODE_DOWN
self.view.mobilePCNode.orderImage.transform.localScale = Vector3(1, self.isIncremental and -1 or 1, 1)
end
SortNode.UpdateDeviceState = HL.Method() << function(self)
if DeviceInfo.usingController then
if self.m_filterBtn then
self.m_filterBtn.transform.localScale = Vector3(0,0,0)
end
local ascendingText = self:GetCurSortData().ascendingSortTitle or Language[self.config.SORT_ASCENDING_TEXT] or Language.LUA_COMMON_SORT_ASCENDING
local descendingText = self:GetCurSortData().descendingSortTitle or Language[self.config.SORT_DESCENDING_TEXT] or Language.LUA_COMMON_SORT_DESCENDING
local subText = self.isIncremental and ascendingText or descendingText
self.view.controllerNode.text.text = string.format(subText, self:GetCurSortData().name)
if not self.m_filterBtn or not self.m_filterBtn.m_args or not self.m_filterBtn.m_args.tagGroups then
self.view.controllerNode.normalState.gameObject:SetActive(false)
self.view.controllerNode.selectedState.gameObject:SetActive(false)
else
local selectedTags = self.m_filterBtn.m_args.selectedTags
local isSelected = (selectedTags and next(selectedTags)) ~= nil
self.view.controllerNode.normalState.gameObject:SetActive(not isSelected)
self.view.controllerNode.selectedState.gameObject:SetActive(isSelected)
end
else
if self.m_filterBtn then
self.m_filterBtn.transform.localScale = Vector3(1,1,1)
end
end
end
HL.Commit(SortNode)
return SortNode