Added confirmation dialog for making subresources unique.
This commit is contained in:
parent
13eff7de69
commit
7249d2555b
@ -30,11 +30,22 @@
|
|||||||
|
|
||||||
#include "inspector_dock.h"
|
#include "inspector_dock.h"
|
||||||
|
|
||||||
#include "editor/editor_node.h"
|
#include "editor/editor_scale.h"
|
||||||
#include "editor/editor_settings.h"
|
|
||||||
#include "editor/plugins/animation_player_editor_plugin.h"
|
#include "editor/plugins/animation_player_editor_plugin.h"
|
||||||
|
|
||||||
void InspectorDock::_menu_option(int p_option) {
|
void InspectorDock::_menu_option(int p_option) {
|
||||||
|
_menu_option_confirm(p_option, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InspectorDock::_menu_confirm_current() {
|
||||||
|
_menu_option_confirm(current_option, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InspectorDock::_menu_option_confirm(int p_option, bool p_confirmed) {
|
||||||
|
if (!p_confirmed) {
|
||||||
|
current_option = p_option;
|
||||||
|
}
|
||||||
|
|
||||||
switch (p_option) {
|
switch (p_option) {
|
||||||
case EXPAND_ALL: {
|
case EXPAND_ALL: {
|
||||||
_menu_expandall();
|
_menu_expandall();
|
||||||
@ -82,40 +93,82 @@ void InspectorDock::_menu_option(int p_option) {
|
|||||||
} break;
|
} break;
|
||||||
|
|
||||||
case OBJECT_UNIQUE_RESOURCES: {
|
case OBJECT_UNIQUE_RESOURCES: {
|
||||||
editor_data->apply_changes_in_editors();
|
if (!p_confirmed) {
|
||||||
if (current) {
|
Vector<String> resource_propnames;
|
||||||
List<PropertyInfo> props;
|
|
||||||
current->get_property_list(&props);
|
if (current) {
|
||||||
Map<RES, RES> duplicates;
|
List<PropertyInfo> props;
|
||||||
for (const PropertyInfo &E : props) {
|
current->get_property_list(&props);
|
||||||
if (!(E.usage & PROPERTY_USAGE_STORAGE)) {
|
|
||||||
continue;
|
for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) {
|
||||||
|
if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant v = current->get(E->get().name);
|
||||||
|
REF ref = v;
|
||||||
|
RES res = ref;
|
||||||
|
if (v.is_ref() && ref.is_valid() && res.is_valid()) {
|
||||||
|
// Valid resource which would be duplicated if action is confirmed.
|
||||||
|
resource_propnames.append(E->get().name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resource_propnames.size()) {
|
||||||
|
unique_resources_list_tree->clear();
|
||||||
|
TreeItem *root = unique_resources_list_tree->create_item();
|
||||||
|
|
||||||
|
for (int i = 0; i < resource_propnames.size(); i++) {
|
||||||
|
String propname = resource_propnames[i].replace("/", " / ");
|
||||||
|
|
||||||
|
TreeItem *ti = unique_resources_list_tree->create_item(root);
|
||||||
|
ti->set_text(0, bool(EDITOR_GET("interface/inspector/capitalize_properties")) ? propname.capitalize() : propname);
|
||||||
}
|
}
|
||||||
|
|
||||||
Variant v = current->get(E.name);
|
unique_resources_confirmation->popup_centered();
|
||||||
if (v.is_ref()) {
|
} else {
|
||||||
REF ref = v;
|
unique_resources_confirmation->set_text(TTR("This object has no resources."));
|
||||||
if (ref.is_valid()) {
|
current_option = -1;
|
||||||
RES res = ref;
|
unique_resources_confirmation->popup_centered();
|
||||||
if (res.is_valid()) {
|
}
|
||||||
if (!duplicates.has(res)) {
|
} else {
|
||||||
duplicates[res] = res->duplicate();
|
editor_data->apply_changes_in_editors();
|
||||||
}
|
|
||||||
res = duplicates[res];
|
|
||||||
|
|
||||||
current->set(E.name, res);
|
if (current) {
|
||||||
editor->get_inspector()->update_property(E.name);
|
List<PropertyInfo> props;
|
||||||
|
current->get_property_list(&props);
|
||||||
|
Map<RES, RES> duplicates;
|
||||||
|
for (const PropertyInfo &prop_info : props) {
|
||||||
|
if (!(prop_info.usage & PROPERTY_USAGE_STORAGE)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant v = current->get(prop_info.name);
|
||||||
|
if (v.is_ref()) {
|
||||||
|
REF ref = v;
|
||||||
|
if (ref.is_valid()) {
|
||||||
|
RES res = ref;
|
||||||
|
if (res.is_valid()) {
|
||||||
|
if (!duplicates.has(res)) {
|
||||||
|
duplicates[res] = res->duplicate();
|
||||||
|
}
|
||||||
|
res = duplicates[res];
|
||||||
|
|
||||||
|
current->set(prop_info.name, res);
|
||||||
|
editor->get_inspector()->update_property(prop_info.name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editor_data->get_undo_redo().clear_history();
|
||||||
|
|
||||||
|
editor->get_editor_plugins_over()->edit(nullptr);
|
||||||
|
editor->get_editor_plugins_over()->edit(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
editor_data->get_undo_redo().clear_history();
|
|
||||||
|
|
||||||
editor->get_editor_plugins_over()->edit(nullptr);
|
|
||||||
editor->get_editor_plugins_over()->edit(current);
|
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
@ -619,6 +672,29 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
|
|||||||
warning->hide();
|
warning->hide();
|
||||||
warning->connect("pressed", callable_mp(this, &InspectorDock::_warning_pressed));
|
warning->connect("pressed", callable_mp(this, &InspectorDock::_warning_pressed));
|
||||||
|
|
||||||
|
unique_resources_confirmation = memnew(ConfirmationDialog);
|
||||||
|
add_child(unique_resources_confirmation);
|
||||||
|
|
||||||
|
VBoxContainer *container = memnew(VBoxContainer);
|
||||||
|
unique_resources_confirmation->add_child(container);
|
||||||
|
|
||||||
|
Label *top_label = memnew(Label);
|
||||||
|
top_label->set_text(TTR("The following resources will be duplicated and embedded within this resource/object."));
|
||||||
|
container->add_child(top_label);
|
||||||
|
|
||||||
|
unique_resources_list_tree = memnew(Tree);
|
||||||
|
unique_resources_list_tree->set_hide_root(true);
|
||||||
|
unique_resources_list_tree->set_columns(1);
|
||||||
|
unique_resources_list_tree->set_column_title(0, TTR("Property"));
|
||||||
|
unique_resources_list_tree->set_custom_minimum_size(Size2(0, 200 * EDSCALE));
|
||||||
|
container->add_child(unique_resources_list_tree);
|
||||||
|
|
||||||
|
Label *bottom_label = memnew(Label);
|
||||||
|
bottom_label->set_text(TTR("This cannot be undone. Are you sure?"));
|
||||||
|
container->add_child(bottom_label);
|
||||||
|
|
||||||
|
unique_resources_confirmation->connect("confirmed", callable_mp(this, &InspectorDock::_menu_confirm_current));
|
||||||
|
|
||||||
warning_dialog = memnew(AcceptDialog);
|
warning_dialog = memnew(AcceptDialog);
|
||||||
editor->get_gui_base()->add_child(warning_dialog);
|
editor->get_gui_base()->add_child(warning_dialog);
|
||||||
|
|
||||||
|
@ -40,8 +40,6 @@
|
|||||||
#include "scene/gui/box_container.h"
|
#include "scene/gui/box_container.h"
|
||||||
#include "scene/gui/button.h"
|
#include "scene/gui/button.h"
|
||||||
#include "scene/gui/control.h"
|
#include "scene/gui/control.h"
|
||||||
#include "scene/gui/label.h"
|
|
||||||
#include "scene/gui/popup_menu.h"
|
|
||||||
|
|
||||||
class EditorNode;
|
class EditorNode;
|
||||||
|
|
||||||
@ -92,7 +90,13 @@ class InspectorDock : public VBoxContainer {
|
|||||||
Button *warning;
|
Button *warning;
|
||||||
AcceptDialog *warning_dialog;
|
AcceptDialog *warning_dialog;
|
||||||
|
|
||||||
|
int current_option = -1;
|
||||||
|
ConfirmationDialog *unique_resources_confirmation;
|
||||||
|
Tree *unique_resources_list_tree;
|
||||||
|
|
||||||
void _menu_option(int p_option);
|
void _menu_option(int p_option);
|
||||||
|
void _menu_confirm_current();
|
||||||
|
void _menu_option_confirm(int p_option, bool p_confirmed);
|
||||||
|
|
||||||
void _new_resource();
|
void _new_resource();
|
||||||
void _load_resource(const String &p_type = "");
|
void _load_resource(const String &p_type = "");
|
||||||
|
Loading…
Reference in New Issue
Block a user