[Bf-blender-cvs] [cff2807affc] master: Fix T103719: missing shortcuts info for some tool-settings
Campbell Barton
noreply at git.blender.org
Wed Jan 11 11:03:16 CET 2023
Commit: cff2807affc60fe94e87df19f00c51c5c70713df
Author: Campbell Barton
Date: Wed Jan 11 20:55:33 2023 +1100
Branches: master
https://developer.blender.org/rBcff2807affc60fe94e87df19f00c51c5c70713df
Fix T103719: missing shortcuts info for some tool-settings
Tool settings can be accessed from both `tool_settings` &
`scene.tool_settings`.
As of [0] `scene.tool_settings` was used instead of `tool_settings`
causing the snap shortcut not to display.
Resolve by supporting variations of data-paths so both are detected.
[0]: 9a76dd2454c2d6f84e4f15c0235669b317599fbd
===================================================================
M source/blender/editors/interface/interface.cc
===================================================================
diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc
index 6998aa91e9f..2a21356b9aa 100644
--- a/source/blender/editors/interface/interface.cc
+++ b/source/blender/editors/interface/interface.cc
@@ -1454,63 +1454,87 @@ static bool ui_but_event_property_operator_string(const bContext *C,
}
}
- char *data_path = WM_context_path_resolve_property_full(C, ptr, prop, prop_index);
+ /* There may be multiple data-paths to the same properties,
+ * support different variations so key bindings are properly detected no matter which are used.
+ */
+ char *data_path_variations[2] = {nullptr};
+ int data_path_variations_num = 0;
+
+ {
+ char *data_path = WM_context_path_resolve_property_full(C, ptr, prop, prop_index);
+
+ /* Always iterate once, even if data-path isn't set. */
+ data_path_variations[data_path_variations_num++] = data_path;
+
+ if (data_path) {
+ if (STRPREFIX(data_path, "scene.tool_settings.")) {
+ data_path_variations[data_path_variations_num++] = BLI_strdup(data_path + 6);
+ }
+ }
+ }
/* We have a data-path! */
bool found = false;
- if (data_path || (prop_enum_value_ok && prop_enum_value_id)) {
- /* Create a property to host the "data_path" property we're sending to the operators. */
- IDProperty *prop_path;
- const IDPropertyTemplate group_val = {0};
- prop_path = IDP_New(IDP_GROUP, &group_val, __func__);
- if (data_path) {
- IDP_AddToGroup(prop_path, IDP_NewString(data_path, "data_path", strlen(data_path) + 1));
- }
- if (prop_enum_value_ok) {
- const EnumPropertyItem *item;
- bool free;
- RNA_property_enum_items((bContext *)C, ptr, prop, &item, nullptr, &free);
- const int index = RNA_enum_from_value(item, prop_enum_value);
- if (index != -1) {
- IDProperty *prop_value;
- if (prop_enum_value_is_int) {
- const int value = item[index].value;
- IDPropertyTemplate val = {};
- val.i = value;
- prop_value = IDP_New(IDP_INT, &val, prop_enum_value_id);
+ for (int data_path_index = 0; data_path_index < data_path_variations_num && (found == false);
+ data_path_index++) {
+ const char *data_path = data_path_variations[data_path_index];
+ if (data_path || (prop_enum_value_ok && prop_enum_value_id)) {
+ /* Create a property to host the "data_path" property we're sending to the operators. */
+ IDProperty *prop_path;
+
+ const IDPropertyTemplate group_val = {0};
+ prop_path = IDP_New(IDP_GROUP, &group_val, __func__);
+ if (data_path) {
+ IDP_AddToGroup(prop_path, IDP_NewString(data_path, "data_path", strlen(data_path) + 1));
+ }
+ if (prop_enum_value_ok) {
+ const EnumPropertyItem *item;
+ bool free;
+ RNA_property_enum_items((bContext *)C, ptr, prop, &item, nullptr, &free);
+ const int index = RNA_enum_from_value(item, prop_enum_value);
+ if (index != -1) {
+ IDProperty *prop_value;
+ if (prop_enum_value_is_int) {
+ const int value = item[index].value;
+ IDPropertyTemplate val = {};
+ val.i = value;
+ prop_value = IDP_New(IDP_INT, &val, prop_enum_value_id);
+ }
+ else {
+ const char *id = item[index].identifier;
+ prop_value = IDP_NewString(id, prop_enum_value_id, strlen(id) + 1);
+ }
+ IDP_AddToGroup(prop_path, prop_value);
}
else {
- const char *id = item[index].identifier;
- prop_value = IDP_NewString(id, prop_enum_value_id, strlen(id) + 1);
+ opnames_len = 0; /* Do nothing. */
+ }
+ if (free) {
+ MEM_freeN((void *)item);
}
- IDP_AddToGroup(prop_path, prop_value);
- }
- else {
- opnames_len = 0; /* Do nothing. */
- }
- if (free) {
- MEM_freeN((void *)item);
}
- }
- /* check each until one works... */
+ /* check each until one works... */
- for (int i = 0; (i < opnames_len) && (opnames[i]); i++) {
- if (WM_key_event_operator_string(
- C, opnames[i], WM_OP_INVOKE_REGION_WIN, prop_path, false, buf, buf_len)) {
- found = true;
- break;
+ for (int i = 0; (i < opnames_len) && (opnames[i]); i++) {
+ if (WM_key_event_operator_string(
+ C, opnames[i], WM_OP_INVOKE_REGION_WIN, prop_path, false, buf, buf_len)) {
+ found = true;
+ break;
+ }
}
+ /* cleanup */
+ IDP_FreeProperty(prop_path);
}
+ }
- /* cleanup */
- IDP_FreeProperty(prop_path);
+ for (int data_path_index = 0; data_path_index < data_path_variations_num; data_path_index++) {
+ char *data_path = data_path_variations[data_path_index];
if (data_path) {
MEM_freeN(data_path);
}
}
-
return found;
}
More information about the Bf-blender-cvs
mailing list