Fix FileSystemDock behavior when dropping an item in the current folder

This commit is contained in:
AlexOtsuka 2024-03-31 05:41:31 +02:00
parent f6a78f83aa
commit 0ccc34d351

View File

@ -576,9 +576,9 @@ void FileSystemDock::_notification(int p_what) {
if ((String(dd["favorite"]) == "all")) { if ((String(dd["favorite"]) == "all")) {
tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN); tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN);
} }
} else if ((String(dd["type"]) == "files") || (String(dd["type"]) == "files_and_dirs") || (String(dd["type"]) == "resource")) { } else if ((String(dd["type"]) == "files") || (String(dd["type"]) == "files_and_dirs")) {
tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM | Tree::DROP_MODE_INBETWEEN); tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM | Tree::DROP_MODE_INBETWEEN);
} else if ((String(dd["type"]) == "nodes")) { } else if ((String(dd["type"]) == "nodes") || (String(dd["type"]) == "resource")) {
holding_branch = true; holding_branch = true;
TreeItem *item = tree->get_next_selected(tree->get_root()); TreeItem *item = tree->get_next_selected(tree->get_root());
while (item) { while (item) {
@ -2757,7 +2757,7 @@ bool FileSystemDock::can_drop_data_fw(const Point2 &p_point, const Variant &p_da
String to_dir; String to_dir;
bool favorite; bool favorite;
_get_drag_target_folder(to_dir, favorite, p_point, p_from); _get_drag_target_folder(to_dir, favorite, p_point, p_from);
return !to_dir.is_empty(); return !favorite;
} }
if (drag_data.has("type") && (String(drag_data["type"]) == "files" || String(drag_data["type"]) == "files_and_dirs")) { if (drag_data.has("type") && (String(drag_data["type"]) == "files" || String(drag_data["type"]) == "files_and_dirs")) {
@ -2872,7 +2872,12 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
Ref<Resource> res = drag_data["resource"]; Ref<Resource> res = drag_data["resource"];
String to_dir; String to_dir;
bool favorite; bool favorite;
tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
_get_drag_target_folder(to_dir, favorite, p_point, p_from); _get_drag_target_folder(to_dir, favorite, p_point, p_from);
if (to_dir.is_empty()) {
to_dir = get_current_directory();
}
if (res.is_valid() && !to_dir.is_empty()) { if (res.is_valid() && !to_dir.is_empty()) {
EditorNode::get_singleton()->push_item(res.ptr()); EditorNode::get_singleton()->push_item(res.ptr());
EditorNode::get_singleton()->save_resource_as(res, to_dir); EditorNode::get_singleton()->save_resource_as(res, to_dir);
@ -2918,7 +2923,11 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
if (drag_data.has("type") && String(drag_data["type"]) == "nodes") { if (drag_data.has("type") && String(drag_data["type"]) == "nodes") {
String to_dir; String to_dir;
bool favorite; bool favorite;
tree->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
_get_drag_target_folder(to_dir, favorite, p_point, p_from); _get_drag_target_folder(to_dir, favorite, p_point, p_from);
if (to_dir.is_empty()) {
to_dir = get_current_directory();
}
SceneTreeDock::get_singleton()->save_branch_to_file(to_dir); SceneTreeDock::get_singleton()->save_branch_to_file(to_dir);
} }
} }
@ -2931,6 +2940,7 @@ void FileSystemDock::_get_drag_target_folder(String &target, bool &target_favori
if (p_from == files) { if (p_from == files) {
int pos = files->get_item_at_position(p_point, true); int pos = files->get_item_at_position(p_point, true);
if (pos == -1) { if (pos == -1) {
target = get_current_directory();
return; return;
} }
@ -3454,13 +3464,17 @@ void FileSystemDock::_tree_gui_input(Ref<InputEvent> p_event) {
void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) { void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) {
Ref<InputEventMouseMotion> mm = p_event; Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && holding_branch) { if (mm.is_valid() && holding_branch) {
const int item_idx = files->get_item_at_position(mm->get_position()); const int item_idx = files->get_item_at_position(mm->get_position(), true);
if (item_idx != -1) {
files->deselect_all(); files->deselect_all();
String fpath = files->get_item_metadata(item_idx); String fpath;
if (item_idx != -1) {
fpath = files->get_item_metadata(item_idx);
if (fpath.ends_with("/") || fpath == "res://") { if (fpath.ends_with("/") || fpath == "res://") {
files->select(item_idx); files->select(item_idx);
} }
} else {
fpath = get_current_directory();
}
TreeItem *deselect_item = tree->get_next_selected(tree->get_root()); TreeItem *deselect_item = tree->get_next_selected(tree->get_root());
while (deselect_item) { while (deselect_item) {
@ -3469,7 +3483,8 @@ void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) {
} }
// Try to select the corresponding tree item. // Try to select the corresponding tree item.
TreeItem *tree_item = tree->get_item_with_text(files->get_item_text(item_idx)); TreeItem *tree_item = (item_idx != -1) ? tree->get_item_with_text(files->get_item_text(item_idx)) : nullptr;
if (tree_item) { if (tree_item) {
tree_item->select(0); tree_item->select(0);
} else { } else {
@ -3487,7 +3502,6 @@ void FileSystemDock::_file_list_gui_input(Ref<InputEvent> p_event) {
} }
} }
} }
}
Ref<InputEventKey> key = p_event; Ref<InputEventKey> key = p_event;
if (key.is_valid() && key->is_pressed() && !key->is_echo()) { if (key.is_valid() && key->is_pressed() && !key->is_echo()) {