|
@@ -30,6 +30,7 @@
|
|
|
|
|
|
#include "scroll_container.h"
|
|
|
#include "core/os/os.h"
|
|
|
+#include "scene/main/viewport.h"
|
|
|
|
|
|
bool ScrollContainer::clips_input() const {
|
|
|
|
|
@@ -232,6 +233,23 @@ void ScrollContainer::_update_scrollbar_position() {
|
|
|
v_scroll->raise();
|
|
|
}
|
|
|
|
|
|
+void ScrollContainer::_ensure_focused_visible(Control *p_control) {
|
|
|
+
|
|
|
+ if (is_a_parent_of(p_control)) {
|
|
|
+ float right_margin = 0;
|
|
|
+ if (v_scroll->is_visible()) {
|
|
|
+ right_margin += v_scroll->get_size().x;
|
|
|
+ }
|
|
|
+ float bottom_margin = 0;
|
|
|
+ if (h_scroll->is_visible()) {
|
|
|
+ bottom_margin += h_scroll->get_size().y;
|
|
|
+ }
|
|
|
+
|
|
|
+ set_v_scroll(MAX(MIN(p_control->get_begin().y, get_v_scroll()), p_control->get_end().y - get_size().y + bottom_margin));
|
|
|
+ set_h_scroll(MAX(MIN(p_control->get_begin().x, get_h_scroll()), p_control->get_end().x - get_size().x + right_margin));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void ScrollContainer::_notification(int p_what) {
|
|
|
|
|
|
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
|
|
@@ -239,6 +257,11 @@ void ScrollContainer::_notification(int p_what) {
|
|
|
call_deferred("_update_scrollbar_position");
|
|
|
};
|
|
|
|
|
|
+ if (p_what == NOTIFICATION_READY) {
|
|
|
+
|
|
|
+ get_viewport()->connect("gui_focus_changed", this, "_ensure_focused_visible");
|
|
|
+ }
|
|
|
+
|
|
|
if (p_what == NOTIFICATION_SORT_CHILDREN) {
|
|
|
|
|
|
child_max_size = Size2(0, 0);
|
|
@@ -521,6 +544,7 @@ void ScrollContainer::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("set_enable_v_scroll", "enable"), &ScrollContainer::set_enable_v_scroll);
|
|
|
ClassDB::bind_method(D_METHOD("is_v_scroll_enabled"), &ScrollContainer::is_v_scroll_enabled);
|
|
|
ClassDB::bind_method(D_METHOD("_update_scrollbar_position"), &ScrollContainer::_update_scrollbar_position);
|
|
|
+ ClassDB::bind_method(D_METHOD("_ensure_focused_visible"), &ScrollContainer::_ensure_focused_visible);
|
|
|
ClassDB::bind_method(D_METHOD("set_h_scroll", "value"), &ScrollContainer::set_h_scroll);
|
|
|
ClassDB::bind_method(D_METHOD("get_h_scroll"), &ScrollContainer::get_h_scroll);
|
|
|
ClassDB::bind_method(D_METHOD("set_v_scroll", "value"), &ScrollContainer::set_v_scroll);
|