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)