summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
Diffstat (limited to 'editor')
-rw-r--r--editor/animation_track_editor.cpp2
-rw-r--r--editor/audio_stream_preview.h2
-rw-r--r--editor/code_editor.cpp2
-rw-r--r--editor/collada/collada.h6
-rw-r--r--editor/connections_dialog.cpp5
-rw-r--r--editor/connections_dialog.h6
-rw-r--r--editor/create_dialog.cpp16
-rw-r--r--editor/dependency_editor.cpp4
-rw-r--r--editor/doc/doc_data.cpp16
-rw-r--r--editor/doc/doc_data.h6
-rw-r--r--editor/doc/doc_dump.cpp4
-rw-r--r--editor/doc/doc_dump.h2
-rw-r--r--editor/editor_asset_installer.cpp6
-rw-r--r--editor/editor_audio_buses.cpp4
-rw-r--r--editor/editor_autoload_settings.cpp4
-rw-r--r--editor/editor_data.cpp8
-rw-r--r--editor/editor_data.h6
-rw-r--r--editor/editor_dir_dialog.cpp4
-rw-r--r--editor/editor_dir_dialog.h2
-rw-r--r--editor/editor_export.cpp16
-rw-r--r--editor/editor_export.h4
-rw-r--r--editor/editor_file_dialog.cpp8
-rw-r--r--editor/editor_file_dialog.h2
-rw-r--r--editor/editor_file_system.cpp14
-rw-r--r--editor/editor_file_system.h8
-rw-r--r--editor/editor_help.cpp2
-rw-r--r--editor/editor_initialize_ssl.cpp4
-rw-r--r--editor/editor_inspector.cpp18
-rw-r--r--editor/editor_inspector.h3
-rw-r--r--editor/editor_log.cpp2
-rw-r--r--editor/editor_log.h2
-rw-r--r--editor/editor_name_dialog.cpp4
-rw-r--r--editor/editor_node.cpp22
-rw-r--r--editor/editor_plugin.h4
-rw-r--r--editor/editor_plugin_settings.cpp8
-rw-r--r--editor/editor_plugin_settings.h2
-rw-r--r--editor/editor_profiler.cpp2
-rw-r--r--editor/editor_resource_preview.cpp10
-rw-r--r--editor/editor_resource_preview.h4
-rw-r--r--editor/editor_run.cpp2
-rw-r--r--editor/editor_run.h2
-rw-r--r--editor/editor_run_script.h2
-rw-r--r--editor/editor_scale.cpp2
-rw-r--r--editor/editor_settings.h8
-rw-r--r--editor/editor_spin_slider.cpp4
-rw-r--r--editor/export_template_manager.cpp8
-rw-r--r--editor/file_type_cache.cpp4
-rw-r--r--editor/file_type_cache.h2
-rw-r--r--editor/fileserver/editor_file_server.cpp2
-rw-r--r--editor/fileserver/editor_file_server.h10
-rw-r--r--editor/filesystem_dock.cpp10
-rw-r--r--editor/filesystem_dock.h4
-rw-r--r--editor/groups_editor.h2
-rw-r--r--editor/import/editor_import_collada.cpp2
-rw-r--r--editor/import/editor_import_plugin.h2
-rw-r--r--editor/import/editor_scene_importer_gltf.cpp14
-rw-r--r--editor/import/resource_importer_bitmask.cpp4
-rw-r--r--editor/import/resource_importer_bitmask.h4
-rw-r--r--editor/import/resource_importer_csv_translation.cpp8
-rw-r--r--editor/import/resource_importer_csv_translation.h2
-rw-r--r--editor/import/resource_importer_image.cpp6
-rw-r--r--editor/import/resource_importer_image.h4
-rw-r--r--editor/import/resource_importer_layered_texture.cpp4
-rw-r--r--editor/import/resource_importer_layered_texture.h4
-rw-r--r--editor/import/resource_importer_obj.cpp4
-rw-r--r--editor/import/resource_importer_scene.cpp2
-rw-r--r--editor/import/resource_importer_scene.h2
-rw-r--r--editor/import/resource_importer_texture.cpp4
-rw-r--r--editor/import/resource_importer_texture.h4
-rw-r--r--editor/import/resource_importer_wav.cpp6
-rw-r--r--editor/import/resource_importer_wav.h2
-rw-r--r--editor/output_strings.h2
-rw-r--r--editor/plugins/animation_blend_space_1d_editor.cpp2
-rw-r--r--editor/plugins/animation_blend_space_2d_editor.cpp6
-rw-r--r--editor/plugins/animation_blend_tree_editor_plugin.cpp4
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp8
-rw-r--r--editor/plugins/animation_state_machine_editor.cpp6
-rw-r--r--editor/plugins/animation_tree_editor_plugin.cpp6
-rw-r--r--editor/plugins/animation_tree_player_editor_plugin.cpp4
-rw-r--r--editor/plugins/audio_stream_editor_plugin.cpp4
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp569
-rw-r--r--editor/plugins/canvas_item_editor_plugin.h17
-rw-r--r--editor/plugins/collision_polygon_editor_plugin.cpp6
-rw-r--r--editor/plugins/curve_editor_plugin.cpp6
-rw-r--r--editor/plugins/editor_preview_plugins.cpp6
-rw-r--r--editor/plugins/item_list_editor_plugin.cpp24
-rw-r--r--editor/plugins/item_list_editor_plugin.h4
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.cpp2
-rw-r--r--editor/plugins/particles_2d_editor_plugin.cpp2
-rw-r--r--editor/plugins/particles_editor_plugin.cpp2
-rw-r--r--editor/plugins/path_2d_editor_plugin.cpp4
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp6
-rw-r--r--editor/plugins/resource_preloader_editor_plugin.cpp4
-rw-r--r--editor/plugins/script_editor_plugin.cpp14
-rw-r--r--editor/plugins/script_editor_plugin.h2
-rw-r--r--editor/plugins/script_text_editor.cpp2
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.cpp4
-rw-r--r--editor/plugins/texture_editor_plugin.cpp4
-rw-r--r--editor/plugins/texture_region_editor_plugin.cpp4
-rw-r--r--editor/plugins/theme_editor_plugin.cpp4
-rw-r--r--editor/plugins/tile_map_editor_plugin.cpp4
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp4
-rw-r--r--editor/progress_dialog.cpp4
-rw-r--r--editor/project_export.cpp16
-rw-r--r--editor/project_manager.cpp22
-rw-r--r--editor/project_settings_editor.cpp3
-rw-r--r--editor/property_editor.cpp2684
-rw-r--r--editor/property_editor.h174
-rw-r--r--editor/property_selector.cpp2
-rw-r--r--editor/pvrtc_compress.cpp8
-rw-r--r--editor/pvrtc_compress.h2
-rw-r--r--editor/quick_open.cpp2
-rw-r--r--editor/quick_open.h2
-rw-r--r--editor/rename_dialog.cpp2
-rw-r--r--editor/rename_dialog.h2
-rw-r--r--editor/reparent_dialog.cpp2
-rw-r--r--editor/scene_tree_dock.cpp7
-rw-r--r--editor/scene_tree_editor.cpp4
-rw-r--r--editor/scene_tree_editor.h2
-rw-r--r--editor/script_create_dialog.cpp14
-rw-r--r--editor/script_editor_debugger.cpp10
-rw-r--r--editor/script_editor_debugger.h6
-rw-r--r--editor/settings_config_dialog.cpp4
-rw-r--r--editor/spatial_editor_gizmos.cpp57
124 files changed, 704 insertions, 3445 deletions
diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp
index 4c4830ad7a..ac28fb9b99 100644
--- a/editor/animation_track_editor.cpp
+++ b/editor/animation_track_editor.cpp
@@ -30,11 +30,11 @@
#include "animation_track_editor.h"
#include "animation_track_editor_plugins.h"
+#include "core/os/keyboard.h"
#include "editor/animation_bezier_editor.h"
#include "editor/plugins/animation_player_editor_plugin.h"
#include "editor_node.h"
#include "editor_scale.h"
-#include "os/keyboard.h"
#include "scene/main/viewport.h"
#include "servers/audio/audio_stream.h"
diff --git a/editor/audio_stream_preview.h b/editor/audio_stream_preview.h
index a014f2f571..1a8f2eaa15 100644
--- a/editor/audio_stream_preview.h
+++ b/editor/audio_stream_preview.h
@@ -31,7 +31,7 @@
#ifndef AUDIO_STREAM_PREVIEW_H
#define AUDIO_STREAM_PREVIEW_H
-#include "os/thread.h"
+#include "core/os/thread.h"
#include "scene/main/node.h"
#include "servers/audio/audio_stream.h"
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index 2fecf24d7d..80bc73bc12 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -30,10 +30,10 @@
#include "code_editor.h"
+#include "core/os/keyboard.h"
#include "editor/editor_scale.h"
#include "editor_node.h"
#include "editor_settings.h"
-#include "os/keyboard.h"
#include "scene/gui/margin_container.h"
#include "scene/gui/separator.h"
#include "scene/resources/dynamic_font.h"
diff --git a/editor/collada/collada.h b/editor/collada/collada.h
index 7535162f74..b777fa04c2 100644
--- a/editor/collada/collada.h
+++ b/editor/collada/collada.h
@@ -33,9 +33,9 @@
#ifndef COLLADA_H
#define COLLADA_H
-#include "io/xml_parser.h"
-#include "map.h"
-#include "project_settings.h"
+#include "core/io/xml_parser.h"
+#include "core/map.h"
+#include "core/project_settings.h"
#include "scene/resources/material.h"
class Collada {
diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp
index 85965768cc..18c4dd85a1 100644
--- a/editor/connections_dialog.cpp
+++ b/editor/connections_dialog.cpp
@@ -30,10 +30,10 @@
#include "connections_dialog.h"
+#include "core/print_string.h"
#include "editor_node.h"
#include "editor_settings.h"
#include "plugins/script_editor_plugin.h"
-#include "print_string.h"
#include "scene/gui/label.h"
#include "scene/gui/popup_menu.h"
@@ -341,8 +341,7 @@ ConnectDialog::ConnectDialog() {
vbc_right->add_margin_child(TTR("Add Extra Call Argument:"), add_bind_hb);
- bind_editor = memnew(PropertyEditor);
- bind_editor->hide_top_label();
+ bind_editor = memnew(EditorInspector);
vbc_right->add_margin_child(TTR("Extra Call Arguments:"), bind_editor, true);
diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h
index 932ff693e4..c2fd1f1d09 100644
--- a/editor/connections_dialog.h
+++ b/editor/connections_dialog.h
@@ -35,7 +35,8 @@
#ifndef CONNECTIONS_DIALOG_H
#define CONNECTIONS_DIALOG_H
-#include "editor/property_editor.h"
+#include "core/undo_redo.h"
+#include "editor/editor_inspector.h"
#include "editor/scene_tree_editor.h"
#include "scene/gui/button.h"
#include "scene/gui/check_button.h"
@@ -44,7 +45,6 @@
#include "scene/gui/menu_button.h"
#include "scene/gui/popup.h"
#include "scene/gui/tree.h"
-#include "undo_redo.h"
class PopupMenu;
class ConnectDialogBinds;
@@ -62,7 +62,7 @@ class ConnectDialog : public ConfirmationDialog {
SceneTreeEditor *tree;
ConfirmationDialog *error;
- PropertyEditor *bind_editor;
+ EditorInspector *bind_editor;
OptionButton *type_list;
CheckButton *deferred;
CheckButton *oneshot;
diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp
index fd607e5b63..8bef94d8a8 100644
--- a/editor/create_dialog.cpp
+++ b/editor/create_dialog.cpp
@@ -30,12 +30,12 @@
#include "create_dialog.h"
-#include "class_db.h"
+#include "core/class_db.h"
+#include "core/os/keyboard.h"
+#include "core/print_string.h"
#include "editor_help.h"
#include "editor_node.h"
#include "editor_settings.h"
-#include "os/keyboard.h"
-#include "print_string.h"
#include "scene/gui/box_container.h"
void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode) {
@@ -244,17 +244,17 @@ void CreateDialog::add_type(const String &p_type, HashMap<String, TreeItem *> &p
bool is_search_subsequence = search_box->get_text().is_subsequence_ofi(p_type);
String to_select_type = *to_select ? (*to_select)->get_text(0) : "";
to_select_type = to_select_type.split(" ")[0];
- bool current_item_is_preffered;
+ bool current_item_is_preferred;
if (cpp_type) {
- current_item_is_preffered = ClassDB::is_parent_class(p_type, preferred_search_result_type) && !ClassDB::is_parent_class(to_select_type, preferred_search_result_type);
+ current_item_is_preferred = ClassDB::is_parent_class(p_type, preferred_search_result_type) && !ClassDB::is_parent_class(to_select_type, preferred_search_result_type) && search_box->get_text() != to_select_type;
} else {
- current_item_is_preffered = ed.script_class_is_parent(p_type, preferred_search_result_type) && !ed.script_class_is_parent(to_select_type, preferred_search_result_type);
+ current_item_is_preferred = ed.script_class_is_parent(p_type, preferred_search_result_type) && !ed.script_class_is_parent(to_select_type, preferred_search_result_type) && search_box->get_text() != to_select_type;
}
if (*to_select && p_type.length() < (*to_select)->get_text(0).length()) {
- current_item_is_preffered = true;
+ current_item_is_preferred = true;
}
- if (((!*to_select || current_item_is_preffered) && is_search_subsequence) || search_box->get_text() == p_type) {
+ if (((!*to_select || current_item_is_preferred) && is_search_subsequence) || search_box->get_text() == p_type) {
*to_select = item;
}
}
diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp
index 62ae14c988..9f04d40763 100644
--- a/editor/dependency_editor.cpp
+++ b/editor/dependency_editor.cpp
@@ -30,9 +30,9 @@
#include "dependency_editor.h"
+#include "core/io/resource_loader.h"
+#include "core/os/file_access.h"
#include "editor_node.h"
-#include "io/resource_loader.h"
-#include "os/file_access.h"
#include "scene/gui/margin_container.h"
void DependencyEditor::_notification(int p_what) {
diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp
index c90b2b14b3..599f46d6d9 100644
--- a/editor/doc/doc_data.cpp
+++ b/editor/doc/doc_data.cpp
@@ -30,15 +30,15 @@
#include "doc_data.h"
-#include "engine.h"
-#include "global_constants.h"
-#include "io/compression.h"
-#include "io/marshalls.h"
-#include "os/dir_access.h"
-#include "project_settings.h"
+#include "core/engine.h"
+#include "core/global_constants.h"
+#include "core/io/compression.h"
+#include "core/io/marshalls.h"
+#include "core/os/dir_access.h"
+#include "core/project_settings.h"
+#include "core/script_language.h"
+#include "core/version.h"
#include "scene/resources/theme.h"
-#include "script_language.h"
-#include "version.h"
void DocData::merge_from(const DocData &p_data) {
diff --git a/editor/doc/doc_data.h b/editor/doc/doc_data.h
index c7b70b5fb9..6633c123e6 100644
--- a/editor/doc/doc_data.h
+++ b/editor/doc/doc_data.h
@@ -31,9 +31,9 @@
#ifndef DOC_DATA_H
#define DOC_DATA_H
-#include "io/xml_parser.h"
-#include "map.h"
-#include "variant.h"
+#include "core/io/xml_parser.h"
+#include "core/map.h"
+#include "core/variant.h"
class DocData {
public:
diff --git a/editor/doc/doc_dump.cpp b/editor/doc/doc_dump.cpp
index 06d35c4d3a..86fd9b436b 100644
--- a/editor/doc/doc_dump.cpp
+++ b/editor/doc/doc_dump.cpp
@@ -30,9 +30,9 @@
#include "doc_dump.h"
-#include "os/file_access.h"
+#include "core/os/file_access.h"
+#include "core/version.h"
#include "scene/main/node.h"
-#include "version.h"
static void _write_string(FileAccess *f, int p_tablevel, const String &p_string) {
diff --git a/editor/doc/doc_dump.h b/editor/doc/doc_dump.h
index 48cf1a587b..99398b5d96 100644
--- a/editor/doc/doc_dump.h
+++ b/editor/doc/doc_dump.h
@@ -31,7 +31,7 @@
#ifndef DOC_DUMP_H
#define DOC_DUMP_H
-#include "class_db.h"
+#include "core/class_db.h"
class DocDump {
public:
diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp
index d99908a3c3..6af45f26ae 100644
--- a/editor/editor_asset_installer.cpp
+++ b/editor/editor_asset_installer.cpp
@@ -30,10 +30,10 @@
#include "editor_asset_installer.h"
+#include "core/io/zip_io.h"
+#include "core/os/dir_access.h"
+#include "core/os/file_access.h"
#include "editor_node.h"
-#include "io/zip_io.h"
-#include "os/dir_access.h"
-#include "os/file_access.h"
void EditorAssetInstaller::_update_subitems(TreeItem *p_item, bool p_check, bool p_first) {
diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp
index 9c775be87e..96110b61ab 100644
--- a/editor/editor_audio_buses.cpp
+++ b/editor/editor_audio_buses.cpp
@@ -30,10 +30,10 @@
#include "editor_audio_buses.h"
+#include "core/io/resource_saver.h"
+#include "core/os/keyboard.h"
#include "editor_node.h"
#include "filesystem_dock.h"
-#include "io/resource_saver.h"
-#include "os/keyboard.h"
#include "servers/audio_server.h"
void EditorAudioBus::_notification(int p_what) {
diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp
index d12c85861b..1374c8c9aa 100644
--- a/editor/editor_autoload_settings.cpp
+++ b/editor/editor_autoload_settings.cpp
@@ -30,9 +30,9 @@
#include "editor_autoload_settings.h"
+#include "core/global_constants.h"
+#include "core/project_settings.h"
#include "editor_node.h"
-#include "global_constants.h"
-#include "project_settings.h"
#include "scene/main/viewport.h"
#include "scene/resources/packed_scene.h"
diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp
index 69c120bb3c..6187c6b318 100644
--- a/editor/editor_data.cpp
+++ b/editor/editor_data.cpp
@@ -30,12 +30,12 @@
#include "editor_data.h"
+#include "core/io/resource_loader.h"
+#include "core/os/dir_access.h"
+#include "core/os/file_access.h"
+#include "core/project_settings.h"
#include "editor_node.h"
#include "editor_settings.h"
-#include "io/resource_loader.h"
-#include "os/dir_access.h"
-#include "os/file_access.h"
-#include "project_settings.h"
#include "scene/resources/packed_scene.h"
void EditorHistory::cleanup_history() {
diff --git a/editor/editor_data.h b/editor/editor_data.h
index 285769aa78..9f5d3e2a15 100644
--- a/editor/editor_data.h
+++ b/editor/editor_data.h
@@ -31,12 +31,12 @@
#ifndef EDITOR_DATA_H
#define EDITOR_DATA_H
+#include "core/list.h"
+#include "core/pair.h"
+#include "core/undo_redo.h"
#include "editor/editor_plugin.h"
#include "editor/plugins/script_editor_plugin.h"
-#include "list.h"
-#include "pair.h"
#include "scene/resources/texture.h"
-#include "undo_redo.h"
class EditorHistory {
diff --git a/editor/editor_dir_dialog.cpp b/editor/editor_dir_dialog.cpp
index c094b2b559..6f80b6bea4 100644
--- a/editor/editor_dir_dialog.cpp
+++ b/editor/editor_dir_dialog.cpp
@@ -30,11 +30,11 @@
#include "editor_dir_dialog.h"
+#include "core/os/keyboard.h"
+#include "core/os/os.h"
#include "editor/editor_file_system.h"
#include "editor/editor_settings.h"
#include "editor_scale.h"
-#include "os/keyboard.h"
-#include "os/os.h"
void EditorDirDialog::_update_dir(TreeItem *p_item, EditorFileSystemDirectory *p_dir, const String &p_select_path) {
updating = true;
diff --git a/editor/editor_dir_dialog.h b/editor/editor_dir_dialog.h
index 7c19e7de38..a9dc7accfe 100644
--- a/editor/editor_dir_dialog.h
+++ b/editor/editor_dir_dialog.h
@@ -31,8 +31,8 @@
#ifndef EDITOR_DIR_DIALOG_H
#define EDITOR_DIR_DIALOG_H
+#include "core/os/dir_access.h"
#include "editor/editor_file_system.h"
-#include "os/dir_access.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/tree.h"
diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp
index 441c09620e..455c889224 100644
--- a/editor/editor_export.cpp
+++ b/editor/editor_export.cpp
@@ -30,20 +30,20 @@
#include "editor_export.h"
+#include "core/io/config_file.h"
+#include "core/io/resource_loader.h"
+#include "core/io/resource_saver.h"
+#include "core/io/zip_io.h"
+#include "core/os/file_access.h"
+#include "core/project_settings.h"
+#include "core/script_language.h"
+#include "core/version.h"
#include "editor/editor_file_system.h"
#include "editor/plugins/script_editor_plugin.h"
#include "editor_node.h"
#include "editor_settings.h"
-#include "io/config_file.h"
-#include "io/resource_loader.h"
-#include "io/resource_saver.h"
-#include "io/zip_io.h"
-#include "os/file_access.h"
-#include "project_settings.h"
#include "scene/resources/scene_format_text.h"
-#include "script_language.h"
#include "thirdparty/misc/md5.h"
-#include "version.h"
static int _get_pad(int p_alignment, int p_n) {
diff --git a/editor/editor_export.h b/editor/editor_export.h
index b984d66a1b..420f383f95 100644
--- a/editor/editor_export.h
+++ b/editor/editor_export.h
@@ -31,8 +31,8 @@
#ifndef EDITOR_EXPORT_H
#define EDITOR_EXPORT_H
-#include "os/dir_access.h"
-#include "resource.h"
+#include "core/os/dir_access.h"
+#include "core/resource.h"
#include "scene/main/node.h"
#include "scene/main/timer.h"
#include "scene/resources/texture.h"
diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp
index d240f4ed25..3659a06bb7 100644
--- a/editor/editor_file_dialog.cpp
+++ b/editor/editor_file_dialog.cpp
@@ -29,14 +29,14 @@
/*************************************************************************/
#include "editor_file_dialog.h"
+#include "core/os/file_access.h"
+#include "core/os/keyboard.h"
+#include "core/os/os.h"
+#include "core/print_string.h"
#include "dependency_editor.h"
#include "editor_resource_preview.h"
#include "editor_scale.h"
#include "editor_settings.h"
-#include "os/file_access.h"
-#include "os/keyboard.h"
-#include "os/os.h"
-#include "print_string.h"
#include "scene/gui/center_container.h"
#include "scene/gui/label.h"
#include "scene/gui/margin_container.h"
diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h
index b1f8f1108c..61eeff9162 100644
--- a/editor/editor_file_dialog.h
+++ b/editor/editor_file_dialog.h
@@ -31,7 +31,7 @@
#ifndef EDITORFILEDIALOG_H
#define EDITORFILEDIALOG_H
-#include "os/dir_access.h"
+#include "core/os/dir_access.h"
#include "scene/gui/box_container.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/item_list.h"
diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp
index 9562a8c63c..351ca6f435 100644
--- a/editor/editor_file_system.cpp
+++ b/editor/editor_file_system.cpp
@@ -30,16 +30,16 @@
#include "editor_file_system.h"
+#include "core/io/resource_import.h"
+#include "core/io/resource_loader.h"
+#include "core/io/resource_saver.h"
+#include "core/os/file_access.h"
+#include "core/os/os.h"
+#include "core/project_settings.h"
+#include "core/variant_parser.h"
#include "editor_node.h"
#include "editor_resource_preview.h"
#include "editor_settings.h"
-#include "io/resource_import.h"
-#include "io/resource_loader.h"
-#include "io/resource_saver.h"
-#include "os/file_access.h"
-#include "os/os.h"
-#include "project_settings.h"
-#include "variant_parser.h"
EditorFileSystem *EditorFileSystem::singleton = NULL;
diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h
index 75ca79932f..f2f72eddbd 100644
--- a/editor/editor_file_system.h
+++ b/editor/editor_file_system.h
@@ -31,11 +31,11 @@
#ifndef EDITOR_FILE_SYSTEM_H
#define EDITOR_FILE_SYSTEM_H
-#include "os/dir_access.h"
-#include "os/thread.h"
-#include "os/thread_safe.h"
+#include "core/os/dir_access.h"
+#include "core/os/thread.h"
+#include "core/os/thread_safe.h"
+#include "core/set.h"
#include "scene/main/node.h"
-#include "set.h"
class FileAccess;
struct EditorProgressBG;
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index d84b9bff91..8d371714cf 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -30,11 +30,11 @@
#include "editor_help.h"
+#include "core/os/keyboard.h"
#include "doc_data_compressed.gen.h"
#include "editor/plugins/script_editor_plugin.h"
#include "editor_node.h"
#include "editor_settings.h"
-#include "os/keyboard.h"
#define CONTRIBUTE_URL "http://docs.godotengine.org/en/latest/community/contributing/updating_the_class_reference.html"
#define CONTRIBUTE2_URL "https://github.com/godotengine/godot-docs"
diff --git a/editor/editor_initialize_ssl.cpp b/editor/editor_initialize_ssl.cpp
index aedbfb7bd7..9f7537cc9a 100644
--- a/editor/editor_initialize_ssl.cpp
+++ b/editor/editor_initialize_ssl.cpp
@@ -31,8 +31,8 @@
#include "editor_initialize_ssl.h"
#include "certs_compressed.gen.h"
-#include "io/compression.h"
-#include "io/stream_peer_ssl.h"
+#include "core/io/compression.h"
+#include "core/io/stream_peer_ssl.h"
void editor_initialize_certificates() {
diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp
index 852e1930d2..929028c499 100644
--- a/editor/editor_inspector.cpp
+++ b/editor/editor_inspector.cpp
@@ -38,7 +38,6 @@
// TODO:
// arrays and dictionary
-// replace property editor in sectionedpropertyeditor
Size2 EditorProperty::get_minimum_size() const {
@@ -1138,7 +1137,6 @@ void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) {
return;
#ifdef TOOLS_ENABLED
-
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
@@ -1167,7 +1165,6 @@ void EditorInspectorSection::unfold() {
_test_unfold();
#ifdef TOOLS_ENABLED
-
object->editor_set_section_unfold(section, true);
vbox->show();
update();
@@ -1180,8 +1177,8 @@ void EditorInspectorSection::fold() {
if (!vbox_added)
return; //kinda pointless
-#ifdef TOOLS_ENABLED
+#ifdef TOOLS_ENABLED
object->editor_set_section_unfold(section, false);
vbox->hide();
update();
@@ -1202,7 +1199,6 @@ EditorInspectorSection::EditorInspectorSection() {
foldable = false;
vbox = memnew(VBoxContainer);
vbox_added = false;
- //add_child(vbox);
}
EditorInspectorSection::~EditorInspectorSection() {
@@ -1607,12 +1603,6 @@ void EditorInspector::update_tree() {
doc_hint = descr;
}
-#if 0
- if (p.name == selected_property) {
-
- item->select(1);
- }
-#endif
for (List<Ref<EditorInspectorPlugin> >::Element *E = valid_plugins.front(); E; E = E->next()) {
Ref<EditorInspectorPlugin> ped = E->get();
bool exclusive = ped->parse_property(object, p.type, p.name, p.hint, p.hint_string, p.usage);
@@ -1812,12 +1802,6 @@ void EditorInspector::_filter_changed(const String &p_text) {
update_tree();
}
-void EditorInspector::set_subsection_selectable(bool p_selectable) {
-}
-
-void EditorInspector::set_property_selectable(bool p_selectable) {
-}
-
void EditorInspector::set_use_folding(bool p_enable) {
use_folding = p_enable;
update_tree();
diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h
index ebe2124a40..dccbdb9a73 100644
--- a/editor/editor_inspector.h
+++ b/editor/editor_inspector.h
@@ -349,9 +349,6 @@ public:
void set_use_filter(bool p_use);
void register_text_enter(Node *p_line_edit);
- void set_subsection_selectable(bool p_selectable);
- void set_property_selectable(bool p_selectable);
-
void set_use_folding(bool p_enable);
bool is_using_folding();
diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp
index b3ec717d85..3fc35810df 100644
--- a/editor/editor_log.cpp
+++ b/editor/editor_log.cpp
@@ -31,10 +31,10 @@
#include "editor_log.h"
#include "core/os/keyboard.h"
+#include "core/version.h"
#include "editor_node.h"
#include "scene/gui/center_container.h"
#include "scene/resources/dynamic_font.h"
-#include "version.h"
void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type) {
diff --git a/editor/editor_log.h b/editor/editor_log.h
index 8d0310d914..78a5671d29 100644
--- a/editor/editor_log.h
+++ b/editor/editor_log.h
@@ -36,7 +36,7 @@
#include "scene/gui/rich_text_label.h"
#include "scene/gui/texture_button.h"
//#include "scene/gui/empty_control.h"
-#include "os/thread.h"
+#include "core/os/thread.h"
#include "pane_drag.h"
#include "scene/gui/box_container.h"
#include "scene/gui/panel_container.h"
diff --git a/editor/editor_name_dialog.cpp b/editor/editor_name_dialog.cpp
index bacb288273..1ef61802c4 100644
--- a/editor/editor_name_dialog.cpp
+++ b/editor/editor_name_dialog.cpp
@@ -30,8 +30,8 @@
#include "editor_name_dialog.h"
-#include "class_db.h"
-#include "os/keyboard.h"
+#include "core/class_db.h"
+#include "core/os/keyboard.h"
void EditorNameDialog::_line_gui_input(const Ref<InputEvent> &p_event) {
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index 353dce5b20..7359cf598a 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -1174,6 +1174,16 @@ void EditorNode::_dialog_action(String p_file) {
int scene_idx = (current_option == FILE_SAVE_SCENE || current_option == FILE_SAVE_AS_SCENE) ? -1 : tab_closing;
if (file->get_mode() == EditorFileDialog::MODE_SAVE_FILE) {
+ bool same_open_scene = false;
+ for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
+ if (editor_data.get_scene_path(i) == p_file && i != scene_idx)
+ same_open_scene = true;
+ }
+
+ if (same_open_scene) {
+ show_warning(TTR("Can't overwrite scene that is still open!"));
+ return;
+ }
_save_default_environment();
_save_scene_with_preview(p_file, scene_idx);
@@ -2068,7 +2078,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} break;
case RUN_PROJECT_DATA_FOLDER: {
- OS::get_singleton()->shell_open(OS::get_singleton()->get_user_data_dir());
+ OS::get_singleton()->shell_open(String("file://") + OS::get_singleton()->get_user_data_dir());
} break;
case FILE_QUIT:
case RUN_PROJECT_MANAGER: {
@@ -2204,11 +2214,11 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} break;
case SETTINGS_EDITOR_DATA_FOLDER: {
- OS::get_singleton()->shell_open(EditorSettings::get_singleton()->get_data_dir());
+ OS::get_singleton()->shell_open(String("file://") + EditorSettings::get_singleton()->get_data_dir());
} break;
case SETTINGS_EDITOR_CONFIG_FOLDER: {
- OS::get_singleton()->shell_open(EditorSettings::get_singleton()->get_settings_dir());
+ OS::get_singleton()->shell_open(String("file://") + EditorSettings::get_singleton()->get_settings_dir());
} break;
case SETTINGS_MANAGE_EXPORT_TEMPLATES: {
@@ -2747,6 +2757,8 @@ void EditorNode::set_current_scene(int p_idx) {
Dictionary state = editor_data.restore_edited_scene_state(editor_selection, &editor_history);
_edit_current();
+ _update_title();
+
call_deferred("_set_main_scene_state", state, get_edited_scene()); //do after everything else is done setting up
}
@@ -5634,10 +5646,6 @@ EditorNode::EditorNode() {
add_editor_plugin(memnew(SkeletonIKEditorPlugin(this)));
add_editor_plugin(memnew(PhysicalBonePlugin(this)));
- // FIXME: Disabled as (according to reduz) users were complaining that it gets in the way
- // Waiting for PropertyEditor rewrite (planned for 3.1) to be refactored.
- //add_editor_plugin(memnew(MaterialEditorPlugin(this)));
-
for (int i = 0; i < EditorPlugins::get_plugin_count(); i++)
add_editor_plugin(EditorPlugins::create(i, this));
diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h
index 1ebddbe2b0..6c385abf9b 100644
--- a/editor/editor_plugin.h
+++ b/editor/editor_plugin.h
@@ -31,15 +31,15 @@
#ifndef EDITOR_PLUGIN_H
#define EDITOR_PLUGIN_H
+#include "core/io/config_file.h"
+#include "core/undo_redo.h"
#include "editor/editor_inspector.h"
#include "editor/import/editor_import_plugin.h"
#include "editor/import/resource_importer_scene.h"
#include "editor/script_create_dialog.h"
-#include "io/config_file.h"
#include "scene/gui/tool_button.h"
#include "scene/main/node.h"
#include "scene/resources/texture.h"
-#include "undo_redo.h"
/**
@author Juan Linietsky <reduzio@gmail.com>
diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp
index 68f8ed6d94..ef0b61e882 100644
--- a/editor/editor_plugin_settings.cpp
+++ b/editor/editor_plugin_settings.cpp
@@ -30,11 +30,11 @@
#include "editor_plugin_settings.h"
+#include "core/io/config_file.h"
+#include "core/os/file_access.h"
+#include "core/os/main_loop.h"
+#include "core/project_settings.h"
#include "editor_node.h"
-#include "io/config_file.h"
-#include "os/file_access.h"
-#include "os/main_loop.h"
-#include "project_settings.h"
#include "scene/gui/margin_container.h"
void EditorPluginSettings::_notification(int p_what) {
diff --git a/editor/editor_plugin_settings.h b/editor/editor_plugin_settings.h
index 194fac6b92..fe14f87cfc 100644
--- a/editor/editor_plugin_settings.h
+++ b/editor/editor_plugin_settings.h
@@ -31,11 +31,11 @@
#ifndef EDITORPLUGINSETTINGS_H
#define EDITORPLUGINSETTINGS_H
+#include "core/undo_redo.h"
#include "editor/plugin_config_dialog.h"
#include "editor_data.h"
#include "property_editor.h"
#include "scene/gui/dialogs.h"
-#include "undo_redo.h"
class EditorPluginSettings : public VBoxContainer {
diff --git a/editor/editor_profiler.cpp b/editor/editor_profiler.cpp
index 223bb9df84..b57e3826c6 100644
--- a/editor/editor_profiler.cpp
+++ b/editor/editor_profiler.cpp
@@ -30,9 +30,9 @@
#include "editor_profiler.h"
+#include "core/os/os.h"
#include "editor_scale.h"
#include "editor_settings.h"
-#include "os/os.h"
void EditorProfiler::_make_metric_ptrs(Metric &m) {
diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp
index bc56a95b47..edfee595ea 100644
--- a/editor/editor_resource_preview.cpp
+++ b/editor/editor_resource_preview.cpp
@@ -30,13 +30,13 @@
#include "editor_resource_preview.h"
+#include "core/io/resource_loader.h"
+#include "core/io/resource_saver.h"
+#include "core/message_queue.h"
+#include "core/os/file_access.h"
+#include "core/project_settings.h"
#include "editor_scale.h"
#include "editor_settings.h"
-#include "io/resource_loader.h"
-#include "io/resource_saver.h"
-#include "message_queue.h"
-#include "os/file_access.h"
-#include "project_settings.h"
bool EditorResourcePreviewGenerator::handles(const String &p_type) const {
diff --git a/editor/editor_resource_preview.h b/editor/editor_resource_preview.h
index 74841b1a1e..434b26e901 100644
--- a/editor/editor_resource_preview.h
+++ b/editor/editor_resource_preview.h
@@ -31,8 +31,8 @@
#ifndef EDITORRESOURCEPREVIEW_H
#define EDITORRESOURCEPREVIEW_H
-#include "os/semaphore.h"
-#include "os/thread.h"
+#include "core/os/semaphore.h"
+#include "core/os/thread.h"
#include "scene/main/node.h"
#include "scene/resources/texture.h"
diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp
index 62870ab35c..ad5cf49f3f 100644
--- a/editor/editor_run.cpp
+++ b/editor/editor_run.cpp
@@ -30,8 +30,8 @@
#include "editor_run.h"
+#include "core/project_settings.h"
#include "editor_settings.h"
-#include "project_settings.h"
EditorRun::Status EditorRun::get_status() const {
diff --git a/editor/editor_run.h b/editor/editor_run.h
index 8da607e6dc..df2324efd7 100644
--- a/editor/editor_run.h
+++ b/editor/editor_run.h
@@ -31,7 +31,7 @@
#ifndef EDITOR_RUN_H
#define EDITOR_RUN_H
-#include "os/os.h"
+#include "core/os/os.h"
#include "scene/main/node.h"
class EditorRun {
public:
diff --git a/editor/editor_run_script.h b/editor/editor_run_script.h
index 027fdd428d..892d5151a0 100644
--- a/editor/editor_run_script.h
+++ b/editor/editor_run_script.h
@@ -31,8 +31,8 @@
#ifndef EDITOR_RUN_SCRIPT_H
#define EDITOR_RUN_SCRIPT_H
+#include "core/reference.h"
#include "editor_plugin.h"
-#include "reference.h"
class EditorNode;
class EditorScript : public Reference {
diff --git a/editor/editor_scale.cpp b/editor/editor_scale.cpp
index 365ea95e3e..ba1607b408 100644
--- a/editor/editor_scale.cpp
+++ b/editor/editor_scale.cpp
@@ -30,7 +30,7 @@
#include "editor_scale.h"
-#include "os/os.h"
+#include "core/os/os.h"
static float scale = 1.0;
diff --git a/editor/editor_settings.h b/editor/editor_settings.h
index e5b61abf54..8165c36e67 100644
--- a/editor/editor_settings.h
+++ b/editor/editor_settings.h
@@ -31,13 +31,13 @@
#ifndef EDITOR_SETTINGS_H
#define EDITOR_SETTINGS_H
-#include "object.h"
+#include "core/object.h"
#include "core/io/config_file.h"
-#include "os/thread_safe.h"
-#include "resource.h"
+#include "core/os/thread_safe.h"
+#include "core/resource.h"
+#include "core/translation.h"
#include "scene/gui/shortcut.h"
-#include "translation.h"
class EditorPlugin;
diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp
index b2c9f9865a..b5353a071c 100644
--- a/editor/editor_spin_slider.cpp
+++ b/editor/editor_spin_slider.cpp
@@ -29,9 +29,9 @@
/*************************************************************************/
#include "editor_spin_slider.h"
+#include "core/math/expression.h"
+#include "core/os/input.h"
#include "editor_scale.h"
-#include "math/expression.h"
-#include "os/input.h"
String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const {
return rtos(get_value());
diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp
index 6c9d1568fa..52611367f6 100644
--- a/editor/export_template_manager.cpp
+++ b/editor/export_template_manager.cpp
@@ -30,14 +30,14 @@
#include "export_template_manager.h"
+#include "core/io/json.h"
+#include "core/io/zip_io.h"
+#include "core/os/dir_access.h"
#include "core/os/input.h"
#include "core/os/keyboard.h"
+#include "core/version.h"
#include "editor_node.h"
#include "editor_scale.h"
-#include "io/json.h"
-#include "io/zip_io.h"
-#include "os/dir_access.h"
-#include "version.h"
void ExportTemplateManager::_update_template_list() {
diff --git a/editor/file_type_cache.cpp b/editor/file_type_cache.cpp
index 02e647b733..0e328247ac 100644
--- a/editor/file_type_cache.cpp
+++ b/editor/file_type_cache.cpp
@@ -30,8 +30,8 @@
#include "file_type_cache.h"
-#include "os/file_access.h"
-#include "project_settings.h"
+#include "core/os/file_access.h"
+#include "core/project_settings.h"
FileTypeCache *FileTypeCache::singleton = NULL;
diff --git a/editor/file_type_cache.h b/editor/file_type_cache.h
index 33b50cb1c4..aa2d78f763 100644
--- a/editor/file_type_cache.h
+++ b/editor/file_type_cache.h
@@ -31,7 +31,7 @@
#ifndef FILE_TYPE_CACHE_H
#define FILE_TYPE_CACHE_H
-#include "object.h"
+#include "core/object.h"
class FileTypeCache : Object {
diff --git a/editor/fileserver/editor_file_server.cpp b/editor/fileserver/editor_file_server.cpp
index 28b1095256..d6e89d0573 100644
--- a/editor/fileserver/editor_file_server.cpp
+++ b/editor/fileserver/editor_file_server.cpp
@@ -31,7 +31,7 @@
#include "editor_file_server.h"
#include "../editor_settings.h"
-#include "io/marshalls.h"
+#include "core/io/marshalls.h"
//#define DEBUG_PRINT(m_p) print_line(m_p)
//#define DEBUG_TIME(m_what) printf("MS: %s - %lu\n", m_what, OS::get_singleton()->get_ticks_usec());
diff --git a/editor/fileserver/editor_file_server.h b/editor/fileserver/editor_file_server.h
index d73c78ee70..8e32c3c82f 100644
--- a/editor/fileserver/editor_file_server.h
+++ b/editor/fileserver/editor_file_server.h
@@ -31,11 +31,11 @@
#ifndef EDITOR_FILE_SERVER_H
#define EDITOR_FILE_SERVER_H
-#include "io/file_access_network.h"
-#include "io/packet_peer.h"
-#include "io/tcp_server.h"
-#include "object.h"
-#include "os/thread.h"
+#include "core/io/file_access_network.h"
+#include "core/io/packet_peer.h"
+#include "core/io/tcp_server.h"
+#include "core/object.h"
+#include "core/os/thread.h"
class EditorFileServer : public Object {
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
index cb38c2f85e..3a55966e7b 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -30,14 +30,14 @@
#include "filesystem_dock.h"
+#include "core/io/resource_loader.h"
+#include "core/os/dir_access.h"
+#include "core/os/file_access.h"
#include "core/os/keyboard.h"
+#include "core/os/os.h"
+#include "core/project_settings.h"
#include "editor_node.h"
#include "editor_settings.h"
-#include "io/resource_loader.h"
-#include "os/dir_access.h"
-#include "os/file_access.h"
-#include "os/os.h"
-#include "project_settings.h"
#include "scene/main/viewport.h"
bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths) {
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
index fbbe87fc16..40be645bf7 100644
--- a/editor/filesystem_dock.h
+++ b/editor/filesystem_dock.h
@@ -44,8 +44,8 @@
#include "scene/gui/tree.h"
#include "scene/main/timer.h"
-#include "os/dir_access.h"
-#include "os/thread.h"
+#include "core/os/dir_access.h"
+#include "core/os/thread.h"
#include "create_dialog.h"
diff --git a/editor/groups_editor.h b/editor/groups_editor.h
index 461cf0f8c2..7705b3b6fb 100644
--- a/editor/groups_editor.h
+++ b/editor/groups_editor.h
@@ -31,6 +31,7 @@
#ifndef GROUPS_EDITOR_H
#define GROUPS_EDITOR_H
+#include "core/undo_redo.h"
#include "editor/scene_tree_editor.h"
#include "scene/gui/button.h"
#include "scene/gui/dialogs.h"
@@ -39,7 +40,6 @@
#include "scene/gui/popup.h"
#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
-#include "undo_redo.h"
/**
@author Juan Linietsky <reduzio@gmail.com>
diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp
index d4bd4f85e6..31c1886d32 100644
--- a/editor/import/editor_import_collada.cpp
+++ b/editor/import/editor_import_collada.cpp
@@ -30,9 +30,9 @@
#include "editor_import_collada.h"
+#include "core/os/os.h"
#include "editor/collada/collada.h"
#include "editor/editor_node.h"
-#include "os/os.h"
#include "scene/3d/camera.h"
#include "scene/3d/light.h"
#include "scene/3d/mesh_instance.h"
diff --git a/editor/import/editor_import_plugin.h b/editor/import/editor_import_plugin.h
index 92d83158ef..b850c0605b 100644
--- a/editor/import/editor_import_plugin.h
+++ b/editor/import/editor_import_plugin.h
@@ -31,7 +31,7 @@
#ifndef EDITOR_IMPORT_PLUGIN_H
#define EDITOR_IMPORT_PLUGIN_H
-#include "io/resource_import.h"
+#include "core/io/resource_import.h"
class EditorImportPlugin : public ResourceImporter {
GDCLASS(EditorImportPlugin, Reference)
diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp
index 3d3dc978bc..85383fd69d 100644
--- a/editor/import/editor_scene_importer_gltf.cpp
+++ b/editor/import/editor_scene_importer_gltf.cpp
@@ -29,10 +29,10 @@
/*************************************************************************/
#include "editor_scene_importer_gltf.h"
-#include "io/json.h"
-#include "math_defs.h"
-#include "os/file_access.h"
-#include "os/os.h"
+#include "core/io/json.h"
+#include "core/math/math_defs.h"
+#include "core/os/file_access.h"
+#include "core/os/os.h"
#include "scene/3d/camera.h"
#include "scene/3d/mesh_instance.h"
#include "scene/animation/animation_player.h"
@@ -1876,9 +1876,9 @@ T EditorSceneImporterGLTF::_interpolate_track(const Vector<float> &p_times, cons
float c = (p_time - p_times[idx]) / (p_times[idx + 1] - p_times[idx]);
T from = p_values[idx * 3 + 1];
- T c1 = from + p_values[idx * 3 + 0];
- T to = p_values[idx * 3 + 3];
- T c2 = to + p_values[idx * 3 + 2];
+ T c1 = from + p_values[idx * 3 + 2];
+ T to = p_values[idx * 3 + 4];
+ T c2 = to + p_values[idx * 3 + 3];
return interp.bezier(from, c1, c2, to, c);
diff --git a/editor/import/resource_importer_bitmask.cpp b/editor/import/resource_importer_bitmask.cpp
index 7b330936f6..917d6d1bcc 100644
--- a/editor/import/resource_importer_bitmask.cpp
+++ b/editor/import/resource_importer_bitmask.cpp
@@ -30,10 +30,10 @@
#include "resource_importer_bitmask.h"
#include "core/image.h"
+#include "core/io/config_file.h"
+#include "core/io/image_loader.h"
#include "editor/editor_file_system.h"
#include "editor/editor_node.h"
-#include "io/config_file.h"
-#include "io/image_loader.h"
#include "scene/resources/bit_mask.h"
#include "scene/resources/texture.h"
diff --git a/editor/import/resource_importer_bitmask.h b/editor/import/resource_importer_bitmask.h
index f3537df819..1b97152099 100644
--- a/editor/import/resource_importer_bitmask.h
+++ b/editor/import/resource_importer_bitmask.h
@@ -31,8 +31,8 @@
#ifndef RESOURCE_IMPORTER_BITMASK_H
#define RESOURCE_IMPORTER_BITMASK_H
-#include "image.h"
-#include "io/resource_import.h"
+#include "core/image.h"
+#include "core/io/resource_import.h"
class StreamBitMap;
diff --git a/editor/import/resource_importer_csv_translation.cpp b/editor/import/resource_importer_csv_translation.cpp
index cf850eef03..e7f9e1afe6 100644
--- a/editor/import/resource_importer_csv_translation.cpp
+++ b/editor/import/resource_importer_csv_translation.cpp
@@ -30,10 +30,10 @@
#include "resource_importer_csv_translation.h"
-#include "compressed_translation.h"
-#include "io/resource_saver.h"
-#include "os/file_access.h"
-#include "translation.h"
+#include "core/compressed_translation.h"
+#include "core/io/resource_saver.h"
+#include "core/os/file_access.h"
+#include "core/translation.h"
String ResourceImporterCSVTranslation::get_importer_name() const {
diff --git a/editor/import/resource_importer_csv_translation.h b/editor/import/resource_importer_csv_translation.h
index f5f230c6bd..370c182f65 100644
--- a/editor/import/resource_importer_csv_translation.h
+++ b/editor/import/resource_importer_csv_translation.h
@@ -31,7 +31,7 @@
#ifndef RESOURCEIMPORTERCSVTRANSLATION_H
#define RESOURCEIMPORTERCSVTRANSLATION_H
-#include "io/resource_import.h"
+#include "core/io/resource_import.h"
class ResourceImporterCSVTranslation : public ResourceImporter {
GDCLASS(ResourceImporterCSVTranslation, ResourceImporter)
diff --git a/editor/import/resource_importer_image.cpp b/editor/import/resource_importer_image.cpp
index e42f9eaf51..923a9a20ec 100644
--- a/editor/import/resource_importer_image.cpp
+++ b/editor/import/resource_importer_image.cpp
@@ -30,9 +30,9 @@
#include "resource_importer_image.h"
-#include "io/image_loader.h"
-#include "io/resource_saver.h"
-#include "os/file_access.h"
+#include "core/io/image_loader.h"
+#include "core/io/resource_saver.h"
+#include "core/os/file_access.h"
#include "scene/resources/texture.h"
String ResourceImporterImage::get_importer_name() const {
diff --git a/editor/import/resource_importer_image.h b/editor/import/resource_importer_image.h
index 5df1231239..d282ac482d 100644
--- a/editor/import/resource_importer_image.h
+++ b/editor/import/resource_importer_image.h
@@ -31,8 +31,8 @@
#ifndef RESOURCE_IMPORTER_IMAGE_H
#define RESOURCE_IMPORTER_IMAGE_H
-#include "image.h"
-#include "io/resource_import.h"
+#include "core/image.h"
+#include "core/io/resource_import.h"
class ResourceImporterImage : public ResourceImporter {
GDCLASS(ResourceImporterImage, ResourceImporter)
diff --git a/editor/import/resource_importer_layered_texture.cpp b/editor/import/resource_importer_layered_texture.cpp
index eeaa002f04..a0ed27c72c 100644
--- a/editor/import/resource_importer_layered_texture.cpp
+++ b/editor/import/resource_importer_layered_texture.cpp
@@ -32,10 +32,10 @@
#include "resource_importer_texture.h"
+#include "core/io/config_file.h"
+#include "core/io/image_loader.h"
#include "editor/editor_file_system.h"
#include "editor/editor_node.h"
-#include "io/config_file.h"
-#include "io/image_loader.h"
#include "scene/resources/texture.h"
String ResourceImporterLayeredTexture::get_importer_name() const {
diff --git a/editor/import/resource_importer_layered_texture.h b/editor/import/resource_importer_layered_texture.h
index d3a3b6d1ad..a4b83bf56c 100644
--- a/editor/import/resource_importer_layered_texture.h
+++ b/editor/import/resource_importer_layered_texture.h
@@ -31,8 +31,8 @@
#ifndef RESOURCE_IMPORTER_LAYERED_TEXTURE_H
#define RESOURCE_IMPORTER_LAYERED_TEXTURE_H
-#include "image.h"
-#include "io/resource_import.h"
+#include "core/image.h"
+#include "core/io/resource_import.h"
class StreamTexture;
diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp
index 3f101cd04d..b18bbc8ce9 100644
--- a/editor/import/resource_importer_obj.cpp
+++ b/editor/import/resource_importer_obj.cpp
@@ -30,8 +30,8 @@
#include "resource_importer_obj.h"
-#include "io/resource_saver.h"
-#include "os/file_access.h"
+#include "core/io/resource_saver.h"
+#include "core/os/file_access.h"
#include "scene/3d/mesh_instance.h"
#include "scene/3d/spatial.h"
#include "scene/resources/mesh.h"
diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp
index f544811eb0..6d72cb4909 100644
--- a/editor/import/resource_importer_scene.cpp
+++ b/editor/import/resource_importer_scene.cpp
@@ -30,8 +30,8 @@
#include "resource_importer_scene.h"
+#include "core/io/resource_saver.h"
#include "editor/editor_node.h"
-#include "io/resource_saver.h"
#include "scene/resources/packed_scene.h"
#include "scene/3d/collision_shape.h"
diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h
index 2bde9432fc..b046e2e975 100644
--- a/editor/import/resource_importer_scene.h
+++ b/editor/import/resource_importer_scene.h
@@ -31,7 +31,7 @@
#ifndef RESOURCEIMPORTERSCENE_H
#define RESOURCEIMPORTERSCENE_H
-#include "io/resource_import.h"
+#include "core/io/resource_import.h"
#include "scene/resources/animation.h"
#include "scene/resources/mesh.h"
#include "scene/resources/shape.h"
diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp
index af2615f9cf..acca1725d7 100644
--- a/editor/import/resource_importer_texture.cpp
+++ b/editor/import/resource_importer_texture.cpp
@@ -30,10 +30,10 @@
#include "resource_importer_texture.h"
+#include "core/io/config_file.h"
+#include "core/io/image_loader.h"
#include "editor/editor_file_system.h"
#include "editor/editor_node.h"
-#include "io/config_file.h"
-#include "io/image_loader.h"
#include "scene/resources/texture.h"
void ResourceImporterTexture::_texture_reimport_srgb(const Ref<StreamTexture> &p_tex) {
diff --git a/editor/import/resource_importer_texture.h b/editor/import/resource_importer_texture.h
index fd6f75c3f4..b49b29874d 100644
--- a/editor/import/resource_importer_texture.h
+++ b/editor/import/resource_importer_texture.h
@@ -31,8 +31,8 @@
#ifndef RESOURCEIMPORTTEXTURE_H
#define RESOURCEIMPORTTEXTURE_H
-#include "image.h"
-#include "io/resource_import.h"
+#include "core/image.h"
+#include "core/io/resource_import.h"
class StreamTexture;
diff --git a/editor/import/resource_importer_wav.cpp b/editor/import/resource_importer_wav.cpp
index d04f29ea5e..55f4cc7439 100644
--- a/editor/import/resource_importer_wav.cpp
+++ b/editor/import/resource_importer_wav.cpp
@@ -30,9 +30,9 @@
#include "resource_importer_wav.h"
-#include "io/marshalls.h"
-#include "io/resource_saver.h"
-#include "os/file_access.h"
+#include "core/io/marshalls.h"
+#include "core/io/resource_saver.h"
+#include "core/os/file_access.h"
#include "scene/resources/audio_stream_sample.h"
String ResourceImporterWAV::get_importer_name() const {
diff --git a/editor/import/resource_importer_wav.h b/editor/import/resource_importer_wav.h
index f78ab09e9b..a630ff732e 100644
--- a/editor/import/resource_importer_wav.h
+++ b/editor/import/resource_importer_wav.h
@@ -31,7 +31,7 @@
#ifndef RESOURCEIMPORTWAV_H
#define RESOURCEIMPORTWAV_H
-#include "io/resource_import.h"
+#include "core/io/resource_import.h"
class ResourceImporterWAV : public ResourceImporter {
GDCLASS(ResourceImporterWAV, ResourceImporter)
diff --git a/editor/output_strings.h b/editor/output_strings.h
index 0729971704..4833f2067e 100644
--- a/editor/output_strings.h
+++ b/editor/output_strings.h
@@ -31,7 +31,7 @@
#ifndef OUTPUT_STRINGS_H
#define OUTPUT_STRINGS_H
-#include "map.h"
+#include "core/map.h"
#include "scene/gui/control.h"
#include "scene/gui/scroll_bar.h"
diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp
index 10c19d8173..4b1e710705 100644
--- a/editor/plugins/animation_blend_space_1d_editor.cpp
+++ b/editor/plugins/animation_blend_space_1d_editor.cpp
@@ -30,7 +30,7 @@
#include "animation_blend_space_1d_editor.h"
-#include "os/keyboard.h"
+#include "core/os/keyboard.h"
#include "scene/animation/animation_blend_tree.h"
StringName AnimationNodeBlendSpace1DEditor::get_blend_position_path() const {
diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp
index 6dbba2ba80..c4f8cdc3d7 100644
--- a/editor/plugins/animation_blend_space_2d_editor.cpp
+++ b/editor/plugins/animation_blend_space_2d_editor.cpp
@@ -31,10 +31,10 @@
#include "animation_blend_space_2d_editor.h"
#include "core/io/resource_loader.h"
+#include "core/math/delaunay.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "core/project_settings.h"
-#include "math/delaunay.h"
-#include "os/input.h"
-#include "os/keyboard.h"
#include "scene/animation/animation_blend_tree.h"
#include "scene/animation/animation_player.h"
#include "scene/gui/menu_button.h"
diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp
index 66142a1e05..4d27a5cea4 100644
--- a/editor/plugins/animation_blend_tree_editor_plugin.cpp
+++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -31,10 +31,10 @@
#include "animation_blend_tree_editor_plugin.h"
#include "core/io/resource_loader.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "core/project_settings.h"
#include "editor/editor_inspector.h"
-#include "os/input.h"
-#include "os/keyboard.h"
#include "scene/animation/animation_player.h"
#include "scene/gui/menu_button.h"
#include "scene/gui/panel.h"
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
index 9ab5436de8..bd7b58f65a 100644
--- a/editor/plugins/animation_player_editor_plugin.cpp
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -30,12 +30,12 @@
#include "animation_player_editor_plugin.h"
+#include "core/io/resource_loader.h"
+#include "core/io/resource_saver.h"
+#include "core/os/keyboard.h"
+#include "core/project_settings.h"
#include "editor/animation_track_editor.h"
#include "editor/editor_settings.h"
-#include "io/resource_loader.h"
-#include "io/resource_saver.h"
-#include "os/keyboard.h"
-#include "project_settings.h"
// For onion skinning
#include "editor/plugins/canvas_item_editor_plugin.h"
diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp
index 0788921910..d00c06bd12 100644
--- a/editor/plugins/animation_state_machine_editor.cpp
+++ b/editor/plugins/animation_state_machine_editor.cpp
@@ -31,10 +31,10 @@
#include "animation_state_machine_editor.h"
#include "core/io/resource_loader.h"
+#include "core/math/delaunay.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "core/project_settings.h"
-#include "math/delaunay.h"
-#include "os/input.h"
-#include "os/keyboard.h"
#include "scene/animation/animation_blend_tree.h"
#include "scene/animation/animation_player.h"
#include "scene/gui/menu_button.h"
diff --git a/editor/plugins/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp
index 90e5adc680..24787a78e9 100644
--- a/editor/plugins/animation_tree_editor_plugin.cpp
+++ b/editor/plugins/animation_tree_editor_plugin.cpp
@@ -35,10 +35,10 @@
#include "animation_blend_tree_editor_plugin.h"
#include "animation_state_machine_editor.h"
#include "core/io/resource_loader.h"
+#include "core/math/delaunay.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "core/project_settings.h"
-#include "math/delaunay.h"
-#include "os/input.h"
-#include "os/keyboard.h"
#include "scene/animation/animation_blend_tree.h"
#include "scene/animation/animation_player.h"
#include "scene/gui/menu_button.h"
diff --git a/editor/plugins/animation_tree_player_editor_plugin.cpp b/editor/plugins/animation_tree_player_editor_plugin.cpp
index 36d10ab99e..c79e3a436d 100644
--- a/editor/plugins/animation_tree_player_editor_plugin.cpp
+++ b/editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -31,9 +31,9 @@
#include "animation_tree_player_editor_plugin.h"
#include "core/io/resource_loader.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "core/project_settings.h"
-#include "os/input.h"
-#include "os/keyboard.h"
#include "scene/gui/menu_button.h"
#include "scene/gui/panel.h"
#include "scene/main/viewport.h"
diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp
index 454a5d72f2..06ca5833e2 100644
--- a/editor/plugins/audio_stream_editor_plugin.cpp
+++ b/editor/plugins/audio_stream_editor_plugin.cpp
@@ -30,9 +30,9 @@
#include "audio_stream_editor_plugin.h"
+#include "core/io/resource_loader.h"
+#include "core/project_settings.h"
#include "editor/editor_settings.h"
-#include "io/resource_loader.h"
-#include "project_settings.h"
void AudioStreamEditor::_notification(int p_what) {
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index 72248b62a3..7fe9f429b0 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -30,15 +30,15 @@
#include "canvas_item_editor_plugin.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
+#include "core/print_string.h"
+#include "core/project_settings.h"
#include "editor/editor_node.h"
#include "editor/editor_settings.h"
#include "editor/plugins/animation_player_editor_plugin.h"
#include "editor/plugins/script_editor_plugin.h"
#include "editor/script_editor_debugger.h"
-#include "os/input.h"
-#include "os/keyboard.h"
-#include "print_string.h"
-#include "project_settings.h"
#include "scene/2d/light_2d.h"
#include "scene/2d/particles_2d.h"
#include "scene/2d/polygon_2d.h"
@@ -55,6 +55,7 @@
#define MAX_ZOOM 100
#define RULER_WIDTH 15 * EDSCALE
+#define SCALE_HANDLE_DISTANCE 25
class SnapDialog : public ConfirmationDialog {
@@ -335,10 +336,11 @@ void CanvasItemEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
if (!is_visible_in_tree() || get_viewport()->gui_has_modal_stack())
return;
- if (k->get_control())
- return;
+ if (k->get_scancode() == KEY_CONTROL || k->get_scancode() == KEY_ALT || k->get_scancode() == KEY_SHIFT) {
+ viewport->update();
+ }
- if (k->is_pressed() && !k->is_echo()) {
+ if (k->is_pressed() && !k->get_control() && !k->is_echo()) {
if ((snap_grid || show_grid) && multiply_grid_step_shortcut.is_valid() && multiply_grid_step_shortcut->is_shortcut(p_ev)) {
// Multiply the grid size
grid_step_multiplier = MIN(grid_step_multiplier + 1, 12);
@@ -667,7 +669,7 @@ List<CanvasItem *> CanvasItemEditor::_get_edited_canvas_items(bool retreive_lock
List<CanvasItem *> selection;
for (Map<Node *, Object *>::Element *E = editor_selection->get_selection().front(); E; E = E->next()) {
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->key());
- if (canvas_item && canvas_item->is_visible_in_tree() && canvas_item->get_viewport() == EditorNode::get_singleton()->get_scene_root() && (!retreive_locked || !canvas_item->has_meta("_edit_lock_"))) {
+ if (canvas_item && canvas_item->is_visible_in_tree() && canvas_item->get_viewport() == EditorNode::get_singleton()->get_scene_root() && (retreive_locked || !canvas_item->has_meta("_edit_lock_"))) {
CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item);
if (se) {
selection.push_back(canvas_item);
@@ -1267,7 +1269,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) {
if (drag_type == DRAG_NONE) {
if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed()) {
drag_selection = _get_edited_canvas_items();
- if (drag_selection.size() > 0 && ((b->get_control() && tool == TOOL_SELECT) || tool == TOOL_ROTATE)) {
+ if (drag_selection.size() > 0 && ((b->get_control() && !b->get_alt() && tool == TOOL_SELECT) || tool == TOOL_ROTATE)) {
drag_type = DRAG_ROTATE;
drag_from = transform.affine_inverse().xform(b->get_position());
CanvasItem *canvas_item = drag_selection[0];
@@ -1615,6 +1617,89 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) {
return false;
}
+bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) {
+
+ Ref<InputEventMouseButton> b = p_event;
+ Ref<InputEventMouseMotion> m = p_event;
+
+ // Drag resize handles
+ if (drag_type == DRAG_NONE) {
+ if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed() && ((b->get_alt() && b->get_control()) || tool == TOOL_SCALE)) {
+ List<CanvasItem *> selection = _get_edited_canvas_items();
+ if (selection.size() == 1) {
+ CanvasItem *canvas_item = selection[0];
+
+ Transform2D xform = transform * canvas_item->get_global_transform_with_canvas();
+ Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * Transform2D(canvas_item->_edit_get_rotation(), canvas_item->_edit_get_position())).orthonormalized();
+ Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
+
+ Size2 scale_factor = Size2(SCALE_HANDLE_DISTANCE, SCALE_HANDLE_DISTANCE);
+ Rect2 x_handle_rect = Rect2(scale_factor.x * EDSCALE, -5 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
+ if (x_handle_rect.has_point(simple_xform.affine_inverse().xform(b->get_position()))) {
+ drag_type = DRAG_SCALE_X;
+ }
+ Rect2 y_handle_rect = Rect2(-5 * EDSCALE, -(scale_factor.y + 10) * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
+ if (y_handle_rect.has_point(simple_xform.affine_inverse().xform(b->get_position()))) {
+ drag_type = DRAG_SCALE_Y;
+ }
+ if (drag_type == DRAG_SCALE_X || drag_type == DRAG_SCALE_Y) {
+ drag_from = transform.affine_inverse().xform(b->get_position());
+ drag_selection = List<CanvasItem *>();
+ drag_selection.push_back(canvas_item);
+ _save_canvas_item_state(drag_selection);
+ return true;
+ }
+ }
+ }
+ }
+
+ if (drag_type == DRAG_SCALE_X || drag_type == DRAG_SCALE_Y) {
+ // Resize the node
+ if (m.is_valid()) {
+ _restore_canvas_item_state(drag_selection, true);
+ CanvasItem *canvas_item = drag_selection[0];
+
+ drag_to = transform.affine_inverse().xform(m->get_position());
+
+ bool uniform = m->get_shift();
+ Point2 offset = drag_to - drag_from;
+ Size2 scale = canvas_item->call("get_scale");
+ float ratio = scale.y / scale.x;
+ if (drag_type == DRAG_SCALE_X) {
+ scale.x += offset.x / SCALE_HANDLE_DISTANCE;
+ if (uniform) {
+ scale.y = scale.x * ratio;
+ }
+ canvas_item->call("set_scale", scale);
+
+ } else if (drag_type == DRAG_SCALE_Y) {
+ scale.y -= offset.y / SCALE_HANDLE_DISTANCE;
+ if (uniform) {
+ scale.x = scale.y / ratio;
+ }
+ canvas_item->call("set_scale", scale);
+ }
+ }
+
+ // Confirm resize
+ if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && !b->is_pressed()) {
+ _commit_canvas_item_state(drag_selection, TTR("Scale CanvasItem"));
+ drag_type = DRAG_NONE;
+ viewport->update();
+ return true;
+ }
+
+ // Cancel a drag
+ if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) {
+ _restore_canvas_item_state(drag_selection);
+ drag_type = DRAG_NONE;
+ viewport->update();
+ return true;
+ }
+ }
+ return false;
+}
+
bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> b = p_event;
Ref<InputEventMouseMotion> m = p_event;
@@ -1624,8 +1709,8 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
//Start moving the nodes
if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed()) {
List<CanvasItem *> selection = _get_edited_canvas_items();
- if ((b->get_alt() || tool == TOOL_MOVE) && selection.size() > 0) {
- drag_type = DRAG_ALL;
+ if (((b->get_alt() && !b->get_control()) || tool == TOOL_MOVE) && selection.size() > 0) {
+ drag_type = DRAG_MOVE;
drag_from = transform.affine_inverse().xform(b->get_position());
drag_selection = selection;
_save_canvas_item_state(drag_selection);
@@ -1634,7 +1719,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
}
}
- if (drag_type == DRAG_ALL) {
+ if (drag_type == DRAG_MOVE) {
// Move the nodes
if (m.is_valid()) {
_restore_canvas_item_state(drag_selection, true);
@@ -1674,7 +1759,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) {
}
// Confirm the move (only if it was moved)
- if (b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT && (drag_type == DRAG_ALL)) {
+ if (b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT && (drag_type == DRAG_MOVE)) {
if (transform.affine_inverse().xform(b->get_position()) != drag_from) {
_commit_canvas_item_state(drag_selection, TTR("Move CanvasItem"), true);
}
@@ -1858,22 +1943,9 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
// Retrieve the bones
_get_bones_at_pos(click, selection);
- for (int i = 0; i < selection.size(); i++) {
- if (editor_selection->is_selected(selection[i].item)) {
- // Drag the node(s) if requested
- List<CanvasItem *> selection = _get_edited_canvas_items();
-
- drag_type = DRAG_ALL;
- drag_selection = selection;
- drag_from = click;
- _save_canvas_item_state(drag_selection);
-
- return true;
- }
- }
-
- if (!selection.empty())
+ if (!selection.empty()) {
canvas_item = selection[0].item;
+ }
if (!canvas_item) {
// Start a box selection
@@ -1894,7 +1966,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
// Drag the node(s) if requested
List<CanvasItem *> selection = _get_edited_canvas_items();
- drag_type = DRAG_ALL;
+ drag_type = DRAG_MOVE;
drag_selection = selection;
drag_from = click;
_save_canvas_item_state(drag_selection);
@@ -2019,6 +2091,8 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) {
//printf("Open scene on double click\n");
} else if ((accepted = _gui_input_anchors(p_event))) {
//printf("Anchors\n");
+ } else if ((accepted = _gui_input_scale(p_event))) {
+ //printf("Set scale\n");
} else if ((accepted = _gui_input_pivot(p_event))) {
//printf("Set pivot\n");
} else if ((accepted = _gui_input_resize(p_event))) {
@@ -2073,7 +2147,7 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) {
case DRAG_BOTTOM_LEFT:
c = CURSOR_BDIAGSIZE;
break;
- case DRAG_ALL:
+ case DRAG_MOVE:
c = CURSOR_MOVE;
break;
case DRAG_PAN:
@@ -2301,6 +2375,188 @@ void CanvasItemEditor::_draw_grid() {
}
}
+void CanvasItemEditor::_draw_control_helpers(Control *control) {
+ Transform2D xform = transform * control->get_global_transform_with_canvas();
+ RID ci = viewport->get_canvas_item();
+ if (tool == TOOL_SELECT && show_helpers && !Object::cast_to<Container>(control->get_parent())) {
+ // Draw the helpers
+ Color color_base = Color(0.8, 0.8, 0.8, 0.5);
+
+ float anchors_values[4];
+ anchors_values[0] = control->get_anchor(MARGIN_LEFT);
+ anchors_values[1] = control->get_anchor(MARGIN_TOP);
+ anchors_values[2] = control->get_anchor(MARGIN_RIGHT);
+ anchors_values[3] = control->get_anchor(MARGIN_BOTTOM);
+
+ // Draw the anchors
+ Vector2 anchors[4];
+ Vector2 anchors_pos[4];
+ for (int i = 0; i < 4; i++) {
+ anchors[i] = Vector2((i % 2 == 0) ? anchors_values[i] : anchors_values[(i + 1) % 4], (i % 2 == 1) ? anchors_values[i] : anchors_values[(i + 1) % 4]);
+ anchors_pos[i] = xform.xform(_anchor_to_position(control, anchors[i]));
+ }
+
+ // Get which anchor is dragged
+ int dragged_anchor = -1;
+ switch (drag_type) {
+ case DRAG_ANCHOR_ALL:
+ case DRAG_ANCHOR_TOP_LEFT:
+ dragged_anchor = 0;
+ break;
+ case DRAG_ANCHOR_TOP_RIGHT:
+ dragged_anchor = 1;
+ break;
+ case DRAG_ANCHOR_BOTTOM_RIGHT:
+ dragged_anchor = 2;
+ break;
+ case DRAG_ANCHOR_BOTTOM_LEFT:
+ dragged_anchor = 3;
+ break;
+ default:
+ break;
+ }
+
+ if (dragged_anchor >= 0) {
+ // Draw the 4 lines when dragged
+ bool snapped;
+ Color color_snapped = Color(0.64, 0.93, 0.67, 0.5);
+
+ Vector2 corners_pos[4];
+ for (int i = 0; i < 4; i++) {
+ corners_pos[i] = xform.xform(_anchor_to_position(control, Vector2((i == 0 || i == 3) ? ANCHOR_BEGIN : ANCHOR_END, (i <= 1) ? ANCHOR_BEGIN : ANCHOR_END)));
+ }
+
+ Vector2 line_starts[4];
+ Vector2 line_ends[4];
+ for (int i = 0; i < 4; i++) {
+ float anchor_val = (i >= 2) ? ANCHOR_END - anchors_values[i] : anchors_values[i];
+ line_starts[i] = Vector2::linear_interpolate(corners_pos[i], corners_pos[(i + 1) % 4], anchor_val);
+ line_ends[i] = Vector2::linear_interpolate(corners_pos[(i + 3) % 4], corners_pos[(i + 2) % 4], anchor_val);
+ snapped = anchors_values[i] == 0.0 || anchors_values[i] == 0.5 || anchors_values[i] == 1.0;
+ viewport->draw_line(line_starts[i], line_ends[i], snapped ? color_snapped : color_base, (i == dragged_anchor || (i + 3) % 4 == dragged_anchor) ? 2 : 1);
+ }
+
+ // Display the percentages next to the lines
+ float percent_val;
+ percent_val = anchors_values[(dragged_anchor + 2) % 4] - anchors_values[dragged_anchor];
+ percent_val = (dragged_anchor >= 2) ? -percent_val : percent_val;
+ _draw_percentage_at_position(percent_val, (anchors_pos[dragged_anchor] + anchors_pos[(dragged_anchor + 1) % 4]) / 2, (Margin)((dragged_anchor + 1) % 4));
+
+ percent_val = anchors_values[(dragged_anchor + 3) % 4] - anchors_values[(dragged_anchor + 1) % 4];
+ percent_val = ((dragged_anchor + 1) % 4 >= 2) ? -percent_val : percent_val;
+ _draw_percentage_at_position(percent_val, (anchors_pos[dragged_anchor] + anchors_pos[(dragged_anchor + 3) % 4]) / 2, (Margin)(dragged_anchor));
+
+ percent_val = anchors_values[(dragged_anchor + 1) % 4];
+ percent_val = ((dragged_anchor + 1) % 4 >= 2) ? ANCHOR_END - percent_val : percent_val;
+ _draw_percentage_at_position(percent_val, (line_starts[dragged_anchor] + anchors_pos[dragged_anchor]) / 2, (Margin)(dragged_anchor));
+
+ percent_val = anchors_values[dragged_anchor];
+ percent_val = (dragged_anchor >= 2) ? ANCHOR_END - percent_val : percent_val;
+ _draw_percentage_at_position(percent_val, (line_ends[(dragged_anchor + 1) % 4] + anchors_pos[dragged_anchor]) / 2, (Margin)((dragged_anchor + 1) % 4));
+ }
+
+ Rect2 anchor_rects[4];
+ anchor_rects[0] = Rect2(anchors_pos[0] - anchor_handle->get_size(), anchor_handle->get_size());
+ anchor_rects[1] = Rect2(anchors_pos[1] - Vector2(0.0, anchor_handle->get_size().y), Point2(-anchor_handle->get_size().x, anchor_handle->get_size().y));
+ anchor_rects[2] = Rect2(anchors_pos[2], -anchor_handle->get_size());
+ anchor_rects[3] = Rect2(anchors_pos[3] - Vector2(anchor_handle->get_size().x, 0.0), Point2(anchor_handle->get_size().x, -anchor_handle->get_size().y));
+
+ for (int i = 0; i < 4; i++) {
+ anchor_handle->draw_rect(ci, anchor_rects[i]);
+ }
+
+ // Draw the margin values and the node width/height when dragging control side
+ float ratio = 0.33;
+ Transform2D parent_transform = xform * control->get_transform().affine_inverse();
+ float node_pos_in_parent[4];
+
+ Rect2 parent_rect = control->get_parent_anchorable_rect();
+
+ node_pos_in_parent[0] = control->get_anchor(MARGIN_LEFT) * parent_rect.size.width + control->get_margin(MARGIN_LEFT) + parent_rect.position.x;
+ node_pos_in_parent[1] = control->get_anchor(MARGIN_TOP) * parent_rect.size.height + control->get_margin(MARGIN_TOP) + parent_rect.position.y;
+ node_pos_in_parent[2] = control->get_anchor(MARGIN_RIGHT) * parent_rect.size.width + control->get_margin(MARGIN_RIGHT) + parent_rect.position.x;
+ node_pos_in_parent[3] = control->get_anchor(MARGIN_BOTTOM) * parent_rect.size.height + control->get_margin(MARGIN_BOTTOM) + parent_rect.position.y;
+
+ Point2 start, end;
+ switch (drag_type) {
+ case DRAG_LEFT:
+ case DRAG_TOP_LEFT:
+ case DRAG_BOTTOM_LEFT:
+ _draw_margin_at_position(control->get_size().width, parent_transform.xform(Vector2((node_pos_in_parent[0] + node_pos_in_parent[2]) / 2, node_pos_in_parent[3])) + Vector2(0, 5), MARGIN_BOTTOM);
+ case DRAG_MOVE:
+ start = Vector2(node_pos_in_parent[0], Math::lerp(node_pos_in_parent[1], node_pos_in_parent[3], ratio));
+ end = start - Vector2(control->get_margin(MARGIN_LEFT), 0);
+ _draw_margin_at_position(control->get_margin(MARGIN_LEFT), parent_transform.xform((start + end) / 2), MARGIN_TOP);
+ viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1);
+ break;
+ default:
+ break;
+ }
+ switch (drag_type) {
+ case DRAG_RIGHT:
+ case DRAG_TOP_RIGHT:
+ case DRAG_BOTTOM_RIGHT:
+ _draw_margin_at_position(control->get_size().width, parent_transform.xform(Vector2((node_pos_in_parent[0] + node_pos_in_parent[2]) / 2, node_pos_in_parent[3])) + Vector2(0, 5), MARGIN_BOTTOM);
+ case DRAG_MOVE:
+ start = Vector2(node_pos_in_parent[2], Math::lerp(node_pos_in_parent[3], node_pos_in_parent[1], ratio));
+ end = start - Vector2(control->get_margin(MARGIN_RIGHT), 0);
+ _draw_margin_at_position(control->get_margin(MARGIN_RIGHT), parent_transform.xform((start + end) / 2), MARGIN_BOTTOM);
+ viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1);
+ break;
+ default:
+ break;
+ }
+ switch (drag_type) {
+ case DRAG_TOP:
+ case DRAG_TOP_LEFT:
+ case DRAG_TOP_RIGHT:
+ _draw_margin_at_position(control->get_size().height, parent_transform.xform(Vector2(node_pos_in_parent[2], (node_pos_in_parent[1] + node_pos_in_parent[3]) / 2)) + Vector2(5, 0), MARGIN_RIGHT);
+ case DRAG_MOVE:
+ start = Vector2(Math::lerp(node_pos_in_parent[0], node_pos_in_parent[2], ratio), node_pos_in_parent[1]);
+ end = start - Vector2(0, control->get_margin(MARGIN_TOP));
+ _draw_margin_at_position(control->get_margin(MARGIN_TOP), parent_transform.xform((start + end) / 2), MARGIN_LEFT);
+ viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1);
+ break;
+ default:
+ break;
+ }
+ switch (drag_type) {
+ case DRAG_BOTTOM:
+ case DRAG_BOTTOM_LEFT:
+ case DRAG_BOTTOM_RIGHT:
+ _draw_margin_at_position(control->get_size().height, parent_transform.xform(Vector2(node_pos_in_parent[2], (node_pos_in_parent[1] + node_pos_in_parent[3]) / 2) + Vector2(5, 0)), MARGIN_RIGHT);
+ case DRAG_MOVE:
+ start = Vector2(Math::lerp(node_pos_in_parent[2], node_pos_in_parent[0], ratio), node_pos_in_parent[3]);
+ end = start - Vector2(0, control->get_margin(MARGIN_BOTTOM));
+ _draw_margin_at_position(control->get_margin(MARGIN_BOTTOM), parent_transform.xform((start + end) / 2), MARGIN_RIGHT);
+ viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1);
+ break;
+ default:
+ break;
+ }
+
+ switch (drag_type) {
+ //Draw the ghost rect if the node if rotated/scaled
+ case DRAG_LEFT:
+ case DRAG_TOP_LEFT:
+ case DRAG_TOP:
+ case DRAG_TOP_RIGHT:
+ case DRAG_RIGHT:
+ case DRAG_BOTTOM_RIGHT:
+ case DRAG_BOTTOM:
+ case DRAG_BOTTOM_LEFT:
+ case DRAG_MOVE:
+ if (control->get_rotation() != 0.0 || control->get_scale() != Vector2(1, 1)) {
+ Rect2 rect = Rect2(Vector2(node_pos_in_parent[0], node_pos_in_parent[1]), control->get_size());
+ viewport->draw_rect(parent_transform.xform(rect), color_base, false);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
void CanvasItemEditor::_draw_selection() {
Ref<Texture> pivot_icon = get_icon("EditorPivot", "EditorIcons");
Ref<Texture> position_icon = get_icon("EditorPosition", "EditorIcons");
@@ -2317,7 +2573,7 @@ void CanvasItemEditor::_draw_selection() {
// Draw the previous position if we are dragging the node
if (show_helpers &&
- (drag_type == DRAG_ALL || drag_type == DRAG_ROTATE ||
+ (drag_type == DRAG_MOVE || drag_type == DRAG_ROTATE ||
drag_type == DRAG_LEFT || drag_type == DRAG_RIGHT || drag_type == DRAG_TOP || drag_type == DRAG_BOTTOM ||
drag_type == DRAG_TOP_LEFT || drag_type == DRAG_TOP_RIGHT || drag_type == DRAG_BOTTOM_LEFT || drag_type == DRAG_BOTTOM_RIGHT)) {
const Transform2D pre_drag_xform = transform * se->pre_drag_xform;
@@ -2359,199 +2615,26 @@ void CanvasItemEditor::_draw_selection() {
}
} else {
- Transform2D transform = Transform2D(xform.get_rotation(), xform.get_origin());
- viewport->draw_set_transform_matrix(transform);
+ Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * Transform2D(canvas_item->_edit_get_rotation(), canvas_item->_edit_get_position())).orthonormalized();
+ Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
+ viewport->draw_set_transform_matrix(simple_xform);
viewport->draw_texture(position_icon, -(position_icon->get_size() / 2));
- viewport->draw_set_transform_matrix(Transform2D());
+ viewport->draw_set_transform_matrix(viewport->get_transform());
}
- if (single && (tool == TOOL_SELECT || tool == TOOL_MOVE || tool == TOOL_ROTATE || tool == TOOL_EDIT_PIVOT)) { //kind of sucks
+ if (single && (tool == TOOL_SELECT || tool == TOOL_MOVE || tool == TOOL_SCALE || tool == TOOL_ROTATE || tool == TOOL_EDIT_PIVOT)) { //kind of sucks
// Draw the pivot
if (canvas_item->_edit_get_pivot() != Vector2() || drag_type == DRAG_PIVOT || tool == TOOL_EDIT_PIVOT) { // This is not really clean :/
viewport->draw_texture(pivot_icon, (xform.xform(canvas_item->_edit_get_pivot()) - (pivot_icon->get_size() / 2)).floor());
}
+ // Draw control-related helpers
Control *control = Object::cast_to<Control>(canvas_item);
if (control) {
- if (tool == TOOL_SELECT && show_helpers && !Object::cast_to<Container>(control->get_parent())) {
- // Draw the helpers
- Color color_base = Color(0.8, 0.8, 0.8, 0.5);
-
- float anchors_values[4];
- anchors_values[0] = control->get_anchor(MARGIN_LEFT);
- anchors_values[1] = control->get_anchor(MARGIN_TOP);
- anchors_values[2] = control->get_anchor(MARGIN_RIGHT);
- anchors_values[3] = control->get_anchor(MARGIN_BOTTOM);
-
- // Draw the anchors
- Vector2 anchors[4];
- Vector2 anchors_pos[4];
- for (int i = 0; i < 4; i++) {
- anchors[i] = Vector2((i % 2 == 0) ? anchors_values[i] : anchors_values[(i + 1) % 4], (i % 2 == 1) ? anchors_values[i] : anchors_values[(i + 1) % 4]);
- anchors_pos[i] = xform.xform(_anchor_to_position(control, anchors[i]));
- }
-
- // Get which anchor is dragged
- int dragged_anchor = -1;
- switch (drag_type) {
- case DRAG_ANCHOR_ALL:
- case DRAG_ANCHOR_TOP_LEFT:
- dragged_anchor = 0;
- break;
- case DRAG_ANCHOR_TOP_RIGHT:
- dragged_anchor = 1;
- break;
- case DRAG_ANCHOR_BOTTOM_RIGHT:
- dragged_anchor = 2;
- break;
- case DRAG_ANCHOR_BOTTOM_LEFT:
- dragged_anchor = 3;
- break;
- default:
- break;
- }
-
- if (dragged_anchor >= 0) {
- // Draw the 4 lines when dragged
- bool snapped;
- Color color_snapped = Color(0.64, 0.93, 0.67, 0.5);
-
- Vector2 corners_pos[4];
- for (int i = 0; i < 4; i++) {
- corners_pos[i] = xform.xform(_anchor_to_position(control, Vector2((i == 0 || i == 3) ? ANCHOR_BEGIN : ANCHOR_END, (i <= 1) ? ANCHOR_BEGIN : ANCHOR_END)));
- }
-
- Vector2 line_starts[4];
- Vector2 line_ends[4];
- for (int i = 0; i < 4; i++) {
- float anchor_val = (i >= 2) ? ANCHOR_END - anchors_values[i] : anchors_values[i];
- line_starts[i] = Vector2::linear_interpolate(corners_pos[i], corners_pos[(i + 1) % 4], anchor_val);
- line_ends[i] = Vector2::linear_interpolate(corners_pos[(i + 3) % 4], corners_pos[(i + 2) % 4], anchor_val);
- snapped = anchors_values[i] == 0.0 || anchors_values[i] == 0.5 || anchors_values[i] == 1.0;
- viewport->draw_line(line_starts[i], line_ends[i], snapped ? color_snapped : color_base, (i == dragged_anchor || (i + 3) % 4 == dragged_anchor) ? 2 : 1);
- }
-
- // Display the percentages next to the lines
- float percent_val;
- percent_val = anchors_values[(dragged_anchor + 2) % 4] - anchors_values[dragged_anchor];
- percent_val = (dragged_anchor >= 2) ? -percent_val : percent_val;
- _draw_percentage_at_position(percent_val, (anchors_pos[dragged_anchor] + anchors_pos[(dragged_anchor + 1) % 4]) / 2, (Margin)((dragged_anchor + 1) % 4));
-
- percent_val = anchors_values[(dragged_anchor + 3) % 4] - anchors_values[(dragged_anchor + 1) % 4];
- percent_val = ((dragged_anchor + 1) % 4 >= 2) ? -percent_val : percent_val;
- _draw_percentage_at_position(percent_val, (anchors_pos[dragged_anchor] + anchors_pos[(dragged_anchor + 3) % 4]) / 2, (Margin)(dragged_anchor));
-
- percent_val = anchors_values[(dragged_anchor + 1) % 4];
- percent_val = ((dragged_anchor + 1) % 4 >= 2) ? ANCHOR_END - percent_val : percent_val;
- _draw_percentage_at_position(percent_val, (line_starts[dragged_anchor] + anchors_pos[dragged_anchor]) / 2, (Margin)(dragged_anchor));
-
- percent_val = anchors_values[dragged_anchor];
- percent_val = (dragged_anchor >= 2) ? ANCHOR_END - percent_val : percent_val;
- _draw_percentage_at_position(percent_val, (line_ends[(dragged_anchor + 1) % 4] + anchors_pos[dragged_anchor]) / 2, (Margin)((dragged_anchor + 1) % 4));
- }
-
- Rect2 anchor_rects[4];
- anchor_rects[0] = Rect2(anchors_pos[0] - anchor_handle->get_size(), anchor_handle->get_size());
- anchor_rects[1] = Rect2(anchors_pos[1] - Vector2(0.0, anchor_handle->get_size().y), Point2(-anchor_handle->get_size().x, anchor_handle->get_size().y));
- anchor_rects[2] = Rect2(anchors_pos[2], -anchor_handle->get_size());
- anchor_rects[3] = Rect2(anchors_pos[3] - Vector2(anchor_handle->get_size().x, 0.0), Point2(anchor_handle->get_size().x, -anchor_handle->get_size().y));
-
- for (int i = 0; i < 4; i++) {
- anchor_handle->draw_rect(ci, anchor_rects[i]);
- }
-
- // Draw the margin values and the node width/height when dragging control side
- float ratio = 0.33;
- Transform2D parent_transform = xform * control->get_transform().affine_inverse();
- float node_pos_in_parent[4];
-
- Rect2 parent_rect = control->get_parent_anchorable_rect();
-
- node_pos_in_parent[0] = control->get_anchor(MARGIN_LEFT) * parent_rect.size.width + control->get_margin(MARGIN_LEFT) + parent_rect.position.x;
- node_pos_in_parent[1] = control->get_anchor(MARGIN_TOP) * parent_rect.size.height + control->get_margin(MARGIN_TOP) + parent_rect.position.y;
- node_pos_in_parent[2] = control->get_anchor(MARGIN_RIGHT) * parent_rect.size.width + control->get_margin(MARGIN_RIGHT) + parent_rect.position.x;
- node_pos_in_parent[3] = control->get_anchor(MARGIN_BOTTOM) * parent_rect.size.height + control->get_margin(MARGIN_BOTTOM) + parent_rect.position.y;
-
- Point2 start, end;
- switch (drag_type) {
- case DRAG_LEFT:
- case DRAG_TOP_LEFT:
- case DRAG_BOTTOM_LEFT:
- _draw_margin_at_position(control->get_size().width, parent_transform.xform(Vector2((node_pos_in_parent[0] + node_pos_in_parent[2]) / 2, node_pos_in_parent[3])) + Vector2(0, 5), MARGIN_BOTTOM);
- case DRAG_ALL:
- start = Vector2(node_pos_in_parent[0], Math::lerp(node_pos_in_parent[1], node_pos_in_parent[3], ratio));
- end = start - Vector2(control->get_margin(MARGIN_LEFT), 0);
- _draw_margin_at_position(control->get_margin(MARGIN_LEFT), parent_transform.xform((start + end) / 2), MARGIN_TOP);
- viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1);
- break;
- default:
- break;
- }
- switch (drag_type) {
- case DRAG_RIGHT:
- case DRAG_TOP_RIGHT:
- case DRAG_BOTTOM_RIGHT:
- _draw_margin_at_position(control->get_size().width, parent_transform.xform(Vector2((node_pos_in_parent[0] + node_pos_in_parent[2]) / 2, node_pos_in_parent[3])) + Vector2(0, 5), MARGIN_BOTTOM);
- case DRAG_ALL:
- start = Vector2(node_pos_in_parent[2], Math::lerp(node_pos_in_parent[3], node_pos_in_parent[1], ratio));
- end = start - Vector2(control->get_margin(MARGIN_RIGHT), 0);
- _draw_margin_at_position(control->get_margin(MARGIN_RIGHT), parent_transform.xform((start + end) / 2), MARGIN_BOTTOM);
- viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1);
- break;
- default:
- break;
- }
- switch (drag_type) {
- case DRAG_TOP:
- case DRAG_TOP_LEFT:
- case DRAG_TOP_RIGHT:
- _draw_margin_at_position(control->get_size().height, parent_transform.xform(Vector2(node_pos_in_parent[2], (node_pos_in_parent[1] + node_pos_in_parent[3]) / 2)) + Vector2(5, 0), MARGIN_RIGHT);
- case DRAG_ALL:
- start = Vector2(Math::lerp(node_pos_in_parent[0], node_pos_in_parent[2], ratio), node_pos_in_parent[1]);
- end = start - Vector2(0, control->get_margin(MARGIN_TOP));
- _draw_margin_at_position(control->get_margin(MARGIN_TOP), parent_transform.xform((start + end) / 2), MARGIN_LEFT);
- viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1);
- break;
- default:
- break;
- }
- switch (drag_type) {
- case DRAG_BOTTOM:
- case DRAG_BOTTOM_LEFT:
- case DRAG_BOTTOM_RIGHT:
- _draw_margin_at_position(control->get_size().height, parent_transform.xform(Vector2(node_pos_in_parent[2], (node_pos_in_parent[1] + node_pos_in_parent[3]) / 2) + Vector2(5, 0)), MARGIN_RIGHT);
- case DRAG_ALL:
- start = Vector2(Math::lerp(node_pos_in_parent[2], node_pos_in_parent[0], ratio), node_pos_in_parent[3]);
- end = start - Vector2(0, control->get_margin(MARGIN_BOTTOM));
- _draw_margin_at_position(control->get_margin(MARGIN_BOTTOM), parent_transform.xform((start + end) / 2), MARGIN_RIGHT);
- viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1);
- break;
- default:
- break;
- }
-
- switch (drag_type) {
- //Draw the ghost rect if the node if rotated/scaled
- case DRAG_LEFT:
- case DRAG_TOP_LEFT:
- case DRAG_TOP:
- case DRAG_TOP_RIGHT:
- case DRAG_RIGHT:
- case DRAG_BOTTOM_RIGHT:
- case DRAG_BOTTOM:
- case DRAG_BOTTOM_LEFT:
- case DRAG_ALL:
- if (control->get_rotation() != 0.0 || control->get_scale() != Vector2(1, 1)) {
- Rect2 rect = Rect2(Vector2(node_pos_in_parent[0], node_pos_in_parent[1]), control->get_size());
- viewport->draw_rect(parent_transform.xform(rect), color_base, false);
- }
- break;
- default:
- break;
- }
- }
+ _draw_control_helpers(control);
}
+ // Draw the resize handles
if (tool == TOOL_SELECT && canvas_item->_edit_use_rect()) {
Rect2 rect = canvas_item->_edit_get_rect();
Vector2 endpoints[4] = {
@@ -2561,7 +2644,6 @@ void CanvasItemEditor::_draw_selection() {
xform.xform(rect.position + Vector2(0, rect.size.y))
};
for (int i = 0; i < 4; i++) {
- // Draw the resize handles
int prev = (i + 3) % 4;
int next = (i + 1) % 4;
@@ -2576,6 +2658,46 @@ void CanvasItemEditor::_draw_selection() {
select_handle->draw(ci, (ofs - (select_handle->get_size() / 2)).floor());
}
}
+
+ // Draw the rescale handles
+ bool is_ctrl = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
+ bool is_alt = Input::get_singleton()->is_key_pressed(KEY_ALT);
+ if ((is_alt && is_ctrl) || tool == TOOL_SCALE || drag_type == DRAG_SCALE_X || drag_type == DRAG_SCALE_Y) {
+
+ Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * Transform2D(canvas_item->_edit_get_rotation(), canvas_item->_edit_get_position())).orthonormalized();
+ Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
+
+ Size2 scale_factor = Size2(SCALE_HANDLE_DISTANCE, SCALE_HANDLE_DISTANCE);
+ bool uniform = Input::get_singleton()->is_key_pressed(KEY_SHIFT);
+ Point2 offset = (simple_xform.affine_inverse().xform(drag_to) - simple_xform.affine_inverse().xform(drag_from)) * zoom;
+
+ if (drag_type == DRAG_SCALE_X) {
+ scale_factor.x += offset.x;
+ if (uniform) {
+ scale_factor.y += offset.x;
+ }
+ } else if (drag_type == DRAG_SCALE_Y) {
+ scale_factor.y -= offset.y;
+ if (uniform) {
+ scale_factor.x -= offset.y;
+ }
+ }
+
+ //scale_factor *= zoom;
+
+ viewport->draw_set_transform_matrix(simple_xform);
+ Rect2 x_handle_rect = Rect2(scale_factor.x * EDSCALE, -5 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
+ Color x_axis_color(1.0, 0.4, 0.4, 0.6);
+ viewport->draw_rect(x_handle_rect, x_axis_color);
+ viewport->draw_line(Point2(), Point2(scale_factor.x * EDSCALE, 0), x_axis_color);
+
+ Rect2 y_handle_rect = Rect2(-5 * EDSCALE, -(scale_factor.y + 10) * EDSCALE, 10 * EDSCALE, 10 * EDSCALE);
+ Color y_axis_color(0.4, 1.0, 0.4, 0.6);
+ viewport->draw_rect(y_handle_rect, y_axis_color);
+ viewport->draw_line(Point2(), Point2(0, -scale_factor.y * EDSCALE), y_axis_color);
+
+ viewport->draw_set_transform_matrix(viewport->get_transform());
+ }
}
}
@@ -2750,15 +2872,16 @@ void CanvasItemEditor::_draw_invisible_nodes_positions(Node *p_node, const Trans
_draw_invisible_nodes_positions(p_node->get_child(i), parent_xform, canvas_xform);
}
- if (canvas_item && !canvas_item->_edit_use_rect() && !editor_selection->is_selected(canvas_item)) {
+ if (canvas_item && !canvas_item->_edit_use_rect() && (!editor_selection->is_selected(canvas_item) || (canvas_item->has_meta("_edit_lock_") && canvas_item->get_meta("_edit_lock_")))) {
Transform2D xform = transform * canvas_xform * parent_xform;
// Draw the node's position
Ref<Texture> position_icon = get_icon("EditorPositionUnselected", "EditorIcons");
- Transform2D transform = Transform2D(xform.get_rotation(), xform.get_origin());
- viewport->draw_set_transform_matrix(transform);
+ Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * Transform2D(canvas_item->_edit_get_rotation(), canvas_item->_edit_get_position())).orthonormalized();
+ Transform2D simple_xform = viewport->get_transform() * unscaled_transform;
+ viewport->draw_set_transform_matrix(simple_xform);
viewport->draw_texture(position_icon, -position_icon->get_size() / 2, Color(1.0, 1.0, 1.0, 0.5));
- viewport->draw_set_transform_matrix(Transform2D());
+ viewport->draw_set_transform_matrix(viewport->get_transform());
}
}
@@ -3086,6 +3209,7 @@ void CanvasItemEditor::_notification(int p_what) {
select_button->set_icon(get_icon("ToolSelect", "EditorIcons"));
list_select_button->set_icon(get_icon("ListSelect", "EditorIcons"));
move_button->set_icon(get_icon("ToolMove", "EditorIcons"));
+ scale_button->set_icon(get_icon("ToolScale", "EditorIcons"));
rotate_button->set_icon(get_icon("ToolRotate", "EditorIcons"));
snap_button->set_icon(get_icon("Snap", "EditorIcons"));
snap_config_menu->set_icon(get_icon("GuiMiniTabMenu", "EditorIcons"));
@@ -3394,7 +3518,7 @@ void CanvasItemEditor::_button_toggle_snap(bool p_status) {
void CanvasItemEditor::_button_tool_select(int p_index) {
- ToolButton *tb[TOOL_MAX] = { select_button, list_select_button, move_button, rotate_button, pivot_button, pan_button };
+ ToolButton *tb[TOOL_MAX] = { select_button, list_select_button, move_button, scale_button, rotate_button, pivot_button, pan_button };
for (int i = 0; i < TOOL_MAX; i++) {
tb[i]->set_pressed(i == p_index);
}
@@ -4286,6 +4410,8 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
select_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/select_mode", TTR("Select Mode"), KEY_Q));
select_button->set_tooltip(keycode_get_string(KEY_MASK_CMD) + TTR("Drag: Rotate") + "\n" + TTR("Alt+Drag: Move") + "\n" + TTR("Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving).") + "\n" + TTR("Alt+RMB: Depth list selection"));
+ hb->add_child(memnew(VSeparator));
+
move_button = memnew(ToolButton);
hb->add_child(move_button);
move_button->set_toggle_mode(true);
@@ -4293,6 +4419,13 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
move_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/move_mode", TTR("Move Mode"), KEY_W));
move_button->set_tooltip(TTR("Move Mode"));
+ scale_button = memnew(ToolButton);
+ hb->add_child(scale_button);
+ scale_button->set_toggle_mode(true);
+ scale_button->connect("pressed", this, "_button_tool_select", make_binds(TOOL_SCALE));
+ scale_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/scale_mode", TTR("Scale Mode"), KEY_S));
+ scale_button->set_tooltip(TTR("Scale Mode"));
+
rotate_button = memnew(ToolButton);
hb->add_child(rotate_button);
rotate_button->set_toggle_mode(true);
diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h
index 2c943385ad..61d77581d3 100644
--- a/editor/plugins/canvas_item_editor_plugin.h
+++ b/editor/plugins/canvas_item_editor_plugin.h
@@ -77,6 +77,7 @@ class CanvasItemEditor : public VBoxContainer {
TOOL_SELECT,
TOOL_LIST_SELECT,
TOOL_MOVE,
+ TOOL_SCALE,
TOOL_ROTATE,
TOOL_EDIT_PIVOT,
TOOL_PAN,
@@ -188,7 +189,9 @@ class CanvasItemEditor : public VBoxContainer {
DRAG_ANCHOR_BOTTOM_RIGHT,
DRAG_ANCHOR_BOTTOM_LEFT,
DRAG_ANCHOR_ALL,
- DRAG_ALL,
+ DRAG_MOVE,
+ DRAG_SCALE_X,
+ DRAG_SCALE_Y,
DRAG_ROTATE,
DRAG_PIVOT,
DRAG_V_GUIDE,
@@ -298,17 +301,19 @@ class CanvasItemEditor : public VBoxContainer {
List<PoseClipboard> pose_clipboard;
ToolButton *select_button;
- ToolButton *list_select_button;
+
ToolButton *move_button;
+ ToolButton *scale_button;
ToolButton *rotate_button;
+ ToolButton *list_select_button;
+ ToolButton *pivot_button;
+ ToolButton *pan_button;
+
ToolButton *snap_button;
MenuButton *snap_config_menu;
PopupMenu *smartsnap_config_popup;
- ToolButton *pivot_button;
- ToolButton *pan_button;
-
ToolButton *lock_button;
ToolButton *unlock_button;
@@ -408,6 +413,7 @@ class CanvasItemEditor : public VBoxContainer {
void _draw_guides();
void _draw_focus();
void _draw_grid();
+ void _draw_control_helpers(Control *control);
void _draw_selection();
void _draw_axis();
void _draw_bones();
@@ -420,6 +426,7 @@ class CanvasItemEditor : public VBoxContainer {
bool _gui_input_anchors(const Ref<InputEvent> &p_event);
bool _gui_input_move(const Ref<InputEvent> &p_event);
bool _gui_input_open_scene_on_double_click(const Ref<InputEvent> &p_event);
+ bool _gui_input_scale(const Ref<InputEvent> &p_event);
bool _gui_input_pivot(const Ref<InputEvent> &p_event);
bool _gui_input_resize(const Ref<InputEvent> &p_event);
bool _gui_input_rotate(const Ref<InputEvent> &p_event);
diff --git a/editor/plugins/collision_polygon_editor_plugin.cpp b/editor/plugins/collision_polygon_editor_plugin.cpp
index 5109379add..805a7d3835 100644
--- a/editor/plugins/collision_polygon_editor_plugin.cpp
+++ b/editor/plugins/collision_polygon_editor_plugin.cpp
@@ -31,10 +31,10 @@
#include "collision_polygon_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
+#include "core/os/file_access.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "editor/editor_settings.h"
-#include "os/file_access.h"
-#include "os/input.h"
-#include "os/keyboard.h"
#include "scene/3d/camera.h"
#include "spatial_editor_plugin.h"
diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp
index f5bdf77973..79169d3183 100644
--- a/editor/plugins/curve_editor_plugin.cpp
+++ b/editor/plugins/curve_editor_plugin.cpp
@@ -31,9 +31,9 @@
#include "curve_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
-#include "core_string_names.h"
-#include "os/input.h"
-#include "os/keyboard.h"
+#include "core/core_string_names.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
CurveEditor::CurveEditor() {
_selected_point = -1;
diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp
index 9acbceec92..72a746e95b 100644
--- a/editor/plugins/editor_preview_plugins.cpp
+++ b/editor/plugins/editor_preview_plugins.cpp
@@ -30,12 +30,12 @@
#include "editor_preview_plugins.h"
+#include "core/io/file_access_memory.h"
+#include "core/io/resource_loader.h"
+#include "core/os/os.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
-#include "io/file_access_memory.h"
-#include "io/resource_loader.h"
-#include "os/os.h"
#include "scene/resources/bit_mask.h"
#include "scene/resources/dynamic_font.h"
#include "scene/resources/material.h"
diff --git a/editor/plugins/item_list_editor_plugin.cpp b/editor/plugins/item_list_editor_plugin.cpp
index 1f0b4e9e97..7b5de9c009 100644
--- a/editor/plugins/item_list_editor_plugin.cpp
+++ b/editor/plugins/item_list_editor_plugin.cpp
@@ -30,7 +30,7 @@
#include "item_list_editor_plugin.h"
-#include "io/resource_loader.h"
+#include "core/io/resource_loader.h"
bool ItemListPlugin::_set(const StringName &p_name, const Variant &p_value) {
@@ -278,18 +278,20 @@ void ItemListEditor::_add_pressed() {
void ItemListEditor::_delete_pressed() {
- TreeItem *ti = tree->get_selected();
-
- if (!ti)
+ if (selected_idx == -1)
return;
- if (ti->get_parent() != tree->get_root())
+ String current_selected = (String)property_editor->get_selected_path();
+
+ if (current_selected == "")
return;
- int idx = ti->get_text(0).to_int();
+ // FIXME: Currently relying on selecting a *property* to derive what item to delete
+ // e.g. you select "1/enabled" to delete item 1.
+ // This should be fixed so that you can delete by selecting the item section header,
+ // or a delete button on that header.
- if (selected_idx == -1)
- return;
+ int idx = current_selected.get_slice("/", 0).to_int();
item_plugins[selected_idx]->erase(idx);
}
@@ -382,13 +384,9 @@ ItemListEditor::ItemListEditor() {
hbc->add_child(del_button);
del_button->connect("pressed", this, "_delete_button");
- property_editor = memnew(PropertyEditor);
- property_editor->hide_top_label();
- property_editor->set_subsection_selectable(true);
+ property_editor = memnew(EditorInspector);
vbc->add_child(property_editor);
property_editor->set_v_size_flags(SIZE_EXPAND_FILL);
-
- tree = property_editor->get_property_tree();
}
ItemListEditor::~ItemListEditor() {
diff --git a/editor/plugins/item_list_editor_plugin.h b/editor/plugins/item_list_editor_plugin.h
index d6a071b9b9..3dc3775f83 100644
--- a/editor/plugins/item_list_editor_plugin.h
+++ b/editor/plugins/item_list_editor_plugin.h
@@ -32,9 +32,9 @@
#define ITEM_LIST_EDITOR_PLUGIN_H
#include "canvas_item_editor_plugin.h"
+#include "editor/editor_inspector.h"
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
-
#include "scene/gui/menu_button.h"
#include "scene/gui/option_button.h"
#include "scene/gui/popup_menu.h"
@@ -210,7 +210,7 @@ class ItemListEditor : public HBoxContainer {
ToolButton *toolbar_button;
AcceptDialog *dialog;
- PropertyEditor *property_editor;
+ EditorInspector *property_editor;
Tree *tree;
Button *add_button;
Button *del_button;
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.cpp b/editor/plugins/light_occluder_2d_editor_plugin.cpp
index 3351e5918f..4f8a307cc1 100644
--- a/editor/plugins/light_occluder_2d_editor_plugin.cpp
+++ b/editor/plugins/light_occluder_2d_editor_plugin.cpp
@@ -31,8 +31,8 @@
#include "light_occluder_2d_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
+#include "core/os/file_access.h"
#include "editor/editor_settings.h"
-#include "os/file_access.h"
void LightOccluder2DEditor::_notification(int p_what) {
diff --git a/editor/plugins/particles_2d_editor_plugin.cpp b/editor/plugins/particles_2d_editor_plugin.cpp
index 3bde157edf..5dcbca2ed6 100644
--- a/editor/plugins/particles_2d_editor_plugin.cpp
+++ b/editor/plugins/particles_2d_editor_plugin.cpp
@@ -31,7 +31,7 @@
#include "particles_2d_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
-#include "io/image_loader.h"
+#include "core/io/image_loader.h"
#include "scene/gui/separator.h"
#include "scene/resources/particles_material.h"
diff --git a/editor/plugins/particles_editor_plugin.cpp b/editor/plugins/particles_editor_plugin.cpp
index 9a1a60805f..6b41946918 100644
--- a/editor/plugins/particles_editor_plugin.cpp
+++ b/editor/plugins/particles_editor_plugin.cpp
@@ -30,8 +30,8 @@
#include "particles_editor_plugin.h"
+#include "core/io/resource_loader.h"
#include "editor/plugins/spatial_editor_plugin.h"
-#include "io/resource_loader.h"
#include "scene/3d/cpu_particles.h"
#include "scene/resources/particles_material.h"
diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp
index 33e182faef..96c1ad2f2b 100644
--- a/editor/plugins/path_2d_editor_plugin.cpp
+++ b/editor/plugins/path_2d_editor_plugin.cpp
@@ -31,9 +31,9 @@
#include "path_2d_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
+#include "core/os/file_access.h"
+#include "core/os/keyboard.h"
#include "editor/editor_settings.h"
-#include "os/file_access.h"
-#include "os/keyboard.h"
void Path2DEditor::_notification(int p_what) {
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
index a437cd5362..e0c8cf41ff 100644
--- a/editor/plugins/polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -31,10 +31,10 @@
#include "polygon_2d_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
+#include "core/os/file_access.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "editor/editor_settings.h"
-#include "os/file_access.h"
-#include "os/input.h"
-#include "os/keyboard.h"
#include "scene/2d/skeleton_2d.h"
Node2D *Polygon2DEditor::_get_node() const {
diff --git a/editor/plugins/resource_preloader_editor_plugin.cpp b/editor/plugins/resource_preloader_editor_plugin.cpp
index c6e8ec1a2b..da6aa48f9c 100644
--- a/editor/plugins/resource_preloader_editor_plugin.cpp
+++ b/editor/plugins/resource_preloader_editor_plugin.cpp
@@ -30,9 +30,9 @@
#include "resource_preloader_editor_plugin.h"
+#include "core/io/resource_loader.h"
+#include "core/project_settings.h"
#include "editor/editor_settings.h"
-#include "io/resource_loader.h"
-#include "project_settings.h"
void ResourcePreloaderEditor::_gui_input(Ref<InputEvent> p_event) {
}
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index 70f1789a86..706bda4089 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -504,6 +504,13 @@ void ScriptEditor::_open_recent_script(int p_idx) {
return;
}
// if it's a path then its most likely a deleted file not help
+ } else if (path.find("::") != -1) {
+ // built-in script
+ Ref<Script> script = ResourceLoader::load(path);
+ if (script.is_valid()) {
+ edit(script, true);
+ return;
+ }
} else if (!path.is_resource_file()) {
_help_class_open(path);
return;
@@ -1793,8 +1800,8 @@ void ScriptEditor::_update_script_names() {
new_cur_tab = i;
}
}
- tab_container->call_deferred("set_current_tab", new_prev_tab);
- tab_container->call_deferred("set_current_tab", new_cur_tab);
+ tab_container->set_current_tab(new_prev_tab);
+ tab_container->set_current_tab(new_cur_tab);
_sort_list_on_update = false;
}
@@ -2017,6 +2024,7 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra
_go_to_tab(tab_container->get_tab_count() - 1);
}
+ _sort_list_on_update = true;
_update_script_names();
_save_layout();
se->connect("name_changed", this, "_update_script_names");
@@ -2591,6 +2599,7 @@ void ScriptEditor::_help_class_open(const String &p_class) {
eh->go_to_class(p_class, 0);
eh->connect("go_to_help", this, "_help_class_goto");
_add_recent_script(p_class);
+ _sort_list_on_update = true;
_update_script_names();
_save_layout();
}
@@ -2620,6 +2629,7 @@ void ScriptEditor::_help_class_goto(const String &p_desc) {
eh->go_to_help(p_desc);
eh->connect("go_to_help", this, "_help_class_goto");
_add_recent_script(eh->get_class());
+ _sort_list_on_update = true;
_update_script_names();
_save_layout();
}
diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h
index 737f17358b..120755b5af 100644
--- a/editor/plugins/script_editor_plugin.h
+++ b/editor/plugins/script_editor_plugin.h
@@ -31,6 +31,7 @@
#ifndef SCRIPT_EDITOR_PLUGIN_H
#define SCRIPT_EDITOR_PLUGIN_H
+#include "core/script_language.h"
#include "editor/code_editor.h"
#include "editor/editor_help.h"
#include "editor/editor_plugin.h"
@@ -44,7 +45,6 @@
#include "scene/gui/tree.h"
#include "scene/main/timer.h"
#include "scene/resources/text_file.h"
-#include "script_language.h"
class ScriptEditorQuickOpen : public ConfirmationDialog {
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index e0eb89d6b6..82c2e07940 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -30,10 +30,10 @@
#include "script_text_editor.h"
+#include "core/os/keyboard.h"
#include "editor/editor_node.h"
#include "editor/editor_settings.h"
#include "editor/script_editor_debugger.h"
-#include "os/keyboard.h"
Vector<String> ScriptTextEditor::get_functions() {
diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp
index fcbbee2b9c..30246147c2 100644
--- a/editor/plugins/sprite_frames_editor_plugin.cpp
+++ b/editor/plugins/sprite_frames_editor_plugin.cpp
@@ -30,9 +30,9 @@
#include "sprite_frames_editor_plugin.h"
+#include "core/io/resource_loader.h"
+#include "core/project_settings.h"
#include "editor/editor_settings.h"
-#include "io/resource_loader.h"
-#include "project_settings.h"
#include "scene/3d/sprite_3d.h"
void SpriteFramesEditor::_gui_input(Ref<InputEvent> p_event) {
diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp
index e891850870..140d37fdb5 100644
--- a/editor/plugins/texture_editor_plugin.cpp
+++ b/editor/plugins/texture_editor_plugin.cpp
@@ -30,9 +30,9 @@
#include "texture_editor_plugin.h"
+#include "core/io/resource_loader.h"
+#include "core/project_settings.h"
#include "editor/editor_settings.h"
-#include "io/resource_loader.h"
-#include "project_settings.h"
void TextureEditor::_gui_input(Ref<InputEvent> p_event) {
}
diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp
index 4390b94ece..33e1f7c6a3 100644
--- a/editor/plugins/texture_region_editor_plugin.cpp
+++ b/editor/plugins/texture_region_editor_plugin.cpp
@@ -31,8 +31,8 @@
#include "texture_region_editor_plugin.h"
#include "core/core_string_names.h"
-#include "os/input.h"
-#include "os/keyboard.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "scene/gui/check_box.h"
/**
diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp
index 92b95963f9..acee1a6942 100644
--- a/editor/plugins/theme_editor_plugin.cpp
+++ b/editor/plugins/theme_editor_plugin.cpp
@@ -30,8 +30,8 @@
#include "theme_editor_plugin.h"
-#include "os/file_access.h"
-#include "version.h"
+#include "core/os/file_access.h"
+#include "core/version.h"
void ThemeEditor::edit(const Ref<Theme> &p_theme) {
diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp
index 58c3fd015e..a0adbfccff 100644
--- a/editor/plugins/tile_map_editor_plugin.cpp
+++ b/editor/plugins/tile_map_editor_plugin.cpp
@@ -31,10 +31,10 @@
#include "tile_map_editor_plugin.h"
#include "canvas_item_editor_plugin.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
-#include "os/input.h"
-#include "os/keyboard.h"
#include "scene/gui/split_container.h"
void TileMapEditor::_notification(int p_what) {
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index ee31e1409c..cefed193ca 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -31,10 +31,10 @@
#include "visual_shader_editor_plugin.h"
#include "core/io/resource_loader.h"
+#include "core/os/input.h"
+#include "core/os/keyboard.h"
#include "core/project_settings.h"
#include "editor/editor_properties.h"
-#include "os/input.h"
-#include "os/keyboard.h"
#include "scene/animation/animation_player.h"
#include "scene/gui/menu_button.h"
#include "scene/gui/panel.h"
diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp
index f735ef97db..29a780961e 100644
--- a/editor/progress_dialog.cpp
+++ b/editor/progress_dialog.cpp
@@ -30,10 +30,10 @@
#include "progress_dialog.h"
+#include "core/message_queue.h"
+#include "core/os/os.h"
#include "editor_scale.h"
#include "main/main.h"
-#include "message_queue.h"
-#include "os/os.h"
void BackgroundProgress::_add_task(const String &p_task, const String &p_label, int p_steps) {
diff --git a/editor/project_export.cpp b/editor/project_export.cpp
index df79317549..aba89a87ee 100644
--- a/editor/project_export.cpp
+++ b/editor/project_export.cpp
@@ -30,17 +30,17 @@
#include "project_export.h"
-#include "compressed_translation.h"
+#include "core/compressed_translation.h"
+#include "core/io/image_loader.h"
+#include "core/io/resource_loader.h"
+#include "core/io/resource_saver.h"
+#include "core/os/dir_access.h"
+#include "core/os/file_access.h"
+#include "core/os/os.h"
+#include "core/project_settings.h"
#include "editor_data.h"
#include "editor_node.h"
#include "editor_settings.h"
-#include "io/image_loader.h"
-#include "io/resource_loader.h"
-#include "io/resource_saver.h"
-#include "os/dir_access.h"
-#include "os/file_access.h"
-#include "os/os.h"
-#include "project_settings.h"
#include "scene/gui/box_container.h"
#include "scene/gui/margin_container.h"
#include "scene/gui/scroll_container.h"
diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp
index 4d25a1da5c..f494c84efa 100644
--- a/editor/project_manager.cpp
+++ b/editor/project_manager.cpp
@@ -30,18 +30,21 @@
#include "project_manager.h"
+#include "core/io/config_file.h"
+#include "core/io/resource_saver.h"
+#include "core/io/stream_peer_ssl.h"
+#include "core/io/zip_io.h"
+#include "core/os/dir_access.h"
+#include "core/os/file_access.h"
+#include "core/os/keyboard.h"
+#include "core/os/os.h"
+#include "core/translation.h"
+#include "core/version.h"
+#include "core/version_hash.gen.h"
#include "editor_initialize_ssl.h"
#include "editor_scale.h"
#include "editor_settings.h"
#include "editor_themes.h"
-#include "io/config_file.h"
-#include "io/resource_saver.h"
-#include "io/stream_peer_ssl.h"
-#include "io/zip_io.h"
-#include "os/dir_access.h"
-#include "os/file_access.h"
-#include "os/keyboard.h"
-#include "os/os.h"
#include "scene/gui/center_container.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/margin_container.h"
@@ -49,9 +52,6 @@
#include "scene/gui/separator.h"
#include "scene/gui/texture_rect.h"
#include "scene/gui/tool_button.h"
-#include "translation.h"
-#include "version.h"
-#include "version_hash.gen.h"
class ProjectDialog : public ConfirmationDialog {
diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp
index a7c336eb16..1baf606e7b 100644
--- a/editor/project_settings_editor.cpp
+++ b/editor/project_settings_editor.cpp
@@ -1750,12 +1750,9 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) {
globals_editor = memnew(SectionedInspector);
props_base->add_child(globals_editor);
globals_editor->get_inspector()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo());
- globals_editor->get_inspector()->set_property_selectable(true);
- //globals_editor->hide_top_label();
globals_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
globals_editor->register_search_box(search_box);
globals_editor->get_inspector()->connect("property_selected", this, "_item_selected");
- //globals_editor->get_inspector()->connect("property_toggled", this, "_item_checked", varray(), CONNECT_DEFERRED);
globals_editor->get_inspector()->connect("property_edited", this, "_settings_prop_edited");
globals_editor->get_inspector()->connect("restart_requested", this, "_editor_restart_request");
diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp
index d9812f7425..1c2eedfc9c 100644
--- a/editor/property_editor.cpp
+++ b/editor/property_editor.cpp
@@ -1910,6 +1910,7 @@ void CustomPropertyEditor::_bind_methods() {
ADD_SIGNAL(MethodInfo("variant_field_changed", PropertyInfo(Variant::STRING, "field")));
ADD_SIGNAL(MethodInfo("resource_edit_request"));
}
+
CustomPropertyEditor::CustomPropertyEditor() {
read_only = false;
@@ -2034,2691 +2035,8 @@ CustomPropertyEditor::CustomPropertyEditor() {
property_select = NULL;
}
-bool PropertyEditor::_might_be_in_instance() {
-
- if (!obj)
- return false;
-
- Node *node = Object::cast_to<Node>(obj);
-
- Node *edited_scene = EditorNode::get_singleton()->get_edited_scene();
-
- bool might_be = false;
-
- while (node) {
-
- if (node->get_scene_instance_state().is_valid()) {
- might_be = true;
- break;
- }
- if (node == edited_scene) {
- if (node->get_scene_inherited_state().is_valid()) {
- might_be = true;
- break;
- }
- might_be = false;
- break;
- }
- node = node->get_owner();
- }
-
- return might_be;
-}
-
-bool PropertyEditor::_get_instanced_node_original_property(const StringName &p_prop, Variant &value) {
-
- Node *node = Object::cast_to<Node>(obj);
-
- if (!node)
- return false;
-
- Node *orig = node;
-
- Node *edited_scene = EditorNode::get_singleton()->get_edited_scene();
-
- bool found = false;
-
- while (node) {
-
- Ref<SceneState> ss;
-
- if (node == edited_scene) {
- ss = node->get_scene_inherited_state();
-
- } else {
- ss = node->get_scene_instance_state();
- }
-
- if (ss.is_valid()) {
-
- NodePath np = node->get_path_to(orig);
- int node_idx = ss->find_node_by_path(np);
- if (node_idx >= 0) {
- bool lfound = false;
- Variant lvar;
- lvar = ss->get_property_value(node_idx, p_prop, lfound);
- if (lfound) {
-
- found = true;
- value = lvar;
- }
- }
- }
- if (node == edited_scene) {
- //just in case
- break;
- }
- node = node->get_owner();
- }
-
- return found;
-}
-
-bool PropertyEditor::_is_property_different(const Variant &p_current, const Variant &p_orig, int p_usage) {
-
- {
- Node *node = Object::cast_to<Node>(obj);
- if (!node)
- return false;
-
- Node *edited_scene = EditorNode::get_singleton()->get_edited_scene();
- bool found_state = false;
-
- while (node) {
-
- Ref<SceneState> ss;
-
- if (node == edited_scene) {
- ss = node->get_scene_inherited_state();
-
- } else {
- ss = node->get_scene_instance_state();
- }
-
- if (ss.is_valid()) {
- found_state = true;
- }
- if (node == edited_scene) {
- //just in case
- break;
- }
- node = node->get_owner();
- }
-
- if (!found_state)
- return false; //pointless to check if we are not comparing against anything.
- }
-
- if (p_orig.get_type() == Variant::NIL) {
-
- //special cases
- if (p_current.is_zero() && p_usage & PROPERTY_USAGE_STORE_IF_NONZERO)
- return false;
- if (p_current.is_one() && p_usage & PROPERTY_USAGE_STORE_IF_NONONE)
- return false;
- }
-
- if (p_current.get_type() == Variant::REAL && p_orig.get_type() == Variant::REAL) {
- float a = p_current;
- float b = p_orig;
-
- return Math::abs(a - b) > CMP_EPSILON; //this must be done because, as some scenes save as text, there might be a tiny difference in floats due to numerical error
- }
-
- return bool(Variant::evaluate(Variant::OP_NOT_EQUAL, p_current, p_orig));
-}
-
-bool PropertyEditor::_is_instanced_node_with_original_property_different(const String &p_name, TreeItem *item) {
- bool mbi = _might_be_in_instance();
- if (mbi) {
- Variant vorig;
- Dictionary d = item->get_metadata(0);
- int usage = d.has("usage") ? int(int(d["usage"]) & (PROPERTY_USAGE_STORE_IF_NONONE | PROPERTY_USAGE_STORE_IF_NONZERO)) : 0;
- if (_get_instanced_node_original_property(p_name, vorig) || usage) {
- Variant v = obj->get(p_name);
-
- if (_is_property_different(v, vorig, usage)) {
- return true;
- }
- }
- }
- return false;
-}
-
-TreeItem *PropertyEditor::find_item(TreeItem *p_item, const String &p_name) {
-
- if (!p_item)
- return NULL;
-
- String name = p_item->get_metadata(1);
-
- if (name == p_name) {
-
- return p_item;
- }
-
- TreeItem *c = p_item->get_children();
-
- while (c) {
-
- TreeItem *found = find_item(c, p_name);
- if (found)
- return found;
- c = c->get_next();
- }
-
- return NULL;
-}
-
-void PropertyEditor::_changed_callback(Object *p_changed, const char *p_prop) {
-
- _changed_callbacks(p_changed, p_prop);
-}
-
-void PropertyEditor::_changed_callbacks(Object *p_changed, const String &p_prop) {
-
- if (p_changed != obj)
- return;
-
- if (changing)
- return;
-
- if (p_prop == String())
- update_tree_pending = true;
- else {
-
- pending[p_prop] = p_prop;
- }
-}
-
-void PropertyEditor::update_property(const String &p_prop) {
-
- if (obj)
- _changed_callbacks(obj, p_prop);
-}
-
-void PropertyEditor::set_item_text(TreeItem *p_item, int p_type, const String &p_name, int p_hint, const String &p_hint_text) {
-
- switch (p_type) {
-
- case Variant::BOOL: {
-
- p_item->set_checked(1, obj->get(p_name));
- } break;
- case Variant::REAL:
- case Variant::INT: {
-
- if (p_hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || p_hint == PROPERTY_HINT_LAYERS_2D_RENDER || p_hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || p_hint == PROPERTY_HINT_LAYERS_3D_RENDER) {
- tree->update();
- break;
- }
-
- if (p_hint == PROPERTY_HINT_FLAGS) {
- Vector<String> values = p_hint_text.split(",");
- String flags;
- int val = obj->get(p_name);
- for (int i = 0; i < values.size(); i++) {
-
- String v = values[i];
- if (v == "")
- continue;
- if (!(val & (1 << i)))
- continue;
-
- if (flags != "")
- flags += ", ";
- flags += v;
- }
- p_item->set_text(1, flags);
- break;
- }
-
- if (p_hint == PROPERTY_HINT_EXP_EASING) {
-
- p_item->set_text(1, String::num(obj->get(p_name), 2));
- break;
- }
-
- if (p_type == Variant::REAL) {
- p_item->set_range(1, obj->get(p_name));
-
- } else {
- /* FIXME: Why are both statements equal? */
- p_item->set_range(1, obj->get(p_name));
- }
-
- p_item->set_editable(1, !read_only);
-
- } break;
- case Variant::STRING:
-
- if (p_hint == PROPERTY_HINT_TYPE_STRING) {
-
- p_item->set_text(1, obj->get(p_name));
- }
-
- if (p_hint == PROPERTY_HINT_METHOD_OF_VARIANT_TYPE ||
- p_hint == PROPERTY_HINT_METHOD_OF_BASE_TYPE ||
- p_hint == PROPERTY_HINT_METHOD_OF_INSTANCE ||
- p_hint == PROPERTY_HINT_METHOD_OF_SCRIPT ||
- p_hint == PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE ||
- p_hint == PROPERTY_HINT_PROPERTY_OF_BASE_TYPE ||
- p_hint == PROPERTY_HINT_PROPERTY_OF_INSTANCE ||
- p_hint == PROPERTY_HINT_PROPERTY_OF_SCRIPT) {
-
- p_item->set_text(1, obj->get(p_name));
- }
-
- if (p_hint == PROPERTY_HINT_ENUM) {
-
- Vector<String> strings = p_hint_text.split(",");
- String current = obj->get(p_name);
- int idx = 0;
- for (int x = 0; x < strings.size(); x++) {
- if (strings[x] == current) {
- idx = x;
- break;
- }
- }
- p_item->set_text(1, p_hint_text);
- p_item->set_range(1, idx);
- break;
- }
-
- case Variant::VECTOR3:
- case Variant::QUAT:
- case Variant::VECTOR2:
- case Variant::AABB:
- case Variant::RECT2:
- case Variant::TRANSFORM2D:
- case Variant::BASIS:
- case Variant::TRANSFORM: {
-
- p_item->set_text(1, obj->get(p_name));
-
- } break;
- case Variant::COLOR: {
-
- tree->update();
-
- } break;
- case Variant::NODE_PATH: {
-
- p_item->set_text(1, obj->get(p_name));
- } break;
- case Variant::OBJECT: {
-
- Ref<EncodedObjectAsID> encoded = obj->get(p_name); //for debugger and remote tools
-
- if (encoded.is_valid()) {
-
- p_item->set_text(1, "Object: " + itos(encoded->get_object_id()));
- p_item->set_icon(1, Ref<Texture>());
- p_item->set_custom_as_button(1, true);
-
- } else if (obj->get(p_name).get_type() == Variant::NIL || obj->get(p_name).operator RefPtr().is_null()) {
- p_item->set_text(1, "<null>");
- p_item->set_icon(1, Ref<Texture>());
- p_item->set_custom_as_button(1, false);
-
- Dictionary d = p_item->get_metadata(0);
- int hint = d.has("hint") ? d["hint"].operator int() : -1;
- String hint_text = d.has("hint_text") ? d["hint_text"] : "";
- if (hint == PROPERTY_HINT_RESOURCE_TYPE && hint_text == "Texture") {
- p_item->set_icon(1, NULL);
- }
-
- } else {
- p_item->set_custom_as_button(1, true);
- RES res = obj->get(p_name).operator RefPtr();
- if (res->is_class("Texture")) {
- int tw = EditorSettings::get_singleton()->get("docks/property_editor/texture_preview_width");
- Vector2 size(res->call("get_width"), res->call("get_height"));
- if (size.width < size.height) {
- tw = MAX((size.width / size.height) * tw, 1);
- }
- p_item->set_icon_max_width(1, tw);
- p_item->set_icon(1, res);
- p_item->set_text(1, "");
-
- } else if (res->get_name() != "") {
-
- p_item->set_text(1, res->get_name());
- } else if (res->get_path() != "" && !res->get_path().begins_with("local://")) {
- p_item->set_text(1, res->get_path().get_file());
- } else {
- p_item->set_text(1, "<" + res->get_class() + ">");
- };
-
- if (res.is_valid() && res->get_path().is_resource_file()) {
- p_item->set_tooltip(1, res->get_path());
- } else if (res.is_valid()) {
- p_item->set_tooltip(1, res->get_name() + " (" + res->get_class() + ")");
- }
-
- if (has_icon(res->get_class(), "EditorIcons")) {
-
- p_item->set_icon(0, get_icon(res->get_class(), "EditorIcons"));
- } else {
-
- Dictionary d = p_item->get_metadata(0);
- int hint = d.has("hint") ? d["hint"].operator int() : -1;
- String hint_text = d.has("hint_text") ? d["hint_text"] : "";
- if (hint == PROPERTY_HINT_RESOURCE_TYPE) {
-
- if (has_icon(hint_text, "EditorIcons")) {
-
- p_item->set_icon(0, get_icon(hint_text, "EditorIcons"));
-
- } else {
- p_item->set_icon(0, get_icon("Object", "EditorIcons"));
- }
- }
- }
-
- if (res->is_class("Script")) {
- p_item->set_text(1, res->get_path().get_file());
- } else if (!res->is_class("Texture")) {
- //texture already previews via itself
- EditorResourcePreview::get_singleton()->queue_edited_resource_preview(res, this, "_resource_preview_done", p_item->get_instance_id());
- }
- }
-
- } break;
- default: {};
- }
-}
-
-void PropertyEditor::_check_reload_status(const String &p_name, TreeItem *item) {
-
- bool has_reload = false;
- int found = -1;
- bool is_disabled = false;
-
- for (int i = 0; i < item->get_button_count(1); i++) {
-
- if (item->get_button_id(1, i) == 3) {
- found = i;
- is_disabled = item->is_button_disabled(1, i);
- break;
- }
- }
-
- if (_is_instanced_node_with_original_property_different(p_name, item)) {
- has_reload = true;
- }
-
- if (obj->call("property_can_revert", p_name).operator bool()) {
-
- has_reload = true;
- }
-
- if (!has_reload && !obj->get_script().is_null()) {
- Ref<Script> scr = obj->get_script();
- Variant orig_value;
- if (scr->get_property_default_value(p_name, orig_value)) {
- if (orig_value != obj->get(p_name)) {
- has_reload = true;
- }
- }
- }
-
- if (found != -1 && !has_reload) {
-
- if (!is_disabled) {
- item->erase_button(1, found);
- if (item->get_cell_mode(1) == TreeItem::CELL_MODE_RANGE && item->get_text(1) == String()) {
- item->add_button(1, get_icon("ReloadEmpty", "EditorIcons"), 3, true);
- }
- }
- } else if (found == -1 && has_reload) {
- item->add_button(1, get_icon("ReloadSmall", "EditorIcons"), 3);
- } else if (found != -1 && has_reload && is_disabled) {
- item->erase_button(1, found);
- item->add_button(1, get_icon("ReloadSmall", "EditorIcons"), 3);
- }
-}
-
-bool PropertyEditor::_is_drop_valid(const Dictionary &p_drag_data, const Dictionary &p_item_data) const {
-
- Dictionary d = p_item_data;
-
- if (d.has("type")) {
-
- int type = d["type"];
- if (type == Variant::OBJECT && d.has("hint") && d.has("hint_text") && int(d["hint"]) == PROPERTY_HINT_RESOURCE_TYPE) {
-
- String allowed_type = d["hint_text"];
-
- Dictionary drag_data = p_drag_data;
- if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
- Ref<Resource> res = drag_data["resource"];
- for (int i = 0; i < allowed_type.get_slice_count(","); i++) {
- String at = allowed_type.get_slice(",", i).strip_edges();
- if (res.is_valid() && ClassDB::is_parent_class(res->get_class(), at)) {
- return true;
- }
- }
- }
-
- if (drag_data.has("type") && String(drag_data["type"]) == "files") {
-
- Vector<String> files = drag_data["files"];
-
- if (files.size() == 1) {
- String file = files[0];
- String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
-
- if (ftype != "") {
-
- for (int i = 0; i < allowed_type.get_slice_count(","); i++) {
- String at = allowed_type.get_slice(",", i).strip_edges();
- if (ClassDB::is_parent_class(ftype, at)) {
- return true;
- }
- }
- }
- }
- }
- }
- }
-
- return false;
-}
-void PropertyEditor::_mark_drop_fields(TreeItem *p_at) {
-
- if (_is_drop_valid(get_viewport()->gui_get_drag_data(), p_at->get_metadata(0)))
- p_at->set_custom_bg_color(1, get_color("accent_color", "Editor"), true);
-
- if (p_at->get_children()) {
- _mark_drop_fields(p_at->get_children());
- }
-
- if (p_at->get_next()) {
- _mark_drop_fields(p_at->get_next());
- }
-}
-
-Variant PropertyEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
-
- TreeItem *item = tree->get_item_at_position(p_point);
- if (!item)
- return Variant();
-
- Dictionary d = item->get_metadata(0);
- if (!d.has("name"))
- return Variant();
-
- int col = tree->get_column_at_position(p_point);
- if (col == 0) {
-
- Dictionary dp;
- dp["type"] = "obj_property";
- dp["object"] = obj;
- dp["property"] = d["name"];
- dp["value"] = obj->get(d["name"]);
-
- Label *label = memnew(Label);
- label->set_text(d["name"]);
- set_drag_preview(label);
- return dp;
- }
-
- Variant val = obj->get(d["name"]);
-
- if (val.get_type() == Variant::OBJECT) {
- RES res = val;
- if (res.is_valid()) {
-
- custom_editor->hide_menu();
- return EditorNode::get_singleton()->drag_resource(res, p_from);
- }
- }
-
- return Variant();
-}
-
-bool PropertyEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
-
- TreeItem *item = tree->get_item_at_position(p_point);
- if (!item)
- return false;
-
- int col = tree->get_column_at_position(p_point);
- if (col != 1)
- return false;
-
- return _is_drop_valid(p_data, item->get_metadata(0));
-}
-void PropertyEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
-
- TreeItem *item = tree->get_item_at_position(p_point);
- if (!item)
- return;
-
- int col = tree->get_column_at_position(p_point);
- if (col != 1)
- return;
-
- if (!_is_drop_valid(p_data, item->get_metadata(0)))
- return;
-
- Dictionary d = item->get_metadata(0);
-
- if (!d.has("name"))
- return;
-
- String name = d["name"];
-
- Dictionary drag_data = p_data;
- if (drag_data.has("type") && String(drag_data["type"]) == "resource") {
- Ref<Resource> res = drag_data["resource"];
- if (res.is_valid()) {
- _edit_set(name, res);
- return;
- }
- }
-
- if (drag_data.has("type") && String(drag_data["type"]) == "files") {
-
- Vector<String> files = drag_data["files"];
-
- if (files.size() == 1) {
- String file = files[0];
- RES res = ResourceLoader::load(file);
- if (res.is_valid()) {
- _edit_set(name, res);
- return;
- }
- }
- }
-}
-
-void PropertyEditor::_clear_drop_fields(TreeItem *p_at) {
-
- Dictionary d = p_at->get_metadata(0);
-
- if (d.has("type")) {
-
- int type = d["type"];
- if (type == Variant::OBJECT) {
- p_at->clear_custom_bg_color(1);
- }
- }
-
- if (p_at->get_children()) {
- _clear_drop_fields(p_at->get_children());
- }
-
- if (p_at->get_next()) {
- _clear_drop_fields(p_at->get_next());
- }
-}
-
-void PropertyEditor::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE) {
-
- get_tree()->connect("node_removed", this, "_node_removed");
- }
- if (p_what == NOTIFICATION_EXIT_TREE) {
-
- get_tree()->disconnect("node_removed", this, "_node_removed");
- edit(NULL);
- }
-
- if (p_what == NOTIFICATION_DRAG_BEGIN) {
-
- if (is_visible_in_tree() && tree->get_root()) {
- _mark_drop_fields(tree->get_root());
- }
- }
-
- if (p_what == NOTIFICATION_DRAG_END) {
- if (is_visible_in_tree() && tree->get_root()) {
- _clear_drop_fields(tree->get_root());
- }
- }
-
- if (p_what == NOTIFICATION_PHYSICS_PROCESS) {
-
- if (refresh_countdown > 0) {
- refresh_countdown -= get_physics_process_delta_time();
- if (refresh_countdown <= 0) {
- TreeItem *root = tree->get_root();
- _refresh_item(root);
- }
- }
-
- changing = true;
-
- if (update_tree_pending) {
-
- update_tree();
- update_tree_pending = false;
-
- } else {
-
- const String *k = NULL;
- while ((k = pending.next(k))) {
-
- TreeItem *item = find_item(tree->get_root(), *k);
- if (!item)
- continue;
-
- _check_reload_status(*k, item);
-
- Dictionary d = item->get_metadata(0);
- set_item_text(item, d["type"], d["name"], d["hint"], d["hint_text"]);
- }
- }
-
- pending.clear();
-
- changing = false;
- }
-
- if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
- update_tree();
- }
-}
-
-TreeItem *PropertyEditor::get_parent_node(String p_path, HashMap<String, TreeItem *> &item_paths, TreeItem *root, TreeItem *category) {
-
- TreeItem *item = NULL;
-
- if (p_path == "") {
-
- item = category ? category : root;
- } else if (item_paths.has(p_path)) {
-
- item = item_paths.get(p_path);
- } else {
-
- TreeItem *parent = get_parent_node(p_path.left(p_path.find_last("/")), item_paths, root, NULL);
- item = tree->create_item(parent);
-
- String name = (p_path.find("/") != -1) ? p_path.right(p_path.find_last("/") + 1) : p_path;
- item->set_text(0, capitalize_paths ? name.capitalize() : name);
- item->set_tooltip(0, p_path);
- if (item->get_parent() != root) {
- item->set_icon(0, get_icon("Folder", "EditorIcons"));
- }
-
- item->set_editable(0, false);
- if (!subsection_selectable) {
- item->set_expand_right(0, true);
- }
- item->set_selectable(0, subsection_selectable);
- item->set_editable(1, false);
- item->set_selectable(1, subsection_selectable);
-
- if (use_folding) {
- if (!obj->editor_is_section_unfolded(p_path)) {
- updating_folding = true;
- item->set_collapsed(true);
- updating_folding = false;
- }
- item->set_metadata(0, p_path);
- foldable_property_cache.push_back(p_path);
- }
-
- if (item->get_parent() == root) {
-
- item->set_custom_bg_color(0, get_color("prop_subsection", "Editor"));
- item->set_custom_bg_color(1, get_color("prop_subsection", "Editor"));
- }
-
- item_paths[p_path] = item;
- }
-
- return item;
-}
-
-void PropertyEditor::_refresh_item(TreeItem *p_item) {
-
- if (!p_item)
- return;
-
- String name = p_item->get_metadata(1);
-
- if (name != String()) {
-
- _check_reload_status(name, p_item);
- Dictionary d = p_item->get_metadata(0);
- set_item_text(p_item, d["type"], d["name"], d["hint"], d["hint_text"]);
- }
-
- TreeItem *c = p_item->get_children();
-
- while (c) {
-
- _refresh_item(c);
-
- c = c->get_next();
- }
-}
-
-void PropertyEditor::refresh() {
-
- if (refresh_countdown > 0)
- return;
- refresh_countdown = EditorSettings::get_singleton()->get("docks/property_editor/auto_refresh_interval");
-}
-
-void PropertyEditor::update_tree() {
-
- tree->clear();
- foldable_property_cache.clear();
-
- if (!obj)
- return;
-
- HashMap<String, TreeItem *> item_path;
-
- TreeItem *root = tree->create_item(NULL);
- tree->set_hide_root(true);
-
- List<PropertyInfo> plist;
- obj->get_property_list(&plist, true);
-
- bool draw_red = false;
-
- {
- Node *nod = Object::cast_to<Node>(obj);
- Node *es = EditorNode::get_singleton()->get_edited_scene();
- if (nod && es != nod && nod->get_owner() != es) {
- draw_red = true;
- }
- }
-
- Color sscolor = get_color("prop_subsection", "Editor");
-
- TreeItem *current_category = NULL;
-
- String filter = search_box ? search_box->get_text() : "";
- String group;
- String group_base;
-
- for (List<PropertyInfo>::Element *I = plist.front(); I; I = I->next()) {
-
- PropertyInfo &p = I->get();
-
- //make sure the property can be edited
-
- if (p.usage & PROPERTY_USAGE_GROUP) {
-
- group = p.name;
- group_base = p.hint_string;
-
- continue;
-
- } else if (p.usage & PROPERTY_USAGE_CATEGORY) {
-
- group = "";
- group_base = "";
-
- if (!show_categories)
- continue;
-
- List<PropertyInfo>::Element *N = I->next();
- bool valid = true;
- //if no properties in category, skip
- while (N) {
- if (N->get().usage & PROPERTY_USAGE_EDITOR)
- break;
- if (N->get().usage & PROPERTY_USAGE_CATEGORY) {
- valid = false;
- break;
- }
- N = N->next();
- }
- if (!valid)
- continue; //empty, ignore
- TreeItem *sep = tree->create_item(root);
- current_category = sep;
- String type = p.name;
-
- if (has_icon(type, "EditorIcons"))
- sep->set_icon(0, get_icon(type, "EditorIcons"));
- else
- sep->set_icon(0, get_icon("Object", "EditorIcons"));
-
- sep->set_text(0, type);
- sep->set_expand_right(0, true);
- sep->set_selectable(0, false);
- sep->set_selectable(1, false);
- sep->set_custom_bg_color(0, get_color("prop_category", "Editor"));
- sep->set_custom_bg_color(1, get_color("prop_category", "Editor"));
- sep->set_text_align(0, TreeItem::ALIGN_CENTER);
- sep->set_disable_folding(true);
-
- if (use_doc_hints) {
- StringName type = p.name;
- if (!class_descr_cache.has(type)) {
-
- String descr;
- DocData *dd = EditorHelp::get_doc_data();
- Map<String, DocData::ClassDoc>::Element *E = dd->class_list.find(type);
- if (E) {
- descr = E->get().brief_description;
- }
- class_descr_cache[type] = descr.word_wrap(80);
- }
-
- sep->set_tooltip(0, TTR("Class:") + " " + p.name + (class_descr_cache[type] == "" ? "" : "\n\n" + class_descr_cache[type]));
- }
- continue;
-
- } else if (!(p.usage & PROPERTY_USAGE_EDITOR))
- continue;
-
- if (hide_script && p.name == "script")
- continue;
-
- String basename = p.name;
- if (group != "") {
- if (group_base != "") {
- if (basename.begins_with(group_base)) {
- basename = basename.replace_first(group_base, "");
- } else if (group_base.begins_with(basename)) {
- //keep it, this is used pretty often
- } else {
- group = ""; //no longer using group base, clear
- }
- }
- }
-
- if (group != "") {
- basename = group + "/" + basename;
- }
-
- String name = (basename.find("/") != -1) ? basename.right(basename.find_last("/") + 1) : basename;
-
- if (capitalize_paths) {
- int dot = name.find(".");
- if (dot != -1) {
- String ov = name.right(dot);
- name = name.substr(0, dot);
- name = name.camelcase_to_underscore().capitalize();
- name += ov;
-
- } else {
- name = name.camelcase_to_underscore().capitalize();
- }
- }
-
- String path = basename.left(basename.find_last("/"));
-
- if (use_filter && filter != "") {
-
- String cat = path;
-
- if (capitalize_paths)
- cat = cat.capitalize();
-
- if (!filter.is_subsequence_ofi(cat) && !filter.is_subsequence_ofi(name))
- continue;
- }
-
- TreeItem *parent = get_parent_node(path, item_path, root, current_category);
- int level = 0;
- if (parent != root) {
- level++;
- TreeItem *parent_lev = parent;
- while (parent_lev->get_parent() != root) {
- parent_lev = parent_lev->get_parent();
- level++;
- }
- }
- if (level > 4)
- level = 4;
-
- Color col = sscolor;
- col.a = (level / 4.0) * 0.7;
-
- TreeItem *item = tree->create_item(parent);
-
- if (level > 0) {
- item->set_custom_bg_color(0, col);
- }
- item->set_editable(0, false);
- item->set_selectable(0, property_selectable);
-
- if (p.usage & PROPERTY_USAGE_CHECKABLE) {
-
- item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
- item->set_selectable(0, true);
- item->set_editable(0, true);
- item->set_checked(0, p.usage & PROPERTY_USAGE_CHECKED);
- }
-
- item->set_text(0, name);
- item->set_tooltip(0, p.name);
-
- if (name.find(".") != -1) {
- Color textcol = get_color("font_color", "Tree");
- textcol.a *= 0.5;
- //override :D
- item->set_custom_color(0, textcol);
- item->set_custom_color(1, textcol);
-
- Color iconcol(1, 1, 1, 0.6);
- item->set_icon_color(0, iconcol);
- item->set_icon_color(1, iconcol);
- }
-
- if (use_doc_hints) {
-
- StringName classname = obj->get_class_name();
- StringName propname = p.name;
- String descr;
- bool found = false;
-
- Map<StringName, Map<StringName, String> >::Element *E = descr_cache.find(classname);
- if (E) {
- Map<StringName, String>::Element *F = E->get().find(propname);
- if (F) {
- found = true;
- descr = F->get();
- }
- }
-
- if (!found) {
- DocData *dd = EditorHelp::get_doc_data();
- Map<String, DocData::ClassDoc>::Element *E = dd->class_list.find(classname);
- while (E && descr == String()) {
- for (int i = 0; i < E->get().properties.size(); i++) {
- if (E->get().properties[i].name == propname.operator String()) {
- descr = E->get().properties[i].description.strip_edges().word_wrap(80);
- break;
- }
- }
- if (!E->get().inherits.empty()) {
- E = dd->class_list.find(E->get().inherits);
- } else {
- break;
- }
- }
- descr_cache[classname][propname] = descr;
- }
-
- item->set_tooltip(0, TTR("Property:") + " " + p.name + (descr == "" ? "" : "\n\n" + descr));
- }
-
- Dictionary d;
- d["name"] = p.name;
- d["type"] = (int)p.type;
- d["hint"] = (int)p.hint;
- d["hint_text"] = p.hint_string;
- d["usage"] = (int)p.usage;
-
- item->set_metadata(0, d);
- item->set_metadata(1, p.name);
-
- if (draw_red)
- item->set_custom_color(0, get_color("error_color", "Editor"));
-
- if (p.name == selected_property) {
-
- item->select(1);
- }
-
- switch (p.type) {
-
- case Variant::BOOL: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CHECK);
- item->set_text(1, TTR("On"));
- item->set_tooltip(1, obj->get(p.name) ? "True" : "False");
- item->set_checked(1, obj->get(p.name));
- if (show_type_icons)
- item->set_icon(0, get_icon("bool", "EditorIcons"));
- item->set_editable(1, !read_only);
-
- } break;
- case Variant::REAL:
- case Variant::INT: {
-
- if (p.hint == PROPERTY_HINT_EXP_EASING) {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_text(1, String::num(obj->get(p.name), 2));
- item->set_editable(1, !read_only);
- if (show_type_icons)
- item->set_icon(0, get_icon("Curve", "EditorIcons"));
-
- break;
- }
-
- if (p.hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || p.hint == PROPERTY_HINT_LAYERS_2D_RENDER || p.hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || p.hint == PROPERTY_HINT_LAYERS_3D_RENDER) {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, !read_only);
- item->set_custom_draw(1, this, "_draw_flags");
- break;
- }
-
- if (p.hint == PROPERTY_HINT_FLAGS) {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, !read_only);
-
- Vector<String> values = p.hint_string.split(",");
- String flags;
- int val = obj->get(p.name);
- for (int i = 0; i < values.size(); i++) {
-
- String v = values[i];
- if (v == "")
- continue;
- if (!(val & (1 << i)))
- continue;
-
- if (flags != "")
- flags += ", ";
- flags += v;
- }
- item->set_text(1, flags);
- break;
- }
-
- if (p.hint == PROPERTY_HINT_ENUM)
- item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE);
- else
- item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE_EXPRESSION);
-
- if (p.hint == PROPERTY_HINT_SPRITE_FRAME || p.hint == PROPERTY_HINT_RANGE || p.hint == PROPERTY_HINT_EXP_RANGE) {
-
- int c = p.hint_string.get_slice_count(",");
- float min = 0, max = 100, step = p.type == Variant::REAL ? .01 : 1;
- if (c >= 1) {
-
- min = p.hint_string.get_slice(",", 0).to_double();
- }
- if (c >= 2) {
-
- max = p.hint_string.get_slice(",", 1).to_double();
- }
-
- if (p.hint != PROPERTY_HINT_SPRITE_FRAME && c >= 3) {
-
- step = p.hint_string.get_slice(",", 2).to_double();
- }
-
- item->set_range_config(1, min, max, step, p.hint == PROPERTY_HINT_EXP_RANGE);
- } else if (p.hint == PROPERTY_HINT_ENUM) {
-
- item->set_text(1, p.hint_string);
- if (show_type_icons)
- item->set_icon(0, get_icon("Enum", "EditorIcons"));
- item->set_range(1, obj->get(p.name));
- item->set_editable(1, !read_only);
- break;
- } else if (p.hint == PROPERTY_HINT_OBJECT_ID) {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
-
- String type = p.hint_string;
- if (type == "")
- type = "Object";
-
- ObjectID id = obj->get(p.name);
- if (id != 0) {
- item->set_text(1, type + " ID: " + itos(id));
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
- } else {
- item->set_text(1, TTR("[Empty]"));
- }
-
- if (has_icon(p.hint_string, "EditorIcons")) {
- type = p.hint_string;
- } else {
- type = "Object";
- }
-
- item->set_icon(0, get_icon(type, "EditorIcons"));
-
- break;
-
- } else {
- if (p.type == Variant::REAL) {
-
- item->set_range_config(1, -16777216, 16777216, 0.001);
- } else {
-
- item->set_range_config(1, -2147483647, 2147483647, 1);
- }
- };
-
- if (p.type == Variant::REAL) {
- if (show_type_icons)
- item->set_icon(0, get_icon("float", "EditorIcons"));
- item->set_range(1, obj->get(p.name));
-
- } else {
- if (show_type_icons)
- item->set_icon(0, get_icon("int", "EditorIcons"));
- item->set_range(1, obj->get(p.name));
- }
-
- item->set_editable(1, !read_only);
-
- } break;
- case Variant::STRING: {
-
- switch (p.hint) {
-
- case PROPERTY_HINT_DIR:
- case PROPERTY_HINT_FILE:
- case PROPERTY_HINT_GLOBAL_DIR:
- case PROPERTY_HINT_GLOBAL_FILE: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_STRING);
- item->set_editable(1, !read_only);
- if (show_type_icons)
- item->set_icon(0, get_icon("File", "EditorIcons"));
- item->set_text(1, obj->get(p.name));
- item->add_button(1, get_icon("Folder", "EditorIcons"));
-
- } break;
- case PROPERTY_HINT_ENUM: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE);
- Vector<String> strings = p.hint_string.split(",");
- String current = obj->get(p.name);
- int idx = 0;
- for (int x = 0; x < strings.size(); x++) {
- if (strings[x] == current) {
- idx = x;
- break;
- }
- }
- item->set_text(1, p.hint_string);
- item->set_range(1, idx);
- item->set_editable(1, !read_only);
- if (show_type_icons)
- item->set_icon(0, get_icon("Enum", "EditorIcons"));
-
- } break;
- case PROPERTY_HINT_METHOD_OF_VARIANT_TYPE: ///< a property of a type
- case PROPERTY_HINT_METHOD_OF_BASE_TYPE: ///< a method of a base type
- case PROPERTY_HINT_METHOD_OF_INSTANCE: ///< a method of an instance
- case PROPERTY_HINT_METHOD_OF_SCRIPT: ///< a method of a script & base
- case PROPERTY_HINT_PROPERTY_OF_VARIANT_TYPE: ///< a property of a type
- case PROPERTY_HINT_PROPERTY_OF_BASE_TYPE: ///< a property of a base type
- case PROPERTY_HINT_PROPERTY_OF_INSTANCE: ///< a property of an instance
- case PROPERTY_HINT_PROPERTY_OF_SCRIPT: ///< a property of a script & base
- case PROPERTY_HINT_TYPE_STRING: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, !read_only);
- if (show_type_icons)
- item->set_icon(0, get_icon("String", "EditorIcons"));
- item->set_text(1, obj->get(p.name));
-
- } break;
-
- default: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_STRING);
- item->set_editable(1, !read_only);
- if (show_type_icons)
- item->set_icon(0, get_icon("String", "EditorIcons"));
- item->set_text(1, obj->get(p.name));
- if (p.hint == PROPERTY_HINT_MULTILINE_TEXT)
- item->add_button(1, get_icon("MultiLine", "EditorIcons"));
-
- } break;
- }
-
- } break;
- case Variant::ARRAY: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
-
- Variant v = obj->get(p.name);
- String type_name = "Array";
- String type_name_suffix = "";
-
- String hint = p.hint_string;
- while (hint.begins_with(itos(Variant::ARRAY) + ":")) {
- type_name += "<Array";
- type_name_suffix += ">";
- hint = hint.right(2);
- }
- if (hint.find(":") >= 0) {
- int colon_pos = hint.find(":");
- String hint_string = hint.right(colon_pos + 1);
- hint = hint.left(colon_pos);
-
- PropertyHint property_hint = PROPERTY_HINT_NONE;
-
- if (hint.find("/") >= 0) {
- int slash_pos = hint.find("/");
- property_hint = PropertyHint(hint.right(slash_pos + 1).to_int());
- hint = hint.left(slash_pos);
- }
-
- if (property_hint == PROPERTY_HINT_RESOURCE_TYPE) {
- type_name += "<" + hint_string;
- } else {
- type_name += "<" + Variant::get_type_name(Variant::Type(hint.to_int()));
- }
- type_name_suffix += ">";
- }
- type_name += type_name_suffix;
-
- if (v.is_array())
- item->set_text(1, type_name + "(" + itos(v.call("size")) + ")");
- else
- item->set_text(1, type_name + "()");
-
- if (show_type_icons)
- item->set_icon(0, get_icon("PoolByteArray", "EditorIcons"));
-
- } break;
- case Variant::DICTIONARY: {
-
- Variant v = obj->get(p.name);
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_STRING);
- item->set_text(1, String("Dictionary{") + itos(v.call("size")) + "}");
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
-
- if (show_type_icons)
- item->set_icon(0, get_icon("Dictionary", "EditorIcons"));
-
- } break;
-
- case Variant::POOL_INT_ARRAY: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
-
- Variant v = obj->get(p.name);
- if (v.is_array())
- item->set_text(1, "IntArray[" + itos(v.call("size")) + "]");
- else
- item->set_text(1, "IntArray[]");
- if (show_type_icons)
- item->set_icon(0, get_icon("PoolIntArray", "EditorIcons"));
-
- } break;
- case Variant::POOL_REAL_ARRAY: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
-
- Variant v = obj->get(p.name);
- if (v.is_array())
- item->set_text(1, "FloatArray[" + itos(v.call("size")) + "]");
- else
- item->set_text(1, "FloatArray[]");
- if (show_type_icons)
- item->set_icon(0, get_icon("PoolRealArray", "EditorIcons"));
-
- } break;
- case Variant::POOL_STRING_ARRAY: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
-
- Variant v = obj->get(p.name);
- if (v.is_array())
- item->set_text(1, "String[" + itos(v.call("size")) + "]");
- else
- item->set_text(1, "String[]");
- if (show_type_icons)
- item->set_icon(0, get_icon("PoolStringArray", "EditorIcons"));
-
- } break;
- case Variant::POOL_BYTE_ARRAY: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
-
- Variant v = obj->get(p.name);
- if (v.is_array())
- item->set_text(1, "Byte[" + itos(v.call("size")) + "]");
- else
- item->set_text(1, "Byte[]");
- if (show_type_icons)
- item->set_icon(0, get_icon("PoolByteArray", "EditorIcons"));
-
- } break;
- case Variant::POOL_VECTOR2_ARRAY: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
-
- Variant v = obj->get(p.name);
- if (v.is_array())
- item->set_text(1, "Vector2[" + itos(v.call("size")) + "]");
- else
- item->set_text(1, "Vector2[]");
- if (show_type_icons)
- item->set_icon(0, get_icon("Vector2", "EditorIcons"));
-
- } break;
- case Variant::POOL_VECTOR3_ARRAY: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
-
- Variant v = obj->get(p.name);
- if (v.is_array())
- item->set_text(1, "Vector3[" + itos(v.call("size")) + "]");
- else
- item->set_text(1, "Vector3[]");
- if (show_type_icons)
- item->set_icon(0, get_icon("Vector3", "EditorIcons"));
-
- } break;
- case Variant::POOL_COLOR_ARRAY: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->add_button(1, get_icon("EditResource", "EditorIcons"));
-
- Variant v = obj->get(p.name);
- if (v.is_array())
- item->set_text(1, "Color[" + itos(v.call("size")) + "]");
- else
- item->set_text(1, "Color[]");
- if (show_type_icons)
- item->set_icon(0, get_icon("Color", "EditorIcons"));
-
- } break;
- case Variant::VECTOR2: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, true);
- item->set_text(1, obj->get(p.name));
- if (show_type_icons)
- item->set_icon(0, get_icon("Vector2", "EditorIcons"));
-
- } break;
- case Variant::RECT2: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, true);
- item->set_text(1, obj->get(p.name));
- if (show_type_icons)
- item->set_icon(0, get_icon("Rect2", "EditorIcons"));
-
- } break;
- case Variant::VECTOR3: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, true);
- item->set_text(1, obj->get(p.name));
- if (show_type_icons)
- item->set_icon(0, get_icon("Vector3", "EditorIcons"));
-
- } break;
- case Variant::TRANSFORM2D:
- case Variant::BASIS: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, true);
- item->set_text(1, obj->get(p.name));
-
- } break;
- case Variant::TRANSFORM: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, true);
- item->set_text(1, obj->get(p.name));
- if (show_type_icons)
- item->set_icon(0, get_icon("Transform", "EditorIcons"));
-
- } break;
- case Variant::PLANE: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, true);
- item->set_text(1, obj->get(p.name));
- if (show_type_icons)
- item->set_icon(0, get_icon("Plane", "EditorIcons"));
-
- } break;
- case Variant::AABB: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, true);
- item->set_text(1, "AABB");
- if (show_type_icons)
- item->set_icon(0, get_icon("AABB", "EditorIcons"));
-
- } break;
-
- case Variant::QUAT: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, true);
- item->set_text(1, obj->get(p.name));
- if (show_type_icons)
- item->set_icon(0, get_icon("Quat", "EditorIcons"));
-
- } break;
- case Variant::COLOR: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, !read_only);
- item->set_custom_draw(1, this, "_draw_transparency");
- if (show_type_icons)
- item->set_icon(0, get_icon("Color", "EditorIcons"));
-
- } break;
-
- case Variant::NODE_PATH: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_STRING);
- item->set_editable(1, !read_only);
- item->set_text(1, obj->get(p.name));
- item->add_button(1, get_icon("CopyNodePath", "EditorIcons"));
- if (show_type_icons)
- item->set_icon(0, get_icon("NodePath", "EditorIcons"));
-
- } break;
- case Variant::OBJECT: {
-
- item->set_cell_mode(1, TreeItem::CELL_MODE_CUSTOM);
- item->set_editable(1, !read_only);
- String type;
- if (p.hint == PROPERTY_HINT_RESOURCE_TYPE)
- type = p.hint_string;
-
- RES res = obj->get(p.name).operator RefPtr();
- if (type.begins_with("RES:") && type != "RES:") { // Remote resources
- res = ResourceLoader::load(type.substr(4, type.length()));
- }
- Ref<EncodedObjectAsID> encoded = obj->get(p.name); //for debugger and remote tools
-
- if (encoded.is_valid()) {
-
- item->set_text(1, "Object: " + itos(encoded->get_object_id()));
- item->set_icon(1, Ref<Texture>());
- item->set_custom_as_button(1, true);
- item->set_editable(1, true);
-
- } else if (obj->get(p.name).get_type() == Variant::NIL || res.is_null()) {
-
- item->set_text(1, "<null>");
- item->set_icon(1, Ref<Texture>());
- item->set_custom_as_button(1, false);
-
- } else if (res.is_valid()) {
-
- item->set_custom_as_button(1, true);
-
- if (res->is_class("Texture")) {
- int tw = EditorSettings::get_singleton()->get("docks/property_editor/texture_preview_width");
- Vector2 size(res->call("get_width"), res->call("get_height"));
- if (size.width < size.height) {
- tw = MAX((size.width / size.height) * tw, 1);
- }
- item->set_icon_max_width(1, tw);
- item->set_icon(1, res);
- item->set_text(1, "");
-
- } else if (res->get_name() != "") {
-
- item->set_text(1, res->get_name());
- } else if (res->get_path() != "" && !res->get_path().begins_with("local://")) {
- item->set_text(1, res->get_path().get_file());
-
- } else {
- item->set_text(1, "<" + res->get_class() + ">");
- }
-
- if (has_icon(res->get_class(), "EditorIcons")) {
- type = res->get_class();
- }
-
- if (res.is_valid() && res->get_path().is_resource_file()) {
- item->set_tooltip(1, res->get_path());
- } else if (res.is_valid()) {
- item->set_tooltip(1, res->get_name() + " (" + res->get_class() + ")");
- }
- if (res->is_class("Script")) {
- item->set_text(1, res->get_path().get_file());
- } else if (!res->is_class("Texture")) {
- //texture already previews via itself
- EditorResourcePreview::get_singleton()->queue_edited_resource_preview(res, this, "_resource_preview_done", item->get_instance_id());
- }
- }
-
- if (type != String()) {
- if (type.find(",") != -1)
- type = type.get_slice(",", 0);
- if (has_icon(type, "EditorIcons"))
- item->set_icon(0, get_icon(type, "EditorIcons"));
- else
- item->set_icon(0, get_icon("Object", "EditorIcons"));
- }
-
- } break;
- default: {};
- }
-
- if (keying) {
-
- if (p.hint == PROPERTY_HINT_SPRITE_FRAME) {
-
- item->add_button(1, get_icon("KeyNext", "EditorIcons"), 5);
- } else {
- item->add_button(1, get_icon("Key", "EditorIcons"), 2);
- }
- }
-
- bool has_reload = false;
-
- if (_is_instanced_node_with_original_property_different(p.name, item)) {
- item->add_button(1, get_icon("ReloadSmall", "EditorIcons"), 3);
- has_reload = true;
- }
-
- if (obj->call("property_can_revert", p.name).operator bool()) {
-
- item->add_button(1, get_icon("ReloadSmall", "EditorIcons"), 3);
- has_reload = true;
- }
-
- if (!has_reload && !obj->get_script().is_null()) {
- Ref<Script> scr = obj->get_script();
- Variant orig_value;
- if (scr->get_property_default_value(p.name, orig_value)) {
- if (orig_value != obj->get(p.name)) {
- item->add_button(1, get_icon("ReloadSmall", "EditorIcons"), 3);
- has_reload = true;
- }
- }
- }
-
- if (_might_be_in_instance() && !has_reload && item->get_cell_mode(1) == TreeItem::CELL_MODE_RANGE && item->get_text(1) == String()) {
- item->add_button(1, get_icon("ReloadEmpty", "EditorIcons"), 3, true);
- }
- }
-}
-
-void PropertyEditor::_draw_transparency(Object *t, const Rect2 &p_rect) {
-
- TreeItem *ti = Object::cast_to<TreeItem>(t);
- if (!ti)
- return;
-
- Color color = obj->get(ti->get_metadata(1));
- Ref<Texture> arrow = tree->get_icon("select_option");
-
- // make a little space between consecutive color fields
- Rect2 area = p_rect;
- area.position.y += 1;
- area.size.height -= 2;
- area.size.width -= arrow->get_size().width + 5;
- tree->draw_texture_rect(get_icon("GuiMiniCheckerboard", "EditorIcons"), area, true);
- tree->draw_rect(area, color);
-}
-
-void PropertyEditor::_item_folded(Object *item_obj) {
-
- if (updating_folding)
- return;
-
- TreeItem *item = Object::cast_to<TreeItem>(item_obj);
-
- obj->editor_set_section_unfold(item->get_metadata(0), !item->is_collapsed());
-}
-
-void PropertyEditor::_item_selected() {
-
- TreeItem *item = tree->get_selected();
- ERR_FAIL_COND(!item);
- selected_property = item->get_metadata(1);
-}
-
-void PropertyEditor::_item_rmb_edited() {
- _custom_editor_request(true);
-}
-
-void PropertyEditor::_edit_set(const String &p_name, const Variant &p_value, bool p_refresh_all, const String &p_changed_field) {
-
- if (autoclear) {
- TreeItem *item = tree->get_selected();
- if (item && item->get_cell_mode(0) == TreeItem::CELL_MODE_CHECK) {
-
- item->set_checked(0, true);
- }
- }
-
- if (!undo_redo || Object::cast_to<ArrayPropertyEdit>(obj) || Object::cast_to<DictionaryPropertyEdit>(obj)) { //kind of hacky
-
- obj->set(p_name, p_value);
- if (p_refresh_all)
- _changed_callbacks(obj, "");
- else
- _changed_callbacks(obj, p_name);
-
- emit_signal(_prop_edited, p_name);
-
- } else if (Object::cast_to<MultiNodeEdit>(obj)) {
-
- Object::cast_to<MultiNodeEdit>(obj)->set_property_field(p_name, p_value, p_changed_field);
- _changed_callbacks(obj, p_name);
- emit_signal(_prop_edited, p_name);
- } else {
-
- undo_redo->create_action(TTR("Set") + " " + p_name, UndoRedo::MERGE_ENDS);
- undo_redo->add_do_property(obj, p_name, p_value);
- undo_redo->add_undo_property(obj, p_name, obj->get(p_name));
-
- if (p_refresh_all) {
- undo_redo->add_do_method(this, "_changed_callback", obj, "");
- undo_redo->add_undo_method(this, "_changed_callback", obj, "");
- } else {
-
- undo_redo->add_do_method(this, "_changed_callback", obj, p_name);
- undo_redo->add_undo_method(this, "_changed_callback", obj, p_name);
- }
-
- Resource *r = Object::cast_to<Resource>(obj);
- if (r) {
- if (!r->is_edited() && String(p_name) != "resource/edited") {
- undo_redo->add_do_method(r, "set_edited", true);
- undo_redo->add_undo_method(r, "set_edited", false);
- }
-
- if (String(p_name) == "resource_local_to_scene") {
- bool prev = obj->get(p_name);
- bool next = p_value;
- if (next) {
- undo_redo->add_do_method(this, "setup_local_to_scene");
- }
- if (prev) {
- undo_redo->add_undo_method(this, "setup_local_to_scene");
- }
- }
- }
- undo_redo->add_do_method(this, "emit_signal", _prop_edited, p_name);
- undo_redo->add_undo_method(this, "emit_signal", _prop_edited, p_name);
- undo_redo->commit_action();
- }
-}
-
-void PropertyEditor::_item_edited() {
-
- TreeItem *item = tree->get_edited();
- if (!item)
- return; //it all happened too fast..
-
- Dictionary d = item->get_metadata(0);
-
- String name = d["name"];
-
- if (tree->get_edited_column() == 0) {
- //property checked
- if (autoclear) {
- if (!item->is_checked(0)) {
- obj->set(name, Variant());
- update_property(name);
- } else {
- Variant::CallError ce;
- obj->set(name, Variant::construct(Variant::Type(int(d["type"])), NULL, 0, ce));
- }
- } else {
- emit_signal("property_toggled", name, item->is_checked(0));
- }
- return;
- }
-
- if (autoclear && item->get_cell_mode(0) == TreeItem::CELL_MODE_CHECK && item->get_cell_mode(1) != TreeItem::CELL_MODE_CUSTOM) {
- item->set_checked(0, true);
- }
-
- int type = d["type"];
- int hint = d["hint"];
- int usage = d["usage"];
- bool refresh_all = usage & PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED;
-
- String hint_text = d["hint_text"];
- switch (type) {
-
- case Variant::NIL: {
-
- } break;
- case Variant::BOOL: {
-
- item->set_tooltip(1, item->is_checked(1) ? "True" : "False");
- _edit_set(name, item->is_checked(1), refresh_all);
- } break;
- case Variant::INT:
- case Variant::REAL: {
-
- if (hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || hint == PROPERTY_HINT_LAYERS_2D_RENDER || hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || hint == PROPERTY_HINT_LAYERS_3D_RENDER)
- break;
- if (hint == PROPERTY_HINT_EXP_EASING)
- break;
- if (hint == PROPERTY_HINT_FLAGS)
- break;
-
- if (type == Variant::INT)
- _edit_set(name, int64_t(round(item->get_range(1))), refresh_all);
- else
- _edit_set(name, item->get_range(1), refresh_all);
- } break;
- case Variant::STRING: {
-
- if (hint == PROPERTY_HINT_ENUM) {
-
- int idx = item->get_range(1);
-
- Vector<String> strings = hint_text.split(",");
- String txt;
- if (idx >= 0 && idx < strings.size()) {
-
- txt = strings[idx];
- }
-
- _edit_set(name, txt, refresh_all);
- } else {
- _edit_set(name, item->get_text(1), refresh_all);
- }
- } break;
-
- // math types
- case Variant::VECTOR3: {
-
- } break;
- case Variant::PLANE: {
-
- } break;
- case Variant::QUAT: {
-
- } break;
- case Variant::AABB: {
-
- } break;
- case Variant::BASIS: {
-
- } break;
- case Variant::TRANSFORM: {
-
- } break;
- case Variant::COLOR: {
-
- } break;
-
- case Variant::NODE_PATH: {
- _edit_set(name, NodePath(item->get_text(1)), refresh_all);
-
- } break;
- case Variant::OBJECT: {
- if (!item->is_custom_set_as_button(1))
- break;
-
- Ref<EncodedObjectAsID> encoded = obj->get(name); //for debugger and remote tools
-
- if (encoded.is_valid()) {
-
- emit_signal("object_id_selected", encoded->get_object_id());
- }
-
- RES res = obj->get(name);
- if (res.is_valid()) {
- emit_signal("resource_selected", res.get_ref_ptr(), name);
- }
-
- } break;
-
- case Variant::DICTIONARY: {
-
- } break;
-
- // arrays
- case Variant::POOL_BYTE_ARRAY: {
-
- } break;
- case Variant::POOL_INT_ARRAY: {
-
- } break;
- case Variant::POOL_REAL_ARRAY: {
-
- } break;
- case Variant::POOL_STRING_ARRAY: {
-
- } break;
- case Variant::POOL_VECTOR3_ARRAY: {
-
- } break;
- case Variant::POOL_COLOR_ARRAY: {
-
- } break;
- };
-}
-
-void PropertyEditor::_resource_edit_request() {
-
- RES res = custom_editor->get_variant();
- if (res.is_null())
- return;
-
- String name = custom_editor->get_name();
-
- emit_signal("resource_selected", res.get_ref_ptr(), name);
-}
-
-void PropertyEditor::_custom_editor_edited() {
-
- if (!obj)
- return;
-
- _edit_set(custom_editor->get_name(), custom_editor->get_variant());
-}
-
-void PropertyEditor::_custom_editor_edited_field(const String &p_field_name) {
-
- ERR_FAIL_COND(p_field_name == "");
-
- if (!obj)
- return;
-
- _edit_set(custom_editor->get_name(), custom_editor->get_variant(), false, p_field_name);
-}
-
-void PropertyEditor::_custom_editor_request(bool p_arrow) {
-
- TreeItem *item = tree->get_edited();
- ERR_FAIL_COND(!item);
- Dictionary d = item->get_metadata(0);
-
- String name = d["name"];
- Variant::Type type = Variant::NIL;
- if (d.has("type"))
- type = (Variant::Type)((int)(d["type"]));
-
- Variant v = obj->get(name);
- int hint = d.has("hint") ? d["hint"].operator int() : -1;
- String hint_text = d.has("hint_text") ? d["hint_text"] : "";
- Rect2 where = tree->get_custom_popup_rect();
- custom_editor->set_position(where.position);
-
- if (custom_editor->edit(obj, name, type, v, hint, hint_text)) {
- custom_editor->popup();
- }
-}
-
-void PropertyEditor::edit(Object *p_object) {
-
- if (obj == p_object)
- return;
- if (obj) {
-
- obj->remove_change_receptor(this);
- }
-
- obj = p_object;
-
- evaluator->edit(p_object);
-
- update_tree();
-
- if (obj) {
-
- obj->add_change_receptor(this);
- }
-}
-
-void PropertyEditor::_set_range_def(Object *p_item, String prop, float p_frame) {
-
- TreeItem *ti = Object::cast_to<TreeItem>(p_item);
- ERR_FAIL_COND(!ti);
-
- ti->call_deferred("set_range", 1, p_frame);
- obj->call_deferred("set", prop, p_frame);
-}
-
-void PropertyEditor::_edit_button(Object *p_item, int p_column, int p_button) {
-
- TreeItem *ti = Object::cast_to<TreeItem>(p_item);
- ERR_FAIL_COND(!ti);
-
- Dictionary d = ti->get_metadata(0);
-
- if (p_button == 2) {
-
- if (!d.has("name"))
- return;
- String prop = d["name"];
- emit_signal("property_keyed", prop, obj->get(prop), false);
- } else if (p_button == 5) {
- if (!d.has("name"))
- return;
- String prop = d["name"];
- emit_signal("property_keyed", prop, obj->get(prop), true);
- call_deferred("_set_range_def", ti, prop, ti->get_range(p_column) + 1.0);
- } else if (p_button == 3) {
-
- if (!d.has("name"))
- return;
-
- String prop = d["name"];
-
- Variant vorig;
-
- if (_might_be_in_instance() && _get_instanced_node_original_property(prop, vorig)) {
-
- _edit_set(prop, vorig.duplicate(true)); // Set, making sure to duplicate arrays properly
- return;
- }
-
- if (obj->call("property_can_revert", prop).operator bool()) {
- Variant rev = obj->call("property_get_revert", prop);
- _edit_set(prop, rev);
- }
-
- if (!obj->get_script().is_null()) {
- Ref<Script> scr = obj->get_script();
- Variant orig_value;
- if (scr->get_property_default_value(prop, orig_value)) {
- _edit_set(prop, orig_value);
- }
- }
-
- } else {
-
- Dictionary d = ti->get_metadata(0);
- if (!d.has("type"))
- return;
- if (!d.has("hint"))
- return;
- if (!d.has("name"))
- return;
- if (!d.has("hint_text"))
- return;
-
- int t = d["type"];
- int h = d["hint"];
- String n = d["name"];
- String ht = d["hint_text"];
-
- if (t == Variant::NODE_PATH) {
-
- Variant v = obj->get(n);
- Rect2 where = tree->get_item_rect(ti, 1);
- where.position -= tree->get_scroll();
- where.position += tree->get_global_position() + Point2(where.size.width, 0);
- for (int i = ti->get_button_count(p_column) - 1; i >= p_button; i--)
- where.position.x -= ti->get_button(p_column, i)->get_width();
- custom_editor->set_position(where.position);
- custom_editor->edit(obj, n, (Variant::Type)t, v, h, ht);
- custom_editor->popup();
-
- } else if (t == Variant::STRING) {
-
- Variant v = obj->get(n);
- custom_editor->edit(obj, n, (Variant::Type)t, v, h, ht);
- if (h == PROPERTY_HINT_FILE || h == PROPERTY_HINT_DIR || h == PROPERTY_HINT_GLOBAL_DIR || h == PROPERTY_HINT_GLOBAL_FILE) {
-
- Rect2 where = tree->get_item_rect(ti, 1);
- where.position -= tree->get_scroll();
- where.position += tree->get_global_position() + Point2(where.size.width, 0);
- for (int i = ti->get_button_count(p_column) - 1; i >= p_button; i--)
- where.position.x -= ti->get_button(p_column, i)->get_width();
- custom_editor->set_position(where.position);
- custom_editor->popup();
- } else {
- custom_editor->popup_centered_ratio();
- }
-
- } else if (t == Variant::OBJECT) {
-
- RES r = obj->get(n);
- if (r.is_valid()) {
-
- emit_signal("resource_selected", r, n);
- }
- } else if (t == Variant::INT && h == PROPERTY_HINT_OBJECT_ID) {
-
- emit_signal("object_id_selected", obj->get(n));
-
- } else if (t == Variant::ARRAY || t == Variant::POOL_INT_ARRAY || t == Variant::POOL_REAL_ARRAY || t == Variant::POOL_STRING_ARRAY || t == Variant::POOL_VECTOR2_ARRAY || t == Variant::POOL_VECTOR3_ARRAY || t == Variant::POOL_COLOR_ARRAY || t == Variant::POOL_BYTE_ARRAY) {
-
- Variant v = obj->get(n);
-
- if (v.get_type() != t) {
- Variant::CallError ce;
- v = Variant::construct(Variant::Type(t), NULL, 0, ce);
- }
-
- Ref<ArrayPropertyEdit> ape = memnew(ArrayPropertyEdit);
- ape->edit(obj, n, ht, Variant::Type(t));
- EditorNode::get_singleton()->push_item(ape.ptr());
-
- } else if (t == Variant::DICTIONARY) {
-
- Variant v = obj->get(n);
-
- if (v.get_type() != t) {
- Variant::CallError ce;
- v = Variant::construct(Variant::Type(t), NULL, 0, ce);
- }
-
- Ref<DictionaryPropertyEdit> dpe = memnew(DictionaryPropertyEdit);
- dpe->edit(obj, n);
- EditorNode::get_singleton()->push_item(dpe.ptr());
- }
- }
-}
-
-void PropertyEditor::_node_removed(Node *p_node) {
-
- if (p_node == obj) {
- edit(NULL);
- }
-}
-
-void PropertyEditor::set_keying(bool p_active) {
-
- if (keying == p_active)
- return;
-
- keying = p_active;
- update_tree();
-}
-
-void PropertyEditor::_draw_flags(Object *p_object, const Rect2 &p_rect) {
-
- TreeItem *ti = Object::cast_to<TreeItem>(p_object);
- if (!ti)
- return;
-
- Dictionary d = ti->get_metadata(0);
-
- if (!d.has("name"))
- return;
-
- uint32_t f = obj->get(d["name"]);
-
- int bsize = (p_rect.size.height * 80 / 100) / 2;
-
- int h = bsize * 2 + 1;
- int vofs = (p_rect.size.height - h) / 2;
-
- for (int i = 0; i < 2; i++) {
-
- Point2 ofs(4, vofs);
- if (i == 1)
- ofs.y += bsize + 1;
-
- ofs += p_rect.position;
- for (int j = 0; j < 10; j++) {
-
- Point2 o = ofs + Point2(j * (bsize + 1), 0);
- if (j >= 5)
- o.x += 1;
-
- uint32_t idx = i * 10 + j;
- bool on = f & (1 << idx);
- tree->draw_rect(Rect2(o, Size2(bsize, bsize)), Color(0, 0, 0, on ? 0.8 : 0.3));
- }
- }
-}
-
-void PropertyEditor::_filter_changed(const String &p_text) {
-
- update_tree();
-}
-
-void PropertyEditor::_resource_preview_done(const String &p_path, const Ref<Texture> &p_preview, Variant p_ud) {
-
- if (p_preview.is_null())
- return; //don't bother with empty preview
-
- ObjectID id = p_ud;
- Object *obj = ObjectDB::get_instance(id);
-
- if (!obj)
- return;
-
- TreeItem *ti = Object::cast_to<TreeItem>(obj);
-
- ERR_FAIL_COND(!ti);
-
- int tw = EditorSettings::get_singleton()->get("docks/property_editor/texture_preview_width");
-
- ti->set_icon(1, p_preview); //should be scaled I think?
- ti->set_icon_max_width(1, tw);
- ti->set_text(1, "");
-}
-void PropertyEditor::_bind_methods() {
-
- ClassDB::bind_method("_item_edited", &PropertyEditor::_item_edited);
- ClassDB::bind_method("_item_selected", &PropertyEditor::_item_selected);
- ClassDB::bind_method("_item_rmb_edited", &PropertyEditor::_item_rmb_edited);
- ClassDB::bind_method("_item_folded", &PropertyEditor::_item_folded);
- ClassDB::bind_method("_custom_editor_request", &PropertyEditor::_custom_editor_request);
- ClassDB::bind_method("_custom_editor_edited", &PropertyEditor::_custom_editor_edited);
- ClassDB::bind_method("_custom_editor_edited_field", &PropertyEditor::_custom_editor_edited_field, DEFVAL(""));
- ClassDB::bind_method("_resource_edit_request", &PropertyEditor::_resource_edit_request);
- ClassDB::bind_method("_node_removed", &PropertyEditor::_node_removed);
- ClassDB::bind_method("_edit_button", &PropertyEditor::_edit_button);
- ClassDB::bind_method("_changed_callback", &PropertyEditor::_changed_callbacks);
- ClassDB::bind_method("_draw_flags", &PropertyEditor::_draw_flags);
- ClassDB::bind_method("_set_range_def", &PropertyEditor::_set_range_def);
- ClassDB::bind_method("_filter_changed", &PropertyEditor::_filter_changed);
- ClassDB::bind_method("update_tree", &PropertyEditor::update_tree);
- ClassDB::bind_method("_resource_preview_done", &PropertyEditor::_resource_preview_done);
- ClassDB::bind_method("refresh", &PropertyEditor::refresh);
- ClassDB::bind_method("_draw_transparency", &PropertyEditor::_draw_transparency);
- ClassDB::bind_method("edit", &PropertyEditor::edit);
-
- ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &PropertyEditor::get_drag_data_fw);
- ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &PropertyEditor::can_drop_data_fw);
- ClassDB::bind_method(D_METHOD("drop_data_fw"), &PropertyEditor::drop_data_fw);
-
- ADD_SIGNAL(MethodInfo("property_toggled", PropertyInfo(Variant::STRING, "property"), PropertyInfo(Variant::BOOL, "value")));
- ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::OBJECT, "res"), PropertyInfo(Variant::STRING, "prop")));
- ADD_SIGNAL(MethodInfo("object_id_selected", PropertyInfo(Variant::INT, "id")));
- ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property")));
- ADD_SIGNAL(MethodInfo("property_edited", PropertyInfo(Variant::STRING, "property")));
-}
-
-Tree *PropertyEditor::get_property_tree() {
-
- return tree;
-}
-
-Label *PropertyEditor::get_top_label() {
-
- return top_label;
-}
-
-void PropertyEditor::hide_top_label() {
-
- top_label->hide();
- tree->set_begin(Point2(0, 0));
-}
-
-String PropertyEditor::get_selected_path() const {
-
- TreeItem *ti = tree->get_selected();
- if (!ti)
- return "";
-
- Dictionary d = ti->get_metadata(0);
-
- if (d.has("name"))
- return d["name"];
- else
- return "";
-}
-
-bool PropertyEditor::is_capitalize_paths_enabled() const {
-
- return capitalize_paths;
-}
-
-void PropertyEditor::set_enable_capitalize_paths(bool p_capitalize) {
-
- capitalize_paths = p_capitalize;
- update_tree_pending = true;
-}
-
-void PropertyEditor::set_autoclear(bool p_enable) {
-
- autoclear = p_enable;
-}
-
-void PropertyEditor::set_show_categories(bool p_show) {
-
- show_categories = p_show;
- update_tree();
-}
-
-void PropertyEditor::set_use_filter(bool p_use) {
-
- if (p_use == use_filter)
- return;
-
- use_filter = p_use;
- update_tree();
-}
-
-void PropertyEditor::register_text_enter(Node *p_line_edit) {
-
- ERR_FAIL_NULL(p_line_edit);
- search_box = Object::cast_to<LineEdit>(p_line_edit);
-
- if (search_box)
- search_box->connect("text_changed", this, "_filter_changed");
-}
-
-void PropertyEditor::set_property_selectable(bool p_selectable) {
- property_selectable = p_selectable;
- update_tree();
-}
-
-void PropertyEditor::set_subsection_selectable(bool p_selectable) {
-
- if (p_selectable == subsection_selectable)
- return;
-
- subsection_selectable = p_selectable;
- update_tree();
-}
-
-void PropertyEditor::set_use_folding(bool p_enable) {
-
- use_folding = p_enable;
- tree->set_hide_folding(false);
-}
-
-void PropertyEditor::collapse_all_folding() {
- if (!obj)
- return;
- for (List<String>::Element *E = foldable_property_cache.front(); E; E = E->next()) {
- obj->editor_set_section_unfold(E->get(), false);
- }
- update_tree();
-}
-
-void PropertyEditor::expand_all_folding() {
-
- if (!obj)
- return;
- for (List<String>::Element *E = foldable_property_cache.front(); E; E = E->next()) {
- obj->editor_set_section_unfold(E->get(), true);
- }
- update_tree();
-}
-
-PropertyEditor::PropertyEditor() {
-
- _prop_edited = "property_edited";
-
- hide_script = true;
- use_folding = false;
-
- undo_redo = NULL;
- obj = NULL;
- search_box = NULL;
- changing = false;
- update_tree_pending = false;
-
- top_label = memnew(Label);
- top_label->set_text(TTR("Properties:"));
- top_label->set_anchor(MARGIN_RIGHT, ANCHOR_END);
- top_label->set_begin(Point2(10, 0));
- top_label->set_end(Point2(0, 12));
-
- add_child(top_label);
-
- tree = memnew(Tree);
- tree->set_anchor(MARGIN_RIGHT, ANCHOR_END);
- tree->set_anchor(MARGIN_BOTTOM, ANCHOR_END);
- tree->set_begin(Point2(0, 19));
- tree->set_end(Point2(0, 0));
-
- tree->set_columns(2);
- tree->set_column_expand(0, true);
- tree->set_column_min_width(0, 30);
- tree->set_column_expand(1, true);
- tree->set_column_min_width(1, 18);
- add_child(tree);
-
- tree->connect("item_edited", this, "_item_edited", varray(), CONNECT_DEFERRED);
- tree->connect("item_rmb_edited", this, "_item_rmb_edited");
- tree->connect("cell_selected", this, "_item_selected");
- tree->connect("item_collapsed", this, "_item_folded");
-
- tree->set_drag_forwarding(this);
-
- set_physics_process(true);
-
- custom_editor = memnew(CustomPropertyEditor);
- custom_editor->set_pass_on_modal_close_click(false);
- add_child(custom_editor);
-
- tree->connect("custom_popup_edited", this, "_custom_editor_request");
- tree->connect("button_pressed", this, "_edit_button");
- custom_editor->connect("variant_changed", this, "_custom_editor_edited");
- custom_editor->connect("variant_field_changed", this, "_custom_editor_edited_field");
- custom_editor->connect("resource_edit_request", this, "_resource_edit_request", make_binds(), CONNECT_DEFERRED);
- tree->set_hide_folding(true);
-
- evaluator = memnew(PropertyValueEvaluator);
- tree->set_value_evaluator(evaluator);
- custom_editor->set_value_evaluator(evaluator);
-
- capitalize_paths = true;
- autoclear = false;
- tree->set_column_titles_visible(false);
- tree->add_constant_override("button_margin", 0);
-
- keying = false;
- read_only = false;
- show_categories = false;
- refresh_countdown = 0;
- use_doc_hints = false;
- updating_folding = true;
- use_filter = false;
- subsection_selectable = false;
- property_selectable = false;
- show_type_icons = false; // TODO: need to reimplement it to work with the new inspector
-}
-
-PropertyEditor::~PropertyEditor() {
- memdelete(evaluator);
-}
-
/////////////////////////////
-class SectionedPropertyEditorFilter : public Object {
-
- GDCLASS(SectionedPropertyEditorFilter, Object);
-
- Object *edited;
- String section;
- bool allow_sub;
-
- bool _set(const StringName &p_name, const Variant &p_value) {
-
- if (!edited)
- return false;
-
- String name = p_name;
- if (section != "") {
- name = section + "/" + name;
- }
-
- bool valid;
- edited->set(name, p_value, &valid);
- return valid;
- }
-
- bool _get(const StringName &p_name, Variant &r_ret) const {
-
- if (!edited)
- return false;
-
- String name = p_name;
- if (section != "") {
- name = section + "/" + name;
- }
-
- bool valid = false;
-
- r_ret = edited->get(name, &valid);
- return valid;
- }
- void _get_property_list(List<PropertyInfo> *p_list) const {
-
- if (!edited)
- return;
-
- List<PropertyInfo> pinfo;
- edited->get_property_list(&pinfo);
- for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
-
- PropertyInfo pi = E->get();
- int sp = pi.name.find("/");
-
- if (pi.name == "resource_path" || pi.name == "resource_name" || pi.name == "resource_local_to_scene" || pi.name.begins_with("script/")) //skip resource stuff
- continue;
-
- if (sp == -1) {
- pi.name = "global/" + pi.name;
- }
-
- if (pi.name.begins_with(section + "/")) {
- pi.name = pi.name.replace_first(section + "/", "");
- if (!allow_sub && pi.name.find("/") != -1)
- continue;
- p_list->push_back(pi);
- }
- }
- }
-
- bool property_can_revert(const String &p_name) {
-
- return edited->call("property_can_revert", section + "/" + p_name);
- }
-
- Variant property_get_revert(const String &p_name) {
-
- return edited->call("property_get_revert", section + "/" + p_name);
- }
-
-protected:
- static void _bind_methods() {
-
- ClassDB::bind_method("property_can_revert", &SectionedPropertyEditorFilter::property_can_revert);
- ClassDB::bind_method("property_get_revert", &SectionedPropertyEditorFilter::property_get_revert);
- }
-
-public:
- void set_section(const String &p_section, bool p_allow_sub) {
-
- section = p_section;
- allow_sub = p_allow_sub;
- _change_notify();
- }
-
- void set_edited(Object *p_edited) {
- edited = p_edited;
- _change_notify();
- }
-
- SectionedPropertyEditorFilter() {
- edited = NULL;
- }
-};
-
-void SectionedPropertyEditor::_bind_methods() {
-
- ClassDB::bind_method("_section_selected", &SectionedPropertyEditor::_section_selected);
- ClassDB::bind_method("_search_changed", &SectionedPropertyEditor::_search_changed);
-
- ClassDB::bind_method("update_category_list", &SectionedPropertyEditor::update_category_list);
-}
-
-void SectionedPropertyEditor::_section_selected() {
-
- if (!sections->get_selected())
- return;
-
- filter->set_section(sections->get_selected()->get_metadata(0), sections->get_selected()->get_children() == NULL);
-}
-
-void SectionedPropertyEditor::set_current_section(const String &p_section) {
-
- if (section_map.has(p_section)) {
- section_map[p_section]->select(0);
- }
-}
-
-String SectionedPropertyEditor::get_current_section() const {
-
- if (sections->get_selected())
- return sections->get_selected()->get_metadata(0);
- else
- return "";
-}
-
-String SectionedPropertyEditor::get_full_item_path(const String &p_item) {
-
- String base = get_current_section();
-
- if (base != "")
- return base + "/" + p_item;
- else
- return p_item;
-}
-
-void SectionedPropertyEditor::edit(Object *p_object) {
-
- if (!p_object) {
- obj = -1;
- sections->clear();
-
- filter->set_edited(NULL);
- editor->edit(NULL);
-
- return;
- }
-
- ObjectID id = p_object->get_instance_id();
-
- if (obj != id) {
-
- obj = id;
- update_category_list();
-
- filter->set_edited(p_object);
- editor->edit(filter);
-
- if (sections->get_root()->get_children()) {
- sections->get_root()->get_children()->select(0);
- }
- } else {
-
- update_category_list();
- }
-}
-
-void SectionedPropertyEditor::update_category_list() {
-
- String selected_category = get_current_section();
- sections->clear();
-
- Object *o = ObjectDB::get_instance(obj);
-
- if (!o)
- return;
-
- List<PropertyInfo> pinfo;
- o->get_property_list(&pinfo);
-
- section_map.clear();
-
- TreeItem *root = sections->create_item();
- section_map[""] = root;
-
- for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
-
- PropertyInfo pi = E->get();
-
- if (pi.usage & PROPERTY_USAGE_CATEGORY)
- continue;
- else if (!(pi.usage & PROPERTY_USAGE_EDITOR))
- continue;
-
- if (pi.name.find(":") != -1 || pi.name == "script" || pi.name == "resource_name" || pi.name == "resource_path" || pi.name == "resource_local_to_scene")
- continue;
-
- if (search_box && search_box->get_text() != String() && pi.name.findn(search_box->get_text()) == -1)
- continue;
-
- int sp = pi.name.find("/");
- if (sp == -1)
- pi.name = "Global/" + pi.name;
-
- Vector<String> sectionarr = pi.name.split("/");
- String metasection;
-
- int sc = MIN(2, sectionarr.size() - 1);
-
- for (int i = 0; i < sc; i++) {
-
- TreeItem *parent = section_map[metasection];
- parent->set_custom_bg_color(0, get_color("prop_subsection", "Editor"));
-
- if (i > 0) {
- metasection += "/" + sectionarr[i];
- } else {
- metasection = sectionarr[i];
- }
-
- if (!section_map.has(metasection)) {
- TreeItem *ms = sections->create_item(parent);
- section_map[metasection] = ms;
- ms->set_text(0, sectionarr[i].capitalize());
- ms->set_metadata(0, metasection);
- ms->set_selectable(0, false);
- }
-
- if (i == sc - 1) {
- //if it has children, make selectable
- section_map[metasection]->set_selectable(0, true);
- }
- }
- }
-
- if (section_map.has(selected_category)) {
- section_map[selected_category]->select(0);
- }
-
- editor->update_tree();
-}
-
-void SectionedPropertyEditor::register_search_box(LineEdit *p_box) {
-
- search_box = p_box;
- editor->register_text_enter(p_box);
- search_box->connect("text_changed", this, "_search_changed");
-}
-
-void SectionedPropertyEditor::_search_changed(const String &p_what) {
-
- update_category_list();
-}
-
-PropertyEditor *SectionedPropertyEditor::get_property_editor() {
-
- return editor;
-}
-
-SectionedPropertyEditor::SectionedPropertyEditor() {
-
- obj = -1;
-
- search_box = NULL;
-
- add_constant_override("autohide", 1); // Fixes the dragger always showing up
-
- VBoxContainer *left_vb = memnew(VBoxContainer);
- left_vb->set_custom_minimum_size(Size2(170, 0) * EDSCALE);
- add_child(left_vb);
-
- sections = memnew(Tree);
- sections->set_v_size_flags(SIZE_EXPAND_FILL);
- sections->set_hide_root(true);
-
- left_vb->add_child(sections, true);
-
- VBoxContainer *right_vb = memnew(VBoxContainer);
- right_vb->set_custom_minimum_size(Size2(300, 0) * EDSCALE);
- right_vb->set_h_size_flags(SIZE_EXPAND_FILL);
- add_child(right_vb);
-
- filter = memnew(SectionedPropertyEditorFilter);
- editor = memnew(PropertyEditor);
- editor->set_v_size_flags(SIZE_EXPAND_FILL);
- right_vb->add_child(editor, true);
-
- editor->get_property_tree()->set_column_titles_visible(false);
-
- editor->hide_top_label();
-
- sections->connect("cell_selected", this, "_section_selected");
-}
-
-SectionedPropertyEditor::~SectionedPropertyEditor() {
-
- memdelete(filter);
-}
-
double PropertyValueEvaluator::eval(const String &p_text) {
// If range value contains a comma replace it with dot (issue #6028)
diff --git a/editor/property_editor.h b/editor/property_editor.h
index 7d8fa22f3f..7d7ab912ea 100644
--- a/editor/property_editor.h
+++ b/editor/property_editor.h
@@ -175,180 +175,6 @@ public:
CustomPropertyEditor();
};
-class PropertyEditor : public Control {
-
- GDCLASS(PropertyEditor, Control);
-
- Tree *tree;
- Label *top_label;
- LineEdit *search_box;
-
- PropertyValueEvaluator *evaluator;
-
- Object *obj;
-
- StringName _prop_edited;
-
- bool capitalize_paths;
- bool changing;
- bool update_tree_pending;
- bool autoclear;
- bool keying;
- bool read_only;
- bool show_categories;
- bool show_type_icons;
- float refresh_countdown;
- bool use_doc_hints;
- bool use_filter;
- bool subsection_selectable;
- bool hide_script;
- bool use_folding;
- bool property_selectable;
- bool updating_folding;
-
- List<String> foldable_property_cache;
- HashMap<String, String> pending;
- String selected_property;
-
- Map<StringName, Map<StringName, String> > descr_cache;
- Map<StringName, String> class_descr_cache;
-
- CustomPropertyEditor *custom_editor;
-
- void _resource_edit_request();
- void _custom_editor_edited();
- void _custom_editor_edited_field(const String &p_field_name);
- void _custom_editor_request(bool p_arrow);
-
- void _item_selected();
- void _item_rmb_edited();
- void _item_edited();
- TreeItem *get_parent_node(String p_path, HashMap<String, TreeItem *> &item_paths, TreeItem *root, TreeItem *category);
-
- void set_item_text(TreeItem *p_item, int p_type, const String &p_name, int p_hint = PROPERTY_HINT_NONE, const String &p_hint_text = "");
-
- TreeItem *find_item(TreeItem *p_item, const String &p_name);
-
- virtual void _changed_callback(Object *p_changed, const char *p_prop);
- virtual void _changed_callbacks(Object *p_changed, const String &p_prop);
-
- void _check_reload_status(const String &p_name, TreeItem *item);
-
- void _edit_button(Object *p_item, int p_column, int p_button);
-
- void _node_removed(Node *p_node);
-
- friend class ProjectExportDialog;
- void _edit_set(const String &p_name, const Variant &p_value, bool p_refresh_all = false, const String &p_changed_field = "");
- void _draw_flags(Object *p_object, const Rect2 &p_rect);
-
- bool _might_be_in_instance();
- bool _get_instanced_node_original_property(const StringName &p_prop, Variant &value);
- bool _is_property_different(const Variant &p_current, const Variant &p_orig, int p_usage = 0);
- bool _is_instanced_node_with_original_property_different(const String &p_name, TreeItem *item);
-
- void _refresh_item(TreeItem *p_item);
- void _set_range_def(Object *p_item, String prop, float p_frame);
-
- void _filter_changed(const String &p_text);
-
- void _mark_drop_fields(TreeItem *p_at);
- void _clear_drop_fields(TreeItem *p_at);
-
- bool _is_drop_valid(const Dictionary &p_drag_data, const Dictionary &p_item_data) const;
- Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
- 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);
-
- void _resource_preview_done(const String &p_path, const Ref<Texture> &p_preview, Variant p_ud);
- void _draw_transparency(Object *t, const Rect2 &p_rect);
- void _item_folded(Object *item_obj);
-
- UndoRedo *undo_redo;
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; }
-
- String get_selected_path() const;
-
- Tree *get_property_tree();
- Label *get_top_label();
- void hide_top_label();
- void update_tree();
- void update_property(const String &p_prop);
-
- void refresh();
-
- void edit(Object *p_object);
-
- void set_keying(bool p_active);
- void set_read_only(bool p_read_only) {
- read_only = p_read_only;
- custom_editor->set_read_only(p_read_only);
- }
-
- bool is_capitalize_paths_enabled() const;
- void set_enable_capitalize_paths(bool p_capitalize);
- void set_autoclear(bool p_enable);
-
- void set_show_categories(bool p_show);
- void set_use_doc_hints(bool p_enable) { use_doc_hints = p_enable; }
- void set_hide_script(bool p_hide) { hide_script = p_hide; }
-
- void set_use_filter(bool p_use);
- void register_text_enter(Node *p_line_edit);
-
- void set_subsection_selectable(bool p_selectable);
- void set_property_selectable(bool p_selectable);
-
- void set_use_folding(bool p_enable);
-
- void collapse_all_folding();
- void expand_all_folding();
-
- PropertyEditor();
- ~PropertyEditor();
-};
-
-class SectionedPropertyEditorFilter;
-
-class SectionedPropertyEditor : public HSplitContainer {
-
- GDCLASS(SectionedPropertyEditor, HSplitContainer);
-
- ObjectID obj;
-
- Tree *sections;
- SectionedPropertyEditorFilter *filter;
-
- Map<String, TreeItem *> section_map;
- PropertyEditor *editor;
- LineEdit *search_box;
-
- static void _bind_methods();
- void _section_selected();
-
- void _search_changed(const String &p_what);
-
-public:
- void register_search_box(LineEdit *p_box);
- PropertyEditor *get_property_editor();
- void edit(Object *p_object);
- String get_full_item_path(const String &p_item);
-
- void set_current_section(const String &p_section);
- String get_current_section() const;
-
- void update_category_list();
-
- SectionedPropertyEditor();
- ~SectionedPropertyEditor();
-};
-
class PropertyValueEvaluator : public ValueEvaluator {
GDCLASS(PropertyValueEvaluator, ValueEvaluator);
diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp
index dae1bdeeb0..c9eba33f35 100644
--- a/editor/property_selector.cpp
+++ b/editor/property_selector.cpp
@@ -30,8 +30,8 @@
#include "property_selector.h"
+#include "core/os/keyboard.h"
#include "editor_scale.h"
-#include "os/keyboard.h"
void PropertySelector::_text_changed(const String &p_newtext) {
diff --git a/editor/pvrtc_compress.cpp b/editor/pvrtc_compress.cpp
index 57a2b0d97f..b1c847570c 100644
--- a/editor/pvrtc_compress.cpp
+++ b/editor/pvrtc_compress.cpp
@@ -30,11 +30,11 @@
#include "pvrtc_compress.h"
+#include "core/io/resource_loader.h"
+#include "core/io/resource_saver.h"
+#include "core/os/file_access.h"
+#include "core/os/os.h"
#include "editor_settings.h"
-#include "io/resource_loader.h"
-#include "io/resource_saver.h"
-#include "os/file_access.h"
-#include "os/os.h"
#include "scene/resources/texture.h"
static void (*_base_image_compress_pvrtc2_func)(Image *) = NULL;
diff --git a/editor/pvrtc_compress.h b/editor/pvrtc_compress.h
index cdd2f0d242..0396837623 100644
--- a/editor/pvrtc_compress.h
+++ b/editor/pvrtc_compress.h
@@ -31,7 +31,7 @@
#ifndef PVRTC_COMPRESS_H
#define PVRTC_COMPRESS_H
-#include "image.h"
+#include "core/image.h"
void _pvrtc_register_compressors();
diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp
index d2101f1e00..497596a508 100644
--- a/editor/quick_open.cpp
+++ b/editor/quick_open.cpp
@@ -30,7 +30,7 @@
#include "quick_open.h"
-#include "os/keyboard.h"
+#include "core/os/keyboard.h"
void EditorQuickOpen::popup(const StringName &p_base, bool p_enable_multi, bool p_add_dirs, bool p_dontclear) {
diff --git a/editor/quick_open.h b/editor/quick_open.h
index ecc6af0c53..ffea6b52bd 100644
--- a/editor/quick_open.h
+++ b/editor/quick_open.h
@@ -31,8 +31,8 @@
#ifndef EDITOR_QUICK_OPEN_H
#define EDITOR_QUICK_OPEN_H
+#include "core/pair.h"
#include "editor_file_system.h"
-#include "pair.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/tree.h"
class EditorQuickOpen : public ConfirmationDialog {
diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp
index bffd7bd155..47e1ae0dab 100644
--- a/editor/rename_dialog.cpp
+++ b/editor/rename_dialog.cpp
@@ -30,12 +30,12 @@
#include "rename_dialog.h"
+#include "core/print_string.h"
#include "editor_node.h"
#include "editor_settings.h"
#include "editor_themes.h"
#include "modules/regex/regex.h"
#include "plugins/script_editor_plugin.h"
-#include "print_string.h"
#include "scene/gui/control.h"
#include "scene/gui/label.h"
#include "scene/gui/tab_container.h"
diff --git a/editor/rename_dialog.h b/editor/rename_dialog.h
index c5ebc30c0c..fa558660a4 100644
--- a/editor/rename_dialog.h
+++ b/editor/rename_dialog.h
@@ -37,8 +37,8 @@
#include "scene/gui/option_button.h"
#include "scene/gui/spin_box.h"
+#include "core/undo_redo.h"
#include "editor/scene_tree_editor.h"
-#include "undo_redo.h"
/**
@author Blazej Floch
diff --git a/editor/reparent_dialog.cpp b/editor/reparent_dialog.cpp
index da8bfdbbd2..3a6864b052 100644
--- a/editor/reparent_dialog.cpp
+++ b/editor/reparent_dialog.cpp
@@ -30,7 +30,7 @@
#include "reparent_dialog.h"
-#include "print_string.h"
+#include "core/print_string.h"
#include "scene/gui/box_container.h"
#include "scene/gui/label.h"
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index 18de2a6221..5f2841d2c0 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -1816,6 +1816,13 @@ void SceneTreeDock::_new_scene_from(String p_file) {
return;
}
+ if (EditorNode::get_singleton()->is_scene_open(p_file)) {
+ accept->get_ok()->set_text(TTR("OK"));
+ accept->set_text(TTR("Can't overwrite scene that is still open!"));
+ accept->popup_centered_minsize();
+ return;
+ }
+
Node *base = selection.front()->get();
Map<Node *, Node *> reown;
diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp
index a916ae23f6..a45773003a 100644
--- a/editor/scene_tree_editor.cpp
+++ b/editor/scene_tree_editor.cpp
@@ -30,11 +30,11 @@
#include "scene_tree_editor.h"
+#include "core/message_queue.h"
+#include "core/print_string.h"
#include "editor/plugins/animation_player_editor_plugin.h"
#include "editor/plugins/canvas_item_editor_plugin.h"
#include "editor_node.h"
-#include "message_queue.h"
-#include "print_string.h"
#include "scene/gui/label.h"
#include "scene/main/viewport.h"
#include "scene/resources/packed_scene.h"
diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h
index c4f63f5736..e575fb986a 100644
--- a/editor/scene_tree_editor.h
+++ b/editor/scene_tree_editor.h
@@ -31,12 +31,12 @@
#ifndef SCENE_TREE_EDITOR_H
#define SCENE_TREE_EDITOR_H
+#include "core/undo_redo.h"
#include "editor_data.h"
#include "editor_settings.h"
#include "scene/gui/button.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/tree.h"
-#include "undo_redo.h"
/**
@author Juan Linietsky <reduzio@gmail.com>
*/
diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp
index 24c4ba4cb7..8c36a71d71 100644
--- a/editor/script_create_dialog.cpp
+++ b/editor/script_create_dialog.cpp
@@ -30,13 +30,13 @@
#include "script_create_dialog.h"
+#include "core/io/resource_saver.h"
+#include "core/os/file_access.h"
+#include "core/project_settings.h"
+#include "core/script_language.h"
#include "editor/editor_node.h"
#include "editor/editor_scale.h"
#include "editor_file_system.h"
-#include "io/resource_saver.h"
-#include "os/file_access.h"
-#include "project_settings.h"
-#include "script_language.h"
void ScriptCreateDialog::_notification(int p_what) {
@@ -443,6 +443,12 @@ void ScriptCreateDialog::_path_changed(const String &p_path) {
return;
}
+ if (p.get_file().get_basename() == "") {
+ _msg_path_valid(false, TTR("Filename is empty"));
+ _update_dialog();
+ return;
+ }
+
/* All checks passed */
is_path_valid = true;
diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp
index 6b793a08eb..7a97531932 100644
--- a/editor/script_editor_debugger.cpp
+++ b/editor/script_editor_debugger.cpp
@@ -30,11 +30,12 @@
#include "script_editor_debugger.h"
+#include "core/project_settings.h"
+#include "core/ustring.h"
#include "editor_node.h"
#include "editor_profiler.h"
#include "editor_settings.h"
#include "main/performance.h"
-#include "project_settings.h"
#include "property_editor.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/label.h"
@@ -47,7 +48,6 @@
#include "scene/gui/texture_button.h"
#include "scene/gui/tree.h"
#include "scene/resources/packed_scene.h"
-#include "ustring.h"
class ScriptEditorDebuggerVariables : public Object {
@@ -396,7 +396,6 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da
dobreak->set_disabled(false);
docontinue->set_disabled(true);
emit_signal("breaked", false, false, Variant());
- //tabs->set_current_tab(0);
profiler->set_enabled(true);
profiler->disable_seeking();
inspector->edit(NULL);
@@ -1981,10 +1980,8 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
stack_dump->connect("cell_selected", this, "_stack_dump_frame_selected");
sc->add_child(stack_dump);
- inspector = memnew(PropertyEditor);
+ inspector = memnew(EditorInspector);
inspector->set_h_size_flags(SIZE_EXPAND_FILL);
- inspector->hide_top_label();
- inspector->get_property_tree()->set_column_title(0, TTR("Variable"));
inspector->set_enable_capitalize_paths(false);
inspector->set_read_only(true);
inspector->connect("object_id_selected", this, "_scene_tree_property_select_object");
@@ -2206,7 +2203,6 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
ScriptEditorDebugger::~ScriptEditorDebugger() {
- //inspector->edit(NULL);
memdelete(variables);
ppeer->set_stream_peer(Ref<StreamPeer>());
diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h
index 73a0288e16..017619e56f 100644
--- a/editor/script_editor_debugger.h
+++ b/editor/script_editor_debugger.h
@@ -33,12 +33,12 @@
#include "core/io/packet_peer.h"
#include "core/io/tcp_server.h"
-#include "property_editor.h"
+#include "editor/editor_inspector.h"
+#include "editor/property_editor.h"
#include "scene/gui/box_container.h"
#include "scene/gui/button.h"
class Tree;
-class PropertyEditor;
class EditorNode;
class ScriptEditorDebuggerVariables;
class LineEdit;
@@ -129,7 +129,7 @@ class ScriptEditorDebugger : public Control {
LineEdit *vmem_total;
Tree *stack_dump;
- PropertyEditor *inspector;
+ EditorInspector *inspector;
Ref<TCP_Server> server;
Ref<StreamPeerTCP> connection;
diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp
index 4ebba73cb3..97cdd43fee 100644
--- a/editor/settings_config_dialog.cpp
+++ b/editor/settings_config_dialog.cpp
@@ -30,11 +30,11 @@
#include "settings_config_dialog.h"
+#include "core/os/keyboard.h"
+#include "core/project_settings.h"
#include "editor_file_system.h"
#include "editor_node.h"
#include "editor_settings.h"
-#include "os/keyboard.h"
-#include "project_settings.h"
#include "scene/gui/margin_container.h"
#include "script_editor_debugger.h"
diff --git a/editor/spatial_editor_gizmos.cpp b/editor/spatial_editor_gizmos.cpp
index 00067b84f7..3097f0d0b9 100644
--- a/editor/spatial_editor_gizmos.cpp
+++ b/editor/spatial_editor_gizmos.cpp
@@ -30,8 +30,8 @@
#include "spatial_editor_gizmos.h"
-#include "geometry.h"
-#include "quick_hull.h"
+#include "core/math/geometry.h"
+#include "core/math/quick_hull.h"
#include "scene/3d/audio_stream_player_3d.h"
#include "scene/3d/baked_lightmap.h"
#include "scene/3d/collision_polygon.h"
@@ -55,6 +55,7 @@
#include "scene/3d/visibility_notifier.h"
#include "scene/resources/box_shape.h"
#include "scene/resources/capsule_shape.h"
+#include "scene/resources/concave_polygon_shape.h"
#include "scene/resources/convex_polygon_shape.h"
#include "scene/resources/cylinder_shape.h"
#include "scene/resources/plane_shape.h"
@@ -908,7 +909,6 @@ void LightSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
}
p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
p_gizmo->add_unscaled_billboard(icon, 0.05);
}
@@ -939,8 +939,6 @@ void LightSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
}
p_gizmo->add_lines(points, material, true);
- p_gizmo->add_collision_segments(points);
-
p_gizmo->add_unscaled_billboard(icon, 0.05);
Vector<Vector3> handles;
@@ -982,38 +980,14 @@ void LightSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
p_gizmo->add_lines(points, material);
+ float ra = 16 * Math_PI * 2.0 / 64.0;
+ Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w;
+
Vector<Vector3> handles;
handles.push_back(Vector3(0, 0, -r));
-
- Vector<Vector3> collision_segments;
-
- for (int i = 0; i < 64; i++) {
-
- float ra = i * Math_PI * 2.0 / 64.0;
- float rb = (i + 1) * Math_PI * 2.0 / 64.0;
- Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * w;
- Point2 b = Vector2(Math::sin(rb), Math::cos(rb)) * w;
-
- collision_segments.push_back(Vector3(a.x, a.y, -d));
- collision_segments.push_back(Vector3(b.x, b.y, -d));
-
- if (i % 16 == 0) {
-
- collision_segments.push_back(Vector3(a.x, a.y, -d));
- collision_segments.push_back(Vector3());
- }
-
- if (i == 16) {
-
- handles.push_back(Vector3(a.x, a.y, -d));
- }
- }
-
- collision_segments.push_back(Vector3(0, 0, -r));
- collision_segments.push_back(Vector3());
+ handles.push_back(Vector3(a.x, a.y, -d));
p_gizmo->add_handles(handles, get_material("handles"));
- p_gizmo->add_collision_segments(collision_segments);
p_gizmo->add_unscaled_billboard(icon, 0.05);
}
}
@@ -1149,7 +1123,6 @@ void AudioStreamPlayer3DSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo)
}
p_gizmo->add_lines(points, material);
- p_gizmo->add_collision_segments(points);
Vector<Vector3> handles;
float ha = Math::deg2rad(player->get_emission_angle());
@@ -1344,7 +1317,6 @@ void CameraSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
}
p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
p_gizmo->add_unscaled_billboard(icon, 0.05);
p_gizmo->add_handles(handles, get_material("handles"));
@@ -1387,7 +1359,6 @@ void CameraSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
}
p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
}
}
@@ -2123,12 +2094,10 @@ void SoftBodySpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
Vector<Vector3> points;
soft_body->get_mesh()->generate_debug_mesh_indices(points);
- soft_body->get_mesh()->clear_cache();
Ref<Material> material = get_material("shape_material", p_gizmo);
p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
p_gizmo->add_handles(points, get_material("handles"));
p_gizmo->add_collision_triangles(tm);
}
@@ -2445,7 +2414,6 @@ void ParticlesGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
Ref<Material> icon = get_material("particles_icon", p_gizmo);
p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
if (p_gizmo->is_selected()) {
Ref<Material> solid_material = get_material("particles_solid_material", p_gizmo);
@@ -2630,7 +2598,6 @@ void ReflectionProbeGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
}
p_gizmo->add_unscaled_billboard(icon, 0.05);
- p_gizmo->add_collision_segments(lines);
p_gizmo->add_handles(handles, get_material("handles"));
}
@@ -2745,7 +2712,6 @@ void GIProbeGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
}
p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
lines.clear();
@@ -2915,7 +2881,6 @@ void BakedIndirectLightGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
}
p_gizmo->add_lines(lines, material);
- p_gizmo->add_collision_segments(lines);
Vector<Vector3> handles;
@@ -3506,6 +3471,14 @@ void CollisionShapeSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
}
}
+ if (Object::cast_to<ConcavePolygonShape>(*s)) {
+
+ Ref<ConcavePolygonShape> cs = s;
+ Ref<ArrayMesh> mesh = cs->get_debug_mesh()->duplicate();
+ mesh->surface_set_material(0, material);
+ p_gizmo->add_mesh(mesh);
+ }
+
if (Object::cast_to<RayShape>(*s)) {
Ref<RayShape> rs = s;