From 20c192cc2dcd9efa644fd0b0a995adcb4c00c0c4 Mon Sep 17 00:00:00 2001 From: rsjtdrjgfuzkfg Date: Thu, 15 Dec 2022 20:28:20 +0100 Subject: [PATCH] OpenXR: fix casts and loop in action map editor This commit replaces potentially unsafe static casts with Object::cast_to and fixes the order in which UI elements are looped over when removing controls. This fixes crashes and wrong data being displayed in the OpenXR action map editor when saving or resetting action maps. --- modules/openxr/editor/openxr_action_map_editor.cpp | 10 +++++----- .../editor/openxr_interaction_profile_editor.cpp | 2 +- modules/openxr/editor/openxr_select_action_dialog.cpp | 4 ++-- .../openxr_select_interaction_profile_dialog.cpp | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/openxr/editor/openxr_action_map_editor.cpp b/modules/openxr/editor/openxr_action_map_editor.cpp index a2c33a91c43..844423afc0b 100644 --- a/modules/openxr/editor/openxr_action_map_editor.cpp +++ b/modules/openxr/editor/openxr_action_map_editor.cpp @@ -57,7 +57,7 @@ void OpenXRActionMapEditor::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { for (int i = 0; i < tabs->get_child_count(); i++) { - Control *tab = static_cast(tabs->get_child(i)); + Control *tab = Object::cast_to(tabs->get_child(i)); if (tab) { tab->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree"))); } @@ -208,7 +208,7 @@ void OpenXRActionMapEditor::_on_remove_action_set(Object *p_action_set_editor) { void OpenXRActionMapEditor::_on_action_removed() { for (int i = 0; i < tabs->get_tab_count(); i++) { // First tab won't be an interaction profile editor, but being thorough.. - OpenXRInteractionProfileEditorBase *interaction_profile_editor = static_cast(tabs->get_tab_control(i)); + OpenXRInteractionProfileEditorBase *interaction_profile_editor = Object::cast_to(tabs->get_tab_control(i)); if (interaction_profile_editor) { } } @@ -309,7 +309,7 @@ void OpenXRActionMapEditor::_on_tabs_tab_changed(int p_tab) { } void OpenXRActionMapEditor::_on_tab_button_pressed(int p_tab) { - OpenXRInteractionProfileEditorBase *interaction_profile_editor = static_cast(tabs->get_tab_control(p_tab)); + OpenXRInteractionProfileEditorBase *interaction_profile_editor = Object::cast_to(tabs->get_tab_control(p_tab)); ERR_FAIL_NULL(interaction_profile_editor); undo_redo->create_action(TTR("Remove interaction profile")); @@ -375,9 +375,9 @@ void OpenXRActionMapEditor::_clear_action_map() { child->queue_free(); } - for (int i = 0; i < tabs->get_tab_count(); i++) { + for (int i = tabs->get_tab_count() - 1; i >= 0; --i) { // First tab won't be an interaction profile editor, but being thorough.. - OpenXRInteractionProfileEditorBase *interaction_profile_editor = static_cast(tabs->get_tab_control(i)); + OpenXRInteractionProfileEditorBase *interaction_profile_editor = Object::cast_to(tabs->get_tab_control(i)); if (interaction_profile_editor) { tabs->remove_child(interaction_profile_editor); interaction_profile_editor->queue_free(); diff --git a/modules/openxr/editor/openxr_interaction_profile_editor.cpp b/modules/openxr/editor/openxr_interaction_profile_editor.cpp index 3eca1967f5e..ee73f6a5cd4 100644 --- a/modules/openxr/editor/openxr_interaction_profile_editor.cpp +++ b/modules/openxr/editor/openxr_interaction_profile_editor.cpp @@ -308,7 +308,7 @@ void OpenXRInteractionProfileEditor::_update_interaction_profile() { void OpenXRInteractionProfileEditor::_theme_changed() { for (int i = 0; i < main_hb->get_child_count(); i++) { - Control *panel = static_cast(main_hb->get_child(i)); + Control *panel = Object::cast_to(main_hb->get_child(i)); if (panel) { panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); } diff --git a/modules/openxr/editor/openxr_select_action_dialog.cpp b/modules/openxr/editor/openxr_select_action_dialog.cpp index 5f018291d58..c4b2ef95c53 100644 --- a/modules/openxr/editor/openxr_select_action_dialog.cpp +++ b/modules/openxr/editor/openxr_select_action_dialog.cpp @@ -47,7 +47,7 @@ void OpenXRSelectActionDialog::_notification(int p_what) { void OpenXRSelectActionDialog::_on_select_action(const String p_action) { if (selected_action != "") { NodePath button_path = action_buttons[selected_action]; - Button *button = static_cast