[Bf-blender-cvs] [b81aad9064d] temp-cleanup-screen-context: Cleanup: refactor `ed_screen_context()` to use hash lookups

Sybren A. Stüvel noreply at git.blender.org
Fri Oct 2 11:56:23 CEST 2020


Commit: b81aad9064d626d1d75873672774594fd9bb70a5
Author: Sybren A. Stüvel
Date:   Fri Oct 2 11:56:06 2020 +0200
Branches: temp-cleanup-screen-context
https://developer.blender.org/rBb81aad9064d626d1d75873672774594fd9bb70a5

Cleanup: refactor `ed_screen_context()` to use hash lookups

Refactor `ed_screen_context()` to use `GHash` lookups instead of a sequence
of string comparisons, and move each context member into its own function.

===================================================================

M	source/blender/editors/screen/screen_context.c

===================================================================

diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index 89d6befbb25..8ca10b7b493 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -37,6 +37,7 @@
 #include "DNA_space_types.h"
 #include "DNA_windowmanager_types.h"
 
+#include "BLI_ghash.h"
 #include "BLI_listbase.h"
 #include "BLI_utildefines.h"
 
@@ -110,197 +111,242 @@ const char *screen_context_dir[] = {
     NULL,
 };
 
-int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result)
+/* Each function `screen_ctx_XXX()` will be called when the screen context "XXX" is requested.
+ * ensure_ed_screen_context_functions() is responsible for creating the hash map from context
+ * member name to function.
+ *
+ * Each function returns:
+ *    1 for "the member name was found and returned data is valid"
+ *    0 for "the member name was not found"
+ *   -1 for "the member name was found but data is not available"
+ *
+ * */
+
+static int screen_ctx_scene(const bContext *C, bContextDataResult *result)
 {
   wmWindow *win = CTX_wm_window(C);
-  View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
-  bScreen *screen = CTX_wm_screen(C);
-  ScrArea *area = CTX_wm_area(C);
   Scene *scene = WM_window_get_active_scene(win);
+  CTX_data_id_pointer_set(result, &scene->id);
+  return 1;
+}
+static int screen_ctx_visible_objects(const bContext *C, bContextDataResult *result)
+{
+  wmWindow *win = CTX_wm_window(C);
+  View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
   ViewLayer *view_layer = WM_window_get_active_view_layer(win);
-  Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
-  Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
 
-  if (CTX_data_dir(member)) {
-    CTX_data_dir_set(result, screen_context_dir);
-    return 1;
-  }
-  if (CTX_data_equals(member, "scene")) {
-    CTX_data_id_pointer_set(result, &scene->id);
-    return 1;
-  }
-  if (CTX_data_equals(member, "visible_objects")) {
-    LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
-      if (BASE_VISIBLE(v3d, base)) {
-        CTX_data_id_list_add(result, &base->object->id);
-      }
+  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
+    if (BASE_VISIBLE(v3d, base)) {
+      CTX_data_id_list_add(result, &base->object->id);
     }
-    CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
-    return 1;
   }
-  if (CTX_data_equals(member, "selectable_objects")) {
-    LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
-      if (BASE_SELECTABLE(v3d, base)) {
-        CTX_data_id_list_add(result, &base->object->id);
-      }
+  CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+  return 1;
+}
+static int screen_ctx_selectable_objects(const bContext *C, bContextDataResult *result)
+{
+  wmWindow *win = CTX_wm_window(C);
+  View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
+  ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+
+  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
+    if (BASE_SELECTABLE(v3d, base)) {
+      CTX_data_id_list_add(result, &base->object->id);
     }
-    CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
-    return 1;
   }
-  if (CTX_data_equals(member, "selected_objects")) {
-    LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
-      if (BASE_SELECTED(v3d, base)) {
-        CTX_data_id_list_add(result, &base->object->id);
-      }
+  CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+  return 1;
+}
+static int screen_ctx_selected_objects(const bContext *C, bContextDataResult *result)
+{
+  wmWindow *win = CTX_wm_window(C);
+  View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
+  ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+
+  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
+    if (BASE_SELECTED(v3d, base)) {
+      CTX_data_id_list_add(result, &base->object->id);
     }
-    CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
-    return 1;
   }
-  if (CTX_data_equals(member, "selected_editable_objects")) {
-    LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
-      if (BASE_SELECTED_EDITABLE(v3d, base)) {
-        CTX_data_id_list_add(result, &base->object->id);
-      }
+  CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+  return 1;
+}
+static int screen_ctx_selected_editable_objects(const bContext *C, bContextDataResult *result)
+{
+  wmWindow *win = CTX_wm_window(C);
+  View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
+  ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+
+  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
+    if (BASE_SELECTED_EDITABLE(v3d, base)) {
+      CTX_data_id_list_add(result, &base->object->id);
     }
-    CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
-    return 1;
   }
-  if (CTX_data_equals(member, "editable_objects")) {
-    /* Visible + Editable, but not necessarily selected */
-    LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
-      if (BASE_EDITABLE(v3d, base)) {
-        CTX_data_id_list_add(result, &base->object->id);
-      }
+  CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+  return 1;
+}
+static int screen_ctx_editable_objects(const bContext *C, bContextDataResult *result)
+{
+  wmWindow *win = CTX_wm_window(C);
+  View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
+  ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+
+  /* Visible + Editable, but not necessarily selected */
+  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
+    if (BASE_EDITABLE(v3d, base)) {
+      CTX_data_id_list_add(result, &base->object->id);
     }
-    CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
-    return 1;
   }
-  if (CTX_data_equals(member, "objects_in_mode")) {
-    if (obact && (obact->mode != OB_MODE_OBJECT)) {
-      FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, obact->type, obact->mode, ob_iter) {
-        CTX_data_id_list_add(result, &ob_iter->id);
-      }
-      FOREACH_OBJECT_IN_MODE_END;
+  CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+  return 1;
+}
+static int screen_ctx_objects_in_mode(const bContext *C, bContextDataResult *result)
+{
+  wmWindow *win = CTX_wm_window(C);
+  View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
+  ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+  Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
+
+  if (obact && (obact->mode != OB_MODE_OBJECT)) {
+    FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, obact->type, obact->mode, ob_iter) {
+      CTX_data_id_list_add(result, &ob_iter->id);
     }
-    CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
-    return 1;
+    FOREACH_OBJECT_IN_MODE_END;
   }
-  if (CTX_data_equals(member, "objects_in_mode_unique_data")) {
-    if (obact && (obact->mode != OB_MODE_OBJECT)) {
-      FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, obact->type, obact->mode, ob_iter) {
-        ob_iter->id.tag |= LIB_TAG_DOIT;
-      }
-      FOREACH_OBJECT_IN_MODE_END;
-      FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, obact->type, obact->mode, ob_iter) {
-        if (ob_iter->id.tag & LIB_TAG_DOIT) {
-          ob_iter->id.tag &= ~LIB_TAG_DOIT;
-          CTX_data_id_list_add(result, &ob_iter->id);
-        }
+  CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+  return 1;
+}
+static int screen_ctx_objects_in_mode_unique_data(const bContext *C, bContextDataResult *result)
+{
+  wmWindow *win = CTX_wm_window(C);
+  View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
+  ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+  Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
+
+  if (obact && (obact->mode != OB_MODE_OBJECT)) {
+    FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, obact->type, obact->mode, ob_iter) {
+      ob_iter->id.tag |= LIB_TAG_DOIT;
+    }
+    FOREACH_OBJECT_IN_MODE_END;
+    FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, obact->type, obact->mode, ob_iter) {
+      if (ob_iter->id.tag & LIB_TAG_DOIT) {
+        ob_iter->id.tag &= ~LIB_TAG_DOIT;
+        CTX_data_id_list_add(result, &ob_iter->id);
       }
-      FOREACH_OBJECT_IN_MODE_END;
     }
-    CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
-    return 1;
+    FOREACH_OBJECT_IN_MODE_END;
   }
