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