Merge pull request #41138 from EricEzaM/open-inspector-section-on-drag-and-drop-hover

Added ability to unfold editor sections when dragging and dropping.
This commit is contained in:
Rémi Verschelde 2020-08-25 13:15:36 +02:00 committed by GitHub
commit d7c77f6dd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 12 deletions

View File

@ -1174,6 +1174,47 @@ void EditorInspectorSection::_notification(int p_what) {
if (arrow.is_valid()) {
draw_texture(arrow, Point2(Math::round(arrow_margin * EDSCALE), (h - arrow->get_height()) / 2).floor());
}
if (dropping && !vbox->is_visible_in_tree()) {
Color accent_color = get_theme_color("accent_color", "Editor");
draw_rect(Rect2(Point2(), get_size()), accent_color, false);
}
}
if (p_what == NOTIFICATION_DRAG_BEGIN) {
Dictionary dd = get_viewport()->gui_get_drag_data();
// Only allow dropping if the section contains properties which can take the dragged data.
bool children_can_drop = false;
for (int child_idx = 0; child_idx < vbox->get_child_count(); child_idx++) {
Control *editor_property = Object::cast_to<Control>(vbox->get_child(child_idx));
// Test can_drop_data and can_drop_data_fw, since can_drop_data only works if set up with forwarding or if script attached.
if (editor_property && (editor_property->can_drop_data(Point2(), dd) || editor_property->call("can_drop_data_fw", Point2(), dd, this))) {
children_can_drop = true;
break;
}
}
dropping = children_can_drop;
update();
}
if (p_what == NOTIFICATION_DRAG_END) {
dropping = false;
update();
}
if (p_what == NOTIFICATION_MOUSE_ENTER) {
if (dropping) {
dropping_unfold_timer->start();
}
}
if (p_what == NOTIFICATION_MOUSE_EXIT) {
if (dropping) {
dropping_unfold_timer->stop();
}
}
}
@ -1236,14 +1277,11 @@ void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) {
return;
}
_test_unfold();
bool unfold = !object->editor_is_section_unfolded(section);
object->editor_set_section_unfold(section, unfold);
if (unfold) {
vbox->show();
bool should_unfold = !object->editor_is_section_unfolded(section);
if (should_unfold) {
unfold();
} else {
vbox->hide();
fold();
}
}
}
@ -1291,6 +1329,13 @@ EditorInspectorSection::EditorInspectorSection() {
foldable = false;
vbox = memnew(VBoxContainer);
vbox_added = false;
dropping = false;
dropping_unfold_timer = memnew(Timer);
dropping_unfold_timer->set_wait_time(0.6);
dropping_unfold_timer->set_one_shot(true);
add_child(dropping_unfold_timer);
dropping_unfold_timer->connect("timeout", callable_mp(this, &EditorInspectorSection::unfold));
}
EditorInspectorSection::~EditorInspectorSection() {

View File

@ -231,6 +231,9 @@ class EditorInspectorSection : public Container {
Color bg_color;
bool foldable;
Timer *dropping_unfold_timer;
bool dropping;
void _test_unfold();
protected:

View File

@ -2947,11 +2947,9 @@ void EditorPropertyResource::_notification(int p_what) {
}
if (p_what == NOTIFICATION_DRAG_BEGIN) {
if (is_visible_in_tree()) {
if (_is_drop_valid(get_viewport()->gui_get_drag_data())) {
dropping = true;
assign->update();
}
if (_is_drop_valid(get_viewport()->gui_get_drag_data())) {
dropping = true;
assign->update();
}
}