2025-04-01 10:48:36 +08:00
|
|
|
|
--window 窗口基类
|
|
|
|
|
|
--author:--
|
|
|
|
|
|
|
|
|
|
|
|
BaseWindow = {
|
2025-07-05 18:06:16 +08:00
|
|
|
|
--view description
|
|
|
|
|
|
_view = nil,
|
2025-04-11 12:49:08 +08:00
|
|
|
|
|
2025-07-05 18:06:16 +08:00
|
|
|
|
--View 是否被销毁
|
|
|
|
|
|
_is_destroy = false,
|
|
|
|
|
|
--是否播放动画
|
|
|
|
|
|
_animation = true,
|
|
|
|
|
|
--弹出动画,0关闭,1左边,2右边
|
|
|
|
|
|
_anim_pop = 0,
|
|
|
|
|
|
--关闭摧毁
|
|
|
|
|
|
_close_destroy = false,
|
2025-04-11 12:49:08 +08:00
|
|
|
|
|
2025-07-05 18:06:16 +08:00
|
|
|
|
--点击窗口以外关闭
|
|
|
|
|
|
_close_zone = true,
|
2025-04-11 12:49:08 +08:00
|
|
|
|
|
2025-07-05 18:06:16 +08:00
|
|
|
|
--队列
|
|
|
|
|
|
_queue = true,
|
|
|
|
|
|
--全屏
|
|
|
|
|
|
_full = false,
|
|
|
|
|
|
--缩放全屏
|
|
|
|
|
|
_scale = false,
|
|
|
|
|
|
--全屏偏移
|
|
|
|
|
|
_full_offset = true,
|
|
|
|
|
|
--新窗口隐藏队列
|
|
|
|
|
|
_new_hide = true,
|
|
|
|
|
|
--模糊组件对象
|
|
|
|
|
|
_put_map = true
|
2025-04-01 10:48:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
--window 列表
|
|
|
|
|
|
local WindowMap = {
|
2025-04-11 12:49:08 +08:00
|
|
|
|
|
2025-04-01 10:48:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-11 12:49:08 +08:00
|
|
|
|
local WindowQueue = {
|
|
|
|
|
|
|
2025-04-01 10:48:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
local M = BaseWindow
|
|
|
|
|
|
|
2025-04-11 12:49:08 +08:00
|
|
|
|
function BaseWindow.new(url, blur_view)
|
2025-07-05 18:06:16 +08:00
|
|
|
|
local self = setmetatable({}, { __index = M })
|
|
|
|
|
|
self.class = "BaseWindow"
|
|
|
|
|
|
-- self._blur_view = blur_view
|
|
|
|
|
|
self:init(url)
|
|
|
|
|
|
return self
|
2025-04-01 10:48:36 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local win_url = {
|
2025-07-05 18:06:16 +08:00
|
|
|
|
"ui://Common/Gcm_Window",
|
|
|
|
|
|
"ui://Common/Gcm_Window_Full"
|
2025-04-01 10:48:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function M:init(url)
|
2025-07-05 18:06:16 +08:00
|
|
|
|
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
|
|
|
|
|
|
printlog(url)
|
|
|
|
|
|
self._view = UIPackage.CreateObjectFromURL(url)
|
|
|
|
|
|
printlog(self._view)
|
|
|
|
|
|
-- 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
|
2025-04-01 10:48:36 +08:00
|
|
|
|
|
2025-04-11 12:49:08 +08:00
|
|
|
|
|
2025-07-05 18:06:16 +08:00
|
|
|
|
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)
|
|
|
|
|
|
printlog("======================================", self._full)
|
|
|
|
|
|
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)
|
|
|
|
|
|
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
|
|
|
|
|
|
print("lingmeng", PopPanel.height, self._view.height)
|
|
|
|
|
|
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-04-01 10:48:36 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- 显示窗口
|
|
|
|
|
|
function M:Show()
|
2025-07-05 18:06:16 +08:00
|
|
|
|
-- print("===========================================entershow",M.class)
|
|
|
|
|
|
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
|
2025-04-01 10:48:36 +08:00
|
|
|
|
|
2025-07-05 18:06:16 +08:00
|
|
|
|
-- 判断当前窗口是否已经在队列中,如果在就不重复添加
|
|
|
|
|
|
local _inQueue = false
|
2025-04-01 10:48:36 +08:00
|
|
|
|
|
2025-07-05 18:06:16 +08:00
|
|
|
|
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._scale then
|
|
|
|
|
|
local scaleY = GRoot.inst.height / self._contentPane.height
|
|
|
|
|
|
local scaleX = GRoot.inst.width / self._contentPane.width
|
|
|
|
|
|
self._contentPane:SetScale(scaleX, scaleY)
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
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-04-01 10:48:36 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- 关闭窗口
|
|
|
|
|
|
function M:Close()
|
2025-07-05 18:06:16 +08:00
|
|
|
|
-- 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
|
2025-04-01 10:48:36 +08:00
|
|
|
|
|
2025-07-05 18:06:16 +08:00
|
|
|
|
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-04-01 10:48:36 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local _destroy_all = false
|
|
|
|
|
|
-- 销毁窗口
|
|
|
|
|
|
function M:Destroy()
|
2025-07-05 18:06:16 +08:00
|
|
|
|
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-04-01 10:48:36 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function M:CloseEvent()
|
2025-07-05 18:06:16 +08:00
|
|
|
|
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-04-01 10:48:36 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function M:ActionWithAnim(callback)
|
2025-07-05 18:06:16 +08:00
|
|
|
|
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-04-01 10:48:36 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function BaseWindow.DestroyAll()
|
2025-07-05 18:06:16 +08:00
|
|
|
|
_destroy_all = true
|
|
|
|
|
|
local list = WindowMap
|
|
|
|
|
|
for i = 1, #list do
|
|
|
|
|
|
local win = list[i]
|
|
|
|
|
|
win:Destroy()
|
|
|
|
|
|
end
|
|
|
|
|
|
_destroy_all = false
|
|
|
|
|
|
WindowQueue = {}
|
|
|
|
|
|
WindowMap = {}
|
2025-04-11 12:49:08 +08:00
|
|
|
|
end
|
2025-07-28 21:44:23 +08:00
|
|
|
|
|
|
|
|
|
|
function BaseWindow.FindWindow(viewName)
|
|
|
|
|
|
for _, view in pairs(WindowQueue) do
|
|
|
|
|
|
if view.class == viewName then
|
|
|
|
|
|
return view
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|