changhong/lua_probject/base_project/Game/View/Common/BaseWindow.lua

254 lines
6.6 KiB
Lua
Raw Normal View History

2025-05-24 14:29:14 +08:00
--window 窗口基类
--author--
BaseWindow = {
--view description
_view = nil,
--View 是否被销毁
_is_destroy = false,
--是否播放动画
_animation = true,
--弹出动画0关闭1左边2右边
_anim_pop = 0,
--关闭摧毁
_close_destroy = false,
--点击窗口以外关闭
2025-09-29 16:48:15 +08:00
_close_zone = false,
--队列
_queue = true,
--全屏
_full = false,
--全屏偏移
_full_offset = true,
--新窗口隐藏队列
_new_hide = true,
--模糊组件对象
_put_map = true
2025-05-24 14:29:14 +08:00
}
--window 列表
local WindowMap = {
2025-05-24 14:29:14 +08:00
}
local WindowQueue = {
2025-05-24 14:29:14 +08:00
}
local M = BaseWindow
function BaseWindow.new(url, blur_view)
local self = setmetatable({}, { __index = M })
self.class = "BaseWindow"
-- self._blur_view = blur_view
self:init(url)
return self
2025-05-24 14:29:14 +08:00
end
local win_url = {
"ui://Common/Gcm_Window",
"ui://Common/Gcm_Window_Full"
2025-05-24 14:29:14 +08:00
}
function M:init(url)
self._root_view = UIPackage.CreateObjectFromURL(self._full and win_url[2] or win_url[1])
local contentPane = self._root_view:GetChild("contentPane")
local ctr_hide_bg = self._root_view:GetController("hide_bg")
if self._anim_pop ~= 0 then
ctr_hide_bg.selectedIndex = 1
PopPanel = contentPane:GetChild("PopPanel")
else
ctr_hide_bg.selectedIndex = 0
end
self._view = UIPackage.CreateObjectFromURL(url)
-- self._view.fairyBatching = true
local btn_close = self._view:GetChild("btn_close")
if (btn_close) then
btn_close.onClick:Set(function()
self:CloseEvent()
end)
end
local win_mode = self._root_view:GetChild("win_mode")
win_mode.onClick:Set(function()
if not self._close_zone then
return
end
win_mode.touchable = false
self:CloseEvent()
end)
if self._full then
local offset = get_offset(self._full_offset)
if self._anim_pop == 0 then
self._view:AddRelation(contentPane, RelationType.Size)
contentPane:AddChild(self._view)
self._view:Center()
else
contentPane:RemoveRelation(self._root_view, RelationType.Center_Center)
contentPane:AddRelation(self._root_view, RelationType.Middle_Middle)
PopPanel:AddChild(self._view)
local click_item = PopPanel:GetChild("click_item")
if self._anim_pop == 1 then
contentPane:AddRelation(self._root_view, RelationType.Left_Left)
self._view.x = 0
elseif self._anim_pop == 2 then
contentPane:AddRelation(self._root_view, RelationType.Right_Right)
self._view.x = GRoot.inst.width - self._view.width - offset
end
self._view.y = (PopPanel.height - self._view.height) * 0.5
click_item.xy = self._view.xy
click_item.width = self._view.width
click_item.height = self._view.height
end
else
contentPane:AddChild(self._view)
contentPane.height = self._view.height
contentPane.width = self._view.width
contentPane:Center()
end
self._contentPane = contentPane
if self._put_map then
WindowMap[#WindowMap + 1] = self
end
2025-05-24 14:29:14 +08:00
end
-- 显示窗口
function M:Show()
local contentPane = self._root_view:GetChild("contentPane")
if self._anim_pop == 1 then
contentPane:GetTransition("left_pop"):Play()
elseif self._anim_pop == 2 then
contentPane:GetTransition("right_pop"):Play()
elseif self._animation then
local ani_in = self._root_view:GetTransition("in")
if ani_in then
ani_in:Play()
end
end
-- if self._blur_view then
-- BlurView(self._blur_view,true)
-- end
-- 判断当前窗口是否已经在队列中,如果在就不重复添加
local _inQueue = false
if self._new_hide then
for i = 1, #WindowQueue do
local win = WindowQueue[i]
if win == self then
_inQueue = true
end
if win._queue then
win._root_view:RemoveFromParent()
end
end
end
if self._queue and not _inQueue then
WindowQueue[#WindowQueue + 1] = self
end
AddPanel(self._root_view)
if self._full then
local offset = get_offset(self._full_offset)
self._contentPane.width = GRoot.inst.width - 2 * offset
self._contentPane.height = GRoot.inst.height
self._contentPane.x = offset
end
2025-05-24 14:29:14 +08:00
end
-- 关闭窗口
function M:Close()
-- if self._blur_view then
-- BlurView(self._blur_view,false)
-- end
if self._queue then
for i, v in ipairs(WindowQueue) do
if v == self then
table.remove(WindowQueue, i)
break
end
end
end
if self._new_hide then
local win = WindowQueue[#WindowQueue]
if win and win._queue then
AddPanel(win._root_view)
end
end
self._root_view:RemoveFromParent()
2025-05-24 14:29:14 +08:00
end
local _destroy_all = false
-- 销毁窗口
function M:Destroy()
if self._is_destroy then
return
end
if not _destroy_all then
self:Close()
if self._put_map then
for i, v in ipairs(WindowMap) do
if v == self then
table.remove(WindowMap, i)
break
end
end
end
end
self._is_destroy = true
self._root_view:Dispose()
2025-05-24 14:29:14 +08:00
end
function M:CloseEvent()
local win_mode = self._root_view:GetChild("win_mode")
if self._anim_pop == 0 then
if self._close_destroy then
self:Destroy()
else
self:Close()
win_mode.touchable = true
end
else
self:ActionWithAnim(function()
if self._close_destroy then
self:Destroy()
else
self:Close()
win_mode.touchable = true
end
end)
end
2025-05-24 14:29:14 +08:00
end
function M:ActionWithAnim(callback)
local contentPane = self._root_view:GetChild("contentPane")
if self._anim_pop == 1 then
contentPane:GetTransition("left_pop_back"):Play()
elseif self._anim_pop == 2 then
contentPane:GetTransition("right_pop_back"):Play()
end
if callback then
coroutine.start(function()
coroutine.wait(0.3)
callback()
end)
end
2025-05-24 14:29:14 +08:00
end
function BaseWindow.DestroyAll()
_destroy_all = true
local list = WindowMap
for i = 1, #list do
local win = list[i]
win:Destroy()
end
_destroy_all = false
WindowQueue = {}
WindowMap = {}
end