-  if (CTX_data_equals(member, "visible_bones") || CTX_data_equals(member, "editable_bones")) {
-    bArmature *arm = (obedit && obedit->type == OB_ARMATURE) ? obedit->data : NULL;
-    EditBone *flipbone = NULL;
-    const bool editable_bones = CTX_data_equals(member, "editable_bones");
-
-    if (arm && arm->edbo) {
-      uint objects_len;
-      Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(
-          view_layer, CTX_wm_view3d(C), &objects_len);
-      for (uint i = 0; i < objects_len; i++) {
-        Object *ob = objects[i];
-        arm = ob->data;
-
-        /* Attention: X-Axis Mirroring is also handled here... */
-        LISTBASE_FOREACH (EditBone *, ebone, arm->edbo) {
-          /* first and foremost, bone must be visible and selected */
-          if (EBONE_VISIBLE(arm, ebone)) {
-            /* Get 'x-axis mirror equivalent' bone if the X-Axis Mirroring option is enabled
-             * so that most users of this data don't need to explicitly check for it themselves.
-             *
-             * We need to make sure that these mirrored copies are not selected, otherwise some
-             * bones will be operated on twice.
-             */
-            if (arm->flag & ARM_MIRROR_EDIT) {
-              flipbone = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
-            }
+  CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+  return 1;
+}
+static int screen_ctx_visible_or_editable_bones_(const bContext *C,
+                                                 bContextDataResult *result,
+                                                 const bool editable_bones)
+{
+  wmWindow *win = CTX_wm_window(C);
+  ViewLayer *view_layer = WM_window_get_active

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list