Skip to content

Commit

Permalink
Merge pull request godotengine#88455 from akien-mga/revert-68420-get_…
Browse files Browse the repository at this point in the history
…configuration_warnings-compat-breakage

Revert godotengine#68420 to undo `get_configuration_warnings` compat breakage
  • Loading branch information
akien-mga committed Feb 17, 2024
2 parents 859a3da + 92fcbe2 commit feaa6ce
Show file tree
Hide file tree
Showing 141 changed files with 265 additions and 529 deletions.
3 changes: 0 additions & 3 deletions doc/classes/EditorProperty.xml
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,6 @@
<member name="checked" type="bool" setter="set_checked" getter="is_checked" default="false">
Used by the inspector, set to [code]true[/code] when the property is checked.
</member>
<member name="configuration_warning" type="String" setter="set_configuration_warning" getter="get_configuration_warning" default="&quot;&quot;">
Used by the inspector, set to show a configuration warning on the property.
</member>
<member name="deletable" type="bool" setter="set_deletable" getter="is_deletable" default="false">
Used by the inspector, set to [code]true[/code] when the property can be deleted by the user.
</member>
Expand Down
6 changes: 1 addition & 5 deletions doc/classes/Node.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,9 @@
</description>
</method>
<method name="_get_configuration_warnings" qualifiers="virtual const">
<return type="Array" />
<return type="PackedStringArray" />
<description>
The elements in the array returned from this method are displayed as warnings in the Scene dock if the script that overrides it is a [code]tool[/code] script.
Each array element must either be a [String] or a [Dictionary].
A dictionary element must contain a key [code]message[/code] of type [String] which is shown in the user interface.
The dictionary may optionally contain a key [code]property[/code] of type [NodePath], which also shows this warning in the inspector on the corresponding property.
If a string is found in the returned array, it is converted to an equivalent dictionary with the [code]message[/code] field set.
Returning an empty array produces no warnings.
Call [method update_configuration_warnings] when the warnings need to be updated for this node.
[codeblock]
Expand Down
139 changes: 0 additions & 139 deletions editor/editor_inspector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -214,22 +214,6 @@ void EditorProperty::_notification(int p_what) {
text_size -= close->get_width() + 4 * EDSCALE;
}
}

if (!configuration_warning.is_empty() && !read_only) {
Ref<Texture2D> warning;

warning = get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons"));

rect.size.x -= warning->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree"));

if (is_layout_rtl()) {
rect.position.x += warning->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree"));
}

if (no_children) {
text_size -= warning->get_width() + 4 * EDSCALE;
}
}
}

//set children
Expand Down Expand Up @@ -415,38 +399,6 @@ void EditorProperty::_notification(int p_what) {
} else {
delete_rect = Rect2();
}

if (!configuration_warning.is_empty() && !read_only) {
Ref<Texture2D> warning;

StringName warning_icon;
Node *node = Object::cast_to<Node>(object);
if (node) {
const int warning_num = node->get_configuration_warnings_of_property(property_path).size();
warning_icon = Node::get_configuration_warning_icon(warning_num);
} else {
// This shouldn't happen, but let's not crash over an icon.
warning_icon = "NodeWarning";
}
warning = get_theme_icon(warning_icon, SNAME("EditorIcons"));

ofs -= warning->get_width() + get_theme_constant(SNAME("hseparator"), SNAME("Tree"));

Color color2(1, 1, 1);
if (configuration_warning_hover) {
color2.r *= 1.2;
color2.g *= 1.2;
color2.b *= 1.2;
}
configuration_warning_rect = Rect2(ofs, ((size.height - warning->get_height()) / 2), warning->get_width(), warning->get_height());
if (rtl) {
draw_texture(warning, Vector2(size.width - configuration_warning_rect.position.x - warning->get_width(), configuration_warning_rect.position.y), color2);
} else {
draw_texture(warning, configuration_warning_rect.position, color2);
}
} else {
configuration_warning_rect = Rect2();
}
} break;
}
}
Expand Down Expand Up @@ -722,12 +674,6 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) {
check_hover = new_check_hover;
queue_redraw();
}

