-- ========================================
-- 变强提升系统模块
-- 功能:管理游戏中的变强提升UI界面,包括按钮显示、列表刷新、位置调整等
-- ========================================

BeStrongUp = {}
-- 加载变强提升气泡配置文件
BeStrongUp.config = ssrRequireCsvCfg("cfg_TiShengQiPao")

-- ========================================
-- 主初始化函数
-- 功能:初始化变强提升UI界面,设置按钮事件和界面状态
-- ========================================
function BeStrongUp.main()
    -- 获取父容器
    local parent = GUI:Attach_Parent()
    -- 加载变强提升UI导出文件
    GUI:LoadExport(parent, "be_strong/be_strong_up") 
    
    -- 获取UI控件代理
    BeStrongUp._ui = GUI:ui_delegate(parent)

    -- 为提升按钮添加点击事件
    GUI:addOnClickEvent(BeStrongUp._ui["Button_up"], function ()
        -- 获取背景面板
        local panelBg = BeStrongUp._ui["Panel_bg"]
        -- 获取当前显示状态
        local isShow = GUI:getVisible(panelBg)
        -- 切换显示状态(显示/隐藏)
        GUI:setVisible(panelBg, not isShow)

        -- 刷新变强列表内容
        BeStrongUp.refreshBeStrongList()
    end)

    -- 初始状态隐藏背景面板
    GUI:setVisible(BeStrongUp._ui["Panel_bg"], false)

    -- 启动按钮动画效果
    BeStrongUp.showBtnAction()
    -- 刷新按钮位置
    BeStrongUp.refreshBtnPos()

    -- 注册相关事件监听
    BeStrongUp.RegisterEvent()
end

-- ========================================
-- 关闭函数
-- 功能:清理资源,移除事件监听
-- ========================================
function BeStrongUp.close()
    -- 移除事件监听
    BeStrongUp.RemoveEvent()
end

-- ========================================
-- 提升按钮动画效果
-- 功能:为提升按钮添加呼吸灯效果(透明度变化动画)
-- ========================================
function BeStrongUp.showBtnAction()
    -- 获取提升按钮控件
    local btn_up =  BeStrongUp._ui["Button_up"]
    -- 创建动画序列:淡出到125透明度(0.4秒) -> 淡入到255透明度(0.4秒) -> 延迟0.6秒 -> 无限循环
    local action = GUI:ActionRepeatForever(GUI:ActionSequence(GUI:ActionFadeTo(0.4, 125), GUI:ActionFadeTo(0.4, 255), GUI:DelayTime(0.6)))
    -- 执行动画
    GUI:runAction(btn_up, action)
end 

-- ========================================
-- 提升按钮位置刷新
-- 功能:根据宠物状态和窗口模式动态调整按钮和背景面板的位置
-- ========================================
function BeStrongUp.refreshBtnPos()
    local posBtn = nil  -- 按钮位置
    local posBg = nil   -- 背景面板位置
    -- 获取宠物存活状态
    local isAlived = SL:GetMetaValue("PET_ALIVE")
    -- 获取窗口模式状态
    local isWinMode = SL:GetMetaValue("WINPLAYMODE")

    -- 根据宠物状态和窗口模式设置不同的位置
    if isAlived then 
        -- 宠物存活时的位置(需要为宠物UI预留空间)
        posBtn = isWinMode and {x = -370, y = 400} or {x = -370, y = 300}
        posBg = isWinMode and {x = -370 - 65, y = 400 + 30} or {x = -370 - 65, y = 300 + 30}     
    else 
        -- 宠物不存活时的位置(可以更靠近中心)
        posBtn = isWinMode and {x = -300, y = 400} or {x = -300, y = 300}
        posBg = isWinMode and {x = -300 - 65, y = 400 + 30} or {x = -300 - 65, y = 300 + 30}
    end 

    -- 应用位置设置
    GUI:setPosition(BeStrongUp._ui["Button_up"], posBtn.x, posBtn.y)
    GUI:setPosition(BeStrongUp._ui["Panel_bg"], posBg.x, posBg.y)
end

-- ========================================
-- 创建列表项按钮
-- 参数:i - 索引,data - 数据对象
-- 返回:创建的按钮控件
-- 功能:为变强列表创建单个按钮项
-- ========================================
function BeStrongUp.createCellBtn(i, data)
    -- 创建临时容器控件
    local widget = GUI:Widget_Create(-1, "widget_" .. i, 0, 0, 0, 0)
    -- 加载按钮单元格UI模板
    GUI:LoadExport(widget, "be_strong/be_strong_up_cell")
    -- 获取按钮控件
    local btn = GUI:getChildByName(widget, "Button_cell")
    -- 设置按钮文本为数据名称
    GUI:Button_setTitleText(btn, data.name)

    -- 从临时容器中移除按钮(避免内存泄漏)
    GUI:removeFromParent(btn)
    return btn
end

