源战役客户端
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 

155 行
4.8 KiB

UI = UI or {}
--UI组件的基类
UI.UIComponent = UI.UIComponent or {}
function UI.UIComponent:Init( view_owner )
--调用界面类的UIPartical:AddUIComponent会触发,view_owner就是界面类指针
self.view_owner = view_owner
end
function UI.UIComponent:OnLoad( )
--界面加载成功后触发,先于BaseView和BaseItem的load_callback
end
function UI.UIComponent:OnDestroy( )
--界面销毁后触发,后于BaseView的destroy_callback和BaseItem的__delete
end
--倒计时组件,内置管理定时器,界面销毁时会自动移除,请放心使用,注意参数的单位都是秒
UI.Countdown = UI.Countdown or BaseClass(UI.UIComponent)
--传入结束时间end_time,截至该时间前每秒都会触发传入的step_call_back回调,其回调函数的参数为剩余时间
function UI.Countdown:CountdownByEndTime( end_time, step_call_back, duration )
if not end_time or not step_call_back then
print('Cat:UIComponents.lua[UI.Countdown:CountdownByEndTime] failed! some arge nil:', tostring(end_time), tostring(step_call_back))
return
end
self.end_time = end_time
self.step_call_back = step_call_back
local function step_countdown( )
local curTime = TimeUtil:getServerTimeMs()
local left_time = self.end_time - curTime/1000
self.step_call_back(left_time)
if left_time <= 0 then
self:OnDestroy()
else
self.is_counting = true
end
end
if not self.step_countdown_id then
self.step_countdown_id = GlobalTimerQuest:AddPeriodQuest(step_countdown, duration and duration or 1, -1)
end
step_countdown()
end
function UI.Countdown:CountdownByLeftTime( left_time, step_call_back, duration )
local curTime = TimeUtil:getServerTimeMs()
self:CountdownByEndTime(curTime/1000+left_time, step_call_back, duration)
end
function UI.Countdown:DelayCallByLeftTime( left_time, step_call_back, duration )
self:CountdownByLeftTime(left_time, function(_left_time)
if _left_time<=0 and step_call_back then
step_call_back()
end
end, duration)
end
function UI.Countdown:IsCounting( )
return self.is_counting
end
function UI.Countdown:Stop( )
self:OnDestroy()
end
function UI.Countdown:OnDestroy( )
if self.step_countdown_id then
GlobalTimerQuest:CancelQuest(self.step_countdown_id)
self.step_countdown_id = nil
end
self.is_counting = false
end
--防止某函数在短时间内频繁调用
UI.PreventFastCall = UI.PreventFastCall or BaseClass(UI.UIComponent)
function UI.PreventFastCall:OnLoad( )
self.last_handle_scroll_time = 0
self.prevent_time = 0.5
end
function UI.PreventFastCall:SetPreventTime( prevent_time )
self.prevent_time = prevent_time
end
function UI.PreventFastCall:CallFunc(func, ...)
local curTime = TimeUtil:getServerTimeMs()
local left_time = curTime - self.last_handle_scroll_time
if left_time < self.prevent_time then
local functor = Functor(func, ...)
local function delay_call_func( )
functor()
self.last_handle_scroll_time = curTime
end
if not self.delay_call_func_id then
self.delay_call_func_id = GlobalTimerQuest:AddPeriodQuest(delay_call_func, self.prevent_time-left_time, 1)
end
return false
end
func(...)
self.last_handle_scroll_time = curTime
end
function UI.PreventFastCall:OnDestroy()
if self.delay_call_func_id then
GlobalTimerQuest:CancelQuest(self.delay_call_func_id)
self.delay_call_func_id = nil
end
end
UI.ViewEventListener = UI.ViewEventListener or {}
function UI.ViewEventListener:OnLoad( )
if self.on_load_call_back then
self.on_load_call_back()
end
end
function UI.ViewEventListener:OnDestroy( )
if self.on_destroy_call_back then
self.on_destroy_call_back()
end
end
function UI.ViewEventListener:SetOnLoadCallBack( call_back )
self.on_load_call_back = call_back
end
function UI.ViewEventListener:SetOnDestroyCallBack( call_back )
self.on_destroy_call_back = call_back
end
--绑定组件
UI.BindEventComp = UI.BindEventComp or {}
UI.BindEventComp.BindEvent = function(self, bindDispather, eventName, handleFunc)
assert(bindDispather~=nil, "bindDispather must be not nil!")
self.bindEventInfos = self.bindEventInfos or {}
-- local hadBind = self.bindEventInfos[eventName..tostring(bindDispather)]
-- assert(not hadBind, 'Cat:UINode.lua had bind event name : '..eventName)
-- print('Cat:UINode.lua[69] eventName..tostring(bindDispather)', eventName..tostring(bindDispather))
local eventID = bindDispather:Bind(eventName, handleFunc)
-- self.bindEventInfos[eventName..tostring(bindDispather)] = {bindDispather, eventID}
table.insert(self.bindEventInfos, {bindDispather, eventID})
return eventID
end
UI.BindEventComp.UnBindAll = function(self)
if self.bindEventInfos then
for k,v in pairs(self.bindEventInfos) do
if v[1] and v[2] then
if v[2] == EventName.SHOW_EXIT_BTN_STATE then
print("Cat:UIComponents [148] : ",debug.traceback())
end
v[1]:UnBind(v[2])
end
end
self.bindEventInfos = nil
end
end