|
@@ -1174,6 +1174,47 @@ void EditorInspectorSection::_notification(int p_what) {
|
|
if (arrow.is_valid()) {
|
|
if (arrow.is_valid()) {
|
|
draw_texture(arrow, Point2(Math::round(arrow_margin * EDSCALE), (h - arrow->get_height()) / 2).floor());
|
|
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;
|
|
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 {
|
|
} else {
|
|
- vbox->hide();
|
|
|
|
|
|
+ fold();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1291,6 +1329,13 @@ EditorInspectorSection::EditorInspectorSection() {
|
|
foldable = false;
|
|
foldable = false;
|
|
vbox = memnew(VBoxContainer);
|
|
vbox = memnew(VBoxContainer);
|
|
vbox_added = false;
|
|
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() {
|
|
EditorInspectorSection::~EditorInspectorSection() {
|