288 lines
7.1 KiB
GDScript
288 lines
7.1 KiB
GDScript
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)
|