D5/UI/ui_framework.gd

151 lines
5.9 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# main_controller.gd
extends Control
# --- Signals ---
signal workflow_confirmed(final_data: Dictionary)
signal workflow_cancelled()
# --- Exported Variables ---
@export var initial_page_path: NodePath
@export var gamestate_data_key: String
# --- Internal Variables ---
var current_active_page: UIPage = null
var shared_workflow_data: Dictionary = {}
# --- Godot Lifecycle Methods ---
func _ready():
shared_workflow_data = GameState.get_value(gamestate_data_key)
for child in get_children():
if child is UIPage:
child.hide_page()
_connect_page_signals(child)
for sub_child in child.get_children():
if sub_child is UIPage:
sub_child.hide_page()
_connect_page_signals(sub_child)
# --- Public Methods ---
func show_up():
GameState.pause_game()
shared_workflow_data = GameState.get_value(gamestate_data_key)
var original_money = GameState.get_value("money") # 记录初始Money
shared_workflow_data["original_money"] = int(original_money)
if not initial_page_path.is_empty():
var initial_page_node = get_node_or_null(initial_page_path)
if initial_page_node and initial_page_node is UIPage:
start_new_workflow(initial_page_node, shared_workflow_data)
else:
printerr("Main: Initial page not found or not a UIPage: ", initial_page_path)
else:
self.visible = false
func start_new_workflow(start_page: UIPage, initial_data: Dictionary = {}):
print("Main: Starting new workflow with page: ", start_page.name, " and data: ", initial_data)
shared_workflow_data = initial_data.duplicate()
for child in get_children():
if child is UIPage and child != start_page:
child.hide_page()
for sub_child in child.get_children():
if sub_child is UIPage:
sub_child.hide_page()
_switch_to_page(start_page)
self.visible = true
func get_shared_data(key: String, default = null):
return shared_workflow_data.get(key, default)
func set_shared_data(key: String, value):
shared_workflow_data[key] = value
print("Main: Shared data updated: ", shared_workflow_data)
# --- Private Helper Methods ---
func _connect_page_signals(page: UIPage):
if not page.is_connected("navigate_requested", Callable(self, "_on_page_navigate_requested")):
page.navigate_requested.connect(self._on_page_navigate_requested)
if not page.is_connected("workflow_end_requested", Callable(self, "_on_page_workflow_end_requested")):
page.workflow_end_requested.connect(self._on_page_workflow_end_requested)
func _switch_to_page(target_page: UIPage):
var previous_page = current_active_page
if previous_page:
# ... (处理前一页面的隐藏逻辑,包括 hide_on_next 和父页面清理) ...
# (这部分逻辑不变)
var should_hide_previous_page = true
if previous_page.has_meta("hide_on_next"):
should_hide_previous_page = previous_page.get_meta("hide_on_next")
elif previous_page.has_signal("about_to_show"):
if "hide_on_next" in previous_page:
should_hide_previous_page = previous_page.hide_on_next
else:
printerr("MainController: 'hide_on_next' property not found on previous_page '", previous_page.name, "'. Defaulting to hide.")
if should_hide_previous_page:
previous_page.hide_page()
var old_page_parent_path = previous_page.parent_page_node_path
if not old_page_parent_path.is_empty():
var old_page_parent_node = previous_page.get_node_or_null(old_page_parent_path) as UIPage
if old_page_parent_node:
var target_is_old_parent_itself = (target_page == old_page_parent_node)
var target_is_sibling_of_previous = false
var target_parent = target_page.get_parent()
if target_parent and target_parent == old_page_parent_node:
target_is_sibling_of_previous = true
if not target_is_old_parent_itself and not target_is_sibling_of_previous:
old_page_parent_node.hide_page()
current_active_page = target_page
current_active_page.show_page() # 调用 UIPage.show_page(),现在它只负责设置 visible = true
# 确保新页面的 _on_page_activated() 被调用,无论它之前是否可见
current_active_page._on_page_activated() # <--- 关键MainController 负责调用
# 确保新当前页面的父页面 (如果它是子页面) 也可见并已激活 (如果需要)
var new_page_parent_path = current_active_page.parent_page_node_path
if not new_page_parent_path.is_empty():
var new_page_parent_node = current_active_page.get_node_or_null(new_page_parent_path) as UIPage
if new_page_parent_node:
# 如果父页面之前不可见,则显示并激活它
if not new_page_parent_node.visible:
new_page_parent_node.show_page() # 使其可见
new_page_parent_node._on_page_activated() # 激活它
else:
# 如果父页面已经可见 (例如,它从未被隐藏)
# 确保其 show_page 至少被调用一次以符合逻辑 (尽管它可能什么都不做)
new_page_parent_node.show_page()
print("Main: Switched to page: ", current_active_page.name)
# --- Signal Handlers ---
func _on_page_navigate_requested(target_page_node: Control): # Changed to Control to match signal
if target_page_node is UIPage:
_switch_to_page(target_page_node)
else:
printerr("Main: Navigation requested to a node that is not a UIPage: ", target_page_node)
func _on_page_workflow_end_requested(is_confirm_and_trigger_action: bool):
print("Main: Workflow end requested. Confirm and trigger: ", is_confirm_and_trigger_action)
if is_confirm_and_trigger_action:
print("Main: Workflow CONFIRMED. Final data: ", shared_workflow_data)
emit_signal("workflow_confirmed", shared_workflow_data)
else:
print("Main: Workflow CANCELLED/BACKED OUT.")
emit_signal("workflow_cancelled")
if current_active_page:
current_active_page.hide_page()
var parent = current_active_page.get_node_or_null(current_active_page.parent_page_node_path) as UIPage
if parent:
parent.hide_page()
current_active_page = null
GameState.set_value(gamestate_data_key,shared_workflow_data)
GameState.resume_game()
self.visible = false
print("Main: UI Workflow finished and Main hidden.")