hy-farm/godot/FarmGodot/scripts/ui/game_scene_panel_router.gd
2026-05-29 19:54:56 +08:00

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)