summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
Diffstat (limited to 'editor')
-rw-r--r--editor/editor_export.cpp36
-rw-r--r--editor/editor_export.h8
-rw-r--r--editor/editor_node.cpp10
-rw-r--r--editor/editor_plugin.cpp2
-rw-r--r--editor/editor_plugin.h2
-rw-r--r--editor/editor_resource_preview.cpp2
-rw-r--r--editor/editor_settings.h3
-rw-r--r--editor/editor_vcs_interface.h2
-rw-r--r--editor/fileserver/editor_file_server.h2
-rw-r--r--editor/filesystem_dock.cpp106
-rw-r--r--editor/filesystem_dock.h26
-rw-r--r--editor/inspector_dock.cpp8
-rw-r--r--editor/inspector_dock.h8
-rw-r--r--editor/localization_editor.cpp2
-rw-r--r--editor/plugins/audio_stream_editor_plugin.cpp4
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp8
-rw-r--r--editor/plugins/node_3d_editor_plugin.h6
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp417
-rw-r--r--editor/plugins/visual_shader_editor_plugin.h15
-rw-r--r--editor/project_export.cpp203
-rw-r--r--editor/project_export.h12
-rw-r--r--editor/scene_tree_dock.cpp8
22 files changed, 392 insertions, 498 deletions
diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp
index d3a4dbb6e7..0f86385031 100644
--- a/editor/editor_export.cpp
+++ b/editor/editor_export.cpp
@@ -185,35 +185,6 @@ bool EditorExportPreset::has_export_file(const String &p_path) {
return selected_files.has(p_path);
}
-void EditorExportPreset::add_patch(const String &p_path, int p_at_pos) {
- if (p_at_pos < 0) {
- patches.push_back(p_path);
- } else {
- patches.insert(p_at_pos, p_path);
- }
- EditorExport::singleton->save_presets();
-}
-
-void EditorExportPreset::remove_patch(int p_idx) {
- patches.remove(p_idx);
- EditorExport::singleton->save_presets();
-}
-
-void EditorExportPreset::set_patch(int p_index, const String &p_path) {
- ERR_FAIL_INDEX(p_index, patches.size());
- patches.write[p_index] = p_path;
- EditorExport::singleton->save_presets();
-}
-
-String EditorExportPreset::get_patch(int p_index) {
- ERR_FAIL_INDEX_V(p_index, patches.size(), String());
- return patches[p_index];
-}
-
-Vector<String> EditorExportPreset::get_patches() const {
- return patches;
-}
-
void EditorExportPreset::set_custom_features(const String &p_custom_features) {
custom_features = p_custom_features;
EditorExport::singleton->save_presets();
@@ -1341,7 +1312,6 @@ void EditorExport::_save() {
config->set_value(section, "include_filter", preset->get_include_filter());
config->set_value(section, "exclude_filter", preset->get_exclude_filter());
config->set_value(section, "export_path", preset->get_export_path());
- config->set_value(section, "patch_list", preset->get_patches());
config->set_value(section, "encryption_include_filters", preset->get_enc_in_filter());
config->set_value(section, "encryption_exclude_filters", preset->get_enc_ex_filter());
config->set_value(section, "encrypt_pck", preset->get_enc_pck());
@@ -1529,12 +1499,6 @@ void EditorExport::load_config() {
preset->set_exclude_filter(config->get_value(section, "exclude_filter"));
preset->set_export_path(config->get_value(section, "export_path", ""));
- Vector<String> patch_list = config->get_value(section, "patch_list");
-
- for (int i = 0; i < patch_list.size(); i++) {
- preset->add_patch(patch_list[i]);
- }
-
if (config->has_section_key(section, "encrypt_pck")) {
preset->set_enc_pck(config->get_value(section, "encrypt_pck"));
}
diff --git a/editor/editor_export.h b/editor/editor_export.h
index fa6be88302..55728f0c94 100644
--- a/editor/editor_export.h
+++ b/editor/editor_export.h
@@ -68,8 +68,6 @@ private:
Set<String> selected_files;
bool runnable = false;
- Vector<String> patches;
-
friend class EditorExport;
friend class EditorExportPlatform;
@@ -121,12 +119,6 @@ public:
void set_exclude_filter(const String &p_exclude);
String get_exclude_filter() const;
- void add_patch(const String &p_path, int p_at_pos = -1);
- void set_patch(int p_index, const String &p_path);
- String get_patch(int p_index);
- void remove_patch(int p_idx);
- Vector<String> get_patches() const;
-
void set_custom_features(const String &p_custom_features);
String get_custom_features() const;
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index 73562e0695..e18e980fe2 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -4225,6 +4225,7 @@ void EditorNode::_save_docks_to_config(Ref<ConfigFile> p_layout, const String &p
p_layout->set_value(p_section, "dock_filesystem_split", filesystem_dock->get_split_offset());
p_layout->set_value(p_section, "dock_filesystem_display_mode", filesystem_dock->get_display_mode());
+ p_layout->set_value(p_section, "dock_filesystem_file_sort", filesystem_dock->get_file_sort());
p_layout->set_value(p_section, "dock_filesystem_file_list_display_mode", filesystem_dock->get_file_list_display_mode());
for (int i = 0; i < vsplits.size(); i++) {
@@ -4419,6 +4420,11 @@ void EditorNode::_load_docks_from_config(Ref<ConfigFile> p_layout, const String
filesystem_dock->set_display_mode(dock_filesystem_display_mode);
}
+ if (p_layout->has_section_key(p_section, "dock_filesystem_file_sort")) {
+ FileSystemDock::FileSortOption dock_filesystem_file_sort = FileSystemDock::FileSortOption(int(p_layout->get_value(p_section, "dock_filesystem_file_sort")));
+ filesystem_dock->set_file_sort(dock_filesystem_file_sort);
+ }
+
if (p_layout->has_section_key(p_section, "dock_filesystem_file_list_display_mode")) {
FileSystemDock::FileListDisplayMode dock_filesystem_file_list_display_mode = FileSystemDock::FileListDisplayMode(int(p_layout->get_value(p_section, "dock_filesystem_file_list_display_mode")));
filesystem_dock->set_file_list_display_mode(dock_filesystem_file_list_display_mode);
@@ -5122,7 +5128,6 @@ void EditorNode::_dropped_files(const Vector<String> &p_files, int p_screen) {
void EditorNode::_add_dropped_files_recursive(const Vector<String> &p_files, String to_path) {
DirAccessRef dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
- Vector<String> just_copy = String("ttf,otf").split(",");
for (int i = 0; i < p_files.size(); i++) {
String from = p_files[i];
@@ -5153,9 +5158,6 @@ void EditorNode::_add_dropped_files_recursive(const Vector<String> &p_files, Str
continue;
}
- if (!ResourceFormatImporter::get_singleton()->can_be_imported(from) && (just_copy.find(from.get_extension().to_lower()) == -1)) {
- continue;
- }
dir->copy(from, to);
}
}
diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp
index 082c317655..e330713cfb 100644
--- a/editor/editor_plugin.cpp
+++ b/editor/editor_plugin.cpp
@@ -791,7 +791,7 @@ bool EditorPlugin::build() {
return true;
}
-void EditorPlugin::queue_save_layout() const {
+void EditorPlugin::queue_save_layout() {
EditorNode::get_singleton()->save_layout();
}
diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h
index 40a91cbfb9..dd3bf08678 100644
--- a/editor/editor_plugin.h
+++ b/editor/editor_plugin.h
@@ -221,7 +221,7 @@ public:
int update_overlays() const;
- void queue_save_layout() const;
+ void queue_save_layout();
void make_bottom_panel_item_visible(Control *p_item);
void hide_bottom_panel();
diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp
index 3170ea5ff8..9723ae188b 100644
--- a/editor/editor_resource_preview.cpp
+++ b/editor/editor_resource_preview.cpp
@@ -30,8 +30,6 @@
#include "editor_resource_preview.h"
-#include "core/method_bind_ext.gen.inc"
-
#include "core/io/resource_loader.h"
#include "core/io/resource_saver.h"
#include "core/message_queue.h"
diff --git a/editor/editor_settings.h b/editor/editor_settings.h
index 04bb49bb51..c1bb7951fa 100644
--- a/editor/editor_settings.h
+++ b/editor/editor_settings.h
@@ -31,8 +31,7 @@
#ifndef EDITOR_SETTINGS_H
#define EDITOR_SETTINGS_H
-#include "core/object.h"
-
+#include "core/class_db.h"
#include "core/io/config_file.h"
#include "core/os/thread_safe.h"
#include "core/resource.h"
diff --git a/editor/editor_vcs_interface.h b/editor/editor_vcs_interface.h
index ee9e51441d..6ef55f0a46 100644
--- a/editor/editor_vcs_interface.h
+++ b/editor/editor_vcs_interface.h
@@ -31,7 +31,7 @@
#ifndef EDITOR_VCS_INTERFACE_H
#define EDITOR_VCS_INTERFACE_H
-#include "core/object.h"
+#include "core/class_db.h"
#include "core/ustring.h"
#include "scene/gui/panel_container.h"
diff --git a/editor/fileserver/editor_file_server.h b/editor/fileserver/editor_file_server.h
index 9645fbf39e..eefaa503c1 100644
--- a/editor/fileserver/editor_file_server.h
+++ b/editor/fileserver/editor_file_server.h
@@ -31,10 +31,10 @@
#ifndef EDITOR_FILE_SERVER_H
#define EDITOR_FILE_SERVER_H
+#include "core/class_db.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 0071f169ac..f675f60b7a 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -31,6 +31,7 @@
#include "filesystem_dock.h"
#include "core/io/resource_loader.h"
+#include "core/list.h"
#include "core/os/dir_access.h"
#include "core/os/file_access.h"
#include "core/os/keyboard.h"
@@ -46,13 +47,12 @@
#include "scene/resources/packed_scene.h"
#include "servers/display_server.h"
-Ref<Texture2D> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx) {
+Ref<Texture2D> FileSystemDock::_get_tree_item_icon(bool p_is_valid, String p_file_type) {
Ref<Texture2D> file_icon;
- if (!p_dir->get_file_import_is_valid(p_idx)) {
+ if (!p_is_valid) {
file_icon = get_theme_icon("ImportFail", "EditorIcons");
} else {
- String file_type = p_dir->get_file_type(p_idx);
- file_icon = (has_theme_icon(file_type, "EditorIcons")) ? get_theme_icon(file_type, "EditorIcons") : get_theme_icon("File", "EditorIcons");
+ file_icon = (has_theme_icon(p_file_type, "EditorIcons")) ? get_theme_icon(p_file_type, "EditorIcons") : get_theme_icon("File", "EditorIcons");
}
return file_icon;
}
@@ -94,15 +94,17 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
// Create all items for the files in the subdirectory.
if (display_mode == DISPLAY_MODE_TREE_ONLY) {
String main_scene = ProjectSettings::get_singleton()->get("application/run/main_scene");
+
+ // Build the list of the files to display.
+ List<FileInfo> file_list;
for (int i = 0; i < p_dir->get_file_count(); i++) {
String file_type = p_dir->get_file_type(i);
-
if (_is_file_type_disabled_by_feature_profile(file_type)) {
// If type is disabled, file won't be displayed.
continue;
}
- String file_name = p_dir->get_file(i);
+ String file_name = p_dir->get_file(i);
if (searched_string.length() > 0) {
if (file_name.to_lower().find(searched_string) < 0) {
// The searched string is not in the file name, we skip it.
@@ -113,10 +115,27 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
}
}
+ FileInfo fi;
+ fi.name = p_dir->get_file(i);
+ fi.type = p_dir->get_file_type(i);
+ fi.import_broken = !p_dir->get_file_import_is_valid(i);
+
+ file_list.push_back(fi);
+ }
+
+ // Sort the file list if needed.
+ if (file_sort == FILE_SORT_TYPE) {
+ file_list.sort_custom<FileInfoExtensionComparator>();
+ }
+
+ // Build the tree.
+ for (List<FileInfo>::Element *E = file_list.front(); E; E = E->next()) {
+ FileInfo fi = E->get();
+
TreeItem *file_item = tree->create_item(subdirectory_item);
- file_item->set_text(0, file_name);
- file_item->set_icon(0, _get_tree_item_icon(p_dir, i));
- String file_metadata = lpath.plus_file(file_name);
+ file_item->set_text(0, fi.name);
+ file_item->set_icon(0, _get_tree_item_icon(!fi.import_broken, fi.type));
+ String file_metadata = lpath.plus_file(fi.name);
file_item->set_metadata(0, file_metadata);
if (!p_select_in_favorites && path == file_metadata) {
file_item->select(0);
@@ -220,7 +239,7 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
int index;
EditorFileSystemDirectory *dir = EditorFileSystem::get_singleton()->find_file(fave, &index);
if (dir) {
- icon = _get_tree_item_icon(dir, index);
+ icon = _get_tree_item_icon(dir->get_file_import_is_valid(index), dir->get_file_type(index));
} else {
icon = get_theme_icon("File", "EditorIcons");
}
@@ -273,9 +292,9 @@ void FileSystemDock::_update_display_mode(bool p_force) {
tree->show();
tree->set_v_size_flags(SIZE_EXPAND_FILL);
if (display_mode == DISPLAY_MODE_TREE_ONLY) {
- tree_search_box->show();
+ toolbar2_hbc->show();
} else {
- tree_search_box->hide();
+ toolbar2_hbc->hide();
}
_update_tree(_compute_uncollapsed_paths());
@@ -286,7 +305,7 @@ void FileSystemDock::_update_display_mode(bool p_force) {
tree->show();
tree->set_v_size_flags(SIZE_EXPAND_FILL);
tree->ensure_cursor_is_visible();
- tree_search_box->hide();
+ toolbar2_hbc->hide();
_update_tree(_compute_uncollapsed_paths());
file_list_vb->show();
@@ -318,10 +337,14 @@ void FileSystemDock::_notification(int p_what) {
files->connect("item_activated", callable_mp(this, &FileSystemDock::_file_list_activate_file));
button_hist_next->connect("pressed", callable_mp(this, &FileSystemDock::_fw_history));
button_hist_prev->connect("pressed", callable_mp(this, &FileSystemDock::_bw_history));
+
tree_search_box->set_right_icon(get_theme_icon("Search", ei));
tree_search_box->set_clear_button_enabled(true);
+ tree_button_sort->set_icon(get_theme_icon("Sort", ei));
+
file_list_search_box->set_right_icon(get_theme_icon("Search", ei));
file_list_search_box->set_clear_button_enabled(true);
+ file_list_button_sort->set_icon(get_theme_icon("Sort", ei));
button_hist_next->set_icon(get_theme_icon("Forward", ei));
button_hist_prev->set_icon(get_theme_icon("Back", ei));
@@ -387,8 +410,11 @@ void FileSystemDock::_notification(int p_what) {
tree_search_box->set_right_icon(get_theme_icon("Search", ei));
tree_search_box->set_clear_button_enabled(true);
+ tree_button_sort->set_icon(get_theme_icon("Sort", ei));
+
file_list_search_box->set_right_icon(get_theme_icon("Search", ei));
file_list_search_box->set_clear_button_enabled(true);
+ file_list_button_sort->set_icon(get_theme_icon("Sort", ei));
// Update always show folders.
bool new_always_show_folders = bool(EditorSettings::get_singleton()->get("docks/filesystem/always_show_folders"));
@@ -660,7 +686,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
const Color folder_color = get_theme_color("folder_icon_modulate", "FileDialog");
// Build the FileInfo list.
- List<FileInfo> filelist;
+ List<FileInfo> file_list;
if (path == "Favorites") {
// Display the favorites.
Vector<String> favorites = EditorSettings::get_singleton()->get_favorites();
@@ -698,7 +724,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
}
if (searched_string.length() == 0 || fi.name.to_lower().find(searched_string) >= 0) {
- filelist.push_back(fi);
+ file_list.push_back(fi);
}
}
}
@@ -719,7 +745,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
if (searched_string.length() > 0) {
// Display the search results.
- _search(EditorFileSystem::get_singleton()->get_filesystem(), &filelist, 128);
+ _search(EditorFileSystem::get_singleton()->get_filesystem(), &file_list, 128);
} else {
if (display_mode == DISPLAY_MODE_TREE_ONLY || always_show_folders) {
// Display folders in the list.
@@ -757,16 +783,21 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
fi.type = efd->get_file_type(i);
fi.import_broken = !efd->get_file_import_is_valid(i);
- filelist.push_back(fi);
+ file_list.push_back(fi);
}
}
- filelist.sort();
+ file_list.sort();
+ }
+
+ // Sort the file list if needed.
+ if (file_sort == FILE_SORT_TYPE) {
+ file_list.sort_custom<FileInfoExtensionComparator>();
}
// Fills the ItemList control node from the FileInfos.
String main_scene = ProjectSettings::get_singleton()->get("application/run/main_scene");
String oi = "Object";
- for (List<FileInfo>::Element *E = filelist.front(); E; E = E->next()) {
+ for (List<FileInfo>::Element *E = file_list.front(); E; E = E->next()) {
FileInfo *finfo = &(E->get());
String fname = finfo->name;
String fpath = finfo->path;
@@ -2516,6 +2547,35 @@ void FileSystemDock::_feature_profile_changed() {
_update_display_mode(true);
}
+void FileSystemDock::set_file_sort(FileSortOption p_file_sort) {
+ for (int i = 0; i != FILE_SORT_MAX; i++) {
+ tree_button_sort->get_popup()->set_item_checked(i, (i == (int)p_file_sort));
+ file_list_button_sort->get_popup()->set_item_checked(i, (i == (int)p_file_sort));
+ }
+ file_sort = p_file_sort;
+
+ // Update everything needed.
+ _update_tree(_compute_uncollapsed_paths());
+ _update_file_list(true);
+}
+
+void FileSystemDock::_file_sort_popup(int p_id) {
+ set_file_sort((FileSortOption)p_id);
+}
+
+MenuButton *FileSystemDock::_create_file_menu_button() {
+ MenuButton *button = memnew(MenuButton);
+ button->set_flat(true);
+ button->set_tooltip(TTR("Sort files"));
+
+ PopupMenu *p = button->get_popup();
+ p->connect("id_pressed", callable_mp(this, &FileSystemDock::_file_sort_popup));
+ p->add_radio_check_item("Sort by Name", FILE_SORT_NAME);
+ p->add_radio_check_item("Sort by Type", FILE_SORT_TYPE);
+ p->set_item_checked(file_sort, true);
+ return button;
+}
+
void FileSystemDock::_bind_methods() {
ClassDB::bind_method(D_METHOD("_update_tree"), &FileSystemDock::_update_tree);
@@ -2593,7 +2653,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
button_toggle_display_mode->set_tooltip(TTR("Toggle Split Mode"));
toolbar_hbc->add_child(button_toggle_display_mode);
- HBoxContainer *toolbar2_hbc = memnew(HBoxContainer);
+ toolbar2_hbc = memnew(HBoxContainer);
toolbar2_hbc->add_theme_constant_override("separation", 0);
top_vbc->add_child(toolbar2_hbc);
@@ -2603,6 +2663,9 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
tree_search_box->connect("text_changed", callable_mp(this, &FileSystemDock::_search_changed), varray(tree_search_box));
toolbar2_hbc->add_child(tree_search_box);
+ tree_button_sort = _create_file_menu_button();
+ toolbar2_hbc->add_child(tree_button_sort);
+
file_list_popup = memnew(PopupMenu);
add_child(file_list_popup);
@@ -2644,6 +2707,9 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
file_list_search_box->connect("text_changed", callable_mp(this, &FileSystemDock::_search_changed), varray(file_list_search_box));
path_hb->add_child(file_list_search_box);
+ file_list_button_sort = _create_file_menu_button();
+ path_hb->add_child(file_list_button_sort);
+
button_file_list_display_mode = memnew(Button);
button_file_list_display_mode->set_flat(true);
path_hb->add_child(button_file_list_display_mode);
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
index ec2a075834..f74e04ac2e 100644
--- a/editor/filesystem_dock.h
+++ b/editor/filesystem_dock.h
@@ -69,6 +69,12 @@ public:
DISPLAY_MODE_SPLIT,
};
+ enum FileSortOption {
+ FILE_SORT_NAME = 0,
+ FILE_SORT_TYPE,
+ FILE_SORT_MAX,
+ };
+
private:
enum FileMenu {
FILE_OPEN,
@@ -95,6 +101,8 @@ private:
FOLDER_COLLAPSE_ALL,
};
+ FileSortOption file_sort = FILE_SORT_NAME;
+
VBoxContainer *scanning_vb;
ProgressBar *scanning_progress;
VSplitContainer *split_box;
@@ -109,8 +117,13 @@ private:
Button *button_hist_next;
Button *button_hist_prev;
LineEdit *current_path;
+
+ HBoxContainer *toolbar2_hbc;
LineEdit *tree_search_box;
+ MenuButton *tree_button_sort;
+
LineEdit *file_list_search_box;
+ MenuButton *file_list_button_sort;
String searched_string;
Vector<String> uncollapsed_paths_before_search;
@@ -173,7 +186,7 @@ private:
ItemList *files;
bool import_dock_needs_update;
- Ref<Texture2D> _get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx);
+ Ref<Texture2D> _get_tree_item_icon(bool p_is_valid, String p_file_type);
bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites, bool p_unfold_path = false);
Vector<String> _compute_uncollapsed_paths();
void _update_tree(const Vector<String> &p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false, bool p_unfold_path = false);
@@ -238,6 +251,9 @@ private:
void _search_changed(const String &p_text, const Control *p_from);
+ MenuButton *_create_file_menu_button();
+ void _file_sort_popup(int p_id);
+
void _file_and_folders_fill_popup(PopupMenu *p_popup, Vector<String> p_paths, bool p_display_path_dependent_options = true);
void _tree_rmb_select(const Vector2 &p_pos);
void _tree_rmb_empty(const Vector2 &p_pos);
@@ -256,6 +272,11 @@ private:
return NaturalNoCaseComparator()(name, fi.name);
}
};
+ struct FileInfoExtensionComparator {
+ bool operator()(const FileInfo &p_a, const FileInfo &p_b) const {
+ return NaturalNoCaseComparator()(p_a.name.get_extension() + p_a.name.get_basename(), p_b.name.get_extension() + p_b.name.get_basename());
+ }
+ };
void _search(EditorFileSystemDirectory *p_path, List<FileInfo> *matches, int p_max_items);
@@ -299,6 +320,9 @@ public:
void set_display_mode(DisplayMode p_display_mode);
DisplayMode get_display_mode() { return display_mode; }
+ void set_file_sort(FileSortOption p_file_sort);
+ FileSortOption get_file_sort() { return file_sort; }
+
void set_file_list_display_mode(FileListDisplayMode p_mode);
FileListDisplayMode get_file_list_display_mode() { return file_list_display_mode; };
diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp
index 8f1b8838d8..c88cd8ea5f 100644
--- a/editor/inspector_dock.cpp
+++ b/editor/inspector_dock.cpp
@@ -164,7 +164,7 @@ void InspectorDock::_resource_file_selected(String p_file) {
editor->push_item(res.operator->());
}
-void InspectorDock::_save_resource(bool save_as) const {
+void InspectorDock::_save_resource(bool save_as) {
ObjectID current = EditorNode::get_singleton()->get_editor_history()->get_current();
Object *current_obj = current.is_valid() ? ObjectDB::get_instance(current) : nullptr;
@@ -179,7 +179,7 @@ void InspectorDock::_save_resource(bool save_as) const {
}
}
-void InspectorDock::_unref_resource() const {
+void InspectorDock::_unref_resource() {
ObjectID current = EditorNode::get_singleton()->get_editor_history()->get_current();
Object *current_obj = current.is_valid() ? ObjectDB::get_instance(current) : nullptr;
@@ -190,7 +190,7 @@ void InspectorDock::_unref_resource() const {
editor->edit_current();
}
-void InspectorDock::_copy_resource() const {
+void InspectorDock::_copy_resource() {
ObjectID current = EditorNode::get_singleton()->get_editor_history()->get_current();
Object *current_obj = current.is_valid() ? ObjectDB::get_instance(current) : nullptr;
@@ -201,7 +201,7 @@ void InspectorDock::_copy_resource() const {
EditorSettings::get_singleton()->set_resource_clipboard(current_res);
}
-void InspectorDock::_paste_resource() const {
+void InspectorDock::_paste_resource() {
RES r = EditorSettings::get_singleton()->get_resource_clipboard();
if (r.is_valid()) {
editor->push_item(EditorSettings::get_singleton()->get_resource_clipboard().ptr(), String());
diff --git a/editor/inspector_dock.h b/editor/inspector_dock.h
index 551d3d1643..b2dabf19c5 100644
--- a/editor/inspector_dock.h
+++ b/editor/inspector_dock.h
@@ -96,10 +96,10 @@ class InspectorDock : public VBoxContainer {
void _load_resource(const String &p_type = "");
void _open_resource_selector() { _load_resource(); }; // just used to call from arg-less signal
void _resource_file_selected(String p_file);
- void _save_resource(bool save_as) const;
- void _unref_resource() const;
- void _copy_resource() const;
- void _paste_resource() const;
+ void _save_resource(bool save_as);
+ void _unref_resource();
+ void _copy_resource();
+ void _paste_resource();
void _warning_pressed();
void _resource_created();
diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp
index 6764f70d9b..e4562c57af 100644
--- a/editor/localization_editor.cpp
+++ b/editor/localization_editor.cpp
@@ -319,7 +319,7 @@ void LocalizationEditor::_translation_filter_option_changed() {
}
}
- f_locales = f_locales.sort();
+ f_locales.sort();
undo_redo->create_action(TTR("Changed Locale Filter"));
undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/locale_filter", f_locales_all);
diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp
index b0f65af245..231f5588a4 100644
--- a/editor/plugins/audio_stream_editor_plugin.cpp
+++ b/editor/plugins/audio_stream_editor_plugin.cpp
@@ -44,8 +44,8 @@ void AudioStreamEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_ENTER_TREE) {
_play_button->set_icon(get_theme_icon("MainPlay", "EditorIcons"));
_stop_button->set_icon(get_theme_icon("Stop", "EditorIcons"));
- _preview->set_frame_color(get_theme_color("dark_color_2", "Editor"));
- set_frame_color(get_theme_color("dark_color_1", "Editor"));
+ _preview->set_color(get_theme_color("dark_color_2", "Editor"));
+ set_color(get_theme_color("dark_color_1", "Editor"));
_indicator->update();
_preview->update();
diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp
index aecbf817c4..a4eab6ab4a 100644
--- a/editor/plugins/node_3d_editor_plugin.cpp
+++ b/editor/plugins/node_3d_editor_plugin.cpp
@@ -2464,12 +2464,14 @@ void Node3DEditorViewport::_notification(int p_what) {
subviewport_container->set_stretch_shrink(shrink ? 2 : 1);
}
- //update msaa if changed
+ // Update MSAA, screen-space AA and debanding if changed
- int msaa_mode = ProjectSettings::get_singleton()->get("rendering/quality/screen_filters/msaa");
+ const int msaa_mode = ProjectSettings::get_singleton()->get("rendering/quality/screen_filters/msaa");
viewport->set_msaa(Viewport::MSAA(msaa_mode));
- int ssaa_mode = GLOBAL_GET("rendering/quality/screen_filters/screen_space_aa");
+ const int ssaa_mode = GLOBAL_GET("rendering/quality/screen_filters/screen_space_aa");
viewport->set_screen_space_aa(Viewport::ScreenSpaceAA(ssaa_mode));
+ const bool use_debanding = GLOBAL_GET("rendering/quality/screen_filters/use_debanding");
+ viewport->set_use_debanding(use_debanding);
bool show_info = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION));
if (show_info != info_label->is_visible()) {
diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h
index 4f627b1d0c..e4a384449b 100644
--- a/editor/plugins/node_3d_editor_plugin.h
+++ b/editor/plugins/node_3d_editor_plugin.h
@@ -28,8 +28,8 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifndef SPATIAL_EDITOR_PLUGIN_H
-#define SPATIAL_EDITOR_PLUGIN_H
+#ifndef NODE_3D_EDITOR_PLUGIN_H
+#define NODE_3D_EDITOR_PLUGIN_H
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
@@ -890,4 +890,4 @@ public:
virtual ~EditorNode3DGizmoPlugin();
};
-#endif
+#endif // NODE_3D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index 2d0f4a19e7..ddcba18a78 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -107,6 +107,8 @@ void VisualShaderGraphPlugin::_bind_methods() {
ClassDB::bind_method("update_node_deferred", &VisualShaderGraphPlugin::update_node_deferred);
ClassDB::bind_method("set_input_port_default_value", &VisualShaderGraphPlugin::set_input_port_default_value);
ClassDB::bind_method("set_uniform_name", &VisualShaderGraphPlugin::set_uniform_name);
+ ClassDB::bind_method("set_expression", &VisualShaderGraphPlugin::set_expression);
+ ClassDB::bind_method("update_curve", &VisualShaderGraphPlugin::update_curve);
ClassDB::bind_method("update_constant", &VisualShaderGraphPlugin::update_constant);
}
@@ -205,6 +207,14 @@ void VisualShaderGraphPlugin::set_uniform_name(VisualShader::Type p_type, int p_
}
}
+void VisualShaderGraphPlugin::update_curve(int p_node_id) {
+ if (links.has(p_node_id) && links[p_node_id].curve_editor) {
+ if (((VisualShaderNodeCurveTexture *)links[p_node_id].visual_node)->get_texture().is_valid()) {
+ links[p_node_id].curve_editor->set_curve(((VisualShaderNodeCurveTexture *)links[p_node_id].visual_node)->get_texture()->get_curve());
+ }
+ }
+}
+
int VisualShaderGraphPlugin::get_constant_index(float p_constant) const {
for (int i = 0; i < MAX_FLOAT_CONST_DEFS; i++) {
if (Math::is_equal_approx(p_constant, float_constant_defs[i].value)) {
@@ -226,6 +236,13 @@ void VisualShaderGraphPlugin::update_constant(VisualShader::Type p_type, int p_n
links[p_node_id].graph_node->set_size(Size2(-1, -1));
}
+void VisualShaderGraphPlugin::set_expression(VisualShader::Type p_type, int p_node_id, const String &p_expression) {
+ if (p_type != visual_shader->get_shader_type() || !links.has(p_node_id) || !links[p_node_id].expression_edit) {
+ return;
+ }
+ links[p_node_id].expression_edit->set_text(p_expression);
+}
+
void VisualShaderGraphPlugin::update_node_size(int p_node_id) {
if (!links.has(p_node_id)) {
return;
@@ -241,6 +258,14 @@ void VisualShaderGraphPlugin::register_constant_option_btn(int p_node_id, Option
links[p_node_id].const_op = p_button;
}
+void VisualShaderGraphPlugin::register_expression_edit(int p_node_id, CodeEdit *p_expression_edit) {
+ links[p_node_id].expression_edit = p_expression_edit;
+}
+
+void VisualShaderGraphPlugin::register_curve_editor(int p_node_id, CurveEditor *p_curve_editor) {
+ links[p_node_id].curve_editor = p_curve_editor;
+}
+
void VisualShaderGraphPlugin::update_uniform_refs() {
for (Map<int, Link>::Element *E = links.front(); E; E = E->next()) {
VisualShaderNodeUniformRef *ref = Object::cast_to<VisualShaderNodeUniformRef>(E->get().visual_node);
@@ -284,7 +309,7 @@ void VisualShaderGraphPlugin::make_dirty(bool p_enabled) {
}
void VisualShaderGraphPlugin::register_link(VisualShader::Type p_type, int p_id, VisualShaderNode *p_visual_node, GraphNode *p_graph_node) {
- links.insert(p_id, { p_type, p_visual_node, p_graph_node, p_visual_node->get_output_port_for_preview() != -1, -1, Map<int, InputPort>(), Map<int, Port>(), nullptr, nullptr, nullptr });
+ links.insert(p_id, { p_type, p_visual_node, p_graph_node, p_visual_node->get_output_port_for_preview() != -1, -1, Map<int, InputPort>(), Map<int, Port>(), nullptr, nullptr, nullptr, nullptr, nullptr });
}
void VisualShaderGraphPlugin::register_output_port(int p_node_id, int p_port, TextureButton *p_button) {
@@ -315,9 +340,12 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) {
Ref<VisualShaderNode> vsnode = visual_shader->get_node(p_type, p_id);
+ Ref<VisualShaderNodeResizableBase> resizable_node = Object::cast_to<VisualShaderNodeResizableBase>(vsnode.ptr());
+ bool is_resizable = !resizable_node.is_null();
+ Size2 size = Size2(0, 0);
+
Ref<VisualShaderNodeGroupBase> group_node = Object::cast_to<VisualShaderNodeGroupBase>(vsnode.ptr());
bool is_group = !group_node.is_null();
- Size2 size = Size2(0, 0);
Ref<VisualShaderNodeExpression> expression_node = Object::cast_to<VisualShaderNodeExpression>(group_node.ptr());
bool is_expression = !expression_node.is_null();
@@ -326,8 +354,8 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) {
GraphNode *node = memnew(GraphNode);
register_link(p_type, p_id, vsnode.ptr(), node);
- if (is_group) {
- size = group_node->get_size();
+ if (is_resizable) {
+ size = resizable_node->get_size();
node->set_resizable(true);
node->connect("resize_request", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_node_resized), varray((int)p_type, p_id));
@@ -342,7 +370,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) {
if (p_id >= 2) {
node->set_show_close_button(true);
- node->connect("close_request", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_delete_request), varray(p_id), CONNECT_DEFERRED);
+ node->connect("close_request", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_delete_node_request), varray(p_type, p_id), CONNECT_DEFERRED);
}
node->connect("dragged", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_node_dragged), varray(p_id));
@@ -391,6 +419,18 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) {
}
}
+ Ref<VisualShaderNodeCurveTexture> curve = vsnode;
+ if (curve.is_valid()) {
+ if (curve->get_texture().is_valid() && !curve->get_texture()->is_connected("changed", callable_mp(VisualShaderEditor::get_singleton()->get_graph_plugin(), &VisualShaderGraphPlugin::update_curve))) {
+ curve->get_texture()->connect("changed", callable_mp(VisualShaderEditor::get_singleton()->get_graph_plugin(), &VisualShaderGraphPlugin::update_curve), varray(p_id));
+ }
+
+ HBoxContainer *hbox = memnew(HBoxContainer);
+ custom_editor->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ hbox->add_child(custom_editor);
+ custom_editor = hbox;
+ }
+
Ref<VisualShaderNodeFloatConstant> float_const = vsnode;
if (float_const.is_valid()) {
HBoxContainer *hbox = memnew(HBoxContainer);
@@ -413,6 +453,37 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) {
} else if (custom_editor) {
port_offset++;
node->add_child(custom_editor);
+
+ if (curve.is_valid()) {
+ VisualShaderEditor::get_singleton()->graph->add_child(node);
+ VisualShaderEditor::get_singleton()->_update_created_node(node);
+
+ CurveEditor *curve_editor = memnew(CurveEditor);
+ node->add_child(curve_editor);
+ register_curve_editor(p_id, curve_editor);
+ curve_editor->set_custom_minimum_size(Size2(300, 0));
+ curve_editor->set_h_size_flags(Control::SIZE_EXPAND_FILL);
+ if (curve->get_texture().is_valid()) {
+ curve_editor->set_curve(curve->get_texture()->get_curve());
+ }
+
+ TextureButton *preview = memnew(TextureButton);
+ preview->set_toggle_mode(true);
+ preview->set_normal_texture(VisualShaderEditor::get_singleton()->get_theme_icon("GuiVisibilityHidden", "EditorIcons"));
+ preview->set_pressed_texture(VisualShaderEditor::get_singleton()->get_theme_icon("GuiVisibilityVisible", "EditorIcons"));
+ preview->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
+
+ register_output_port(p_id, 0, preview);
+
+ preview->connect("pressed", callable_mp(VisualShaderEditor::get_singleton(), &VisualShaderEditor::_preview_select_port), varray(p_id, 0), CONNECT_DEFERRED);
+ custom_editor->add_child(preview);
+
+ VisualShaderNode::PortType port_left = vsnode->get_input_port_type(0);
+ VisualShaderNode::PortType port_right = vsnode->get_output_port_type(0);
+ node->set_slot(0, true, port_left, type_color[port_left], true, port_right, type_color[port_right]);
+
+ VisualShaderEditor::get_singleton()->call_deferred("_set_node_size", (int)p_type, p_id, size);
+ }
if (vsnode->is_use_prop_slots()) {
return;
}
@@ -623,6 +694,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) {
expression_syntax_highlighter.instance();
expression_node->set_control(expression_box, 0);
node->add_child(expression_box);
+ register_expression_edit(p_id, expression_box);
Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
Color text_color = EDITOR_GET("text_editor/highlighting/text_color");
@@ -659,7 +731,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) {
if (!uniform.is_valid()) {
VisualShaderEditor::get_singleton()->graph->add_child(node);
VisualShaderEditor::get_singleton()->_update_created_node(node);
- if (is_group) {
+ if (is_resizable) {
VisualShaderEditor::get_singleton()->call_deferred("_set_node_size", (int)p_type, p_id, size);
}
}
@@ -1210,7 +1282,7 @@ void VisualShaderEditor::_add_input_port(int p_node, int p_port, int p_port_type
return;
}
- undo_redo->create_action(TTR("Add input port"));
+ undo_redo->create_action(TTR("Add Input Port"));
undo_redo->add_do_method(node.ptr(), "add_input_port", p_port, p_port_type, p_name);
undo_redo->add_undo_method(node.ptr(), "remove_input_port", p_port);
undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
@@ -1225,7 +1297,7 @@ void VisualShaderEditor::_add_output_port(int p_node, int p_port, int p_port_typ
return;
}
- undo_redo->create_action(TTR("Add output port"));
+ undo_redo->create_action(TTR("Add Output Port"));
undo_redo->add_do_method(node.ptr(), "add_output_port", p_port, p_port_type, p_name);
undo_redo->add_undo_method(node.ptr(), "remove_output_port", p_port);
undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
@@ -1240,7 +1312,7 @@ void VisualShaderEditor::_change_input_port_type(int p_type, int p_node, int p_p
return;
}
- undo_redo->create_action(TTR("Change input port type"));
+ undo_redo->create_action(TTR("Change Input Port Type"));
undo_redo->add_do_method(node.ptr(), "set_input_port_type", p_port, p_type);
undo_redo->add_undo_method(node.ptr(), "set_input_port_type", p_port, node->get_input_port_type(p_port));
undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
@@ -1255,7 +1327,7 @@ void VisualShaderEditor::_change_output_port_type(int p_type, int p_node, int p_
return;
}
- undo_redo->create_action(TTR("Change output port type"));
+ undo_redo->create_action(TTR("Change Output Port Type"));
undo_redo->add_do_method(node.ptr(), "set_output_port_type", p_port, p_type);
undo_redo->add_undo_method(node.ptr(), "set_output_port_type", p_port, node->get_output_port_type(p_port));
undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node);
@@ -1269,7 +1341,7 @@ void VisualShaderEditor::_change_input_port_name(const String &p_text, Object *l
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node_id);
ERR_FAIL_COND(!node.is_valid());
- undo_redo->create_action(TTR("Change input port name"));
+ undo_redo->create_action(TTR("Change Input Port Name"));
undo_redo->add_do_method(node.ptr(), "set_input_port_name", p_port_id, p_text);
undo_redo->add_undo_method(node.ptr(), "set_input_port_name", p_port_id, node->get_input_port_name(p_port_id));
undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node_id);
@@ -1283,7 +1355,7 @@ void VisualShaderEditor::_change_output_port_name(const String &p_text, Object *
Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node_id);
ERR_FAIL_COND(!node.is_valid());
- undo_redo->create_action(TTR("Change output port name"));
+ undo_redo->create_action(TTR("Change Output Port Name"));
undo_redo->add_do_method(node.ptr(), "set_output_port_name", p_port_id, p_text);
undo_redo->add_undo_method(node.ptr(), "set_output_port_name", p_port_id, node->get_output_port_name(p_port_id));
undo_redo->add_do_method(graph_plugin.ptr(), "update_node", type, p_node_id);
@@ -1298,7 +1370,7 @@ void VisualShaderEditor::_remove_input_port(int p_node, int p_port) {
return;
}
- undo_redo->create_action(TTR("Remove input port"));
+ undo_redo->create_action(TTR("Remove Input Port"));
List<VisualShader::Connection> conns;
visual_shader->get_node_connections(type, &conns);
@@ -1347,7 +1419,7 @@ void VisualShaderEditor::_remove_output_port(int p_node, int p_port) {
return;
}
- undo_redo->create_action(TTR("Remove output port"));
+ undo_redo->create_action(TTR("Remove Output Port"));
List<VisualShader::Connection> conns;
visual_shader->get_node_connections(type, &conns);
@@ -1402,31 +1474,39 @@ void VisualShaderEditor::_expression_focus_out(Object *code_edit, int p_node) {
return;
}
- undo_redo->create_action(TTR("Set expression"));
+ undo_redo->create_action(TTR("Set VisualShader Expression"));
undo_redo->add_do_method(node.ptr(), "set_expression", expression_box->get_text());
undo_redo->add_undo_method(node.ptr(), "set_expression", node->get_expression());
+ undo_redo->add_do_method(graph_plugin.ptr(), "set_expression", type, p_node, expression_box->get_text());
+ undo_redo->add_undo_method(graph_plugin.ptr(), "set_expression", type, p_node, node->get_expression());
undo_redo->commit_action();
}
void VisualShaderEditor::_set_node_size(int p_type, int p_node, const Vector2 &p_size) {
- VisualShader::Type type = get_current_shader_type();
- Ref<VisualShaderNode> node = visual_shader->get_node(type, p_node);
+ VisualShader::Type type = VisualShader::Type(p_type);
+ Ref<VisualShaderNodeResizableBase> node = visual_shader->get_node(type, p_node);
if (node.is_null()) {
return;
}
- Ref<VisualShaderNodeGroupBase> group_node = Object::cast_to<VisualShaderNodeGroupBase>(node.ptr());
-
- if (group_node.is_null()) {
- return;
+ Size2 size = p_size;
+ if (!node->is_allow_v_resize()) {
+ size.y = 0;
}
- Vector2 size = p_size;
+ node->set_size(size);
- group_node->set_size(size);
+ if (get_current_shader_type() == type) {
+ Ref<VisualShaderNodeExpression> expression_node = Object::cast_to<VisualShaderNodeExpression>(node.ptr());
+ Control *text_box = nullptr;
+ if (!expression_node.is_null()) {
+ text_box = expression_node->get_control(0);
+ if (text_box) {
+ text_box->set_custom_minimum_size(Size2(0, 0));
+ }
+ }
- GraphNode *gn = nullptr;
- if (edit_type->get_selected() == p_type) { // check - otherwise the error will be emitted
+ GraphNode *gn = nullptr;
Node *node2 = graph->get_node(itos(p_node));
gn = Object::cast_to<GraphNode>(node2);
if (!gn) {
@@ -1435,34 +1515,31 @@ void VisualShaderEditor::_set_node_size(int p_type, int p_node, const Vector2 &p
gn->set_custom_minimum_size(size);
gn->set_size(Size2(1, 1));
- }
- Ref<VisualShaderNodeExpression> expression_node = Object::cast_to<VisualShaderNodeExpression>(node.ptr());
- if (!expression_node.is_null()) {
- Control *text_box = expression_node->get_control(0);
- Size2 box_size = size;
- if (gn != nullptr) {
- if (box_size.x < 150 * EDSCALE || box_size.y < 0) {
- box_size.x = gn->get_size().x;
+ if (!expression_node.is_null() && text_box) {
+ Size2 box_size = size;
+ if (gn != nullptr) {
+ if (box_size.x < 150 * EDSCALE || box_size.y < 0) {
+ box_size.x = gn->get_size().x;
+ }
}
+ box_size.x -= text_box->get_margin(MARGIN_LEFT);
+ box_size.x -= 28 * EDSCALE;
+ box_size.y -= text_box->get_margin(MARGIN_TOP);
+ box_size.y -= 28 * EDSCALE;
+ text_box->set_custom_minimum_size(Size2(box_size.x, box_size.y));
+ text_box->set_size(Size2(1, 1));
}
- box_size.x -= text_box->get_margin(MARGIN_LEFT);
- box_size.x -= 28 * EDSCALE;
- box_size.y -= text_box->get_margin(MARGIN_TOP);
- box_size.y -= 28 * EDSCALE;
- text_box->set_custom_minimum_size(Size2(box_size.x, box_size.y));
- text_box->set_size(Size2(1, 1));
}
}
void VisualShaderEditor::_node_resized(const Vector2 &p_new_size, int p_type, int p_node) {
- VisualShader::Type type = get_current_shader_type();
- Ref<VisualShaderNodeGroupBase> node = visual_shader->get_node(type, p_node);
+ Ref<VisualShaderNodeResizableBase> node = visual_shader->get_node(VisualShader::Type(p_type), p_node);
if (node.is_null()) {
return;
}
- undo_redo->create_action(TTR("Resize VisualShader node"), UndoRedo::MERGE_ENDS);
+ undo_redo->create_action(TTR("Resize VisualShader Node"), UndoRedo::MERGE_ENDS);
undo_redo->add_do_method(this, "_set_node_size", p_type, p_node, p_new_size);
undo_redo->add_undo_method(this, "_set_node_size", p_type, p_node, node->get_size());
undo_redo->commit_action();
@@ -1637,6 +1714,11 @@ void VisualShaderEditor::_add_texture3d_node(const String &p_path) {
texture3d->set_texture(ResourceLoader::load(p_path));
}
+void VisualShaderEditor::_add_curve_node(const String &p_path) {
+ VisualShaderNodeCurveTexture *curve = (VisualShaderNodeCurveTexture *)_add_node(curve_node_option_idx, -1);
+ curve->set_texture(ResourceLoader::load(p_path));
+}
+
VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
ERR_FAIL_INDEX_V(p_idx, add_options.size(), nullptr);
@@ -1815,6 +1897,11 @@ VisualShaderNode *VisualShaderEditor::_add_node(int p_idx, int p_op_idx) {
undo_redo->add_undo_method(this, "_update_uniforms", true);
}
+ VisualShaderNodeCurveTexture *curve = Object::cast_to<VisualShaderNodeCurveTexture>(vsnode.ptr());
+ if (curve) {
+ graph_plugin->call_deferred("update_curve", id_to_use);
+ }
+
undo_redo->commit_action();
return vsnode.ptr();
}
@@ -1903,61 +1990,112 @@ void VisualShaderEditor::_connection_from_empty(const String &p_to, int p_to_slo
_show_members_dialog(true);
}
-void VisualShaderEditor::_delete_request(int which) {
- VisualShader::Type type = get_current_shader_type();
- Ref<VisualShaderNode> node = Ref<VisualShaderNode>(visual_shader->get_node(type, which));
-
- undo_redo->create_action(TTR("Delete Node"));
-
+void VisualShaderEditor::_delete_nodes(int p_type, const List<int> &p_nodes) {
+ VisualShader::Type type = VisualShader::Type(p_type);
List<VisualShader::Connection> conns;
visual_shader->get_node_connections(type, &conns);
- for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
- if (E->get().from_node == which || E->get().to_node == which) {
- undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+
+ for (const List<int>::Element *F = p_nodes.front(); F; F = F->next()) {
+ for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
+ if (E->get().from_node == F->get() || E->get().to_node == F->get()) {
+ undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ }
}
}
- undo_redo->add_do_method(visual_shader.ptr(), "remove_node", type, which);
- undo_redo->add_undo_method(visual_shader.ptr(), "add_node", type, node, visual_shader->get_node_position(type, which), which);
- undo_redo->add_undo_method(graph_plugin.ptr(), "add_node", type, which);
+ Set<String> uniform_names;
- undo_redo->add_do_method(this, "_clear_buffer");
- undo_redo->add_undo_method(this, "_clear_buffer");
+ for (const List<int>::Element *F = p_nodes.front(); F; F = F->next()) {
+ Ref<VisualShaderNode> node = visual_shader->get_node(type, F->get());
- // restore size, inputs and outputs if node is group
- VisualShaderNodeGroupBase *group = Object::cast_to<VisualShaderNodeGroupBase>(node.ptr());
- if (group) {
- undo_redo->add_undo_method(group, "set_size", group->get_size());
- undo_redo->add_undo_method(group, "set_inputs", group->get_inputs());
- undo_redo->add_undo_method(group, "set_outputs", group->get_outputs());
- }
+ undo_redo->add_do_method(visual_shader.ptr(), "remove_node", type, F->get());
+ undo_redo->add_undo_method(visual_shader.ptr(), "add_node", type, node, visual_shader->get_node_position(type, F->get()), F->get());
+ undo_redo->add_undo_method(graph_plugin.ptr(), "add_node", type, F->get());
+
+ undo_redo->add_do_method(this, "_clear_buffer");
+ undo_redo->add_undo_method(this, "_clear_buffer");
+
+ // restore size, inputs and outputs if node is group
+ VisualShaderNodeGroupBase *group = Object::cast_to<VisualShaderNodeGroupBase>(node.ptr());
+ if (group) {
+ undo_redo->add_undo_method(group, "set_size", group->get_size());
+ undo_redo->add_undo_method(group, "set_inputs", group->get_inputs());
+ undo_redo->add_undo_method(group, "set_outputs", group->get_outputs());
+ }
- // restore expression text if node is expression
- VisualShaderNodeExpression *expression = Object::cast_to<VisualShaderNodeExpression>(node.ptr());
- if (expression) {
- undo_redo->add_undo_method(expression, "set_expression", expression->get_expression());
+ // restore expression text if node is expression
+ VisualShaderNodeExpression *expression = Object::cast_to<VisualShaderNodeExpression>(node.ptr());
+ if (expression) {
+ undo_redo->add_undo_method(expression, "set_expression", expression->get_expression());
+ }
+
+ VisualShaderNodeUniform *uniform = Object::cast_to<VisualShaderNodeUniform>(node.ptr());
+ if (uniform) {
+ uniform_names.insert(uniform->get_uniform_name());
+ }
}
- for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
- if (E->get().from_node == which || E->get().to_node == which) {
- undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
- undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ List<VisualShader::Connection> used_conns;
+ for (const List<int>::Element *F = p_nodes.front(); F; F = F->next()) {
+ for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
+ if (E->get().from_node == F->get() || E->get().to_node == F->get()) {
+ bool cancel = false;
+ for (List<VisualShader::Connection>::Element *R = used_conns.front(); R; R = R->next()) {
+ if (R->get().from_node == E->get().from_node && R->get().from_port == E->get().from_port && R->get().to_node == E->get().to_node && R->get().to_port == E->get().to_port) {
+ cancel = true; // to avoid ERR_ALREADY_EXISTS warning
+ break;
+ }
+ }
+ if (!cancel) {
+ undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
+ used_conns.push_back(E->get());
+ }
+ }
}
}
- // delete a node from the graph
- undo_redo->add_do_method(graph_plugin.ptr(), "remove_node", type, which);
- VisualShaderNodeUniform *uniform = Object::cast_to<VisualShaderNodeUniform>(node.ptr());
- if (uniform) {
+ // delete nodes from the graph
+ for (const List<int>::Element *F = p_nodes.front(); F; F = F->next()) {
+ undo_redo->add_do_method(graph_plugin.ptr(), "remove_node", type, F->get());
+ }
+
+ // update uniform refs if any uniform has been deleted
+ if (uniform_names.size() > 0) {
undo_redo->add_do_method(this, "_update_uniforms", true);
undo_redo->add_undo_method(this, "_update_uniforms", true);
- Set<String> uniform_names;
- uniform_names.insert(uniform->get_uniform_name());
-
_update_uniform_refs(uniform_names);
}
+}
+
+void VisualShaderEditor::_delete_node_request(int p_type, int p_node) {
+ List<int> to_erase;
+ to_erase.push_back(p_node);
+
+ undo_redo->create_action(TTR("Delete VisualShader Node"));
+ _delete_nodes(p_type, to_erase);
+ undo_redo->commit_action();
+}
+
+void VisualShaderEditor::_delete_nodes_request() {
+ List<int> to_erase;
+
+ for (int i = 0; i < graph->get_child_count(); i++) {
+ GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
+ if (gn) {
+ if (gn->is_selected() && gn->is_close_button_visible()) {
+ to_erase.push_back(gn->get_name().operator String().to_int());
+ }
+ }
+ }
+
+ if (to_erase.empty()) {
+ return;
+ }
+ undo_redo->create_action(TTR("Delete VisualShader Node(s)"));
+ _delete_nodes(get_current_shader_type(), to_erase);
undo_redo->commit_action();
}
@@ -2280,7 +2418,7 @@ void VisualShaderEditor::_clear_buffer() {
}
void VisualShaderEditor::_duplicate_nodes() {
- int type = edit_type->get_selected();
+ int type = get_current_shader_type();
List<int> nodes;
Set<int> excluded;
@@ -2291,13 +2429,13 @@ void VisualShaderEditor::_duplicate_nodes() {
return;
}
- undo_redo->create_action(TTR("Duplicate Nodes"));
+ undo_redo->create_action(TTR("Duplicate VisualShader Node(s)"));
_dup_paste_nodes(type, type, nodes, excluded, Vector2(10, 10) * EDSCALE, true);
}
void VisualShaderEditor::_copy_nodes() {
- copy_type = edit_type->get_selected();
+ copy_type = get_current_shader_type();
_clear_buffer();
@@ -2309,9 +2447,7 @@ void VisualShaderEditor::_paste_nodes(bool p_use_custom_position, const Vector2
return;
}
- int type = edit_type->get_selected();
-
- undo_redo->create_action(TTR("Paste Nodes"));
+ int type = get_current_shader_type();
float scale = graph->get_zoom();
@@ -2322,109 +2458,13 @@ void VisualShaderEditor::_paste_nodes(bool p_use_custom_position, const Vector2
mpos = graph->get_local_mouse_position();
}
+ undo_redo->create_action(TTR("Paste VisualShader Node(s)"));
+
_dup_paste_nodes(type, copy_type, copy_nodes_buffer, copy_nodes_excluded_buffer, (graph->get_scroll_ofs() / scale + mpos / scale - selection_center), false);
_dup_update_excluded(type, copy_nodes_excluded_buffer); // to prevent selection of previous copies at new paste
}
-void VisualShaderEditor::_delete_nodes() {
- VisualShader::Type type = get_current_shader_type();
- List<int> to_erase;
-
- for (int i = 0; i < graph->get_child_count(); i++) {
- GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
- if (gn) {
- if (gn->is_selected() && gn->is_close_button_visible()) {
- to_erase.push_back(gn->get_name().operator String().to_int());
- }
- }
- }
-
- if (to_erase.empty()) {
- return;
- }
-
- undo_redo->create_action(TTR("Delete Nodes"));
-
- List<VisualShader::Connection> conns;
- visual_shader->get_node_connections(type, &conns);
-
- for (List<int>::Element *F = to_erase.front(); F; F = F->next()) {
- for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
- if (E->get().from_node == F->get() || E->get().to_node == F->get()) {
- undo_redo->add_do_method(graph_plugin.ptr(), "disconnect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
- }
- }
- }
-
- Set<String> uniform_names;
-
- for (List<int>::Element *F = to_erase.front(); F; F = F->next()) {
- Ref<VisualShaderNode> node = visual_shader->get_node(type, F->get());
-
- undo_redo->add_do_method(visual_shader.ptr(), "remove_node", type, F->get());
- undo_redo->add_undo_method(visual_shader.ptr(), "add_node", type, node, visual_shader->get_node_position(type, F->get()), F->get());
- undo_redo->add_undo_method(graph_plugin.ptr(), "add_node", type, F->get());
-
- undo_redo->add_do_method(this, "_clear_buffer");
- undo_redo->add_undo_method(this, "_clear_buffer");
-
- // restore size, inputs and outputs if node is group
- VisualShaderNodeGroupBase *group = Object::cast_to<VisualShaderNodeGroupBase>(node.ptr());
- if (group) {
- undo_redo->add_undo_method(group, "set_size", group->get_size());
- undo_redo->add_undo_method(group, "set_inputs", group->get_inputs());
- undo_redo->add_undo_method(group, "set_outputs", group->get_outputs());
- }
-
- // restore expression text if node is expression
- VisualShaderNodeExpression *expression = Object::cast_to<VisualShaderNodeExpression>(node.ptr());
- if (expression) {
- undo_redo->add_undo_method(expression, "set_expression", expression->get_expression());
- }
-
- VisualShaderNodeUniform *uniform = Object::cast_to<VisualShaderNodeUniform>(node.ptr());
- if (uniform) {
- uniform_names.insert(uniform->get_uniform_name());
- }
- }
-
- List<VisualShader::Connection> used_conns;
- for (List<int>::Element *F = to_erase.front(); F; F = F->next()) {
- for (List<VisualShader::Connection>::Element *E = conns.front(); E; E = E->next()) {
- if (E->get().from_node == F->get() || E->get().to_node == F->get()) {
- bool cancel = false;
- for (List<VisualShader::Connection>::Element *R = used_conns.front(); R; R = R->next()) {
- if (R->get().from_node == E->get().from_node && R->get().from_port == E->get().from_port && R->get().to_node == E->get().to_node && R->get().to_port == E->get().to_port) {
- cancel = true; // to avoid ERR_ALREADY_EXISTS warning
- break;
- }
- }
- if (!cancel) {
- undo_redo->add_undo_method(visual_shader.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
- undo_redo->add_undo_method(graph_plugin.ptr(), "connect_nodes", type, E->get().from_node, E->get().from_port, E->get().to_node, E->get().to_port);
- used_conns.push_back(E->get());
- }
- }
- }
- }
-
- // delete nodes from the graph
- for (List<int>::Element *F = to_erase.front(); F; F = F->next()) {
- undo_redo->add_do_method(graph_plugin.ptr(), "remove_node", type, F->get());
- }
-
- // update uniform refs if any uniform has been deleted
- if (uniform_names.size() > 0) {
- undo_redo->add_do_method(this, "_update_uniforms", true);
- undo_redo->add_undo_method(this, "_update_uniforms", true);
-
- _update_uniform_refs(uniform_names);
- }
-
- undo_redo->commit_action();
-}
-
void VisualShaderEditor::_mode_selected(int p_id) {
visual_shader->set_shader_type(particles_mode ? VisualShader::Type(p_id + 3) : VisualShader::Type(p_id));
_update_options_menu();
@@ -2630,7 +2670,7 @@ void VisualShaderEditor::_node_menu_id_pressed(int p_idx) {
_paste_nodes(true, menu_point);
break;
case NodeMenuOptions::DELETE:
- _delete_nodes();
+ _delete_nodes_request();
break;
case NodeMenuOptions::DUPLICATE:
_duplicate_nodes();
@@ -2705,6 +2745,11 @@ void VisualShaderEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da
_add_custom_node(arr[i]);
j++;
}
+ } else if (type == "CurveTexture") {
+ saved_node_pos = p_point + Vector2(0, j * 210 * EDSCALE);
+ saved_node_pos_dirty = true;
+ _add_curve_node(arr[i]);
+ j++;
} else if (ClassDB::get_parent_class(type) == "Texture2D") {
saved_node_pos = p_point + Vector2(0, j * 210 * EDSCALE);
saved_node_pos_dirty = true;
@@ -2842,8 +2887,8 @@ VisualShaderEditor::VisualShaderEditor() {
graph->connect("scroll_offset_changed", callable_mp(this, &VisualShaderEditor::_scroll_changed));
graph->connect("duplicate_nodes_request", callable_mp(this, &VisualShaderEditor::_duplicate_nodes));
graph->connect("copy_nodes_request", callable_mp(this, &VisualShaderEditor::_copy_nodes));
- graph->connect("paste_nodes_request", callable_mp(this, &VisualShaderEditor::_paste_nodes));
- graph->connect("delete_nodes_request", callable_mp(this, &VisualShaderEditor::_delete_nodes));
+ graph->connect("paste_nodes_request", callable_mp(this, &VisualShaderEditor::_paste_nodes), varray(false, Point2()));
+ graph->connect("delete_nodes_request", callable_mp(this, &VisualShaderEditor::_delete_nodes_request));
graph->connect("gui_input", callable_mp(this, &VisualShaderEditor::_graph_gui_input));
graph->connect("connection_to_empty", callable_mp(this, &VisualShaderEditor::_connection_to_empty));
graph->connect("connection_from_empty", callable_mp(this, &VisualShaderEditor::_connection_from_empty));
@@ -3330,6 +3375,8 @@ VisualShaderEditor::VisualShaderEditor() {
// TEXTURES
cubemap_node_option_idx = add_options.size();
add_options.push_back(AddOption("CubeMap", "Textures", "Functions", "VisualShaderNodeCubemap", TTR("Perform the cubic texture lookup."), -1, -1));
+ curve_node_option_idx = add_options.size();
+ add_options.push_back(AddOption("CurveTexture", "Textures", "Functions", "VisualShaderNodeCurveTexture", TTR("Perform the curve texture lookup."), -1, -1));
texture2d_node_option_idx = add_options.size();
add_options.push_back(AddOption("Texture2D", "Textures", "Functions", "VisualShaderNodeTexture", TTR("Perform the 2D texture lookup."), -1, -1));
texture2d_array_node_option_idx = add_options.size();
diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h
index d43af82238..73bebcd192 100644
--- a/editor/plugins/visual_shader_editor_plugin.h
+++ b/editor/plugins/visual_shader_editor_plugin.h
@@ -33,6 +33,7 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
+#include "editor/plugins/curve_editor_plugin.h"
#include "editor/property_editor.h"
#include "scene/gui/button.h"
#include "scene/gui/graph_edit.h"
@@ -73,6 +74,8 @@ private:
VBoxContainer *preview_box;
LineEdit *uniform_name;
OptionButton *const_op;
+ CodeEdit *expression_edit;
+ CurveEditor *curve_editor;
};
Ref<VisualShader> visual_shader;
@@ -91,6 +94,8 @@ public:
void register_uniform_name(int p_id, LineEdit *p_uniform_name);
void register_default_input_button(int p_node_id, int p_port_id, Button *p_button);
void register_constant_option_btn(int p_node_id, OptionButton *p_button);
+ void register_expression_edit(int p_node_id, CodeEdit *p_expression_edit);
+ void register_curve_editor(int p_node_id, CurveEditor *p_curve_editor);
void clear_links();
void set_shader_type(VisualShader::Type p_type);
bool is_preview_visible(int p_id) const;
@@ -109,7 +114,9 @@ public:
void set_input_port_default_value(VisualShader::Type p_type, int p_node_id, int p_port_id, Variant p_value);
void update_uniform_refs();
void set_uniform_name(VisualShader::Type p_type, int p_node_id, const String &p_name);
+ void update_curve(int p_node_id);
void update_constant(VisualShader::Type p_type, int p_node_id);
+ void set_expression(VisualShader::Type p_type, int p_node_id, const String &p_expression);
int get_constant_index(float p_constant) const;
void update_node_size(int p_node_id);
VisualShader::Type get_shader_type() const;
@@ -251,6 +258,7 @@ class VisualShaderEditor : public VBoxContainer {
int texture2d_array_node_option_idx;
int texture3d_node_option_idx;
int custom_node_option_idx;
+ int curve_node_option_idx;
List<String> keyword_list;
List<VisualShaderNodeUniformRef> uniform_refs;
@@ -262,6 +270,8 @@ class VisualShaderEditor : public VBoxContainer {
void _add_texture2d_node(const String &p_path);
void _add_texture2d_array_node(const String &p_path);
void _add_texture3d_node(const String &p_path);
+ void _add_curve_node(const String &p_path);
+
VisualShaderNode *_add_node(int p_idx, int p_op_idx = -1);
void _update_options_menu();
void _set_mode(int p_which);
@@ -290,8 +300,9 @@ class VisualShaderEditor : public VBoxContainer {
void _scroll_changed(const Vector2 &p_scroll);
void _node_selected(Object *p_node);
- void _delete_request(int);
- void _delete_nodes();
+ void _delete_nodes(int p_type, const List<int> &p_nodes);
+ void _delete_node_request(int p_type, int p_node);
+ void _delete_nodes_request();
void _removed_from_graph();
diff --git a/editor/project_export.cpp b/editor/project_export.cpp
index 1f553ba0de..71522bb253 100644
--- a/editor/project_export.cpp
+++ b/editor/project_export.cpp
@@ -51,10 +51,6 @@
void ProjectExportDialog::_theme_changed() {
duplicate_preset->set_icon(presets->get_theme_icon("Duplicate", "EditorIcons"));
delete_preset->set_icon(presets->get_theme_icon("Remove", "EditorIcons"));
- Control *panel = custom_feature_display->get_parent_control();
- if (panel) {
- panel->add_theme_style_override("panel", patches->get_theme_stylebox("bg", "Tree"));
- }
}
void ProjectExportDialog::_notification(int p_what) {
@@ -68,7 +64,6 @@ void ProjectExportDialog::_notification(int p_what) {
duplicate_preset->set_icon(presets->get_theme_icon("Duplicate", "EditorIcons"));
delete_preset->set_icon(presets->get_theme_icon("Remove", "EditorIcons"));
connect("confirmed", callable_mp(this, &ProjectExportDialog::_export_pck_zip));
- custom_feature_display->get_parent_control()->add_theme_style_override("panel", patches->get_theme_stylebox("bg", "Tree"));
} break;
}
}
@@ -205,7 +200,6 @@ void ProjectExportDialog::_edit_preset(int p_index) {
duplicate_preset->set_disabled(true);
delete_preset->set_disabled(true);
sections->hide();
- patches->clear();
export_error->hide();
export_templates_error->hide();
return;
@@ -241,34 +235,6 @@ void ProjectExportDialog::_edit_preset(int p_index) {
include_filters->set_text(current->get_include_filter());
exclude_filters->set_text(current->get_exclude_filter());
- patches->clear();
- TreeItem *patch_root = patches->create_item();
- Vector<String> patchlist = current->get_patches();
- for (int i = 0; i < patchlist.size(); i++) {
- TreeItem *patch = patches->create_item(patch_root);
- patch->set_cell_mode(0, TreeItem::CELL_MODE_CHECK);
- String file = patchlist[i].get_file();
- patch->set_editable(0, true);
- patch->set_text(0, file.get_file().replace("*", ""));
- if (file.ends_with("*")) {
- patch->set_checked(0, true);
- }
- patch->set_tooltip(0, patchlist[i]);
- patch->set_metadata(0, i);
- patch->add_button(0, presets->get_theme_icon("Remove", "EditorIcons"), 0);
- patch->add_button(0, presets->get_theme_icon("folder", "FileDialog"), 1);
- }
-
- TreeItem *patch_add = patches->create_item(patch_root);
- patch_add->set_metadata(0, patchlist.size());
- if (patchlist.size() == 0) {
- patch_add->set_text(0, TTR("Add initial export..."));
- } else {
- patch_add->set_text(0, TTR("Add previous patches..."));
- }
-
- patch_add->add_button(0, presets->get_theme_icon("folder", "FileDialog"), 1);
-
_fill_resource_tree();
bool needs_templates;
@@ -401,74 +367,6 @@ void ProjectExportDialog::_tab_changed(int) {
_update_feature_list();
}
-void ProjectExportDialog::_patch_button_pressed(Object *p_item, int p_column, int p_id) {
- TreeItem *ti = (TreeItem *)p_item;
-
- patch_index = ti->get_metadata(0);
-
- Ref<EditorExportPreset> current = get_current_preset();
- ERR_FAIL_COND(current.is_null());
-
- if (p_id == 0) {
- Vector<String> patches = current->get_patches();
- ERR_FAIL_INDEX(patch_index, patches.size());
- patch_erase->set_text(vformat(TTR("Delete patch '%s' from list?"), patches[patch_index].get_file()));
- patch_erase->popup_centered();
- } else {
- patch_dialog->popup_file_dialog();
- }
-}
-
-void ProjectExportDialog::_patch_edited() {
- TreeItem *item = patches->get_edited();
- if (!item) {
- return;
- }
- int index = item->get_metadata(0);
-
- Ref<EditorExportPreset> current = get_current_preset();
- ERR_FAIL_COND(current.is_null());
-
- Vector<String> patches = current->get_patches();
-
- ERR_FAIL_INDEX(index, patches.size());
-
- String patch = patches[index].replace("*", "");
-
- if (item->is_checked(0)) {
- patch += "*";
- }
-
- current->set_patch(index, patch);
-}
-
-void ProjectExportDialog::_patch_selected(const String &p_path) {
- Ref<EditorExportPreset> current = get_current_preset();
- ERR_FAIL_COND(current.is_null());
-
- Vector<String> patches = current->get_patches();
-
- if (patch_index >= patches.size()) {
- current->add_patch(ProjectSettings::get_singleton()->get_resource_path().path_to(p_path) + "*");
- } else {
- String enabled = patches[patch_index].ends_with("*") ? String("*") : String();
- current->set_patch(patch_index, ProjectSettings::get_singleton()->get_resource_path().path_to(p_path) + enabled);
- }
-
- _update_current_preset();
-}
-
-void ProjectExportDialog::_patch_deleted() {
- Ref<EditorExportPreset> current = get_current_preset();
- ERR_FAIL_COND(current.is_null());
-
- Vector<String> patches = current->get_patches();
- if (patch_index < patches.size()) {
- current->remove_patch(patch_index);
- _update_current_preset();
- }
-}
-
void ProjectExportDialog::_update_parameters(const String &p_edited_property) {
_update_current_preset();
}
@@ -663,10 +561,6 @@ void ProjectExportDialog::_duplicate_preset() {
preset->set_export_filter(current->get_export_filter());
preset->set_include_filter(current->get_include_filter());
preset->set_exclude_filter(current->get_exclude_filter());
- Vector<String> list = current->get_patches();
- for (int i = 0; i < list.size(); i++) {
- preset->add_patch(list[i]);
- }
preset->set_custom_features(current->get_custom_features());
for (const List<PropertyInfo>::Element *E = current->get_properties().front(); E; E = E->next()) {
@@ -718,21 +612,6 @@ Variant ProjectExportDialog::get_drag_data_fw(const Point2 &p_point, Control *p_
return d;
}
- } else if (p_from == patches) {
- TreeItem *item = patches->get_item_at_position(p_point);
-
- if (item && item->get_cell_mode(0) == TreeItem::CELL_MODE_CHECK) {
- int metadata = item->get_metadata(0);
- Dictionary d;
- d["type"] = "export_patch";
- d["patch"] = metadata;
-
- Label *label = memnew(Label);
- label->set_text(item->get_text(0));
- patches->set_drag_preview(label);
-
- return d;
- }
}
return Variant();
@@ -748,19 +627,6 @@ bool ProjectExportDialog::can_drop_data_fw(const Point2 &p_point, const Variant
if (presets->get_item_at_position(p_point, true) < 0 && !presets->is_pos_at_end_of_items(p_point)) {
return false;
}
- } else if (p_from == patches) {
- Dictionary d = p_data;
- if (!d.has("type") || String(d["type"]) != "export_patch") {
- return false;
- }
-
- patches->set_drop_mode_flags(Tree::DROP_MODE_ON_ITEM);
-
- TreeItem *item = patches->get_item_at_position(p_point);
-
- if (!item) {
- return false;
- }
}
return true;
@@ -797,33 +663,6 @@ void ProjectExportDialog::drop_data_fw(const Point2 &p_point, const Variant &p_d
} else {
_edit_preset(presets->get_item_count() - 1);
}
- } else if (p_from == patches) {
- Dictionary d = p_data;
- if (!d.has("type") || String(d["type"]) != "export_patch") {
- return;
- }
-
- int from_pos = d["patch"];
-
- TreeItem *item = patches->get_item_at_position(p_point);
- if (!item) {
- return;
- }
-
- int to_pos = item->get_cell_mode(0) == TreeItem::CELL_MODE_CHECK ? int(item->get_metadata(0)) : -1;
-
- if (to_pos == from_pos) {
- return;
- } else if (to_pos > from_pos) {
- to_pos--;
- }
-
- Ref<EditorExportPreset> preset = get_current_preset();
- String patch = preset->get_patch(from_pos);
- preset->remove_patch(from_pos);
- preset->add_patch(patch, to_pos);
-
- _update_current_preset();
}
}
@@ -1222,48 +1061,6 @@ ProjectExportDialog::ProjectExportDialog() {
script_mode->add_item(TTR("Compiled"), (int)EditorExportPreset::MODE_SCRIPT_COMPILED);
script_mode->connect("item_selected", callable_mp(this, &ProjectExportDialog::_script_export_mode_changed));
- // Patch packages.
-
- VBoxContainer *patch_vb = memnew(VBoxContainer);
- sections->add_child(patch_vb);
- patch_vb->set_name(TTR("Patches"));
-
- // FIXME: Patching support doesn't seem properly implemented yet, so we hide it.
- // The rest of the code is still kept for now, in the hope that it will be made
- // functional and reactivated.
- patch_vb->hide();
-
- patches = memnew(Tree);
- patch_vb->add_child(patches);
- patches->set_v_size_flags(Control::SIZE_EXPAND_FILL);
- patches->set_hide_root(true);
- patches->connect("button_pressed", callable_mp(this, &ProjectExportDialog::_patch_button_pressed));
- patches->connect("item_edited", callable_mp(this, &ProjectExportDialog::_patch_edited));
-#ifndef _MSC_VER
-#warning must reimplement drag forward
-#endif
- //patches->set_drag_forwarding(this);
- patches->set_edit_checkbox_cell_only_when_checkbox_is_pressed(true);
-
- HBoxContainer *patches_hb = memnew(HBoxContainer);
- patch_vb->add_child(patches_hb);
- patches_hb->add_spacer();
- patch_export = memnew(Button);
- patch_export->set_text(TTR("Make Patch"));
- patches_hb->add_child(patch_export);
- patches_hb->add_spacer();
-
- patch_dialog = memnew(EditorFileDialog);
- patch_dialog->add_filter("*.pck ; " + TTR("Pack File"));
- patch_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
- patch_dialog->connect("file_selected", callable_mp(this, &ProjectExportDialog::_patch_selected));
- add_child(patch_dialog);
-
- patch_erase = memnew(ConfirmationDialog);
- patch_erase->get_ok()->set_text(TTR("Delete"));
- patch_erase->connect("confirmed", callable_mp(this, &ProjectExportDialog::_patch_deleted));
- add_child(patch_erase);
-
// Feature tags.
VBoxContainer *feature_vb = memnew(VBoxContainer);
diff --git a/editor/project_export.h b/editor/project_export.h
index 75402dc334..026daac2ad 100644
--- a/editor/project_export.h
+++ b/editor/project_export.h
@@ -87,12 +87,6 @@ private:
StringName editor_icons;
- Tree *patches;
- Button *patch_export;
- int patch_index;
- EditorFileDialog *patch_dialog;
- ConfirmationDialog *patch_erase;
-
Button *export_button;
Button *export_all_button;
AcceptDialog *export_all_dialog;
@@ -109,9 +103,6 @@ private:
String default_filename;
- void _patch_selected(const String &p_path);
- void _patch_deleted();
-
void _runnable_pressed();
void _update_parameters(const String &p_edited_property);
void _name_changed(const String &p_string);
@@ -133,9 +124,6 @@ private:
bool _fill_tree(EditorFileSystemDirectory *p_dir, TreeItem *p_item, Ref<EditorExportPreset> &current, bool p_only_scenes);
void _tree_changed();
- void _patch_button_pressed(Object *p_item, int p_column, int p_id);
- void _patch_edited();
-
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);
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index fa2270dcd6..c4e90ca3ff 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -2107,8 +2107,12 @@ void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_prop
}
if (E->get().name == "__meta__") {
- if (Object::cast_to<CanvasItem>(newnode)) {
- Dictionary metadata = n->get(E->get().name);
+ Dictionary metadata = n->get(E->get().name);
+ if (metadata.has("_editor_description_")) {
+ newnode->set_meta("_editor_description_", metadata["_editor_description_"]);
+ }
+
+ if (Object::cast_to<CanvasItem>(newnode) || Object::cast_to<Node3D>(newnode)) {
if (metadata.has("_edit_group_") && metadata["_edit_group_"]) {
newnode->set_meta("_edit_group_", true);
}