1
0
Fork 0

Merge pull request #70877 from timothyqiu/tree-scroll

Fix Tree overflow without scrolling being enabled
This commit is contained in:
Rémi Verschelde 2023-01-03 16:15:29 +01:00
commit 0ba3c5453f
No known key found for this signature in database
GPG Key ID: C3336907360768E1
1 changed files with 19 additions and 22 deletions

View File

@ -3847,41 +3847,38 @@ Size2 Tree::get_internal_min_size() const {
} }
void Tree::update_scrollbars() { void Tree::update_scrollbars() {
Size2 size = get_size(); const Size2 size = get_size();
int tbh; const Size2 hmin = h_scroll->get_combined_minimum_size();
if (show_column_titles) { const Size2 vmin = v_scroll->get_combined_minimum_size();
tbh = _get_title_button_height();
} else {
tbh = 0;
}
Size2 hmin = h_scroll->get_combined_minimum_size(); const Rect2 content_rect = Rect2(theme_cache.panel_style->get_offset(), size - theme_cache.panel_style->get_minimum_size());
Size2 vmin = v_scroll->get_combined_minimum_size(); v_scroll->set_begin(content_rect.get_position() + Vector2(content_rect.get_size().x - vmin.width, 0));
v_scroll->set_end(content_rect.get_end() - Vector2(0, hmin.height));
h_scroll->set_begin(content_rect.get_position() + Vector2(0, content_rect.get_size().y - hmin.height));
h_scroll->set_end(content_rect.get_end() - Vector2(vmin.width, 0));
v_scroll->set_begin(Point2(size.width - vmin.width, theme_cache.panel_style->get_margin(SIDE_TOP))); const Size2 internal_min_size = get_internal_min_size();
v_scroll->set_end(Point2(size.width, size.height - theme_cache.panel_style->get_margin(SIDE_TOP) - theme_cache.panel_style->get_margin(SIDE_BOTTOM))); const int title_button_height = _get_title_button_height();
h_scroll->set_begin(Point2(0, size.height - hmin.height)); Size2 tree_content_size = content_rect.get_size() - Vector2(0, title_button_height);
h_scroll->set_end(Point2(size.width - vmin.width, size.height)); bool display_vscroll = internal_min_size.height > tree_content_size.height;
bool display_hscroll = internal_min_size.width > tree_content_size.width;
Size2 internal_min_size = get_internal_min_size();
bool display_vscroll = internal_min_size.height + theme_cache.panel_style->get_margin(SIDE_TOP) > size.height;
bool display_hscroll = internal_min_size.width + theme_cache.panel_style->get_margin(SIDE_LEFT) > size.width;
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
// Check twice, as both values are dependent on each other. // Check twice, as both values are dependent on each other.
if (display_hscroll) { if (display_hscroll) {
display_vscroll = internal_min_size.height + theme_cache.panel_style->get_margin(SIDE_TOP) + hmin.height > size.height; tree_content_size.height = content_rect.get_size().height - title_button_height - hmin.height;
display_vscroll = internal_min_size.height > tree_content_size.height;
} }
if (display_vscroll) { if (display_vscroll) {
display_hscroll = internal_min_size.width + theme_cache.panel_style->get_margin(SIDE_LEFT) + vmin.width > size.width; tree_content_size.width = content_rect.get_size().width - vmin.width;
display_hscroll = internal_min_size.width > tree_content_size.width;
} }
} }
if (display_vscroll) { if (display_vscroll) {
v_scroll->show(); v_scroll->show();
v_scroll->set_max(internal_min_size.height); v_scroll->set_max(internal_min_size.height);
v_scroll->set_page(size.height - hmin.height - tbh); v_scroll->set_page(tree_content_size.height);
theme_cache.offset.y = v_scroll->get_value(); theme_cache.offset.y = v_scroll->get_value();
} else { } else {
v_scroll->hide(); v_scroll->hide();
@ -3891,7 +3888,7 @@ void Tree::update_scrollbars() {
if (display_hscroll) { if (display_hscroll) {
h_scroll->show(); h_scroll->show();
h_scroll->set_max(internal_min_size.width); h_scroll->set_max(internal_min_size.width);
h_scroll->set_page(size.width - vmin.width); h_scroll->set_page(tree_content_size.width);
theme_cache.offset.x = h_scroll->get_value(); theme_cache.offset.x = h_scroll->get_value();
} else { } else {
h_scroll->hide(); h_scroll->hide();