forked from xiangwang25/whale-town-front-v2
Initial WhaleTown V2 frontend
This commit is contained in:
129
scenes/ui/NoticeDialog.gd
Normal file
129
scenes/ui/NoticeDialog.gd
Normal 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
|
||||
Reference in New Issue
Block a user