2026-05-29 19:54:56 +08:00

98 lines
4.4 KiB
GDScript

class_name NoticePanel
extends PanelModule
# 系统公告面板:
# - 负责公告列表和公告内容展示。
# - 公告是只读功能,不写入玩家状态;失败时只提示 Toast。
# - 内容区使用滚动容器,避免长公告文本撑大弹窗节点。
var _page_index := 1
var _page_max := 1
var _list: VBoxContainer
var _page_label: Label
func open() -> void:
_close_modal(false)
_page_index = 1
_page_max = 1
var panel: Control = _ui.create_panel_shell(
"NoticePanel",
Vector2(620.0, 780.0),
_texture_provider.standalone("res://assets/egret/assets/common/menu_notice.png", _texture_provider.common("panel_title_log")),
_texture_provider.standalone("res://assets/egret/assets/common/panel_title_notic1e.png", _texture_provider.common("panel_title_log"))
)
_ui.add_content_panel_background(panel, "InnerPage", Vector2(77.0, 196.0), Vector2(487.0, 555.0))
var scroll := ScrollContainer.new()
scroll.name = "NoticeScroll"
scroll.position = Vector2(80.0, 205.0)
scroll.size = Vector2(482.0, 535.0)
scroll.clip_contents = true
_ui.configure_vertical_scroll(scroll)
panel.add_child(scroll)
_list = VBoxContainer.new()
_list.name = "NoticeList"
_list.custom_minimum_size = Vector2(462.0, 0.0)
_list.add_theme_constant_override("separation", 15)
scroll.add_child(_list)
_page_label = _ui.add_panel_label(panel, "NoticePage", "1/1", Vector2(264.0, 794.0), Vector2(112.0, 32.0), 24, Color.html("#753f24"), 0, Color.TRANSPARENT)
_ui.add_texture_button(panel, "NoticePrev", _texture_provider.common("btn_page_prev"), Vector2(222.0, 789.0), Vector2(46.0, 41.0), "", Callable(self, "_on_prev_pressed"), 20)
_ui.add_texture_button(panel, "NoticeNext", _texture_provider.common("btn_page_next"), Vector2(371.0, 789.0), Vector2(46.0, 41.0), "", Callable(self, "_on_next_pressed"), 20)
_open_modal(panel)
await render()
func render() -> void:
var list := _list
if not _clear_children_if_live(list):
return
_ui.add_panel_label(list, "Loading", "读取公告中...", Vector2.ZERO, Vector2(462.0, 50.0), 22, Color.html("#753f24"), 0, Color.TRANSPARENT)
var result: Dictionary = await _activity_api.fetch_notices(_token(), (_page_index - 1) * 4, 4)
if not _is_current_node(list, _list):
return
_clear_children(list)
if not result.get("ok", false):
_ui.add_panel_label(list, "Error", _response_status_text(result, "公告读取失败"), Vector2.ZERO, Vector2(462.0, 50.0), 22, Color.html("#ce5f5f"), 0, Color.TRANSPARENT)
return
var data = _response_data(result, {})
var rows: Array = []
if data is Dictionary:
rows = data.get("list", [])
_page_max = clampi(int(ceil(float(int(data.get("total_count", rows.size()))) / 4.0)), 1, 10)
else:
_page_max = 1
if _is_live_node(_page_label):
_page_label.text = "%s/%s" % [_page_index, _page_max]
if rows.is_empty():
_ui.add_panel_label(list, "Empty", "暂无公告", Vector2.ZERO, Vector2(462.0, 50.0), 24, Color.html("#753f24"), 0, Color.TRANSPARENT)
return
for index in range(rows.size()):
if rows[index] is Dictionary:
_add_row(list, rows[index], index)
func _on_prev_pressed() -> void:
if _page_index <= 1:
return
_page_index -= 1
await render()
func _on_next_pressed() -> void:
if _page_index >= _page_max:
return
_page_index += 1
await render()
func _add_row(parent: Control, row: Dictionary, index: int) -> void:
var holder := Control.new()
holder.name = "NoticeRow%s" % index
holder.custom_minimum_size = Vector2(462.0, 118.0)
holder.size = Vector2(462.0, 118.0)
parent.add_child(holder)
_ui.add_texture(holder, "Bg", _texture_provider.standalone("res://assets/egret/assets/common/notice_bg.png", _texture_provider.common("inner_page")), Vector2.ZERO, holder.size)
_ui.add_panel_label(holder, "Title", str(row.get("title", "")), Vector2(8.0, 4.0), Vector2(446.0, 30.0), 24, Color.WHITE, 2, Color.html("#724f2e"), HORIZONTAL_ALIGNMENT_LEFT)
_ui.add_texture(holder, "Line", _texture_provider.standalone("res://assets/egret/assets/common/notice_line.png", _texture_provider.common("line")), Vector2(6.0, 34.0), Vector2(450.0, 3.0))
_ui.add_panel_label(holder, "Content", str(row.get("message", row.get("content", ""))), Vector2(8.0, 43.0), Vector2(446.0, 48.0), 19, Color.WHITE, 2, Color.html("#724f2e"), HORIZONTAL_ALIGNMENT_LEFT)
_ui.add_panel_label(holder, "Time", _format_timestamp(int(row.get("created_at", 0))), Vector2(8.0, 94.0), Vector2(446.0, 20.0), 16, Color.WHITE, 1, Color.html("#724f2e"), HORIZONTAL_ALIGNMENT_RIGHT)