-- ========================================
-- 删除重复项函数
-- 参数:table - 输入的数据表
-- 返回:去重后的数据表
-- 功能:根据name字段去除重复的条目
-- ========================================
function BeStrongUp.removeDuplicates(table)
    local seen = {}     -- 记录已见过的name
    local result = {}   -- 结果表

    -- 遍历输入表
    for key, entry in pairs(table) do
        -- 如果该name未出现过
        if not seen[entry.name] then
            -- 添加到结果表
            result[key] = entry
            -- 标记为已见过
            seen[entry.name] = true
        end
    end

    return result
end

-- ========================================
-- 显示变强列表
-- 功能:刷新变强提升列表的显示内容,包括按钮创建、事件绑定、尺寸调整
-- ========================================
function BeStrongUp.refreshBeStrongList()
    -- 获取变强数据
    local getData = SL:GetMetaValue("BESTRONG_DATA")
    -- 去除重复项
    local data = BeStrongUp.removeDuplicates(getData)
    -- 计算数据条目数量
    local nums = table.nums(data)
    -- 如果没有数据则直接返回
    if nums == 0 then 
        return
    end 

    -- 获取UI控件
    local panel = BeStrongUp._ui["Panel_bg"]      -- 背景面板
    local listview = BeStrongUp._ui["ListView"]   -- 列表视图

    -- 清空现有列表项
    GUI:ListView_removeAllItems(listview)

    local btnSize = nil  -- 按钮尺寸(用于后续计算)
    -- 遍历数据创建按钮
    for i, v in pairs(data) do
        -- 创建按钮
        local btn = BeStrongUp.createCellBtn(i, v)
        -- 添加到列表视图
        GUI:ListView_pushBackCustomItem(listview, btn)
        -- 为按钮添加点击事件
        GUI:addOnClickEvent(btn, function()
            -- 点击后隐藏面板
            GUI:setVisible(panel, false)
            -- 如果有链接配置
            if v.link then
                -- 分割链接字符串
                local linkSplit = string.split(v.link,",")
                -- 获取对应配置
                local cfg = BeStrongUp.config[v.link]
                if cfg then
                    -- 打开对应UI界面
                    -- SL:dump(ssrObjCfg[cfg.uiLink], "ssrObjCfg[cfg.uiLink]", 3)
                    ssrUIManager:OPEN(ssrObjCfg[cfg.uiLink], linkSplit[2])
                end
                -- 提交行为统计
                SL:SubmitAct({Act = v.link, subid = v.id})
            -- 如果有函数配置
            elseif v.func then
                -- 执行对应函数
                v.func()
            end
        end)

        -- 记录第一个按钮的尺寸用于计算
        if not btnSize then
            btnSize = GUI:getContentSize(btn)
        end
    end

    -- 获取列表项数量
    local count = GUI:ListView_getItemCount(listview)
    -- 设置默认按钮尺寸(如果获取失败)
    local btnSize = btnSize or {width = 120, height = 40}
    -- 获取当前面板和列表尺寸
    local bgSize = GUI:getContentSize(panel)
    local listSize = GUI:getContentSize(listview)
    -- 获取列表项间距
    local margin = GUI:ListView_getItemsMargin(listview)
    
    -- 计算列表高度:最多显示4.5条,超过的可以滑动显示
    local height = (btnSize.height + margin) * math.min(count, 4.5) - margin
    -- 设置列表视图尺寸
    GUI:setContentSize(listview, listSize.width, height)
    -- 设置背景面板尺寸(高度+10像素边距)
    GUI:setContentSize(panel, bgSize.width, height + 10)
end

-- ========================================
-- 事件注册管理
-- ========================================

-- 注册事件监听
function BeStrongUp.RegisterEvent()
    -- 注册变强位置刷新事件,当需要刷新按钮位置时会触发
    SL:RegisterLUAEvent(LUA_EVENT_BESTRONG_POS_REFRESH, "BeStrongUp", BeStrongUp.refreshBtnPos)
end

-- 移除事件监听
function BeStrongUp.RemoveEvent()
    -- 取消注册变强位置刷新事件
    SL:UnRegisterLUAEvent(LUA_EVENT_BESTRONG_POS_REFRESH, "BeStrongUp")
