Skip to content

Commit

Permalink
replace computed height with cached item minimum size
Browse files Browse the repository at this point in the history
replace computed height with cached item minimum size
  • Loading branch information
maidopi-usagi committed Sep 12, 2024
1 parent 97ef3c8 commit e5e11b2
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 36 deletions.
56 changes: 20 additions & 36 deletions scene/gui/tree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1513,7 +1513,7 @@ Size2 TreeItem::get_minimum_size(int p_column) {

const TreeItem::Cell &cell = cells[p_column];

if (cell.cached_minimum_size_dirty) {
if (cell.cached_minimum_size_dirty || cell.text_buf->is_dirty() || cell.dirty) {
Size2 size = Size2(
parent_tree->theme_cache.inner_item_margin_left + parent_tree->theme_cache.inner_item_margin_right,
parent_tree->theme_cache.inner_item_margin_top + parent_tree->theme_cache.inner_item_margin_bottom);
Expand Down Expand Up @@ -1825,41 +1825,7 @@ int Tree::compute_item_height(TreeItem *p_item) const {
if (p_item->cells[i].dirty) {
const_cast<Tree *>(this)->update_item_cell(p_item, i);
}
height = MAX(height, p_item->cells[i].text_buf->get_size().y);
for (int j = 0; j < p_item->cells[i].buttons.size(); j++) {
Size2i s; // = cache.button_pressed->get_minimum_size();
s += p_item->cells[i].buttons[j].texture->get_size();
if (s.height > height) {
height = s.height;
}
}

switch (p_item->cells[i].mode) {
case TreeItem::CELL_MODE_CHECK: {
int check_icon_h = theme_cache.checked->get_height();
if (height < check_icon_h) {
height = check_icon_h;
}
[[fallthrough]];
}
case TreeItem::CELL_MODE_STRING:
case TreeItem::CELL_MODE_CUSTOM:
case TreeItem::CELL_MODE_ICON: {
Ref<Texture2D> icon = p_item->cells[i].icon;
if (!icon.is_null()) {
Size2i s = _get_cell_icon_size(p_item->cells[i]);
if (s.height > height) {
height = s.height;
}
}
if (p_item->cells[i].mode == TreeItem::CELL_MODE_CUSTOM && p_item->cells[i].custom_button) {
height += theme_cache.custom_button->get_minimum_size().height;
}

} break;
default: {
}
}
height = MAX(height, p_item->get_minimum_size(i).y);
}
int item_min_height = MAX(theme_cache.font->get_height(theme_cache.font_size), p_item->get_custom_minimum_height());
if (height < item_min_height) {
Expand Down Expand Up @@ -4483,11 +4449,29 @@ TreeItem *Tree::get_last_item() const {
return last;
}

void Tree::_dirty_all() const {
TreeItem *last = root;

while (last) {
for (int i = 0; i < columns.size(); i++) {
last->cells.write[i].cached_minimum_size_dirty = true;
}
if (last->next) {
last = last->next;
} else if (last->first_child && !last->collapsed) {
last = last->first_child;
} else {
break;
}
}
}

void Tree::item_edited(int p_column, TreeItem *p_item, MouseButton p_custom_mouse_index) {
edited_item = p_item;
edited_col = p_column;
if (p_item != nullptr && p_column >= 0 && p_column < p_item->cells.size()) {
edited_item->cells.write[p_column].dirty = true;
edited_item->cells.write[p_column].cached_minimum_size_dirty = true;
}
emit_signal(SNAME("item_edited"));
if (p_custom_mouse_index != MouseButton::NONE) {
Expand Down
2 changes: 2 additions & 0 deletions scene/gui/tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,8 @@ class Tree : public Control {

void _find_button_at_pos(const Point2 &p_pos, TreeItem *&r_item, int &r_column, int &r_index) const;

void _dirty_all() const;

/* float drag_speed;
float drag_accum;
Expand Down
4 changes: 4 additions & 0 deletions scene/resources/text_paragraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1012,6 +1012,10 @@ int TextParagraph::hit_test(const Point2 &p_coords) const {
return TS->shaped_text_get_range(rid).y;
}

bool TextParagraph::is_dirty() {
return lines_dirty;
}

void TextParagraph::draw_dropcap(RID p_canvas, const Vector2 &p_pos, const Color &p_color) const {
_THREAD_SAFE_METHOD_

Expand Down
2 changes: 2 additions & 0 deletions scene/resources/text_paragraph.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ class TextParagraph : public RefCounted {

int hit_test(const Point2 &p_coords) const;

bool is_dirty();

Mutex &get_mutex() const { return _thread_safe_; };

TextParagraph(const String &p_text, const Ref<Font> &p_font, int p_font_size, const String &p_language = "", float p_width = -1.f, TextServer::Direction p_direction = TextServer::DIRECTION_AUTO, TextServer::Orientation p_orientation = TextServer::ORIENTATION_HORIZONTAL);
Expand Down

0 comments on commit e5e11b2

Please sign in to comment.