bool new_configuration_warning_hover = configuration_warning_rect.has_point(mpos) && !button_left;
if (new_configuration_warning_hover != configuration_warning_hover) {
configuration_warning_hover = new_configuration_warning_hover;
queue_redraw();
}
}

Ref<InputEventMouseButton> mb = p_event;
Expand Down Expand Up @@ -784,16 +730,6 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) {
queue_redraw();
emit_signal(SNAME("property_checked"), property, checked);
}

if (configuration_warning_rect.has_point(mpos)) {
if (warning_dialog == nullptr) {
warning_dialog = memnew(AcceptDialog);
add_child(warning_dialog);
warning_dialog->set_title(TTR("Node Configuration Warning!"));
}
warning_dialog->set_text(configuration_warning);
warning_dialog->popup_centered();
}
} else if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
accept_event();
_update_popup();
Expand Down Expand Up @@ -919,16 +855,6 @@ float EditorProperty::get_name_split_ratio() const {
return split_ratio;
}

void EditorProperty::set_configuration_warning(const String &p_configuration_warning) {
configuration_warning = p_configuration_warning;
queue_redraw();
queue_sort();
}

String EditorProperty::get_configuration_warning() const {
return configuration_warning;
}

void EditorProperty::set_object_and_property(Object *p_object, const StringName &p_property) {
object = p_object;
property = p_property;
Expand Down Expand Up @@ -985,15 +911,6 @@ void EditorProperty::_update_pin_flags() {
}
}

void EditorProperty::_update_configuration_warnings() {
Node *node = Object::cast_to<Node>(object);
if (node) {
const PackedStringArray warnings = node->get_configuration_warnings_as_strings(true, property_path);
const String warning_lines = String("\n").join(warnings);
set_configuration_warning(warning_lines);
}
}

Control *EditorProperty::make_custom_tooltip(const String &p_text) const {
EditorHelpBit *tooltip = nullptr;

Expand Down Expand Up @@ -1069,9 +986,6 @@ void EditorProperty::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_deletable", "deletable"), &EditorProperty::set_deletable);
ClassDB::bind_method(D_METHOD("is_deletable"), &EditorProperty::is_deletable);

ClassDB::bind_method(D_METHOD("set_configuration_warning", "configuration_warning"), &EditorProperty::set_configuration_warning);
ClassDB::bind_method(D_METHOD("get_configuration_warning"), &EditorProperty::get_configuration_warning);

ClassDB::bind_method(D_METHOD("get_edited_property"), &EditorProperty::get_edited_property);
ClassDB::bind_method(D_METHOD("get_edited_object"), &EditorProperty::get_edited_object);

Expand All @@ -1089,7 +1003,6 @@ void EditorProperty::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "draw_warning"), "set_draw_warning", "is_draw_warning");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keying"), "set_keying", "is_keying");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "deletable"), "set_deletable", "is_deletable");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "configuration_warning"), "set_configuration_warning", "get_configuration_warning");

ADD_SIGNAL(MethodInfo("property_changed", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT), PropertyInfo(Variant::STRING_NAME, "field"), PropertyInfo(Variant::BOOL, "changing")));
ADD_SIGNAL(MethodInfo("multiple_properties_changed", PropertyInfo(Variant::PACKED_STRING_ARRAY, "properties"), PropertyInfo(Variant::ARRAY, "value")));
Expand Down Expand Up @@ -3409,7 +3322,6 @@ void EditorInspector::update_tree() {
ep->set_keying(keying);
ep->set_read_only(property_read_only || all_read_only);
ep->set_deletable(deletable_properties || p.name.begins_with("metadata/"));
ep->_update_configuration_warnings();
}

