Initial WhaleTown V2 frontend

This commit is contained in:
2026-07-19 22:42:20 +08:00
commit 435c578dde
1421 changed files with 54486 additions and 0 deletions

129
scenes/ui/NoticeDialog.gd Normal file
View File

@@ -0,0 +1,129 @@
extends CanvasLayer
class_name NoticeDialog
const DEFAULT_PAGES: Array[Dictionary] = [
{
"text": "[center][color=#2f6b73]小镇新闻[/color][/center]\n\n线上新闻接口接入后,这里会同步 Datawhale Town 的最新动态、活动公告和版本消息。\n\n当前请先通过欢迎板查看新人引导手册。",
"image_path": "res://assets/maps/square/v1/props/center_whale_fountain_v2_hd_clean.png",
},
]
@onready var contentLabel: RichTextLabel = $CenterContainer/PanelContainer/VBoxContainer/ContentContainer/TextPanel/ContentLabel
@onready var prevButton: Button = $CenterContainer/PanelContainer/VBoxContainer/Footer/PrevButton
@onready var nextButton: Button = $CenterContainer/PanelContainer/VBoxContainer/Footer/NextButton
@onready var dotsContainer: HBoxContainer = $CenterContainer/PanelContainer/VBoxContainer/Footer/DotsContainer
@onready var contentContainer: Container = $CenterContainer/PanelContainer/VBoxContainer/ContentContainer
@onready var imageRect: TextureRect = $CenterContainer/PanelContainer/VBoxContainer/ContentContainer/ImagePanel/ImageRect
@onready var imageLabel: Label = $CenterContainer/PanelContainer/VBoxContainer/ContentContainer/ImagePanel/ImageLabel
var pages: Array[Dictionary] = DEFAULT_PAGES.duplicate(true)
var currentPage: int = 0
var tween: Tween
var _chatUi: Control
var _chatUiPrevMouseFilter: Control.MouseFilter = Control.MOUSE_FILTER_STOP
var _chatUiMouseDisabled: bool = false
func _ready() -> void:
get_tree().paused = true
_disableChatUiMouseInput()
var closeButton := $CenterContainer/PanelContainer/VBoxContainer/Header/RightContainer/CloseButton as Button
closeButton.pressed.connect(_onClosePressed)
prevButton.pressed.connect(_onPrevPressed)
nextButton.pressed.connect(_onNextPressed)
contentContainer.modulate.a = 1.0
_setupDots()
_updateUi(false)
func _exit_tree() -> void:
_restoreChatUiMouseInput()
func _setupDots() -> void:
for child in dotsContainer.get_children():
child.queue_free()
for index in range(pages.size()):
var dot := ColorRect.new()
dot.custom_minimum_size = Vector2(12, 12)
dotsContainer.add_child(dot)
func _updateUi(animate: bool = true) -> void:
if pages.is_empty():
return
prevButton.disabled = currentPage == 0
nextButton.disabled = currentPage == pages.size() - 1
var dots := dotsContainer.get_children()
for index in range(dots.size()):
var dot := dots[index] as ColorRect
if dot == null:
continue
if index == currentPage:
dot.color = Color(0.15, 0.36, 0.44, 1.0)
dot.custom_minimum_size = Vector2(18, 12)
else:
dot.color = Color(0.72, 0.78, 0.72, 1.0)
dot.custom_minimum_size = Vector2(12, 12)
if animate:
_animateContentChange()
else:
_setContentImmediate()
func _setContentImmediate() -> void:
var page := pages[currentPage]
contentLabel.text = page.get("text", "") as String
var imagePath := page.get("image_path", "") as String
if imagePath != "" and ResourceLoader.exists(imagePath):
imageRect.texture = load(imagePath) as Texture2D
imageLabel.visible = false
else:
imageRect.texture = null
imageLabel.visible = true
imageLabel.text = "暂无图片"
func _animateContentChange() -> void:
if tween != null and tween.is_valid():
tween.kill()
tween = create_tween()
tween.tween_property(contentContainer, "modulate:a", 0.0, 0.15)
tween.tween_callback(_setContentImmediate)
tween.tween_property(contentContainer, "modulate:a", 1.0, 0.15)
func _onPrevPressed() -> void:
if currentPage > 0:
currentPage -= 1
_updateUi()
func _onNextPressed() -> void:
if currentPage < pages.size() - 1:
currentPage += 1
_updateUi()
func _onClosePressed() -> void:
get_tree().paused = false
queue_free()
func _disableChatUiMouseInput() -> void:
var currentScene := get_tree().current_scene
if currentScene != null:
_chatUi = currentScene.get_node_or_null("UILayer/ChatUI") as Control
if _chatUi == null:
_chatUi = get_tree().root.find_child("ChatUI", true, false) as Control
if _chatUi != null:
_chatUiPrevMouseFilter = _chatUi.mouse_filter
_chatUi.mouse_filter = Control.MOUSE_FILTER_IGNORE
_chatUiMouseDisabled = true
func _restoreChatUiMouseInput() -> void:
if _chatUiMouseDisabled and is_instance_valid(_chatUi):
_chatUi.mouse_filter = _chatUiPrevMouseFilter
_chatUiMouseDisabled = false
_chatUi = null