-- <*
|
|
-- @Author: Saber
|
|
-- @Description: 成就子类界面
|
|
-- *>
|
|
AchieveVarietyView = AchieveVarietyView or BaseClass(BaseItem)
|
|
local AchieveVarietyView = AchieveVarietyView
|
|
|
|
function AchieveVarietyView:__init(parent_wnd,prefab_asset,layer_name)
|
|
self.base_file = "achievement"
|
|
self.layout_file = "AchieveVarietyView"
|
|
self.parent_wnd = parent_wnd
|
|
self.layer_name = layer_name
|
|
self.type_id = 1 -- 当前查看的章节数
|
|
self.can_receive_reward = false -- 是否可领取章节奖励
|
|
self.model = AchieveModel:getInstance()
|
|
self.item_list = {}
|
|
self.item_index_cache = {} -- 记录当前每个成就对应的位置索引
|
|
self:Load()
|
|
end
|
|
|
|
function AchieveVarietyView:Load_callback()
|
|
local nodes = {
|
|
"total_con/progress_fill:img", "total_con/progress:tmp", -- 章节总览进度
|
|
"total_con/variety_name:tmp", "total_con/variety_guide:tmp", -- 章节信息
|
|
"total_con/receive_btn:obj:imgex", "total_con/receive_btn/receive_flag:tmp", -- 章节奖励领取按钮
|
|
"total_con/category_sp:raw", -- 章节立绘
|
|
-- 奖励称号图
|
|
"total_con/designation_con/designation_image:obj:img",
|
|
"total_con/designation_con/designation_name:tmp",
|
|
"total_con/designation_con/designation_effect",
|
|
"item_scroll:scroll", "item_scroll/Viewport/item_con", -- 成就节点容器
|
|
"total_con:raw",
|
|
}
|
|
self:GetChildren(nodes)
|
|
|
|
lua_resM:setOutsideRawImage(self, self.total_con_raw, GameResPath.GetAchieveBigPic("achieve_category_bg"), true)
|
|
self:AddEvents()
|
|
if self.need_refreshData then
|
|
self:UpdateView()
|
|
end
|
|
end
|
|
|
|
function AchieveVarietyView:AddEvents( )
|
|
--[[ local function click_event(target)
|
|
if target == self.receive_btn_obj then -- 领取成就章节奖励
|
|
if self.can_receive_reward then
|
|
self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40901, self.type_id)
|
|
end
|
|
end
|
|
end
|
|
AddClickEvent(self.receive_btn_obj, click_event)--]]
|
|
|
|
local function update_achieve_data(main_type, need_anim)
|
|
if main_type == self.type_id then
|
|
self.update_need_anim = need_anim
|
|
self:UpdateView()
|
|
end
|
|
end
|
|
self:BindEvent(self.model, AchieveModel.UPDATE_ACHIEVE_DATA, update_achieve_data)
|
|
|
|
-- local function update_main_type_progress()
|
|
-- self:UpdateCategoryTotalData()
|
|
-- end
|
|
-- self:BindEvent(self.model, AchieveModel.UPDATE_MAINTYPE_PROGRESS, update_main_type_progress)
|
|
-- self:BindEvent(self.model, AchieveModel.RECEIVE_CHAPTER_REWARD_SUCCEED, update_main_type_progress)
|
|
end
|
|
|
|
function AchieveVarietyView:UpdateView(need_top )
|
|
-- self:UpdateCategoryBasicData()
|
|
-- self:UpdateCategoryTotalData()
|
|
self:UpdateAchieveItem(need_top)
|
|
end
|
|
|
|
-- 更新章节成就节点
|
|
function AchieveVarietyView:UpdateAchieveItem( need_top )
|
|
local achi_list = self.model:GetAchieveDataByMainType(self.type_id)
|
|
|
|
self.achi_item_creator = self.achi_item_creator or self:AddUIComponent(UI.ItemListCreator)
|
|
|
|
-- print('=========Msh:AchieveVarietyView.lua[80] data', data)
|
|
-- 停止一下动画
|
|
self.model:SetAchieveItemAnimState(false) -- 默认设置没有动画
|
|
self.model:SetSCMDWaitFlag(false) -- 初始化协议等待标志
|
|
self.item_scroll_scroll.vertical = true
|
|
self.achi_item_creator:IterateItems(function ( item, i )
|
|
item:StopAnim(i)
|
|
end)
|
|
if need_top then -- 置顶
|
|
self.achi_item_creator:Reset()
|
|
end
|
|
-- print('Msh:AchieveVarietyView.lua[83] 旧', data)
|
|
-- PrintTable(self.item_index_cache)
|
|
-- 更新完全部item后回调(动画可能还在播)
|
|
local update_cache_func = function ( )
|
|
self.update_need_anim = false
|
|
-- print('Msh:AchieveVarietyView.lua[113] 新', data)
|
|
-- PrintTable(self.item_index_cache)
|
|
end
|
|
|
|
-- 使用的item数目
|
|
local ITEM_NUM = 8
|
|
|
|
-- 播完动画的回调
|
|
self.animing_item_count = ITEM_NUM
|
|
local anim_call_back = function ()
|
|
self.animing_item_count = self.animing_item_count - 1
|
|
if self.animing_item_count <= 0 then
|
|
self.model:SetAchieveItemAnimState(false) -- 动画完毕
|
|
self.item_scroll_scroll.vertical = true
|
|
self.model:Fire(AchieveModel.UPDATE_BASE_VIEW) -- 检查是否需要跳转
|
|
end
|
|
end
|
|
|
|
-- 找出一次性位移 很多索引 的数据
|
|
local down_item_new_index = false
|
|
local down_item_data = false
|
|
if self.update_need_anim then
|
|
self.model:SetAchieveItemAnimState(true) -- 动画中
|
|
self.item_scroll_scroll.vertical = false
|
|
for new_index, v in ipairs(achi_list) do
|
|
local key = v.type * 10000 + v.sub_type
|
|
local old_index = self.item_index_cache[key]
|
|
if old_index and new_index - old_index >= ITEM_NUM then
|
|
down_item_data = v
|
|
down_item_new_index = new_index
|
|
end
|
|
end
|
|
end
|
|
local info = {
|
|
data_list = achi_list,
|
|
item_con = self.item_con,
|
|
scroll_view = self.item_scroll,
|
|
item_class = AchieveItem,
|
|
item_height = AchieveItem.HEIGHT,
|
|
start_y = AchieveItem.START_Y,
|
|
space_y = AchieveItem.SPACE_Y,
|
|
create_frequency = 0.01,
|
|
alignment = UnityEngine.TextAnchor.UpperLeft,
|
|
reuse_item_num = ITEM_NUM,
|
|
add_height = 0,
|
|
on_update_item = function(item, i, v)
|
|
if i == ITEM_NUM and down_item_data and self.update_need_anim then -- 拿一下这个平时看不到的item用一用
|
|
local key = down_item_data.type * 10000 + down_item_data.sub_type
|
|
local old_index = self.item_index_cache[key]
|
|
local new_index = down_item_new_index
|
|
-- print('Msh:AchieveVarietyView.lua[101] =======下降很多=============data', old_index, new_index)
|
|
-- 这个item是借用的 得还回去 所以单独给他刷一刷新
|
|
local anim_call_back_update = function ( )
|
|
self.achi_item_creator:IterateItems(function ( item_temp, ii, vv )
|
|
if item_temp == item then
|
|
-- print('Msh:AchieveVarietyView.lua[143] 刷新了借用的ITEM')
|
|
-- PrintTable(vv)
|
|
item:SetData(vv, ii)
|
|
item:SetIndexPos(ii)
|
|
end
|
|
end)
|
|
anim_call_back()
|
|
end
|
|
item:MoveNewIndexPosAnimAndUpdate(old_index, new_index, down_item_data, anim_call_back_update)
|
|
self.item_index_cache[key] = new_index
|
|
down_item_data = nil
|
|
else
|
|
local key = v.type * 10000 + v.sub_type
|
|
local need_anim = self.update_need_anim and self.item_index_cache[key]
|
|
local old_index = need_anim and self.item_index_cache[key] or i
|
|
local new_index = i
|
|
-- print('Msh:AchieveVarietyView.lua[136] data', old_index, new_index)
|
|
if need_anim then
|
|
item:MoveNewIndexPosAnimAndUpdate(old_index, new_index, v, anim_call_back)
|
|
else
|
|
if self.update_need_anim then
|
|
anim_call_back() -- 这个item不走动画 直接回调
|
|
end
|
|
item:SetData(v, new_index)
|
|
end
|
|
self.item_index_cache[key] = new_index
|
|
end
|
|
end,
|
|
final_callback = update_cache_func,
|
|
}
|
|
self.achi_item_creator:UpdateItems(info)
|
|
end
|
|
|
|
|
|
-- 更新章节成就节点
|
|
--[[function AchieveVarietyView:UpdateAchieveItemNew( need_top )
|
|
local achi_list = self.model:GetAchieveDataByMainType(self.type_id)
|
|
|
|
local ITEM_HEIGHT = AchieveItem.HEIGHT
|
|
local START_Y = AchieveItem.START_Y
|
|
self:HideAllItems( )
|
|
-- local new_index_cache = {}
|
|
self.animing_item_count = #achi_list
|
|
local anim_call_back = function ()
|
|
self.animing_item_count = self.animing_item_count - 1
|
|
if self.animing_item_count <= 0 then
|
|
--logWarn('=======Msh:AchieveVarietyView.lua[206]=======')
|
|
self.model:Fire(AchieveModel.UPDATE_BASE_VIEW)
|
|
end
|
|
end
|
|
for i, v in ipairs(achi_list) do
|
|
local delay_create = function()
|
|
local key = v.type * 10000 + v.sub_type
|
|
local need_anim = self.update_need_anim and self.item_index_cache[key]
|
|
local old_index = need_anim and self.item_index_cache[key] or i
|
|
local new_index = i
|
|
local item = self.item_list[old_index]
|
|
if not item then
|
|
item = AchieveItem.New(self.item_con)
|
|
self.item_list[old_index] = item
|
|
end
|
|
item:SetVisible(true)
|
|
if need_anim then
|
|
item:MoveNewIndexPosAnimAndUpdate(new_index, v, anim_call_back)
|
|
else
|
|
item:SetData(v, old_index)
|
|
item:SetPosition( 0, START_Y - (old_index-1) * ITEM_HEIGHT)
|
|
end
|
|
self.item_index_cache[key] = new_index
|
|
end
|
|
if self.update_need_anim then -- 有动画显示需求就不延迟了
|
|
delay_create()
|
|
else
|
|
setTimeout(delay_create, 0)
|
|
end
|
|
end
|
|
-- logWarn('=======Msh:AchieveVarietyView.lua[220]=======')
|
|
-- PrintTable(self.item_index_cache)
|
|
SetSizeDeltaY(self.item_con, ITEM_HEIGHT * #achi_list - START_Y)
|
|
if need_top then -- 置顶
|
|
SetLocalPositionY(self.item_con, 0)
|
|
end
|
|
self.update_need_anim = false
|
|
self:UpdateItemListKey( )
|
|
end--]]
|
|
|
|
-- 更新Item_list的索引(保持与item数据的index一致)
|
|
function AchieveVarietyView:UpdateItemListKey( )
|
|
local new_list = {}
|
|
for k,v in pairs(self.item_list) do
|
|
if v.index and k ~= v.index then
|
|
new_list[v.index] = v
|
|
self.item_list[k] = nil
|
|
end
|
|
end
|
|
-- 这部分应该是还没被使用的 也插进新表
|
|
for k, v in pairs(self.item_list) do
|
|
new_list[k] = v
|
|
end
|
|
self.item_list = new_list
|
|
end
|
|
|
|
-- 隐藏所有节点
|
|
function AchieveVarietyView:HideAllItems( )
|
|
for k,v in pairs(self.item_list) do
|
|
v:SetVisible(false)
|
|
v:StopAnim()
|
|
end
|
|
end
|
|
|
|
-- 置顶
|
|
function AchieveVarietyView:SetMainType( type_id , need_top )
|
|
self.type_id = type_id
|
|
self.item_index_cache = {} -- 切页签重置索引缓存
|
|
if self.is_loaded then
|
|
self.need_refreshData = false
|
|
self:UpdateView(need_top)
|
|
else
|
|
self.need_refreshData = true
|
|
end
|
|
end
|
|
|
|
function AchieveVarietyView:__delete( )
|
|
for k,v in pairs(self.item_list) do
|
|
v:DeleteMe()
|
|
end
|
|
self.item_list = nil
|
|
|
|
self.model:SetAchieveItemAnimState(false)
|
|
end
|