current_vbox->add_child(editors[i].property_editor);
Expand Down Expand Up @@ -3535,9 +3447,6 @@ void EditorInspector::edit(Object *p_object) {

object = p_object;

property_configuration_warnings.clear();
_update_configuration_warnings();

if (object) {
update_scroll_request = 0; //reset
if (scroll_cache.has(object->get_instance_id())) { //if exists, set something else
Expand Down Expand Up @@ -4059,52 +3968,6 @@ void EditorInspector::_node_removed(Node *p_node) {
}
}

void EditorInspector::_warning_changed(Node *p_node) {
if (p_node == object) {
// Only update the tree if the list of configuration warnings has changed.
if (_update_configuration_warnings()) {
update_tree_pending = true;
}
}
}

bool EditorInspector::_update_configuration_warnings() {
Node *node = Object::cast_to<Node>(object);
if (!node) {
return false;
}

bool changed = false;
LocalVector<int> found_warning_indices;

// New and changed warnings.
Vector<Dictionary> warnings = node->get_configuration_warnings_as_dicts();
for (const Dictionary &warning : warnings) {
if (!warning.has("property")) {
continue;
}

int found_warning_index = property_configuration_warnings.find(warning);
if (found_warning_index < 0) {
found_warning_index = property_configuration_warnings.size();
property_configuration_warnings.push_back(warning);
changed = true;
}
found_warning_indices.push_back(found_warning_index);
}

// Removed warnings.
for (uint32_t i = 0; i < property_configuration_warnings.size(); i++) {
if (found_warning_indices.find(i) < 0) {
property_configuration_warnings.remove_at(i);
i--;
changed = true;
}
}

return changed;
}

void EditorInspector::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_READY: {
Expand All @@ -4116,7 +3979,6 @@ void EditorInspector::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE: {
if (!sub_inspector) {
get_tree()->connect("node_removed", callable_mp(this, &EditorInspector::_node_removed));
get_tree()->connect("node_configuration_warning_changed", callable_mp(this, &EditorInspector::_warning_changed));
}
} break;

Expand All @@ -4127,7 +3989,6 @@ void EditorInspector::_notification(int p_what) {
case NOTIFICATION_EXIT_TREE: {
if (!sub_inspector) {
get_tree()->disconnect("node_removed", callable_mp(this, &EditorInspector::_node_removed));
get_tree()->disconnect("node_configuration_warning_changed", callable_mp(this, &EditorInspector::_warning_changed));
}
edit(nullptr);
} break;
Expand Down
12 changes: 0 additions & 12 deletions editor/editor_inspector.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ class EditorProperty : public Container {
String doc_path;
bool internal = false;
bool has_doc_tooltip = false;
AcceptDialog *warning_dialog = nullptr;

int property_usage;

Expand All @@ -99,8 +98,6 @@ class EditorProperty : public Container {
bool check_hover = false;
Rect2 delete_rect;
bool delete_hover = false;
Rect2 configuration_warning_rect;
bool configuration_warning_hover = false;

bool can_revert = false;
bool can_pin = false;
Expand All @@ -124,15 +121,12 @@ class EditorProperty : public Container {
Control *bottom_editor = nullptr;
PopupMenu *menu = nullptr;

String configuration_warning;

HashMap<StringName, Variant> cache;

GDVIRTUAL0(_update_property)
GDVIRTUAL1(_set_read_only, bool)

void _update_pin_flags();
void _update_configuration_warnings();

protected:
void _notification(int p_what);
Expand Down Expand Up @@ -209,9 +203,6 @@ class EditorProperty : public Container {
void set_name_split_ratio(float p_ratio);
float get_name_split_ratio() const;

void set_configuration_warning(const String &p_configuration_warning);
String get_configuration_warning() const;

void set_object_and_property(Object *p_object, const StringName &p_property);
virtual Control *make_custom_tooltip(const String &p_text) const override;

Expand Down Expand Up @@ -514,7 +505,6 @@ class EditorInspector : public ScrollContainer {
int property_focusable;
int update_scroll_request;

LocalVector<Dictionary> property_configuration_warnings;
HashMap<StringName, HashMap<StringName, String>> doc_path_cache;
HashSet<StringName> restart_request_props;
HashMap<String, String> custom_property_descriptions;
Expand Down Expand Up @@ -543,8 +533,6 @@ class EditorInspector : public ScrollContainer {
void _object_id_selected(const String &p_path, ObjectID p_id);

void _node_removed(Node *p_node);
void _warning_changed(Node *p_node);
bool _update_configuration_warnings();

HashMap<StringName, int> per_array_page;
void _page_change_request(int p_new_page, const StringName &p_array_prefix);
Expand Down
50 changes: 43 additions & 7 deletions editor/gui/scene_tree_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,32 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
}
undo_redo->commit_action();
} else if (p_id == BUTTON_WARNING) {
const PackedStringArray warnings = n->get_configuration_warnings_as_strings(true);
const PackedStringArray warnings = n->get_configuration_warnings();

if (warnings.is_empty()) {
return;
}

const String warning_lines = String("\n").join(warnings);
warning->set_text(warning_lines);
// Improve looks on tooltip, extra spacing on non-bullet point newlines.
const String bullet_point = U"";
String all_warnings;
for (const String &w : warnings) {
all_warnings += "\n" + bullet_point + w;
}

// Limit the line width while keeping some padding.
// It is not efficient, but it does not have to be.
const PackedInt32Array boundaries = TS->string_get_word_breaks(all_warnings, "", 80);
PackedStringArray lines;
for (int i = 0; i < boundaries.size(); i += 2) {
const int start = boundaries[i];
const int end = boundaries[i + 1];
const String line = all_warnings.substr(start, end - start);
lines.append(line);
}
all_warnings = String("\n").join(lines).indent(" ").replace(U"", U"\n").substr(2); // We don't want the first two newlines.

warning->set_text(all_warnings);
warning->popup_centered();

} else if (p_id == BUTTON_SIGNALS) {
Expand Down Expand Up @@ -275,12 +294,29 @@ void SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {

if (can_rename) { //should be can edit..

const PackedStringArray warnings = p_node->get_configuration_warnings_as_strings(false);
const PackedStringArray warnings = p_node->get_configuration_warnings();
const int num_warnings = warnings.size();
if (num_warnings > 0) {
const StringName warning_icon = Node::get_configuration_warning_icon(num_warnings);
const String warning_lines = String("\n\n").join(warnings);
item->add_button(0, get_editor_theme_icon(warning_icon), BUTTON_WARNING, false, TTR("Node configuration warning:") + "\n\n" + warning_lines);
String warning_icon;
if (num_warnings == 1) {
warning_icon = SNAME("NodeWarning");
} else if (num_warnings <= 3) {
warning_icon = vformat("NodeWarnings%d", num_warnings);
} else {
warning_icon = SNAME("NodeWarnings4Plus");
}

// Improve looks on tooltip, extra spacing on non-bullet point newlines.
const String bullet_point = U"";
String all_warnings;
for (const String &w : warnings) {
all_warnings += "\n\n" + bullet_point + w.replace("\n", "\n ");
}
if (num_warnings == 1) {
all_warnings.remove_at(0); // With only one warning, two newlines do not look great.
}

item->add_button(0, get_editor_theme_icon(warning_icon), BUTTON_WARNING, false, TTR("Node configuration warning:") + all_warnings);
}

if (p_node->is_unique_name_in_owner()) {
Expand Down
7 changes: 0 additions & 7 deletions misc/extension_api_validation/4.2-stable.expected
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,6 @@ Validate extension JSON: Error: Field 'classes/Sky/properties/sky_material': typ
Property hints reordered to improve editor usability. The types allowed are still the same as before. No adjustments should be necessary.


GH-68420
--------
Validate extension JSON: Error: Field 'classes/Node/methods/_get_configuration_warnings/return_value': type changed value in new API, from "PackedStringArray" to "Array".

Allow configuration warnings to refer to a property. Compatibility method registered.


GH-86907
--------

Expand Down
Loading

0 comments on commit feaa6ce

Please sign in to comment.