summaryrefslogtreecommitdiffstats
path: root/scene/gui
diff options
context:
space:
mode:
Diffstat (limited to 'scene/gui')
-rw-r--r--scene/gui/rich_text_label.cpp30
-rw-r--r--scene/gui/tree.cpp29
-rw-r--r--scene/gui/tree.h4
3 files changed, 49 insertions, 14 deletions
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp
index 070c79c0ee..ed5037ca1d 100644
--- a/scene/gui/rich_text_label.cpp
+++ b/scene/gui/rich_text_label.cpp
@@ -3095,15 +3095,17 @@ void RichTextLabel::_remove_item(Item *p_item, const int p_line, const int p_sub
// If a newline was erased, all lines AFTER the newline need to be decremented.
if (p_item->type == ITEM_NEWLINE) {
current_frame->lines.remove_at(p_line);
- for (int i = 0; i < current->subitems.size(); i++) {
- if (current->subitems[i]->line > p_subitem_line) {
- current->subitems[i]->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) {
+ E->get()->line--;
+ }
}
}
}
} else {
// First, remove all child items for the provided item.
- for (int i = 0; i < size; i++) {
+ while (p_item->subitems.size()) {
_remove_item(p_item->subitems.front()->get(), p_line, p_subitem_line);
}
// Then remove the provided item itself.
@@ -3199,19 +3201,23 @@ bool RichTextLabel::remove_paragraph(const int p_paragraph) {
}
// Remove all subitems with the same line as that provided.
- Vector<int> subitem_indices_to_remove;
- for (int i = 0; i < current->subitems.size(); i++) {
- if (current->subitems[i]->line == p_paragraph) {
- subitem_indices_to_remove.push_back(i);
+ Vector<List<Item *>::Element *> subitem_to_remove;
+ if (current_frame->lines[p_paragraph].from) {
+ for (List<Item *>::Element *E = current_frame->lines[p_paragraph].from->E; E; E = E->next()) {
+ if (E->get()->line == p_paragraph) {
+ subitem_to_remove.push_back(E);
+ } else {
+ break;
+ }
}
}
bool had_newline = false;
// Reverse for loop to remove items from the end first.
- for (int i = subitem_indices_to_remove.size() - 1; i >= 0; i--) {
- int subitem_idx = subitem_indices_to_remove[i];
- had_newline = had_newline || current->subitems[subitem_idx]->type == ITEM_NEWLINE;
- _remove_item(current->subitems[subitem_idx], current->subitems[subitem_idx]->line, 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 (!had_newline) {
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index 3c1be2d5fe..6daa330ee0 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -352,6 +352,24 @@ TextServer::AutowrapMode TreeItem::get_autowrap_mode(int p_column) const {
return cells[p_column].autowrap_mode;
}
+void TreeItem::set_text_overrun_behavior(int p_column, TextServer::OverrunBehavior p_behavior) {
+ ERR_FAIL_INDEX(p_column, cells.size());
+
+ if (cells[p_column].text_buf->get_text_overrun_behavior() == p_behavior) {
+ return;
+ }
+
+ cells.write[p_column].text_buf->set_text_overrun_behavior(p_behavior);
+ cells.write[p_column].dirty = true;
+ _changed_notify(p_column);
+ cells.write[p_column].cached_minimum_size_dirty = true;
+}
+
+TextServer::OverrunBehavior TreeItem::get_text_overrun_behavior(int p_column) const {
+ ERR_FAIL_INDEX_V(p_column, cells.size(), TextServer::OVERRUN_TRIM_ELLIPSIS);
+ return cells[p_column].text_buf->get_text_overrun_behavior();
+}
+
void TreeItem::set_structured_text_bidi_override(int p_column, TextServer::StructuredTextParser p_parser) {
ERR_FAIL_INDEX(p_column, cells.size());
@@ -1512,6 +1530,9 @@ void TreeItem::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_autowrap_mode", "column", "autowrap_mode"), &TreeItem::set_autowrap_mode);
ClassDB::bind_method(D_METHOD("get_autowrap_mode", "column"), &TreeItem::get_autowrap_mode);
+ ClassDB::bind_method(D_METHOD("set_text_overrun_behavior", "column", "overrun_behavior"), &TreeItem::set_text_overrun_behavior);
+ ClassDB::bind_method(D_METHOD("get_text_overrun_behavior", "column"), &TreeItem::get_text_overrun_behavior);
+
ClassDB::bind_method(D_METHOD("set_structured_text_bidi_override", "column", "parser"), &TreeItem::set_structured_text_bidi_override);
ClassDB::bind_method(D_METHOD("get_structured_text_bidi_override", "column"), &TreeItem::get_structured_text_bidi_override);
@@ -2096,7 +2117,12 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
buttons_width += button_size.width + theme_cache.button_margin;
}
- p_item->cells.write[i].text_buf->set_width(item_width);
+ int text_width = item_width - theme_cache.inner_item_margin_left - theme_cache.inner_item_margin_right;
+ if (p_item->cells[i].icon.is_valid()) {
+ text_width -= p_item->cells[i].get_icon_size().x + theme_cache.h_separation;
+ }
+
+ p_item->cells.write[i].text_buf->set_width(text_width);
r_self_height = compute_item_height(p_item);
label_h = r_self_height + theme_cache.v_separation;
@@ -2224,7 +2250,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
Point2i text_pos = item_rect.position;
text_pos.y += Math::floor(p_draw_ofs.y) - _get_title_button_height();
- int text_width = p_item->cells[i].text_buf->get_size().x;
switch (p_item->cells[i].mode) {
case TreeItem::CELL_MODE_STRING: {
diff --git a/scene/gui/tree.h b/scene/gui/tree.h
index cb00889cb9..4afe94a3a0 100644
--- a/scene/gui/tree.h
+++ b/scene/gui/tree.h
@@ -117,6 +117,7 @@ private:
Cell() {
text_buf.instantiate();
+ text_buf->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
}
Size2 get_icon_size() const;
@@ -231,6 +232,9 @@ public:
void set_autowrap_mode(int p_column, TextServer::AutowrapMode p_mode);
TextServer::AutowrapMode get_autowrap_mode(int p_column) const;
+ void set_text_overrun_behavior(int p_column, TextServer::OverrunBehavior p_behavior);
+ TextServer::OverrunBehavior get_text_overrun_behavior(int p_column) const;
+
void set_structured_text_bidi_override(int p_column, TextServer::StructuredTextParser p_parser);
TextServer::StructuredTextParser get_structured_text_bidi_override(int p_column) const;