Skip to content

Commit

Permalink
create a variable when dropping a resource into the code editor while…
Browse files Browse the repository at this point in the history
… CRTL is held, and fix some inconsistencies
  • Loading branch information
JoNax97 committed Sep 19, 2023
1 parent 7872594 commit d00cc43
Showing 1 changed file with 64 additions and 14 deletions.
78 changes: 64 additions & 14 deletions editor/plugins/script_text_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1716,6 +1716,37 @@ static String _quote_drop_data(const String &str) {
return escaped.quote(using_single_quotes ? "'" : "\"");
}

static String _get_preload_resource_line(const Ref<Resource> &p_resource, bool p_use_type, bool p_create_variable) {
const String &path = p_resource->get_path();

if (!p_create_variable) {
return vformat("preload(%s)", _quote_drop_data(path));
}

StringName class_name = p_resource->get_class_name();
Ref<Script> resource_script = p_resource->get_script();
if (resource_script.is_valid()) {
StringName global_node_script_name = resource_script->get_global_name();
if (global_node_script_name != StringName()) {
class_name = global_node_script_name;
}
}

String variable_name = p_resource->get_name();
if (variable_name.is_empty()) {
variable_name = path.get_file().get_basename();
if (path.contains("::")) {
variable_name += class_name;
}
}
variable_name = variable_name.to_snake_case().validate_identifier();

if (p_use_type) {
return vformat("var %s: %s = preload(%s)", variable_name, class_name, _quote_drop_data(path));
}
return vformat("var %s = preload(%s)", variable_name, _quote_drop_data(path));
}

void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
Dictionary d = p_data;

Expand All @@ -1724,39 +1755,59 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data
int row = pos.y;
int col = pos.x;

const bool use_type = EDITOR_GET("text_editor/completion/add_type_hints");
const bool is_ctrl_pressed = Input::get_singleton()->is_key_pressed(Key::CTRL);
const String &line = te->get_line(row);
const bool is_empty_line = line.is_empty() || te->get_first_non_whitespace_column(row) == line.length();

if (d.has("type") && String(d["type"]) == "resource") {
te->remove_secondary_carets();
Ref<Resource> res = d["resource"];
if (!res.is_valid()) {
Ref<Resource> resource = d["resource"];
if (!resource.is_valid()) {
return;
}

if (res->get_path().is_resource_file()) {
const String &path = resource->get_path();
if (path.is_empty() || path.ends_with("::")) {
EditorNode::get_singleton()->show_warning(TTR("The resource does not have a valid path because it has not been saved.\nPlease save the scene or resource that contains this resource and try again."));
return;
}
if (path.is_resource_file()) {
EditorNode::get_singleton()->show_warning(TTR("Only resources from filesystem can be dropped."));
return;
}

String text_to_drop;
if (is_ctrl_pressed) {
text_to_drop = _get_preload_resource_line(resource, use_type, is_empty_line);
} else {
text_to_drop = _quote_drop_data(path);
}

te->set_caret_line(row);
te->set_caret_column(col);
te->insert_text_at_caret(res->get_path());
te->insert_text_at_caret(text_to_drop);
te->grab_focus();
}

if (d.has("type") && (String(d["type"]) == "files" || String(d["type"]) == "files_and_dirs")) {
te->remove_secondary_carets();
Array files = d["files"];

Array files = d["files"];
String text_to_drop;
bool preload = Input::get_singleton()->is_key_pressed(Key::CTRL);

for (int i = 0; i < files.size(); i++) {
if (i > 0) {
text_to_drop += ", ";
}
const String &path = String(files[i]);

if (preload) {
text_to_drop += "preload(" + _quote_drop_data(String(files[i])) + ")";
if (is_ctrl_pressed && ResourceLoader::exists(path)) {
Ref<Resource> resource = ResourceLoader::load(path);
text_to_drop += _get_preload_resource_line(resource, use_type, is_empty_line);
} else {
text_to_drop += _quote_drop_data(String(files[i]));
text_to_drop += _quote_drop_data(path);
}

if (i < files.size() - 1) {
text_to_drop += is_empty_line ? "\n" : ", ";
}
}

Expand Down Expand Up @@ -1787,8 +1838,7 @@ void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data
Array nodes = d["nodes"];
String text_to_drop;

if (Input::get_singleton()->is_key_pressed(Key::CTRL)) {
bool use_type = EDITOR_GET("text_editor/completion/add_type_hints");
if (is_ctrl_pressed) {
for (int i = 0; i < nodes.size(); i++) {
NodePath np = nodes[i];
Node *node = get_node(np);
Expand Down

0 comments on commit d00cc43

Please sign in to comment.