Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/editor/import/import_defaults_editor.cpp
9896 views
1
/**************************************************************************/
2
/* import_defaults_editor.cpp */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#include "import_defaults_editor.h"
32
33
#include "core/config/project_settings.h"
34
#include "core/io/resource_importer.h"
35
#include "editor/inspector/editor_inspector.h"
36
#include "editor/inspector/editor_sectioned_inspector.h"
37
#include "editor/settings/action_map_editor.h"
38
#include "scene/gui/center_container.h"
39
#include "scene/gui/label.h"
40
41
class ImportDefaultsEditorSettings : public Object {
42
GDCLASS(ImportDefaultsEditorSettings, Object)
43
friend class ImportDefaultsEditor;
44
List<PropertyInfo> properties;
45
HashMap<StringName, Variant> values;
46
HashMap<StringName, Variant> default_values;
47
48
Ref<ResourceImporter> importer;
49
50
protected:
51
bool _set(const StringName &p_name, const Variant &p_value) {
52
if (values.has(p_name)) {
53
values[p_name] = p_value;
54
return true;
55
} else {
56
return false;
57
}
58
}
59
bool _get(const StringName &p_name, Variant &r_ret) const {
60
if (values.has(p_name)) {
61
r_ret = values[p_name];
62
return true;
63
} else {
64
r_ret = Variant();
65
return false;
66
}
67
}
68
void _get_property_list(List<PropertyInfo> *p_list) const {
69
if (importer.is_null()) {
70
return;
71
}
72
for (const PropertyInfo &E : properties) {
73
if (importer->get_option_visibility("", E.name, values)) {
74
p_list->push_back(E);
75
}
76
}
77
}
78
};
79
80
void ImportDefaultsEditor::_notification(int p_what) {
81
switch (p_what) {
82
case NOTIFICATION_PREDELETE: {
83
inspector->edit(nullptr);
84
} break;
85
}
86
}
87
88
void ImportDefaultsEditor::_reset() {
89
if (settings->importer.is_valid()) {
90
settings->values = settings->default_values;
91
settings->notify_property_list_changed();
92
}
93
}
94
95
void ImportDefaultsEditor::_save() {
96
if (settings->importer.is_valid()) {
97
Dictionary modified;
98
99
for (const KeyValue<StringName, Variant> &E : settings->values) {
100
if (E.value != settings->default_values[E.key]) {
101
modified[E.key] = E.value;
102
}
103
}
104
105
if (modified.size()) {
106
ProjectSettings::get_singleton()->set("importer_defaults/" + settings->importer->get_importer_name(), modified);
107
} else {
108
ProjectSettings::get_singleton()->set("importer_defaults/" + settings->importer->get_importer_name(), Variant());
109
}
110
ProjectSettings::get_singleton()->save();
111
}
112
}
113
114
void ImportDefaultsEditor::_update_importer() {
115
List<Ref<ResourceImporter>> importer_list;
116
ResourceFormatImporter::get_singleton()->get_importers(&importer_list);
117
Ref<ResourceImporter> importer;
118
for (const Ref<ResourceImporter> &E : importer_list) {
119
if (E->get_visible_name() == importers->get_item_text(importers->get_selected())) {
120
importer = E;
121
break;
122
}
123
}
124
125
settings->properties.clear();
126
settings->values.clear();
127
settings->importer = importer;
128
129
if (importer.is_valid()) {
130
List<ResourceImporter::ImportOption> options;
131
importer->get_import_options("", &options);
132
Dictionary d;
133
if (ProjectSettings::get_singleton()->has_setting("importer_defaults/" + importer->get_importer_name())) {
134
d = GLOBAL_GET("importer_defaults/" + importer->get_importer_name());
135
}
136
137
for (const ResourceImporter::ImportOption &E : options) {
138
settings->properties.push_back(E.option);
139
if (d.has(E.option.name)) {
140
settings->values[E.option.name] = d[E.option.name];
141
} else {
142
settings->values[E.option.name] = E.default_value;
143
}
144
settings->default_values[E.option.name] = E.default_value;
145
}
146
147
save_defaults->set_disabled(false);
148
reset_defaults->set_disabled(false);
149
150
} else {
151
save_defaults->set_disabled(true);
152
reset_defaults->set_disabled(true);
153
}
154
155
settings->notify_property_list_changed();
156
157
// Set the importer class to fetch the correct class in the XML class reference.
158
// This allows tooltips to display when hovering properties.
159
inspector->set_object_class(importer->get_class_name());
160
inspector->edit(settings);
161
}
162
163
void ImportDefaultsEditor::_importer_selected(int p_index) {
164
_update_importer();
165
}
166
167
void ImportDefaultsEditor::clear() {
168
String last_selected;
169
170
if (importers->get_selected() >= 0) {
171
last_selected = importers->get_item_text(importers->get_selected());
172
}
173
174
importers->clear();
175
176
List<Ref<ResourceImporter>> importer_list;
177
ResourceFormatImporter::get_singleton()->get_importers(&importer_list);
178
Vector<String> names;
179
for (const Ref<ResourceImporter> &E : importer_list) {
180
String vn = E->get_visible_name();
181
names.push_back(vn);
182
}
183
names.sort();
184
185
// `last_selected.is_empty()` means it's the first time being called.
186
if (last_selected.is_empty() && !names.is_empty()) {
187
last_selected = names[0];
188
}
189
190
for (int i = 0; i < names.size(); i++) {
191
importers->add_item(names[i]);
192
193
if (names[i] == last_selected) {
194
importers->select(i);
195
_update_importer();
196
}
197
}
198
}
199
200
ImportDefaultsEditor::ImportDefaultsEditor() {
201
ProjectSettings::get_singleton()->add_hidden_prefix("importer_defaults/");
202
203
HBoxContainer *hb = memnew(HBoxContainer);
204
hb->add_child(memnew(Label(TTRC("Importer:"))));
205
importers = memnew(OptionButton);
206
hb->add_child(importers);
207
hb->add_spacer();
208
importers->connect(SceneStringName(item_selected), callable_mp(this, &ImportDefaultsEditor::_importer_selected));
209
reset_defaults = memnew(Button);
210
reset_defaults->set_text(TTRC("Reset to Defaults"));
211
reset_defaults->set_disabled(true);
212
reset_defaults->connect(SceneStringName(pressed), callable_mp(this, &ImportDefaultsEditor::_reset));
213
hb->add_child(reset_defaults);
214
add_child(hb);
215
216
inspector = memnew(EditorInspector);
217
add_child(inspector);
218
inspector->set_v_size_flags(SIZE_EXPAND_FILL);
219
// Make it possible to display tooltips stored in the XML class reference.
220
// The object name is set when the importer changes in `_update_importer()`.
221
inspector->set_use_doc_hints(true);
222
223
CenterContainer *cc = memnew(CenterContainer);
224
save_defaults = memnew(Button);
225
save_defaults->set_text(TTRC("Save"));
226
save_defaults->connect(SceneStringName(pressed), callable_mp(this, &ImportDefaultsEditor::_save));
227
cc->add_child(save_defaults);
228
add_child(cc);
229
230
settings = memnew(ImportDefaultsEditorSettings);
231
}
232
233
ImportDefaultsEditor::~ImportDefaultsEditor() {
234
memdelete(settings);
235
}
236
237