Path: blob/master/modules/openxr/editor/openxr_action_editor.cpp
10278 views
/**************************************************************************/1/* openxr_action_editor.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "openxr_action_editor.h"3132#include "editor/editor_string_names.h"33#include "editor/themes/editor_scale.h"3435void OpenXRActionEditor::_bind_methods() {36ClassDB::bind_method(D_METHOD("_do_set_name", "name"), &OpenXRActionEditor::_do_set_name);37ClassDB::bind_method(D_METHOD("_do_set_localized_name", "name"), &OpenXRActionEditor::_do_set_localized_name);38ClassDB::bind_method(D_METHOD("_do_set_action_type", "type"), &OpenXRActionEditor::_do_set_action_type);3940ADD_SIGNAL(MethodInfo("remove", PropertyInfo(Variant::OBJECT, "action_editor")));41}4243void OpenXRActionEditor::_theme_changed() {44rem_action->set_button_icon(get_theme_icon(SNAME("Remove"), EditorStringName(EditorIcons)));45}4647void OpenXRActionEditor::_notification(int p_what) {48switch (p_what) {49case NOTIFICATION_THEME_CHANGED: {50_theme_changed();51} break;52}53}5455void OpenXRActionEditor::_on_action_name_changed(const String p_new_text) {56if (action->get_name() != p_new_text) {57undo_redo->create_action(TTR("Rename Action"));58undo_redo->add_do_method(this, "_do_set_name", p_new_text);59undo_redo->add_undo_method(this, "_do_set_name", action->get_name());60undo_redo->commit_action(false);6162// If our localized name matches our action name, set this too63if (action->get_name() == action->get_localized_name()) {64undo_redo->create_action(TTR("Rename Actions Localized name"));65undo_redo->add_do_method(this, "_do_set_localized_name", p_new_text);66undo_redo->add_undo_method(this, "_do_set_localized_name", action->get_localized_name());67undo_redo->commit_action(false);6869action->set_localized_name(p_new_text);70action_localized_name->set_text(p_new_text);71}72action->set_name(p_new_text);73action->set_edited(true);74}75}7677void OpenXRActionEditor::_do_set_name(const String p_new_text) {78action->set_name(p_new_text);79action->set_edited(true);80action_name->set_text(p_new_text);81}8283void OpenXRActionEditor::_on_action_localized_name_changed(const String p_new_text) {84if (action->get_localized_name() != p_new_text) {85undo_redo->create_action(TTR("Rename Actions Localized name"));86undo_redo->add_do_method(this, "_do_set_localized_name", p_new_text);87undo_redo->add_undo_method(this, "_do_set_localized_name", action->get_localized_name());88undo_redo->commit_action(false);8990action->set_localized_name(p_new_text);91action->set_edited(true);92}93}9495void OpenXRActionEditor::_do_set_localized_name(const String p_new_text) {96action->set_localized_name(p_new_text);97action->set_edited(true);98action_localized_name->set_text(p_new_text);99}100101void OpenXRActionEditor::_on_item_selected(int p_idx) {102ERR_FAIL_INDEX(p_idx, OpenXRAction::OPENXR_ACTION_MAX);103104OpenXRAction::ActionType action_type = OpenXRAction::ActionType(p_idx);105106if (action->get_action_type() != action_type) {107undo_redo->create_action(TTR("Change Action Type"));108undo_redo->add_do_method(this, "_do_set_action_type", action_type);109undo_redo->add_undo_method(this, "_do_set_action_type", action->get_action_type());110undo_redo->commit_action(false);111112action->set_action_type(action_type);113action->set_edited(true);114}115}116117void OpenXRActionEditor::_do_set_action_type(OpenXRAction::ActionType p_action_type) {118action->set_action_type(p_action_type);119action->set_edited(true);120action_type_button->select(int(action->get_action_type()));121}122123void OpenXRActionEditor::_on_remove_action() {124emit_signal("remove", this);125}126127OpenXRActionEditor::OpenXRActionEditor(Ref<OpenXRAction> p_action) {128undo_redo = EditorUndoRedoManager::get_singleton();129action = p_action;130131set_h_size_flags(Control::SIZE_EXPAND_FILL);132133action_name = memnew(LineEdit);134action_name->set_text(action->get_name());135action_name->set_tooltip_text(TTR("Internal name of the action. Some XR runtimes don't allow spaces or special characters."));136action_name->set_custom_minimum_size(Size2(150.0 * EDSCALE, 0.0));137action_name->connect(SceneStringName(text_changed), callable_mp(this, &OpenXRActionEditor::_on_action_name_changed));138action_name->set_accessibility_name(TTRC("Action Name"));139add_child(action_name);140141action_localized_name = memnew(LineEdit);142action_localized_name->set_text(action->get_localized_name());143action_localized_name->set_tooltip_text(TTR("Human-readable name of the action. This can be displayed to end users."));144action_localized_name->set_custom_minimum_size(Size2(150.0 * EDSCALE, 0.0));145action_localized_name->set_h_size_flags(Control::SIZE_EXPAND_FILL);146action_localized_name->connect(SceneStringName(text_changed), callable_mp(this, &OpenXRActionEditor::_on_action_localized_name_changed));147action_localized_name->set_accessibility_name(TTRC("Action Localized Name"));148add_child(action_localized_name);149150action_type_button = memnew(OptionButton);151action_type_button->set_tooltip_text(TTR("Type of the action"));152action_type_button->add_item("Bool", OpenXRAction::OPENXR_ACTION_BOOL);153action_type_button->add_item("Float", OpenXRAction::OPENXR_ACTION_FLOAT);154action_type_button->add_item("Vector2", OpenXRAction::OPENXR_ACTION_VECTOR2);155action_type_button->add_item("Pose", OpenXRAction::OPENXR_ACTION_POSE);156action_type_button->add_item("Haptic", OpenXRAction::OPENXR_ACTION_HAPTIC);157action_type_button->set_accessibility_name(TTRC("Action Type"));158action_type_button->select(int(action->get_action_type()));159action_type_button->set_custom_minimum_size(Size2(100.0 * EDSCALE, 0.0));160action_type_button->connect(SceneStringName(item_selected), callable_mp(this, &OpenXRActionEditor::_on_item_selected));161add_child(action_type_button);162163// maybe add dropdown to edit our toplevel paths, or do we deduce them from our suggested bindings?164165rem_action = memnew(Button);166rem_action->set_tooltip_text(TTR("Remove action"));167rem_action->connect(SceneStringName(pressed), callable_mp(this, &OpenXRActionEditor::_on_remove_action));168rem_action->set_flat(true);169add_child(rem_action);170}171172173