|
|
- -- <*
- -- @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
|