diff --git a/editor/blackboard_plan_editor.cpp b/editor/blackboard_plan_editor.cpp index bde3d01..2d67e51 100644 --- a/editor/blackboard_plan_editor.cpp +++ b/editor/blackboard_plan_editor.cpp @@ -65,7 +65,19 @@ void BlackboardPlanEditor::_rename_var(const String &p_new_name, int p_index) { void BlackboardPlanEditor::_change_var_type(Variant::Type p_new_type, int p_index) { ERR_FAIL_NULL(plan); - plan->get_var_by_index(p_index).second.set_type(p_new_type); + + BBVariable var = plan->get_var_by_index(p_index).second; + if (var.get_type() == p_new_type) { + return; + } + + PackedInt32Array allowed_hints = LimboUtility::get_singleton()->get_property_hints_allowed_for_type(p_new_type); + if (!allowed_hints.has(var.get_hint())) { + var.set_hint(PROPERTY_HINT_NONE); + } + + var.set_type(p_new_type); + plan->notify_property_list_changed(); _refresh(); } @@ -99,6 +111,16 @@ void BlackboardPlanEditor::_show_button_popup(Button *p_button, PopupMenu *p_pop p_popup->set_size(rect.size); p_popup->set_position(rect.position); + if (p_popup == hint_menu) { + hint_menu->clear(); + hint_menu->reset_size(); + Variant::Type t = plan->get_var_by_index(p_index).second.get_type(); + PackedInt32Array hints = LimboUtility::get_singleton()->get_property_hints_allowed_for_type(t); + for (int i = 0; i < hints.size(); i++) { + hint_menu->add_item(LimboUtility::get_singleton()->get_property_hint_text(PropertyHint(hints[i])), hints[i]); + } + } + last_index = p_index; p_popup->popup(); } diff --git a/util/limbo_utility.cpp b/util/limbo_utility.cpp index ed2f64f..73f35ef 100644 --- a/util/limbo_utility.cpp +++ b/util/limbo_utility.cpp @@ -300,7 +300,7 @@ String LimboUtility::get_property_hint_text(PropertyHint p_hint) const { return "ENUM"; } case PROPERTY_HINT_ENUM_SUGGESTION: { - return "SUGGESTION"; + return "ENUM_SUGGESTION"; } case PROPERTY_HINT_EXP_EASING: { return "EXP_EASING"; @@ -411,6 +411,110 @@ String LimboUtility::get_property_hint_text(PropertyHint p_hint) const { return ""; } +PackedInt32Array LimboUtility::get_property_hints_allowed_for_type(Variant::Type p_type) const { + PackedInt32Array hints; + hints.append(PROPERTY_HINT_NONE); + + // * According to editor/editor_properties.cpp + switch (p_type) { + case Variant::Type::NIL: + case Variant::Type::RID: + case Variant::Type::CALLABLE: + case Variant::Type::SIGNAL: + case Variant::Type::BOOL: { + } break; + case Variant::Type::INT: { + hints.append(PROPERTY_HINT_RANGE); + hints.append(PROPERTY_HINT_ENUM); + hints.append(PROPERTY_HINT_FLAGS); + hints.append(PROPERTY_HINT_LAYERS_2D_RENDER); + hints.append(PROPERTY_HINT_LAYERS_2D_PHYSICS); + hints.append(PROPERTY_HINT_LAYERS_2D_NAVIGATION); + hints.append(PROPERTY_HINT_LAYERS_3D_RENDER); + hints.append(PROPERTY_HINT_LAYERS_3D_PHYSICS); + hints.append(PROPERTY_HINT_LAYERS_3D_NAVIGATION); + hints.append(PROPERTY_HINT_LAYERS_AVOIDANCE); + } break; + case Variant::Type::FLOAT: { + hints.append(PROPERTY_HINT_RANGE); + hints.append(PROPERTY_HINT_EXP_EASING); + } break; + case Variant::Type::STRING: { + hints.append(PROPERTY_HINT_ENUM); + hints.append(PROPERTY_HINT_ENUM_SUGGESTION); + hints.append(PROPERTY_HINT_FILE); + hints.append(PROPERTY_HINT_DIR); + hints.append(PROPERTY_HINT_GLOBAL_FILE); + hints.append(PROPERTY_HINT_GLOBAL_DIR); + hints.append(PROPERTY_HINT_MULTILINE_TEXT); + hints.append(PROPERTY_HINT_EXPRESSION); + hints.append(PROPERTY_HINT_PLACEHOLDER_TEXT); + // hints.append(PROPERTY_HINT_TYPE_STRING); // ! Causes a crash. + hints.append(PROPERTY_HINT_SAVE_FILE); + hints.append(PROPERTY_HINT_GLOBAL_SAVE_FILE); + hints.append(PROPERTY_HINT_LOCALE_ID); + hints.append(PROPERTY_HINT_PASSWORD); + } break; + case Variant::Type::VECTOR2: + case Variant::Type::VECTOR2I: + case Variant::Type::VECTOR3: + case Variant::Type::VECTOR3I: + case Variant::Type::VECTOR4: + case Variant::Type::VECTOR4I: { + hints.append(PROPERTY_HINT_RANGE); + hints.append(PROPERTY_HINT_LINK); + } break; + case Variant::Type::RECT2: + case Variant::Type::RECT2I: + case Variant::Type::TRANSFORM2D: + case Variant::Type::PLANE: + case Variant::Type::AABB: + case Variant::Type::BASIS: + case Variant::Type::TRANSFORM3D: + case Variant::Type::PROJECTION: { + hints.append(PROPERTY_HINT_RANGE); + } break; + case Variant::Type::QUATERNION: { + hints.append(PROPERTY_HINT_RANGE); + hints.append(PROPERTY_HINT_HIDE_QUATERNION_EDIT); + } break; + case Variant::Type::COLOR: { + hints.append(PROPERTY_HINT_COLOR_NO_ALPHA); + } break; + case Variant::Type::STRING_NAME: { + hints.append(PROPERTY_HINT_ENUM); + hints.append(PROPERTY_HINT_ENUM_SUGGESTION); + hints.append(PROPERTY_HINT_PLACEHOLDER_TEXT); + hints.append(PROPERTY_HINT_PASSWORD); + } break; + case Variant::Type::NODE_PATH: { + hints.append(PROPERTY_HINT_NODE_PATH_VALID_TYPES); + hints.append(PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT); + + } break; + case Variant::Type::OBJECT: { + hints.append(PROPERTY_HINT_RESOURCE_TYPE); + hints.append(PROPERTY_HINT_NODE_TYPE); + } break; + case Variant::Type::DICTIONARY: { + hints.append(PROPERTY_HINT_LOCALIZABLE_STRING); + } break; + case Variant::Type::ARRAY: + case Variant::Type::PACKED_BYTE_ARRAY: + case Variant::Type::PACKED_INT32_ARRAY: + case Variant::Type::PACKED_INT64_ARRAY: + case Variant::Type::PACKED_FLOAT32_ARRAY: + case Variant::Type::PACKED_FLOAT64_ARRAY: + case Variant::Type::PACKED_STRING_ARRAY: + case Variant::Type::PACKED_VECTOR2_ARRAY: + case Variant::Type::PACKED_VECTOR3_ARRAY: + case Variant::Type::PACKED_COLOR_ARRAY: + case Variant::Type::VARIANT_MAX: { + } break; + } + return hints; +} + #ifdef TOOLS_ENABLED Ref LimboUtility::add_shortcut(const String &p_path, const String &p_name, Key p_keycode) { diff --git a/util/limbo_utility.h b/util/limbo_utility.h index 39045a4..c778286 100644 --- a/util/limbo_utility.h +++ b/util/limbo_utility.h @@ -89,6 +89,7 @@ public: Variant perform_operation(Operation p_operation, const Variant &left_value, const Variant &right_value); String get_property_hint_text(PropertyHint p_hint) const; + PackedInt32Array get_property_hints_allowed_for_type(Variant::Type p_type) const; #ifdef TOOLS_ENABLED Ref add_shortcut(const String &p_path, const String &p_name, Key p_keycode = LW_KEY(NONE));