Browse Source

Merge pull request #84312 from nickyfoo/fix-remove-paragraph-crash

[RichTextLabel] Fix `remove_paragraph` crash by popping current
Rémi Verschelde 1 năm trước cách đây
mục cha
commit
0f4bc9c085
2 tập tin đã thay đổi với 8 bổ sung5 xóa
  1. 7 4
      scene/gui/rich_text_label.cpp
  2. 1 1
      scene/gui/rich_text_label.h

+ 7 - 4
scene/gui/rich_text_label.cpp

@@ -3151,7 +3151,7 @@ void RichTextLabel::_add_item(Item *p_item, bool p_enter, bool p_ensure_newline)
 	queue_redraw();
 }
 
-void RichTextLabel::_remove_item(Item *p_item, const int p_line, const int p_subitem_line) {
+void RichTextLabel::_remove_item(Item *p_item, const int p_line) {
 	int size = p_item->subitems.size();
 	if (size == 0) {
 		p_item->parent->subitems.erase(p_item);
@@ -3160,7 +3160,7 @@ void RichTextLabel::_remove_item(Item *p_item, const int p_line, const int p_sub
 			current_frame->lines.remove_at(p_line);
 			if (p_line < (int)current_frame->lines.size() && current_frame->lines[p_line].from) {
 				for (List<Item *>::Element *E = current_frame->lines[p_line].from->E; E; E = E->next()) {
-					if (E->get()->line > p_subitem_line) {
+					if (E->get()->line > p_line) {
 						E->get()->line--;
 					}
 				}
@@ -3169,7 +3169,7 @@ void RichTextLabel::_remove_item(Item *p_item, const int p_line, const int p_sub
 	} else {
 		// First, remove all child items for the provided item.
 		while (p_item->subitems.size()) {
-			_remove_item(p_item->subitems.front()->get(), p_line, p_subitem_line);
+			_remove_item(p_item->subitems.front()->get(), p_line);
 		}
 		// Then remove the provided item itself.
 		p_item->parent->subitems.erase(p_item);
@@ -3377,7 +3377,10 @@ bool RichTextLabel::remove_paragraph(const int p_paragraph) {
 	for (int i = subitem_to_remove.size() - 1; i >= 0; i--) {
 		List<Item *>::Element *subitem = subitem_to_remove[i];
 		had_newline = had_newline || subitem->get()->type == ITEM_NEWLINE;
-		_remove_item(subitem->get(), subitem->get()->line, p_paragraph);
+		if (subitem->get() == current) {
+			pop();
+		}
+		_remove_item(subitem->get(), p_paragraph);
 	}
 
 	if (!had_newline) {

+ 1 - 1
scene/gui/rich_text_label.h

@@ -461,7 +461,7 @@ private:
 	_FORCE_INLINE_ float _update_scroll_exceeds(float p_total_height, float p_ctrl_height, float p_width, int p_idx, float p_old_scroll, float p_text_rect_height);
 
 	void _add_item(Item *p_item, bool p_enter = false, bool p_ensure_newline = false);
-	void _remove_item(Item *p_item, const int p_line, const int p_subitem_line);
+	void _remove_item(Item *p_item, const int p_line);
 
 	String language;
 	TextDirection text_direction = TEXT_DIRECTION_AUTO;