end

    配置文件

    local config = {
    	["@qipao_teshuhecheng,1"] = {
    		uiLink = "TeShuHeCheng",
    	},
    	["@qipao_teshuhecheng,2"] = {
    		uiLink = "TeShuHeCheng",
    	},
    	["@qipao_teshuhecheng,3"] = {
    		uiLink = "TeShuHeCheng",
    	},
    	["@qipao_teshuhecheng,4"] = {
    		uiLink = "TeShuHeCheng",
    	},
    	["@qipao_teshuhecheng,5"] = {
    		uiLink = "TeShuHeCheng",
    	},
    	["@qipao_tizhixiulian"] = {
    		uiLink = "TiZhiXiuLian",
    	},
    	["@qipao_shizhuanghecheng"] = {
    		uiLink = "ShiZhuangHeCheng",
    	},
    	["@qipao_jifengkeyin"] = {
    		uiLink = "BaoFengZhiLi",
    	},
    	["@qipao_shalukeyin"] = {
    		uiLink = "ShaLuYinJi",
    	},
    	["@qipao_xiaojiuguan"] = {
    		uiLink = "JiuXianLiBai",
    	},
    	["@qipao_jianjiacuilian"] = {
    		uiLink = "ZhuangBeiDuanZao",
    	},
    	["@qipao_jinengqianghua"] = {
    		uiLink = "JiNengQiangHua",
    	},
    	["@qipao_kongjianfashi"] = {
    		uiLink = "KongJianFaShi",
    	},
    	["@qipao_jianghuchenghao"] = {
    		uiLink = "JiangHuChengHao",
    	},
    	["@qipao_xiuxian"] = {
    		uiLink = "XiuXian",
    	},
    	["@qipao_bianguanchenghao"] = {
    		uiLink = "BianGuanTitle",
    	},
    	["@qipao_zhuangbeiqianghua"] = {
    		uiLink = "ZhuangBeiQiangHua",
    	},
    	["@qipao_hunyuangongfa"] = {
    		uiLink = "HunYuanGongFa",
    	},
    	["@qipao_shenmozhiti"] = {
    		uiLink = "ShenMoZhiTi",
    	},
    }
    return config
      local ssrUIManager = {}
      
      local _layers
      
      local function _get_objcfg_by_id(objid)
          for _, objcfg in pairs(ssrObjCfg) do
              if objcfg.ID == objid then
                  return objcfg
              end
          end
      end
      
      function ssrUIManager:INIT()
          _layers = {}
          for objname, objcfg in pairs(ssrObjCfg) do
              if objcfg.OBJ_PATH and objcfg.ID then
                  local obj
                  --加载模块错误处理,防止模块内出错,影响其他模块执行!!!
                  local status, result = pcall(function()
                      obj = SL:Require(objcfg.OBJ_PATH,true)
                  end)
                  if not status then
                      SL:release_print("----加载模块发生错误----")
                      SL:release_print(result)
                      SL:release_print("----加载模块发生错误----")
                  end
                  _layers[objcfg.ID] = obj
                  --网络消息
                  if objcfg.NET_MESSAGE then
                      ssrMessage:RegisterNetMsg(objcfg.NET_MESSAGE, obj)
                  end
              end
      
              if objcfg.OBJ_ORDER then
                  for _,page_objcfg in ipairs(objcfg.OBJ_ORDER) do
                      page_objcfg.PAGING_OBJ = objcfg
                  end
              end
          end
      
          return self
      end
      
      
      
      -- "ssrObjCfg[cfg.uiLink]" = {
      --     "ID"          = 65100
      --     "NET_MESSAGE" = "TeShuHeCheng"
      --     "OBJ_PATH"    = "GUILayout/A/TeShuHeChengOBJ"
      --     "UI_PATH"     = "A/TeShuHeChengUI"
      -- }
      function ssrUIManager:OPEN(objcfg, data, onClose)
          if type(objcfg) == "table" and _layers[objcfg.ID] then
              if onClose == true then
                  if GUI:GetWindow(nil,_layers[objcfg.ID].__cname) then
                      GUI:Win_CloseByID(_layers[objcfg.ID].__cname)
                      return
                  end
              end
              --有分页的情况
              local pageobj = objcfg.PAGING_OBJ
              if pageobj then
                  --判断父窗口是否打开
                  local pageui = GUI:GetWindow(nil,_layers[pageobj.ID].__cname)
                  if pageui then
                      --父窗口快速化
                      local parent_ui = GUI:ui_delegate(pageui)
                      --创建子页签
                      _layers[objcfg.ID]:main(objcfg,data,parent_ui)
                  else
                      --未打开则去创建
                      _layers[pageobj.ID]:main(pageobj,data,_layers[objcfg.ID],objcfg)
                      return
                  end
              else
                  --没有分页的情况
                 _layers[objcfg.ID]:main(objcfg,data)
              end
          else
              --未在OBJCfg中注册,尝试作为系统窗口打开
              SL:JumpTo(objcfg)
          end
      end
      
      function ssrUIManager:CLOSE(objcfg, data)
          if _layers[objcfg.ID] then
              if GUI:GetWindow(nil,_layers[objcfg.ID].__cname) then
                  GUI:Win_CloseByID(_layers[objcfg.ID].__cname)
              end
          end
          return _layers[objcfg.ID]
      end
      
      
      function ssrUIManager:GET(objcfg)
          return _layers[objcfg.ID]
      end
      
      function ssrUIManager:GETBYID(objid)
          local objcfg = _get_objcfg_by_id(objid)
          return _layers[objid],objcfg
      end
      
      function ssrUIManager:OPENBYID(objid)
          local obj, objcfg = ssrUIManager:GETBYID(objid)
          ssrUIManager:OPEN(objcfg)
      end
      
      return ssrUIManager
        撰写回复...