Files
fc/dev/project/assets/Scripts/zbridge/base/bridge.view.js
T
2026-05-23 22:10:14 +08:00

138 lines
3.6 KiB
JavaScript

/*-----------------------------------------------------+
* 桥接: 所有窗体的显示基类
+-----------------------------------------------------*/
const BridgeClass = require( "bridge.class" );
const { SCENE_TAG } = require( "define" );
const BridgeView = cc.Class( {
extends: BridgeClass,
ctor: function() {
this.wname = "";
this.viewTag = SCENE_TAG.panel;
this.cache = false;
this.prefabPath = "";
this.root_wnd = null;
this.is_loading = false;
this.parent = null;
},
// 设置父节点
setParent: function( parent ) {
this.parent = parent;
},
// 打开窗体的主入口
open: function( params, _cb ) {
// 直接打开
if( this.root_wnd ) {
this.openRootWndBridge( params );
nx.dt.fnInvoke( _cb, true );
return;
};
// 载入中
if( this.is_loading ) {
nx.error( "$UI:载入重复!", this.wname );
nx.dt.fnInvoke( _cb, false );
return;
}
// 加载
this.is_loading = true;
nx.res.loadPrefab( this.prefabPath, ( _err, _fab ) => {
this.is_loading = false;
// 载入错误
if( _err ) {
nx.error( "$UI:载入失败!", nx.fmtError( _err ) );
nx.dt.fnInvoke( _cb, false, nx.fmtError( _err ) );
return;
}
// 实例化
this.root_wnd = cc.instantiate( _fab );
this.root_wnd.name = this.wname;
this.root_wnd.view = this;
this.root_wnd.position = cc.Vec2.ZERO;
if( this.parent != null ) {
this.root_wnd.parent = this.parent;
} else {
this.bindWndBridge();
nx.bridge.ui.addToSceneNode( this.root_wnd, this.viewTag );
}
// 数据设置
this.openRootWndBridge( params );
// 预制常驻
nx.assets.pushResident( this.prefabPath, _fab );
} );
},
/**
* 关闭窗体
*/
close: function( _fromBridgeWindow = false ) {
// 如果不是通过BridgeWindow组件关闭的,那么走组件关闭的方式
if( !_fromBridgeWindow ) {
this.unbindWndBridge();
return;
}
nx.debug( "$UI:窗体关闭:", this.wname );
nx.bridge.Tag2PanelClose(this.wname);
// 节点销毁
if( this.root_wnd ) {
this.root_wnd.destroy();
this.root_wnd = null;
}
},
// 桥接BaseView挂载
bindWndBridge: function() {
let bridge = nx.bridge.getBridgeWindow( this.root_wnd, "" );
if( bridge ) {
bridge.bindView( this );
}
},
unbindWndBridge: function() {
let bridge = nx.bridge.getBridgeWindow( this.root_wnd, "" );
if( bridge ) {
bridge.close( this );
}
},
// 桥接开启参数传递
openRootWndBridge: function( _params ) {
// 开启失败
let bridge = nx.bridge.getBridgeWindow( this.root_wnd, "" );
if( !bridge ) {
nx.error( "$UI:无效窗体,开启失败!", this.wname );
return;
}
nx.debug( "$UI:窗体打开:", this.wname );
// 层级提前
this.root_wnd.active = true;
this.root_wnd.parent.nxOrder = this.root_wnd.parent.nxOrder || 0;
this.root_wnd.zIndex = ++this.root_wnd.parent.nxOrder;
// 参数打开
bridge.openConfigs( _params );
},
} );
module.exports = BridgeView;