diff options
| author | Rémi Verschelde <rverschelde@gmail.com> | 2017-02-26 21:16:30 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-02-26 21:16:30 +0100 | 
| commit | 3de1415b6a0e3ad5bb39b6bcc3958305b0d415d4 (patch) | |
| tree | 1df1237780242b8b683aca869c2c9b23998d3756 | |
| parent | 7a9b08f78557023249538e3b0c9cbbb32b567c26 (diff) | |
| parent | c20b186e7324616843701ee044e87e72b737b47b (diff) | |
Merge pull request #7653 from Dumbeldor/RichTextLabel_remove_line
RichTextLabel add function remove_line
| -rw-r--r-- | scene/gui/rich_text_label.cpp | 43 | ||||
| -rw-r--r-- | scene/gui/rich_text_label.h | 2 | 
2 files changed, 45 insertions, 0 deletions
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index b06cde1e91..17ec71f4a4 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -1214,6 +1214,28 @@ void RichTextLabel::_add_item(Item *p_item, bool p_enter, bool p_ensure_newline)  } +void RichTextLabel::_remove_item(Item* p_item, const int p_line, const int p_subitem_line) { + + +	int size = p_item->subitems.size(); +	if (size == 0) { +		p_item->parent->subitems.erase(p_item); +		if (p_item->type == ITEM_NEWLINE) { +			current_frame->lines.remove(p_line); +			for (int i = p_subitem_line; i < current->subitems.size(); i++) { +				if (current->subitems[i]->line > 0) +					current->subitems[i]->line--; +			} +		} +	} +	else { +		for (int i = 0; i < size; i++) { +			_remove_item(p_item->subitems.front()->get(), p_line, p_subitem_line); +		} +	} + +} +  void RichTextLabel::add_image(const Ref<Texture>& p_image) {  	if (current->type==ITEM_TABLE) @@ -1238,6 +1260,26 @@ void RichTextLabel::add_newline() {  } +bool RichTextLabel::remove_line(const int p_line) { + +	if (p_line >= current_frame->lines.size() || p_line < 0) +		return false; + +	int lines = p_line * 2; + +	if (current->subitems[lines]->type != ITEM_NEWLINE) +		_remove_item(current->subitems[lines], current->subitems[lines]->line, lines); + +	_remove_item(current->subitems[lines], current->subitems[lines]->line, lines); + +	if (p_line == 0) { +		main->lines[0].from = main; +	} + +	main->first_invalid_line = 0; +	return true; +} +  void RichTextLabel::push_font(const Ref<Font>& p_font) {  	ERR_FAIL_COND(current->type==ITEM_TABLE); @@ -1906,6 +1948,7 @@ void RichTextLabel::_bind_methods() {  	ClassDB::bind_method(D_METHOD("add_text","text"),&RichTextLabel::add_text);  	ClassDB::bind_method(D_METHOD("add_image","image:Texture"),&RichTextLabel::add_image);  	ClassDB::bind_method(D_METHOD("newline"),&RichTextLabel::add_newline); +	ClassDB::bind_method(D_METHOD("remove_line"),&RichTextLabel::remove_line);  	ClassDB::bind_method(D_METHOD("push_font","font"),&RichTextLabel::push_font);  	ClassDB::bind_method(D_METHOD("push_color","color"),&RichTextLabel::push_color);  	ClassDB::bind_method(D_METHOD("push_align","align"),&RichTextLabel::push_align); diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index 39032185f8..c675cfbefb 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -217,6 +217,7 @@ private:  	void _validate_line_caches(ItemFrame *p_frame);  	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); @@ -284,6 +285,7 @@ public:  	void add_text(const String& p_text);  	void add_image(const Ref<Texture>& p_image);  	void add_newline(); +	bool remove_line(const int p_line);  	void push_font(const Ref<Font>& p_font);  	void push_color(const Color& p_color);  	void push_underline();  |