Editor: Add Filter to Project Export → Options tab

See godotengine/godot-proposals#11335

Co-authored-by: AThousandShips <96648715+athousandships@users.noreply.github.com>
This commit is contained in:
Stuart Carnie
2026-04-24 06:50:43 +10:00
parent 0dd6299f71
commit 1b53da8e2a
4 changed files with 67 additions and 4 deletions
+10 -1
View File
@@ -333,7 +333,16 @@ bool EditorExportPreset::is_runnable() const {
}
bool EditorExportPreset::are_advanced_options_enabled() const {
return EDITOR_GET("_export_preset_advanced_mode");
return options_search_active || EDITOR_GET("_export_preset_advanced_mode");
}
void EditorExportPreset::set_options_search_active(bool p_active) {
if (options_search_active == p_active) {
return;
}
options_search_active = p_active;
notify_property_list_changed();
}
void EditorExportPreset::set_dedicated_server(bool p_enable) {
+2
View File
@@ -88,6 +88,7 @@ private:
HashMap<StringName, bool> update_visibility;
String name;
bool options_search_active = false;
String custom_features;
@@ -145,6 +146,7 @@ public:
bool is_runnable() const;
bool are_advanced_options_enabled() const;
void set_options_search_active(bool p_active);
void set_dedicated_server(bool p_enable);
bool is_dedicated_server() const;
+52 -3
View File
@@ -119,7 +119,7 @@ void ProjectExportDialog::_notification(int p_what) {
case NOTIFICATION_THEME_CHANGED: {
_script_encryption_key_visibility_changed(show_script_key->is_pressed());
options_filter->set_right_icon(get_editor_theme_icon(SNAME("Search")));
duplicate_preset->set_button_icon(presets->get_editor_theme_icon(SNAME("Duplicate")));
delete_preset->set_button_icon(presets->get_editor_theme_icon(SNAME("Remove")));
patch_add_btn->set_button_icon(get_editor_theme_icon(SNAME("Add")));
@@ -145,6 +145,18 @@ void ProjectExportDialog::_notification(int p_what) {
}
}
void ProjectExportDialog::shortcut_input(const Ref<InputEvent> &p_event) {
const Ref<InputEventKey> &key = p_event;
if (key.is_valid() && key->is_pressed() && !key->is_echo()) {
if (ED_IS_SHORTCUT("editor/open_search", p_event)) {
options_filter->grab_focus();
options_filter->select_all();
options_filter->accept_event();
}
}
}
void ProjectExportDialog::popup_export() {
add_preset->get_popup()->clear();
for (int i = 0; i < EditorExport::get_singleton()->get_export_platform_count(); i++) {
@@ -291,6 +303,7 @@ void ProjectExportDialog::_edit_preset(int p_index) {
updating = true;
presets->select(p_index);
_options_filter_changed(options_filter->get_text());
duplicate_preset->set_disabled(false);
delete_preset->set_disabled(false);
get_ok_button()->set_disabled(false);
@@ -534,6 +547,26 @@ void ProjectExportDialog::_advanced_options_pressed() {
_update_presets();
}
void ProjectExportDialog::_options_filter_changed(const String &p_filter) {
const bool search_active = !p_filter.is_empty();
advanced_options->set_disabled(search_active);
if (search_active) {
advanced_options->set_pressed_no_signal(true);
advanced_options->set_tooltip_text(TTRC("Advanced settings are always shown when searching."));
} else {
advanced_options->set_pressed_no_signal(EDITOR_GET("_export_preset_advanced_mode"));
advanced_options->set_tooltip_text("");
}
const int current_preset = presets->get_current();
if (current_preset >= 0 && current_preset < EditorExport::get_singleton()->get_export_preset_count()) {
Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(current_preset);
if (current.is_valid()) {
current->set_options_search_active(search_active);
}
}
}
void ProjectExportDialog::_runnable_pressed() {
if (updating) {
return;
@@ -1551,6 +1584,7 @@ ProjectExportDialog::ProjectExportDialog() {
set_title(TTRC("Export"));
set_flag(FLAG_MAXIMIZE_DISABLED, false);
set_clamp_to_embedder(true);
set_process_shortcut_input(true);
VBoxContainer *main_vb = memnew(VBoxContainer);
add_child(main_vb);
@@ -1662,12 +1696,27 @@ ProjectExportDialog::ProjectExportDialog() {
// Main preset parameters.
VBoxContainer *parameters_vb = memnew(VBoxContainer);
parameters_vb->set_name(TTRC("Options"));
parameters_vb->set_v_size_flags(Control::SIZE_EXPAND_FILL);
sections->add_child(parameters_vb);
options_filter = memnew(LineEdit);
options_filter->set_placeholder(TTRC("Filter Options"));
options_filter->set_accessibility_name(TTRC("Filter Options"));
options_filter->set_clear_button_enabled(true);
options_filter->set_virtual_keyboard_show_on_focus(false);
options_filter->set_h_size_flags(Control::SIZE_EXPAND_FILL);
options_filter->connect(SceneStringName(text_changed), callable_mp(this, &ProjectExportDialog::_options_filter_changed));
parameters_vb->add_child(options_filter);
parameters = memnew(EditorInspector);
parameters->set_name(TTRC("Options"));
parameters->set_mark_unsaved(false);
parameters->set_v_size_flags(Control::SIZE_EXPAND_FILL);
parameters->set_use_doc_hints(true);
sections->add_child(parameters);
parameters->register_text_enter(options_filter);
parameters->set_use_filter(true);
parameters_vb->add_child(parameters);
parameters->connect("property_edited", callable_mp(this, &ProjectExportDialog::_update_parameters));
EditorExport::get_singleton()->connect("export_presets_updated", callable_mp(this, &ProjectExportDialog::_force_update_current_preset_parameters));
+3
View File
@@ -84,6 +84,7 @@ class ProjectExportDialog : public ConfirmationDialog {
VBoxContainer *settings_vb = nullptr;
LineEdit *name = nullptr;
LineEdit *options_filter = nullptr;
EditorPropertyPath *export_path = nullptr;
EditorInspector *parameters = nullptr;
CheckButton *runnable = nullptr;
@@ -142,6 +143,7 @@ class ProjectExportDialog : public ConfirmationDialog {
bool exporting = false;
void _advanced_options_pressed();
void _options_filter_changed(const String &p_filter);
void _runnable_pressed();
void _update_parameters(const String &p_edited_property);
void _name_changed(const String &p_string);
@@ -231,6 +233,7 @@ class ProjectExportDialog : public ConfirmationDialog {
protected:
void _notification(int p_what);
static void _bind_methods();
virtual void shortcut_input(const Ref<InputEvent> &p_event) override;
public:
void popup_export();