summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
Diffstat (limited to 'editor')
-rw-r--r--editor/editor_fonts.cpp2
-rw-r--r--editor/editor_help.cpp11
-rw-r--r--editor/editor_node.cpp2
-rw-r--r--editor/editor_properties_array_dict.cpp102
-rw-r--r--editor/editor_properties_array_dict.h7
-rw-r--r--editor/editor_settings.cpp2
-rw-r--r--editor/import/editor_scene_importer_gltf.cpp16
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp8
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp2
-rw-r--r--editor/plugins/script_editor_plugin.cpp4
-rw-r--r--editor/quick_open.cpp10
11 files changed, 146 insertions, 20 deletions
diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp
index 8aadf02ea6..cf00c536a7 100644
--- a/editor/editor_fonts.cpp
+++ b/editor/editor_fonts.cpp
@@ -247,10 +247,12 @@ void editor_register_fonts(Ref<Theme> p_theme) {
MAKE_BOLD_FONT(df_doc_bold, int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE);
MAKE_BOLD_FONT(df_doc_title, int(EDITOR_GET("text_editor/help/help_title_font_size")) * EDSCALE);
MAKE_SOURCE_FONT(df_doc_code, int(EDITOR_GET("text_editor/help/help_source_font_size")) * EDSCALE);
+ MAKE_SOURCE_FONT(df_doc_kbd, (int(EDITOR_GET("text_editor/help/help_source_font_size")) - 1) * EDSCALE);
p_theme->set_font("doc", "EditorFonts", df_doc);
p_theme->set_font("doc_bold", "EditorFonts", df_doc_bold);
p_theme->set_font("doc_title", "EditorFonts", df_doc_title);
p_theme->set_font("doc_source", "EditorFonts", df_doc_code);
+ p_theme->set_font("doc_keyboard", "EditorFonts", df_doc_kbd);
// Ruler font
MAKE_DEFAULT_FONT(df_rulers, 8 * EDSCALE);
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index 050b0a5f33..75d1b2595a 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -1222,11 +1222,14 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
Ref<Font> doc_font = p_rt->get_theme_font("doc", "EditorFonts");
Ref<Font> doc_bold_font = p_rt->get_theme_font("doc_bold", "EditorFonts");
Ref<Font> doc_code_font = p_rt->get_theme_font("doc_source", "EditorFonts");
+ Ref<Font> doc_kbd_font = p_rt->get_theme_font("doc_keyboard", "EditorFonts");
Color font_color_hl = p_rt->get_theme_color("headline_color", "EditorHelp");
Color accent_color = p_rt->get_theme_color("accent_color", "Editor");
+ Color property_color = p_rt->get_theme_color("property_color", "Editor");
Color link_color = accent_color.linear_interpolate(font_color_hl, 0.8);
Color code_color = accent_color.linear_interpolate(font_color_hl, 0.6);
+ Color kbd_color = accent_color.linear_interpolate(property_color, 0.6);
String bbcode = p_bbcode.dedent().replace("\t", "").replace("\r", "").strip_edges();
@@ -1337,6 +1340,14 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
code_tag = true;
pos = brk_end + 1;
tag_stack.push_front(tag);
+ } else if (tag == "kbd") {
+
+ //use keyboard font with custom color
+ p_rt->push_font(doc_kbd_font);
+ p_rt->push_color(kbd_color);
+ code_tag = true; // though not strictly a code tag, logic is similar
+ pos = brk_end + 1;
+ tag_stack.push_front(tag);
} else if (tag == "center") {
//align to center
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index c4584e3dfb..ea2009ab58 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -1195,8 +1195,6 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) {
}
img->convert(Image::FORMAT_RGB8);
- img->flip_y();
-
//save thumbnail directly, as thumbnailer may not update due to actual scene not changing md5
String temp_path = EditorSettings::get_singleton()->get_cache_dir();
String cache_base = ProjectSettings::get_singleton()->globalize_path(p_file).md5_text();
diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp
index fdd5bd8db6..49cffb015f 100644
--- a/editor/editor_properties_array_dict.cpp
+++ b/editor/editor_properties_array_dict.cpp
@@ -412,8 +412,104 @@ void EditorPropertyArray::_remove_pressed(int p_index) {
update_property();
}
+void EditorPropertyArray::_button_draw() {
+ if (dropping) {
+ Color color = get_theme_color("accent_color", "Editor");
+ edit->draw_rect(Rect2(Point2(), edit->get_size()), color, false);
+ }
+}
+
+bool EditorPropertyArray::_is_drop_valid(const Dictionary &p_drag_data) const {
+ String allowed_type = Variant::get_type_name(subtype);
+
+ Dictionary drag_data = p_drag_data;
+
+ if (drag_data.has("type") && String(drag_data["type"]) == "files") {
+
+ Vector<String> files = drag_data["files"];
+
+ for (int i = 0; i < files.size(); i++) {
+ String file = files[i];
+ String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
+
+ for (int j = 0; j < allowed_type.get_slice_count(","); j++) {
+ String at = allowed_type.get_slice(",", j).strip_edges();
+ // Fail if one of the files is not of allowed type
+ if (!ClassDB::is_parent_class(ftype, at)) {
+ return false;
+ }
+ }
+ }
+
+ // If no files fail, drop is valid
+ return true;
+ }
+
+ return false;
+}
+
+bool EditorPropertyArray::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
+
+ return _is_drop_valid(p_data);
+}
+
+void EditorPropertyArray::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+ ERR_FAIL_COND(!_is_drop_valid(p_data));
+
+ Dictionary drag_data = p_data;
+
+ if (drag_data.has("type") && String(drag_data["type"]) == "files") {
+
+ Vector<String> files = drag_data["files"];
+
+ Variant array = object->get_array();
+
+ // Handle the case where array is not initialised yet
+ if (!array.is_array()) {
+ Callable::CallError ce;
+ array = Variant::construct(array_type, nullptr, 0, ce);
+ }
+
+ // Loop the file array and add to existing array
+ for (int i = 0; i < files.size(); i++) {
+ String file = files[i];
+
+ RES res = ResourceLoader::load(file);
+ if (res.is_valid()) {
+ array.call("push_back", res);
+ }
+ }
+
+ if (array.get_type() == Variant::ARRAY) {
+ array = array.call("duplicate");
+ }
+
+ emit_changed(get_edited_property(), array, "", false);
+ object->set_array(array);
+
+ update_property();
+ }
+}
+
void EditorPropertyArray::_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;
+ edit->update();
+ }
+ }
+ }
+
+ if (p_what == NOTIFICATION_DRAG_END) {
+ if (dropping) {
+ dropping = false;
+ edit->update();
+ }
+ }
}
+
void EditorPropertyArray::_edit_pressed() {
Variant array = get_edited_object()->get(get_edited_property());
@@ -490,6 +586,8 @@ void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint
}
void EditorPropertyArray::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &EditorPropertyArray::can_drop_data_fw);
+ ClassDB::bind_method(D_METHOD("drop_data_fw"), &EditorPropertyArray::drop_data_fw);
}
EditorPropertyArray::EditorPropertyArray() {
@@ -503,6 +601,8 @@ EditorPropertyArray::EditorPropertyArray() {
edit->set_clip_text(true);
edit->connect("pressed", callable_mp(this, &EditorPropertyArray::_edit_pressed));
edit->set_toggle_mode(true);
+ edit->set_drag_forwarding(this);
+ edit->connect("draw", callable_mp(this, &EditorPropertyArray::_button_draw));
add_child(edit);
add_focusable(edit);
vbox = nullptr;
@@ -524,6 +624,8 @@ EditorPropertyArray::EditorPropertyArray() {
subtype = Variant::NIL;
subtype_hint = PROPERTY_HINT_NONE;
subtype_hint_string = "";
+
+ dropping = false;
}
///////////////////// DICTIONARY ///////////////////////////
diff --git a/editor/editor_properties_array_dict.h b/editor/editor_properties_array_dict.h
index 51a4be1b3a..d6f3c976f9 100644
--- a/editor/editor_properties_array_dict.h
+++ b/editor/editor_properties_array_dict.h
@@ -33,6 +33,7 @@
#include "editor/editor_inspector.h"
#include "editor/editor_spin_slider.h"
+#include "editor/filesystem_dock.h"
#include "scene/gui/button.h"
class EditorPropertyArrayObject : public Reference {
@@ -82,6 +83,7 @@ class EditorPropertyArray : public EditorProperty {
PopupMenu *change_type;
bool updating;
+ bool dropping;
Ref<EditorPropertyArrayObject> object;
int page_len;
@@ -107,6 +109,11 @@ class EditorPropertyArray : public EditorProperty {
void _object_id_selected(const StringName &p_property, ObjectID p_id);
void _remove_pressed(int p_index);
+ void _button_draw();
+ bool _is_drop_valid(const Dictionary &p_drag_data) const;
+ bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
+ void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
+
protected:
static void _bind_methods();
void _notification(int p_what);
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index 9b58c18f51..5e34913cf0 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -561,6 +561,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
// 3D: Freelook
_initial_set("editors/3d/freelook/freelook_navigation_scheme", false);
hints["editors/3d/freelook/freelook_navigation_scheme"] = PropertyInfo(Variant::INT, "editors/3d/freelook/freelook_navigation_scheme", PROPERTY_HINT_ENUM, "Default,Partially Axis-Locked (id Tech),Fully Axis-Locked (Minecraft)");
+ _initial_set("editors/3d/freelook/freelook_sensitivity", 0.4);
+ hints["editors/3d/freelook/freelook_sensitivity"] = PropertyInfo(Variant::FLOAT, "editors/3d/freelook/freelook_sensitivity", PROPERTY_HINT_RANGE, "0.0, 2, 0.01");
_initial_set("editors/3d/freelook/freelook_inertia", 0.1);
hints["editors/3d/freelook/freelook_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/freelook/freelook_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
_initial_set("editors/3d/freelook/freelook_base_speed", 5.0);
diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp
index 6ad2aa4142..45e376a2aa 100644
--- a/editor/import/editor_scene_importer_gltf.cpp
+++ b/editor/import/editor_scene_importer_gltf.cpp
@@ -1075,24 +1075,15 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array[Mesh::ARRAY_INDEX] = indices;
}
- bool generated_tangents = false;
- Variant erased_indices;
+ bool generate_tangents = (primitive == Mesh::PRIMITIVE_TRIANGLES && !a.has("TANGENT") && a.has("TEXCOORD_0") && a.has("NORMAL"));
- if (primitive == Mesh::PRIMITIVE_TRIANGLES && !a.has("TANGENT") && a.has("TEXCOORD_0") && a.has("NORMAL")) {
+ if (generate_tangents) {
//must generate mikktspace tangents.. ergh..
Ref<SurfaceTool> st;
st.instance();
st->create_from_triangle_arrays(array);
- if (!p.has("targets")) {
- //morph targets should not be reindexed, as array size might differ
- //removing indices is the best bet here
- st->deindex();
- erased_indices = a[Mesh::ARRAY_INDEX];
- a[Mesh::ARRAY_INDEX] = Variant();
- }
st->generate_tangents();
array = st->commit_to_arrays();
- generated_tangents = true;
}
Array morphs;
@@ -1207,10 +1198,9 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array_copy[Mesh::ARRAY_TANGENT] = tangents_v4;
}
- if (generated_tangents) {
+ if (generate_tangents) {
Ref<SurfaceTool> st;
st.instance();
- array_copy[Mesh::ARRAY_INDEX] = erased_indices; //needed for tangent generation, erased by deindex
st->create_from_triangle_arrays(array_copy);
st->deindex();
st->generate_tangents();
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
index db51c5c6ba..0a252cc0a3 100644
--- a/editor/plugins/animation_player_editor_plugin.cpp
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -433,7 +433,9 @@ void AnimationPlayerEditor::_animation_remove() {
if (animation->get_item_count() == 0)
return;
- delete_dialog->set_text(TTR("Delete Animation?"));
+ String current = animation->get_item_text(animation->get_selected());
+
+ delete_dialog->set_text(TTR("Delete Animation '" + current + "'?"));
delete_dialog->popup_centered();
}
@@ -1135,7 +1137,9 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
case TOOL_DUPLICATE_ANIM: {
_animation_duplicate();
- } break;
+
+ [[fallthrough]]; // Allow immediate rename after animation is duplicated
+ }
case TOOL_RENAME_ANIM: {
_animation_rename();
diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp
index af34dd5cab..e0b0fe6b53 100644
--- a/editor/plugins/node_3d_editor_plugin.cpp
+++ b/editor/plugins/node_3d_editor_plugin.cpp
@@ -2166,7 +2166,7 @@ void Node3DEditorViewport::_nav_look(Ref<InputEventWithModifiers> p_event, const
_menu_option(VIEW_PERSPECTIVE);
}
- real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity");
+ real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_sensitivity");
real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel);
bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis");
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index 7af98cf346..80d97e7fa9 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -1866,6 +1866,10 @@ void ScriptEditor::_update_script_names() {
if (new_cur_tab == -1 && sedata[i].index == cur_tab) {
new_cur_tab = i;
}
+ // Update index of sd entries for sorted order
+ _ScriptEditorItemData sd = sedata[i];
+ sd.index = i;
+ sedata.set(i, sd);
}
tab_container->set_current_tab(new_prev_tab);
tab_container->set_current_tab(new_cur_tab);
diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp
index 1b4439f0a8..b872bc3dd4 100644
--- a/editor/quick_open.cpp
+++ b/editor/quick_open.cpp
@@ -113,12 +113,18 @@ void EditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) {
float EditorQuickOpen::_path_cmp(String search, String path) const {
+ // Exact match.
if (search == path) {
return 1.2f;
}
- if (path.findn(search) != -1) {
- return 1.1f;
+
+ // Substring match, with positive bias for matches close to the end of the path.
+ int pos = path.rfindn(search);
+ if (pos != -1) {
+ return 1.1f + 0.09 / (path.length() - pos + 1);
}
+
+ // Similarity.
return path.to_lower().similarity(search.to_lower());
}