Editor: Show only relevant hints for the chosen variant type in the Blackboard Plan editor

This commit is contained in:
Serhii Snitsaruk 2024-01-26 16:25:17 +01:00
parent 761b211740
commit a6717ec76d
3 changed files with 129 additions and 2 deletions

View File

@ -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();
}

View File

@ -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<Shortcut> LimboUtility::add_shortcut(const String &p_path, const String &p_name, Key p_keycode) {

View File

@ -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<Shortcut> add_shortcut(const String &p_path, const String &p_name, Key p_keycode = LW_KEY(NONE));