BlackboardPlan: Provide editor hints for mappings

This commit is contained in:
Serhii Snitsaruk 2024-05-14 13:29:04 +02:00
parent 549d73b8fc
commit e43bc25d82
No known key found for this signature in database
GPG Key ID: A965EF8799FFEC2D
4 changed files with 55 additions and 9 deletions

View File

@ -71,9 +71,21 @@ void EditorPropertyVariableName::_update_status() {
if (plan.is_null()) {
return;
}
if (plan->has_var(name_edit->get_text())) {
BUTTON_SET_ICON(status_btn, theme_cache.var_exists_icon);
status_btn->set_tooltip_text(TTR("This variable is present in the blackboard plan.\nClick to open the blackboard plan."));
String var_name = name_edit->get_text();
if (var_name.is_empty() && allow_empty) {
BUTTON_SET_ICON(status_btn, theme_cache.var_empty_icon);
status_btn->set_tooltip_text(TTR("Variable name not specified.\nClick to open the blackboard plan."));
} else if (plan->has_var(var_name)) {
if (type_hint == Variant::NIL || plan->get_var(var_name).get_type() == type_hint) {
BUTTON_SET_ICON(status_btn, theme_cache.var_exists_icon);
status_btn->set_tooltip_text(TTR("This variable is present in the blackboard plan.\nClick to open the blackboard plan."));
} else {
BUTTON_SET_ICON(status_btn, theme_cache.var_error_icon);
status_btn->set_tooltip_text(TTR(vformat(
"The %s variable in the blackboard plan is not of the same type as this variable (expected %s).\nClick to open the blackboard plan and fix the variable type.",
LimboUtility::get_singleton()->decorate_var(var_name),
Variant::get_type_name(type_hint))));
}
} else if (name_edit->get_text().begins_with("_")) {
BUTTON_SET_ICON(status_btn, theme_cache.var_private_icon);
status_btn->set_tooltip_text(TTR("This variable is private and is not included in the blackboard plan.\nClick to open the blackboard plan."));
@ -119,8 +131,10 @@ void EditorPropertyVariableName::_update_property() {
_update_status();
}
void EditorPropertyVariableName::setup(const Ref<BlackboardPlan> &p_plan) {
void EditorPropertyVariableName::setup(const Ref<BlackboardPlan> &p_plan, bool p_allow_empty, Variant::Type p_type_hint) {
plan = p_plan;
allow_empty = p_allow_empty;
type_hint = p_type_hint;
_update_status();
}
@ -148,6 +162,8 @@ void EditorPropertyVariableName::_notification(int p_what) {
theme_cache.var_exists_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarExists));
theme_cache.var_not_found_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarNotFound));
theme_cache.var_private_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarPrivate));
theme_cache.var_empty_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarEmpty));
theme_cache.var_error_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarError));
} break;
}
}
@ -192,6 +208,10 @@ bool EditorInspectorPluginVariableName::_can_handle(Object *p_object) const {
if (param.is_valid()) {
return true;
}
Ref<BlackboardPlan> plan = Object::cast_to<BlackboardPlan>(p_object);
if (plan.is_valid()) {
return true;
}
return false;
}
@ -200,13 +220,30 @@ bool EditorInspectorPluginVariableName::parse_property(Object *p_object, const V
#elif LIMBOAI_GDEXTENSION
bool EditorInspectorPluginVariableName::_parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const BitField<PropertyUsageFlags> p_usage, const bool p_wide) {
#endif
if (!(p_type == Variant::Type::STRING_NAME || p_type == Variant::Type::STRING) || !(p_path.ends_with("_var") || p_path.ends_with("variable"))) {
bool is_mapping = p_path.begins_with("mapping/");
if (!(p_type == Variant::Type::STRING_NAME || p_type == Variant::Type::STRING) || !(is_mapping || p_path.ends_with("_var") || p_path.ends_with("variable"))) {
return false;
}
Ref<BlackboardPlan> plan;
Variant::Type type_hint = Variant::NIL;
if (is_mapping) {
plan.reference_ptr(Object::cast_to<BlackboardPlan>(p_object));
ERR_FAIL_NULL_V(plan, false);
String var_name = p_path.trim_prefix("mapping/");
if (plan->has_var(var_name)) {
BBVariable variable = plan->get_var(var_name);
type_hint = variable.get_type();
}
plan = plan->get_parent_scope_plan();
ERR_FAIL_NULL_V(plan, false);
} else {
plan = plan_getter.call();
}
EditorPropertyVariableName *ed = memnew(EditorPropertyVariableName);
ed->setup(plan_getter.call());
add_property_editor(p_path, ed);
ed->setup(plan, is_mapping, type_hint);
add_property_editor(p_path, ed, type_hint);
return true;
}

View File

@ -33,15 +33,20 @@ class EditorPropertyVariableName : public EditorProperty {
private:
struct ThemeCache {
Ref<Texture2D> var_add_icon;
Ref<Texture2D> var_empty_icon;
Ref<Texture2D> var_error_icon;
Ref<Texture2D> var_exists_icon;
Ref<Texture2D> var_not_found_icon;
Ref<Texture2D> var_add_icon;
Ref<Texture2D> var_private_icon;
};
ThemeCache theme_cache;
Ref<BlackboardPlan> plan;
bool allow_empty = false;
Variant::Type type_hint = Variant::NIL;
LineEdit *name_edit;
Button *drop_btn;
Button *status_btn;
@ -68,7 +73,7 @@ public:
virtual void _update_property() override;
#endif
void setup(const Ref<BlackboardPlan> &p_plan);
void setup(const Ref<BlackboardPlan> &p_plan, bool p_allow_empty = false, Variant::Type p_type_hint = Variant::NIL);
EditorPropertyVariableName();
};

View File

@ -105,6 +105,8 @@ LimboStringNames::LimboStringNames() {
LimboPercent = SN("LimboPercent");
LimboSelectAll = SN("LimboSelectAll");
LimboVarAdd = SN("LimboVarAdd");
LimboVarEmpty = SN("LimboVarEmpty");
LimboVarError = SN("LimboVarError");
LimboVarExists = SN("LimboVarExists");
LimboVarNotFound = SN("LimboVarNotFound");
LimboVarPrivate = SN("LimboVarPrivate");

View File

@ -122,6 +122,8 @@ public:
StringName LimboPercent;
StringName LimboSelectAll;
StringName LimboVarAdd;
StringName LimboVarEmpty;
StringName LimboVarError;
StringName LimboVarExists;
StringName LimboVarNotFound;
StringName LimboVarPrivate;