Change scene drag-and-drop modifier behavior in the 2D and 3D editors
Behavior is now consistent across 2D and 3D editors. - By default, drag-and-dropping adds the scene as a child of the selected node. Hold Alt when releasing the mouse to add the scene as a child of the root node, or Shift to add the scene as a sibling of the selected node. - To choose a different node type in the 2D editor when drag-and-dropping a texture resource, hold Alt + Shift (instead of just Alt). - If multiple nodes are selected, only the first one is taken into account. This was previously the behavior in 2D, but not in 3D (an error dialog appeared instead). This makes the UI more forgiving.
This commit is contained in:
parent
17e7f85c06
commit
341ca31be8
2 changed files with 17 additions and 23 deletions
|
@ -5659,7 +5659,7 @@ void CanvasItemEditorViewport::_create_preview(const Vector<String> &files) cons
|
|||
Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res));
|
||||
if (texture != nullptr || scene != nullptr) {
|
||||
bool root_node_selected = EditorNode::get_singleton()->get_editor_selection()->is_selected(EditorNode::get_singleton()->get_edited_scene());
|
||||
String desc = TTR("Drag and drop to add as child of current scene's root node.") + "\n" + vformat(TTR("Hold %s when dropping to add as child of selected node."), keycode_get_string((Key)KeyModifierMask::CMD_OR_CTRL));
|
||||
String desc = TTR("Drag and drop to add as child of selected node.") + "\n" + TTR("Hold Alt when dropping to add as child of root node.");
|
||||
if (!root_node_selected) {
|
||||
desc += "\n" + TTR("Hold Shift when dropping to add as sibling of selected node.");
|
||||
}
|
||||
|
@ -5670,7 +5670,7 @@ void CanvasItemEditorViewport::_create_preview(const Vector<String> &files) cons
|
|||
preview_node->add_child(sprite);
|
||||
label->show();
|
||||
label_desc->show();
|
||||
desc += "\n" + TTR("Hold Alt when dropping to add as a different node type.");
|
||||
desc += "\n" + TTR("Hold Alt + Shift when dropping to add as a different node type.");
|
||||
label_desc->set_text(desc);
|
||||
} else {
|
||||
if (scene.is_valid()) {
|
||||
|
@ -5963,7 +5963,6 @@ bool CanvasItemEditorViewport::_only_packed_scenes_selected() const {
|
|||
|
||||
void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p_data) {
|
||||
bool is_shift = Input::get_singleton()->is_key_pressed(Key::SHIFT);
|
||||
bool is_ctrl = Input::get_singleton()->is_key_pressed(Key::CMD_OR_CTRL);
|
||||
bool is_alt = Input::get_singleton()->is_key_pressed(Key::ALT);
|
||||
|
||||
selected_files.clear();
|
||||
|
@ -5979,9 +5978,9 @@ void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p
|
|||
Node *root_node = EditorNode::get_singleton()->get_edited_scene();
|
||||
if (selected_nodes.size() > 0) {
|
||||
Node *selected_node = selected_nodes[0];
|
||||
target_node = root_node;
|
||||
if (is_ctrl) {
|
||||
target_node = selected_node;
|
||||
target_node = selected_node;
|
||||
if (is_alt) {
|
||||
target_node = root_node;
|
||||
} else if (is_shift && selected_node != root_node) {
|
||||
target_node = selected_node->get_parent();
|
||||
}
|
||||
|
@ -5995,7 +5994,7 @@ void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p
|
|||
|
||||
drop_pos = p_point;
|
||||
|
||||
if (is_alt && !_only_packed_scenes_selected()) {
|
||||
if (is_alt && is_shift && !_only_packed_scenes_selected()) {
|
||||
_show_resource_type_selector();
|
||||
} else {
|
||||
_perform_drop_data();
|
||||
|
|
|
@ -4530,7 +4530,7 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_
|
|||
}
|
||||
|
||||
bool is_shift = Input::get_singleton()->is_key_pressed(Key::SHIFT);
|
||||
bool is_ctrl = Input::get_singleton()->is_key_pressed(Key::CTRL);
|
||||
bool is_alt = Input::get_singleton()->is_key_pressed(Key::ALT);
|
||||
|
||||
selected_files.clear();
|
||||
Dictionary d = p_data;
|
||||
|
@ -4540,15 +4540,15 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_
|
|||
|
||||
List<Node *> selected_nodes = EditorNode::get_singleton()->get_editor_selection()->get_selected_node_list();
|
||||
Node *root_node = EditorNode::get_singleton()->get_edited_scene();
|
||||
if (selected_nodes.size() == 1) {
|
||||
if (selected_nodes.size() > 0) {
|
||||
Node *selected_node = selected_nodes[0];
|
||||
target_node = root_node;
|
||||
if (is_ctrl) {
|
||||
target_node = selected_node;
|
||||
target_node = selected_node;
|
||||
if (is_alt) {
|
||||
target_node = root_node;
|
||||
} else if (is_shift && selected_node != root_node) {
|
||||
target_node = selected_node->get_parent();
|
||||
}
|
||||
} else if (selected_nodes.size() == 0) {
|
||||
} else {
|
||||
if (root_node) {
|
||||
target_node = root_node;
|
||||
} else {
|
||||
|
@ -4556,11 +4556,6 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_
|
|||
SceneTreeDock::get_singleton()->add_root_node(memnew(Node3D));
|
||||
target_node = get_tree()->get_edited_scene_root();
|
||||
}
|
||||
} else {
|
||||
accept->set_text(TTR("Cannot drag and drop into multiple selected nodes."));
|
||||
accept->popup_centered();
|
||||
_remove_preview_node();
|
||||
return;
|
||||
}
|
||||
|
||||
drop_pos = p_point;
|
||||
|
@ -6500,20 +6495,20 @@ void vertex() {
|
|||
// Points are already in world space, so no need for MODEL_MATRIX anymore.
|
||||
vec4 clip_a = PROJECTION_MATRIX * (VIEW_MATRIX * vec4(point_a, 1.0));
|
||||
vec4 clip_b = PROJECTION_MATRIX * (VIEW_MATRIX * vec4(point_b, 1.0));
|
||||
|
||||
|
||||
vec2 screen_a = VIEWPORT_SIZE * (0.5 * clip_a.xy / clip_a.w + 0.5);
|
||||
vec2 screen_b = VIEWPORT_SIZE * (0.5 * clip_b.xy / clip_b.w + 0.5);
|
||||
|
||||
|
||||
vec2 x_basis = normalize(screen_b - screen_a);
|
||||
vec2 y_basis = vec2(-x_basis.y, x_basis.x);
|
||||
|
||||
|
||||
float width = 3.0;
|
||||
vec2 screen_point_a = screen_a + width * (VERTEX.x * x_basis + VERTEX.y * y_basis);
|
||||
vec2 screen_point_b = screen_b + width * (VERTEX.x * x_basis + VERTEX.y * y_basis);
|
||||
vec2 screen_point_final = mix(screen_point_a, screen_point_b, VERTEX.z);
|
||||
|
||||
|
||||
vec4 clip_final = mix(clip_a, clip_b, VERTEX.z);
|
||||
|
||||
|
||||
POSITION = vec4(clip_final.w * ((2.0 * screen_point_final) / VIEWPORT_SIZE - 1.0), clip_final.z, clip_final.w);
|
||||
UV = VERTEX.yz * clip_final.w;
|
||||
|
||||
|
|
Loading…
Reference in a new issue