1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-04 17:04:49 +00:00

Improve editor settings override display

This commit is contained in:
kobewi
2025-06-20 15:07:07 +02:00
parent 5d721538b7
commit 29148d71e7
3 changed files with 64 additions and 45 deletions

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".6" stroke-width="2" d="M 11,11 H 4 V 4"/></svg>

After

Width:  |  Height:  |  Size: 207 B

View File

@@ -1028,6 +1028,41 @@ EditorSettingsDialog::EditorSettingsDialog() {
EditorInspector::add_inspector_plugin(plugin); EditorInspector::add_inspector_plugin(plugin);
} }
void EditorSettingsPropertyWrapper::_setup_override_info() {
override_container = memnew(HBoxContainer);
override_icon = memnew(TextureRect);
override_icon->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
override_container->add_child(override_icon);
Variant::Type type = ProjectSettings::get_singleton()->get_editor_setting_override(property).get_type();
override_editor_property = get_parent_inspector()->instantiate_property_editor(ProjectSettings::get_singleton(), type, ProjectSettings::EDITOR_SETTING_OVERRIDE_PREFIX + property, hint, hint_text, usage);
override_editor_property->set_object_and_property(ProjectSettings::get_singleton(), ProjectSettings::EDITOR_SETTING_OVERRIDE_PREFIX + property);
override_editor_property->set_read_only(true);
override_editor_property->set_label(TTR("Overridden in project"));
override_editor_property->set_h_size_flags(SIZE_EXPAND_FILL);
override_container->add_child(override_editor_property);
goto_button = memnew(Button);
goto_button->set_tooltip_text(TTRC("Go to the override in the Project Settings."));
override_container->add_child(goto_button);
if (EditorNode::get_singleton()) {
goto_button->connect(SceneStringName(pressed), callable_mp(EditorNode::get_singleton(), &EditorNode::open_setting_override).bind(property), CONNECT_DEFERRED);
}
remove_button = memnew(Button);
remove_button->set_tooltip_text(TTRC("Remove this override."));
override_container->add_child(remove_button);
remove_button->connect(SceneStringName(pressed), callable_mp(this, &EditorSettingsPropertyWrapper::_remove_override));
add_child(override_container);
if (is_ready()) {
// Setup icons.
_notification(NOTIFICATION_THEME_CHANGED);
}
}
void EditorSettingsPropertyWrapper::_update_override() { void EditorSettingsPropertyWrapper::_update_override() {
// Don't allow overriding theme properties, because it causes problems. Overriding Project Manager settings makes no sense. // Don't allow overriding theme properties, because it causes problems. Overriding Project Manager settings makes no sense.
// TODO: Find a better way to define exception prefixes (if the list happens to grow). // TODO: Find a better way to define exception prefixes (if the list happens to grow).
@@ -1038,12 +1073,16 @@ void EditorSettingsPropertyWrapper::_update_override() {
const bool has_override = ProjectSettings::get_singleton()->is_project_loaded() && ProjectSettings::get_singleton()->has_editor_setting_override(property); const bool has_override = ProjectSettings::get_singleton()->is_project_loaded() && ProjectSettings::get_singleton()->has_editor_setting_override(property);
if (has_override) { if (has_override) {
const Variant override_value = EDITOR_GET(property); if (!override_container) {
override_label->set_text(vformat(TTR("Overridden in project: %s"), override_value)); _setup_override_info();
// In case the text is too long and trimmed. }
override_label->set_tooltip_text(override_value); override_editor_property->update_property();
set_bottom_editor(override_container);
override_container->show();
} else if (override_container) {
override_container->hide();
set_bottom_editor(nullptr);
} }
override_info->set_visible(has_override);
can_override = !has_override; can_override = !has_override;
} }
@@ -1060,13 +1099,14 @@ void EditorSettingsPropertyWrapper::_remove_override() {
EditorNode::get_singleton()->notify_settings_overrides_changed(); EditorNode::get_singleton()->notify_settings_overrides_changed();
_update_override(); _update_override();
if (requires_restart) { if (usage & PROPERTY_USAGE_RESTART_IF_CHANGED) {
restart_request_callback.call(); restart_request_callback.call();
} }
} }
void EditorSettingsPropertyWrapper::_notification(int p_what) { void EditorSettingsPropertyWrapper::_notification(int p_what) {
if (p_what == NOTIFICATION_THEME_CHANGED) { if (override_container && p_what == NOTIFICATION_THEME_CHANGED) {
override_icon->set_texture(get_editor_theme_icon(SNAME("Hierarchy")));
goto_button->set_button_icon(get_editor_theme_icon(SNAME("MethodOverride"))); goto_button->set_button_icon(get_editor_theme_icon(SNAME("MethodOverride")));
remove_button->set_button_icon(get_editor_theme_icon(SNAME("Close"))); remove_button->set_button_icon(get_editor_theme_icon(SNAME("Close")));
} }
@@ -1076,40 +1116,15 @@ void EditorSettingsPropertyWrapper::update_property() {
editor_property->update_property(); editor_property->update_property();
} }
void EditorSettingsPropertyWrapper::setup(const String &p_property, EditorProperty *p_editor_property, bool p_requires_restart) { void EditorSettingsPropertyWrapper::setup(const String &p_property, EditorProperty *p_editor_property, PropertyHint p_hint, const String &p_hint_text, uint32_t p_usage) {
requires_restart = p_requires_restart; hint = p_hint;
hint_text = p_hint_text;
usage = p_usage;
property = p_property; property = p_property;
container = memnew(VBoxContainer);
editor_property = p_editor_property; editor_property = p_editor_property;
editor_property->set_h_size_flags(SIZE_EXPAND_FILL); add_child(editor_property);
container->add_child(editor_property);
override_info = memnew(HBoxContainer);
override_info->hide();
container->add_child(override_info);
override_label = memnew(Label);
override_label->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
override_label->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
override_label->set_mouse_filter(MOUSE_FILTER_STOP); // For tooltip.
override_label->set_h_size_flags(SIZE_EXPAND_FILL);
override_info->add_child(override_label);
goto_button = memnew(Button);
goto_button->set_tooltip_text(TTRC("Go to the override in the Project Settings."));
override_info->add_child(goto_button);
if (EditorNode::get_singleton()) {
goto_button->connect(SceneStringName(pressed), callable_mp(EditorNode::get_singleton(), &EditorNode::open_setting_override).bind(property), CONNECT_DEFERRED);
}
remove_button = memnew(Button);
remove_button->set_tooltip_text(TTRC("Remove this override."));
override_info->add_child(remove_button);
remove_button->connect(SceneStringName(pressed), callable_mp(this, &EditorSettingsPropertyWrapper::_remove_override));
add_child(container);
_update_override(); _update_override();
connect(SNAME("property_overridden"), callable_mp(this, &EditorSettingsPropertyWrapper::_create_override)); connect(SNAME("property_overridden"), callable_mp(this, &EditorSettingsPropertyWrapper::_create_override));
@@ -1134,8 +1149,9 @@ bool EditorSettingsInspectorPlugin::parse_property(Object *p_object, const Varia
EditorSettingsPropertyWrapper *editor = memnew(EditorSettingsPropertyWrapper); EditorSettingsPropertyWrapper *editor = memnew(EditorSettingsPropertyWrapper);
EditorProperty *real_property = inspector->get_inspector()->instantiate_property_editor(p_object, p_type, p_path, p_hint, p_hint_text, p_usage, p_wide); EditorProperty *real_property = inspector->get_inspector()->instantiate_property_editor(p_object, p_type, p_path, p_hint, p_hint_text, p_usage, p_wide);
real_property->set_object_and_property(p_object, p_path); real_property->set_object_and_property(p_object, p_path);
real_property->set_h_size_flags(Control::SIZE_EXPAND_FILL);
real_property->set_name_split_ratio(0.0); real_property->set_name_split_ratio(0.0);
editor->setup(property, real_property, bool(p_usage & PROPERTY_USAGE_RESTART_IF_CHANGED)); editor->setup(property, real_property, p_hint, p_hint_text, p_usage);
add_property_editor(p_path, editor); add_property_editor(p_path, editor);
current_object = nullptr; current_object = nullptr;

View File

@@ -141,17 +141,19 @@ class EditorSettingsPropertyWrapper : public EditorProperty {
GDCLASS(EditorSettingsPropertyWrapper, EditorProperty); GDCLASS(EditorSettingsPropertyWrapper, EditorProperty);
String property; String property;
PropertyHint hint;
String hint_text;
uint32_t usage;
EditorProperty *editor_property = nullptr; EditorProperty *editor_property = nullptr;
BoxContainer *container = nullptr; HBoxContainer *override_container = nullptr;
TextureRect *override_icon = nullptr;
HBoxContainer *override_info = nullptr; EditorProperty *override_editor_property = nullptr;
Label *override_label = nullptr;
Button *goto_button = nullptr; Button *goto_button = nullptr;
Button *remove_button = nullptr; Button *remove_button = nullptr;
bool requires_restart = false; void _setup_override_info();
void _update_override(); void _update_override();
void _create_override(); void _create_override();
void _remove_override(); void _remove_override();
@@ -163,7 +165,7 @@ public:
static inline Callable restart_request_callback; static inline Callable restart_request_callback;
virtual void update_property() override; virtual void update_property() override;
void setup(const String &p_property, EditorProperty *p_editor_property, bool p_requires_restart); void setup(const String &p_property, EditorProperty *p_editor_property, PropertyHint p_hint, const String &p_hint_text, uint32_t p_usage);
}; };
class EditorSettingsInspectorPlugin : public EditorInspectorPlugin { class EditorSettingsInspectorPlugin : public EditorInspectorPlugin {