[Bf-blender-cvs] [354db59fb12] master: LibOverride: Rename 'delete hierarchy' to 'clear hierarchy', add 'clear single' operations.

Bastien Montagne noreply at git.blender.org
Tue Mar 29 18:05:44 CEST 2022


Commit: 354db59fb12a5ee595ae650ac3a736e3cc6df39d
Author: Bastien Montagne
Date:   Thu Mar 24 16:57:16 2022 +0100
Branches: master
https://developer.blender.org/rB354db59fb12a5ee595ae650ac3a736e3cc6df39d

LibOverride: Rename 'delete hierarchy' to 'clear hierarchy', add 'clear single' operations.

'Delete' was a confusing name, even though it would delete the overrides
it would replace them by linked data.

Adding the 'single' version of that operation made it even more
confusing, since often it has to keep the override ID for sakes of
hierarchy, and just reset it and turn it back into a non-editable system
override.

Ref: {T95707}.

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

M	source/blender/blenkernel/BKE_lib_override.h
M	source/blender/blenkernel/intern/lib_override.c
M	source/blender/editors/space_outliner/outliner_edit.cc
M	source/blender/editors/space_outliner/outliner_tools.cc
M	source/blender/makesrna/intern/rna_ID.c

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

diff --git a/source/blender/blenkernel/BKE_lib_override.h b/source/blender/blenkernel/BKE_lib_override.h
index daa94031489..2447208b49d 100644
--- a/source/blender/blenkernel/BKE_lib_override.h
+++ b/source/blender/blenkernel/BKE_lib_override.h
@@ -69,6 +69,14 @@ bool BKE_lib_override_library_is_user_edited(struct ID *id);
  */
 bool BKE_lib_override_library_is_system_defined(struct Main *bmain, struct ID *id);
 
+/**
+ * Check if given ID is a leaf in its liboverride hierarchy (i.e. if it does not use any other
+ * override ID).
+ *
+ * NOTE: Embedded IDs of override IDs are not considered as leaves.
+ */
+bool BKE_lib_override_library_is_hierarchy_leaf(struct Main *bmain, struct ID *id);
+
 /**
  * Create an overridden local copy of linked reference.
  *
@@ -374,12 +382,22 @@ bool BKE_lib_override_library_main_operations_create(struct Main *bmain, bool fo
 
 /**
  * Reset all overrides in given \a id_root, while preserving ID relations.
+ *
+ * \param do_reset_system_override If \a true, reset the given ID as a system override one (i.e.
+ * non-editable).
  */
-void BKE_lib_override_library_id_reset(struct Main *bmain, struct ID *id_root);
+void BKE_lib_override_library_id_reset(struct Main *bmain,
+                                       struct ID *id_root,
+                                       bool do_reset_system_override);
 /**
  * Reset all overrides in given \a id_root and its dependencies, while preserving ID relations.
+ *
+ * \param do_reset_system_override If \a true, reset the given ID and all of its descendants in the
+ * override hierarchy as system override ones (i.e. non-editable).
  */
