class_name GameScenePanelRouter extends RefCounted # 主场景面板入口路由: # - 统一负责打开/关闭弹窗和保存当前弹窗引用。 # - 面板模块仍各自负责 UI 和业务,路由只做入口包装、数据刷新和 ModalLayer 装配。 # - GameScene 不再保留一长串 _open_*_panel 方法。 var _owner: Control var _callbacks: Dictionary = {} var _modal_controller var _modal_layer: Control var _active_panel: Control var _shop_panel_view var _warehouse_panel_view var _friend_panel_view var _building_panel_view var _log_panel_view var _notice_panel_view var _level_gift_panel_view var _online_gift_panel_view var _pay_panel_view var _gold_exchange_panel_view var _market_panel_view var _sign_panel_view var _lottery_panel_view var _pet_panel_view var _player_info_panel_view var _shop_panel_list: GridContainer var _warehouse_panel_list: GridContainer var _friend_list: Control var _friend_page_label: Label var _friend_title_lv_label: Label func setup(options: Dictionary) -> void: _owner = options.get("owner") as Control _callbacks = options.get("callbacks", {}) func set_panel_views(views: Dictionary) -> void: _shop_panel_view = views.get("shop_panel_view") _warehouse_panel_view = views.get("warehouse_panel_view") _friend_panel_view = views.get("friend_panel_view") _building_panel_view = views.get("building_panel_view") _log_panel_view = views.get("log_panel_view") _notice_panel_view = views.get("notice_panel_view") _level_gift_panel_view = views.get("level_gift_panel_view") _online_gift_panel_view = views.get("online_gift_panel_view") _pay_panel_view = views.get("pay_panel_view") _gold_exchange_panel_view = views.get("gold_exchange_panel_view") _market_panel_view = views.get("market_panel_view") _sign_panel_view = views.get("sign_panel_view") _lottery_panel_view = views.get("lottery_panel_view") _pet_panel_view = views.get("pet_panel_view") _player_info_panel_view = views.get("player_info_panel_view") _apply_modal_layer_to_panels() func set_modal_controller(modal_controller) -> void: _modal_controller = modal_controller _modal_layer = _modal_controller.layer() if _modal_controller != null else null _apply_modal_layer_to_panels() func pet_panel_view(): return _pet_panel_view func refresh_pet_display() -> void: if _pet_panel_view == null: return await _pet_panel_view.refresh_display() func render_pet_display() -> void: if _pet_panel_view == null: return _pet_panel_view.render_display() func open_pet_panel() -> void: if _pet_panel_view == null: return await _pet_panel_view.open() func open_player_info_panel() -> void: close_modal_panel(false) if _player_info_panel_view == null: return var panel := _player_info_panel_view.create() as Control if panel == null: return open_modal_panel(panel) func open_shop_panel() -> void: close_modal_panel(false) if _shop_panel_view == null: return var panel := _shop_panel_view.create(0) as Control _shop_panel_list = _shop_panel_view.list() if panel == null: return open_modal_panel(panel) func open_warehouse_panel() -> void: close_modal_panel(false) await _call_async("refresh_store_house") if _warehouse_panel_view == null: return _warehouse_panel_view.set_modal_layer(_modal_layer) var panel := _warehouse_panel_view.create(0) as Control _warehouse_panel_list = _warehouse_panel_view.list() if panel == null: return open_modal_panel(panel) func open_friend_panel() -> void: close_modal_panel(false) if _friend_panel_view == null: return var panel := _friend_panel_view.create(0) as Control _friend_list = _friend_panel_view.list() _friend_page_label = _friend_panel_view.page_label() _friend_title_lv_label = _friend_panel_view.title_lv_label() if panel == null: return open_modal_panel(panel) await _friend_panel_view.update_page() func open_log_panel() -> void: if _log_panel_view == null: return await _log_panel_view.open() func open_notice_panel() -> void: if _notice_panel_view == null: return await _notice_panel_view.open() func open_pay_panel() -> void: if _pay_panel_view == null: return _pay_panel_view.open() func open_gold_exchange_panel() -> void: if _gold_exchange_panel_view == null: return await _gold_exchange_panel_view.open() func open_market_panel() -> void: if _market_panel_view == null: return await _market_panel_view.open() func open_level_gift_panel() -> void: if _level_gift_panel_view == null: return await _level_gift_panel_view.open() func open_online_gift_panel() -> void: if _online_gift_panel_view == null: return _online_gift_panel_view.open() func open_sign_panel() -> void: if _sign_panel_view == null: return await _sign_panel_view.open() func open_lottery_panel() -> void: if _lottery_panel_view == null: return _lottery_panel_view.open() func open_house_upgrade_panel() -> void: if _building_panel_view == null: return await _building_panel_view.open_house_upgrade() func open_land_upgrade_panel() -> void: if _building_panel_view == null: return await _building_panel_view.open_land_upgrade(0) func open_land_extend_panel() -> void: if _building_panel_view == null: return _building_panel_view.open_land_extend() func open_modal_panel(panel: Control) -> void: if _modal_controller == null: return _call("hide_selection_ui") _call("set_scene_hit_layers_enabled", [false]) _active_panel = panel _modal_controller.open(panel) func close_modal_panel(animated := true) -> void: if _modal_controller == null: return var panel := _active_panel _active_panel = null _shop_panel_list = null _warehouse_panel_list = null _friend_list = null _friend_page_label = null _friend_title_lv_label = null _modal_controller.close(panel, animated) if animated: _restore_scene_hits_after_close() else: _call("set_scene_hit_layers_enabled", [true]) func on_shop_tab_pressed(index: int) -> void: if _shop_panel_view != null: _shop_panel_view._on_tab_pressed(index) func render_shop_tab() -> void: if _shop_panel_view != null: _shop_panel_view.render() func on_warehouse_tab_pressed(index: int) -> void: if _warehouse_panel_view != null: _warehouse_panel_view._on_tab_pressed(index) func render_warehouse_tab() -> void: if _warehouse_panel_view != null: _warehouse_panel_view.render() func should_render_warehouse() -> bool: return _warehouse_panel_list != null and is_instance_valid(_warehouse_panel_list) func _restore_scene_hits_after_close() -> void: if _owner == null: _call("set_scene_hit_layers_enabled", [true]) return await _owner.get_tree().create_timer(0.18).timeout if _active_panel == null: _call("set_scene_hit_layers_enabled", [true]) func _apply_modal_layer_to_panels() -> void: if _modal_layer == null: return if _warehouse_panel_view != null: _warehouse_panel_view.set_modal_layer(_modal_layer) func _call(name: String, args: Array = [], fallback: Variant = null) -> Variant: var callback: Callable = _callbacks.get(name, Callable()) if not callback.is_valid(): return fallback return callback.callv(args) func _call_async(name: String, args: Array = []) -> Variant: var callback: Callable = _callbacks.get(name, Callable()) if not callback.is_valid(): return null return await callback.callv(args)