diff options
Diffstat (limited to 'scene/gui/scroll_container.cpp')
-rw-r--r-- | scene/gui/scroll_container.cpp | 50 |
1 files changed, 20 insertions, 30 deletions
diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index 89d308de3f..6f5d0cdcfb 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -43,11 +43,8 @@ Size2 ScrollContainer::get_minimum_size() const { largest_child_min_size = Size2(); for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible()) { - continue; - } - if (c->is_set_as_top_level()) { + Control *c = as_sortable_control(get_child(i)); + if (!c) { continue; } if (c == h_scroll || c == v_scroll) { @@ -56,8 +53,7 @@ Size2 ScrollContainer::get_minimum_size() const { Size2 child_min_size = c->get_combined_minimum_size(); - largest_child_min_size.x = MAX(largest_child_min_size.x, child_min_size.x); - largest_child_min_size.y = MAX(largest_child_min_size.y, child_min_size.y); + largest_child_min_size = largest_child_min_size.max(child_min_size); } if (horizontal_scroll_mode == SCROLL_MODE_DISABLED) { @@ -115,19 +111,19 @@ void ScrollContainer::gui_input(const Ref<InputEvent> &p_gui_input) { if (mb->get_button_index() == MouseButton::WHEEL_UP) { // By default, the vertical orientation takes precedence. This is an exception. if ((h_scroll_enabled && mb->is_shift_pressed()) || v_scroll_hidden) { - h_scroll->set_value(prev_h_scroll - h_scroll->get_page() / 8 * mb->get_factor()); + h_scroll->scroll(-h_scroll->get_page() / 8 * mb->get_factor()); scroll_value_modified = true; } else if (v_scroll_enabled) { - v_scroll->set_value(prev_v_scroll - v_scroll->get_page() / 8 * mb->get_factor()); + v_scroll->scroll(-v_scroll->get_page() / 8 * mb->get_factor()); scroll_value_modified = true; } } if (mb->get_button_index() == MouseButton::WHEEL_DOWN) { if ((h_scroll_enabled && mb->is_shift_pressed()) || v_scroll_hidden) { - h_scroll->set_value(prev_h_scroll + h_scroll->get_page() / 8 * mb->get_factor()); + h_scroll->scroll(h_scroll->get_page() / 8 * mb->get_factor()); scroll_value_modified = true; } else if (v_scroll_enabled) { - v_scroll->set_value(prev_v_scroll + v_scroll->get_page() / 8 * mb->get_factor()); + v_scroll->scroll(v_scroll->get_page() / 8 * mb->get_factor()); scroll_value_modified = true; } } @@ -136,19 +132,19 @@ void ScrollContainer::gui_input(const Ref<InputEvent> &p_gui_input) { if (mb->get_button_index() == MouseButton::WHEEL_LEFT) { // By default, the horizontal orientation takes precedence. This is an exception. if ((v_scroll_enabled && mb->is_shift_pressed()) || h_scroll_hidden) { - v_scroll->set_value(prev_v_scroll - v_scroll->get_page() / 8 * mb->get_factor()); + v_scroll->scroll(-v_scroll->get_page() / 8 * mb->get_factor()); scroll_value_modified = true; } else if (h_scroll_enabled) { - h_scroll->set_value(prev_h_scroll - h_scroll->get_page() / 8 * mb->get_factor()); + h_scroll->scroll(-h_scroll->get_page() / 8 * mb->get_factor()); scroll_value_modified = true; } } if (mb->get_button_index() == MouseButton::WHEEL_RIGHT) { if ((v_scroll_enabled && mb->is_shift_pressed()) || h_scroll_hidden) { - v_scroll->set_value(prev_v_scroll + v_scroll->get_page() / 8 * mb->get_factor()); + v_scroll->scroll(v_scroll->get_page() / 8 * mb->get_factor()); scroll_value_modified = true; } else if (h_scroll_enabled) { - h_scroll->set_value(prev_h_scroll + h_scroll->get_page() / 8 * mb->get_factor()); + h_scroll->scroll(h_scroll->get_page() / 8 * mb->get_factor()); scroll_value_modified = true; } } @@ -214,12 +210,12 @@ void ScrollContainer::gui_input(const Ref<InputEvent> &p_gui_input) { } Vector2 diff = drag_from + drag_accum; if (h_scroll_enabled) { - h_scroll->set_value(diff.x); + h_scroll->scroll_to(diff.x); } else { drag_accum.x = 0; } if (v_scroll_enabled) { - v_scroll->set_value(diff.y); + v_scroll->scroll_to(diff.y); } else { drag_accum.y = 0; } @@ -236,10 +232,10 @@ void ScrollContainer::gui_input(const Ref<InputEvent> &p_gui_input) { Ref<InputEventPanGesture> pan_gesture = p_gui_input; if (pan_gesture.is_valid()) { if (h_scroll_enabled) { - h_scroll->set_value(prev_h_scroll + h_scroll->get_page() * pan_gesture->get_delta().x / 8); + h_scroll->scroll(h_scroll->get_page() * pan_gesture->get_delta().x / 8); } if (v_scroll_enabled) { - v_scroll->set_value(prev_v_scroll + v_scroll->get_page() * pan_gesture->get_delta().y / 8); + v_scroll->scroll(v_scroll->get_page() * pan_gesture->get_delta().y / 8); } if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) { @@ -309,11 +305,8 @@ void ScrollContainer::_reposition_children() { } for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible()) { - continue; - } - if (c->is_set_as_top_level()) { + Control *c = as_sortable_control(get_child(i)); + if (!c) { continue; } if (c == h_scroll || c == v_scroll) { @@ -392,10 +385,10 @@ void ScrollContainer::_notification(int p_what) { } if (horizontal_scroll_mode != SCROLL_MODE_DISABLED) { - h_scroll->set_value(pos.x); + h_scroll->scroll_to(pos.x); } if (vertical_scroll_mode != SCROLL_MODE_DISABLED) { - v_scroll->set_value(pos.y); + v_scroll->scroll_to(pos.y); } float sgn_x = drag_speed.x < 0 ? -1 : 1; @@ -543,13 +536,10 @@ PackedStringArray ScrollContainer::get_configuration_warnings() const { int found = 0; for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); + Control *c = as_sortable_control(get_child(i)); if (!c) { continue; } - if (c->is_set_as_top_level()) { - continue; - } if (c == h_scroll || c == v_scroll) { continue; } |