-void BKE_lib_override_library_id_hierarchy_reset(struct Main *bmain, struct ID *id_root);
+void BKE_lib_override_library_id_hierarchy_reset(struct Main *bmain,
+                                                 struct ID *id_root,
+                                                 bool do_reset_system_override);
 
 /**
  * Set or clear given tag in all operations in that override property data.
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c
index edb23f51308..eb6d9fe358e 100644
--- a/source/blender/blenkernel/intern/lib_override.c
+++ b/source/blender/blenkernel/intern/lib_override.c
@@ -291,6 +291,32 @@ bool BKE_lib_override_library_is_system_defined(Main *bmain, ID *id)
   return false;
 }
 
+static int foreachid_is_hierarchy_leaf_fn(LibraryIDLinkCallbackData *cb_data)
+{
+  ID *id_owner = cb_data->id_owner;
+  ID *id = *cb_data->id_pointer;
+  bool *is_leaf = cb_data->user_data;
+
+  if (id != NULL && ID_IS_OVERRIDE_LIBRARY_REAL(id) &&
+      id->override_library->hierarchy_root == id_owner->override_library->hierarchy_root) {
+    *is_leaf = false;
+    return IDWALK_RET_STOP_ITER;
+  }
+  return IDWALK_RET_NOP;
+}
+
+bool BKE_lib_override_library_is_hierarchy_leaf(Main *bmain, ID *id)
+{
+  if (ID_IS_OVERRIDE_LIBRARY_REAL(id)) {
+    bool is_leaf = true;
+    BKE_library_foreach_ID_link(
+        bmain, id, foreachid_is_hierarchy_leaf_fn, &is_leaf, IDWALK_READONLY);
+    return is_leaf;
+  }
+
+  return false;
+}
+
 ID *BKE_lib_override_library_create_from_id(Main *bmain,
                                             ID *reference_id,
                                             const bool do_tagged_remap)
@@ -3058,10 +3084,16 @@ bool BKE_lib_override_library_main_operations_create(Main *bmain, const bool for
   return create_pool_data.changed;
 }
 
-static bool lib_override_library_id_reset_do(Main *bmain, ID *id_root)
+static bool lib_override_library_id_reset_do(Main *bmain,
+                                             ID *id_root,
+                                             const bool do_reset_system_override)
 {
   bool was_op_deleted = false;
 
+  if (do_reset_system_override) {
+    id_root->override_library->flag |= IDOVERRIDE_LIBRARY_FLAG_SYSTEM_DEFINED;
+  }
+
   LISTBASE_FOREACH_MUTABLE (
       IDOverrideLibraryProperty *, op, &id_root->override_library->properties) {
     bool do_op_delete = true;
@@ -3117,13 +3149,15 @@ static bool lib_override_library_id_reset_do(Main *bmain, ID *id_root)
   return was_op_deleted;
 }
 
-void BKE_lib_override_library_id_reset(Main *bmain, ID *id_root)
+void BKE_lib_override_library_id_reset(Main *bmain,
+                                       ID *id_root,
+                                       const bool do_reset_system_override)
 {
   if (!ID_IS_OVERRIDE_LIBRARY_REAL(id_root)) {
     return;
   }
 
-  if (lib_override_library_id_reset_do(bmain, id_root)) {
+  if (lib_override_library_id_reset_do(bmain, id_root, do_reset_system_override)) {
     if (id_root->override_library->runtime != NULL &&
         (id_root->override_library->runtime->tag & IDOVERRIDE_LIBRARY_RUNTIME_TAG_NEEDS_RELOAD) !=
             0) {
@@ -3133,7 +3167,9 @@ void BKE_lib_override_library_id_reset(Main *bmain, ID *id_root)
   }
 }
 
-static void lib_override_library_id_hierarchy_recursive_reset(Main *bmain, ID *id_root)
+static void lib_override_library_id_hierarchy_recursive_reset(Main *bmain,
+                                                              ID *id_root,
+                                                              const bool do_reset_system_override)
 {
   if (!ID_IS_OVERRIDE_LIBRARY_REAL(id_root)) {
     return;
@@ -3142,7 +3178,7 @@ static void lib_override_library_id_hierarchy_recursive_reset(Main *bmain, ID *i
   void **entry_vp = BLI_ghash_lookup_p(bmain->relations->relations_from_pointers, id_root);
   if (entry_vp == NULL) {
     /* This ID is not used by nor using any other ID. */
-    lib_override_library_id_reset_do(bmain, id_root);
+    lib_override_library_id_reset_do(bmain, id_root, do_reset_system_override);
     return;
   }
 
@@ -3152,7 +3188,7 @@ static void lib_override_library_id_hierarchy_recursive_reset(Main *bmain, ID *i
     return;
   }
 
-  lib_override_library_id_reset_do(bmain, id_root);
+  lib_override_library_id_reset_do(bmain, id_root, do_reset_system_override);
 
   /* This way we won't process again that ID, should we encounter it again through another
    * relationship hierarchy. */
@@ -3169,17 +3205,19 @@ static void lib_override_library_id_hierarchy_recursive_reset(Main *bmain, ID *i
     if (*to_id_entry->id_pointer.to != NULL) {
       ID *to_id = *to_id_entry->id_pointer.to;
       if (to_id->override_library != NULL) {
-        lib_override_library_id_hierarchy_recursive_reset(bmain, to_id);
+        lib_override_library_id_hierarchy_recursive_reset(bmain, to_id, do_reset_system_override);
       }
     }
   }
 }
 
-void BKE_lib_override_library_id_hierarchy_reset(Main *bmain, ID *id_root)
+void BKE_lib_override_library_id_hierarchy_reset(Main *bmain,
+                                                 ID *id_root,
+                                                 const bool do_reset_system_override)
 {
   BKE_main_relations_create(bmain, 0);
 
-  lib_override_library_id_hierarchy_recursive_reset(bmain, id_root);
+  lib_override_library_id_hierarchy_recursive_reset(bmain, id_root, do_reset_system_override);
 
   BKE_main_relations_free(bmain);
 
diff --git a/source/blender/editors/space_outliner/outliner_edit.cc b/source/blender/editors/space_outliner/outliner_edit.cc
index ae67e7108bf..d6c5901b546 100644
--- a/source/blender/editors/space_outliner/outliner_edit.cc
+++ b/source/blender/editors/space_outliner/outliner_edit.cc
@@ -30,6 +30,7 @@
 #include "BKE_context.h"
 #include "BKE_idtype.h"
 #include "BKE_lib_id.h"
+#include "BKE_lib_override.h"
 #include "BKE_lib_query.h"
 #include "BKE_lib_remap.h"
 #include "BKE_main.h"
diff --git a/source/blender/editors/space_outliner/outliner_tools.cc b/source/blender/editors/space_outliner/outliner_tools.cc
index 6593fb9b6af..22e42c762ca 100644
--- a/source/blender/editors/space_outliner/outliner_tools.cc
+++ b/source/blender/editors/space_outliner/outliner_tools.cc
@@ -47,6 +47,7 @@
 #include "BKE_lib_id.h"
 #include "BKE_lib_override.h"
 #include "BKE_lib_query.h"
+#include "BKE_lib_remap.h"
 #include "BKE_main.h"
 #include "BKE_object.h"
 #include "BKE_report.h"
@@ -1008,6 +1009,23 @@ static void id_override_library_create_hierarchy_post_process(bContext *C,
   FOREACH_MAIN_ID_END;
 }
 
+static void id_override_library_toggle_flag_fn(bContext *UNUSED(C),
+                                               ReportList *UNUSED(reports),
+                                               Scene *UNUSED(scene),
+                                               TreeElement *UNUSED(te),
+                                               TreeStoreElem *UNUSED(tsep),
+                                               TreeStoreElem *tselem,
+                                               void *user_data)
+{
+  BLI_assert(TSE_IS_REAL_ID(tselem));
+  ID *id = tselem->id;
+
+  if (ID_IS_OVERRIDE_LIBRARY_REAL(id)) {
+    const uint flag = POINTER_AS_UINT(user_data);
+    id->override_library->flag ^= flag;
+  }
+}
+
 static void id_override_library_reset_fn(bContext *C,
                                          ReportList *UNUSED(reports),
                                          Scene *UNUSED(scene),
@@ -1025,10 +1043,10 @@ static void id_override_library_reset_fn(bContext *C,
     Main *bmain = CTX_data_main(C);
 
     if (do_hierarchy) {
-      BKE_lib_override_library_id_hierarchy_reset(bmain, id_root);
+      BKE_lib_override_library_id_hierarchy_reset(bmain, id_root, false);
     }
     else {
-      BKE_lib_override_library_id_reset(bmain, id_root);
+      BKE_lib_override_library_id_reset(bmain, id_root, false);
     }
 
     WM_event_add_notifier(C, NC_WM | ND_DATACHANGED, nullptr);
@@ -1080,40 +1098,76 @@ static void id_override_library_resync_fn(bContext *C,
   }
 }
 
-static void id_override_library_delete_fn(bContext *C,
-                                          ReportList *UNUSED(reports),
-                                          Scene *UNUSED(scene),
-                                          TreeElement *te,
-                                          TreeStoreElem *UNUSED(tsep),
-                                          TreeStoreElem *tselem,
-                                          void *UNUSED(user_data))
+static void id_override_library_clear_hierarchy_fn(bCon

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list