Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <bastien@blender.org>2022-08-24 18:12:01 +0300
committerBastien Montagne <bastien@blender.org>2022-08-24 18:12:01 +0300
commit5d4d5a216271e22ed9775402dedff33cdf420e30 (patch)
tree6ef6e3f20fac05e50ebaba3da5c5c9a283154a9f /source/blender/editors/interface
parent61896947d4b75829d4275043e1554bd5eb4d8abb (diff)
parent8b7293eb4168908945d562fdd1c3f8cd4d4944e5 (diff)
Merge branch 'blender-v3.3-release'
Diffstat (limited to 'source/blender/editors/interface')
-rw-r--r--source/blender/editors/interface/interface_intern.h2
-rw-r--r--source/blender/editors/interface/interface_ops.cc83
-rw-r--r--source/blender/editors/interface/interface_templates.c34
3 files changed, 74 insertions, 45 deletions
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index ca5922353de..c8468950c34 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -1544,7 +1544,7 @@ uiButViewItem *ui_block_view_find_matching_view_item_but_in_old_block(
struct uiListType *UI_UL_cache_file_layers(void);
-struct ID *ui_template_id_liboverride_hierarchy_create(struct bContext *C,
+struct ID *ui_template_id_liboverride_hierarchy_make(struct bContext *C,
struct Main *bmain,
struct ID *owner_id,
struct ID *id,
diff --git a/source/blender/editors/interface/interface_ops.cc b/source/blender/editors/interface/interface_ops.cc
index 0657e17f1dc..dbedbe550ba 100644
--- a/source/blender/editors/interface/interface_ops.cc
+++ b/source/blender/editors/interface/interface_ops.cc
@@ -801,12 +801,12 @@ static bool override_idtemplate_poll(bContext *C, const bool is_create_op)
return true;
}
-static bool override_idtemplate_create_poll(bContext *C)
+static bool override_idtemplate_make_poll(bContext *C)
{
return override_idtemplate_poll(C, true);
}
-static int override_idtemplate_create_exec(bContext *C, wmOperator *UNUSED(op))
+static int override_idtemplate_make_exec(bContext *C, wmOperator *UNUSED(op))
{
ID *owner_id, *id;
PointerRNA owner_ptr;
@@ -816,42 +816,49 @@ static int override_idtemplate_create_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_CANCELLED;
}
- ID *id_override = ui_template_id_liboverride_hierarchy_create(
+ ID *id_override = ui_template_id_liboverride_hierarchy_make(
C, CTX_data_main(C), owner_id, id, NULL);
if (id_override == NULL) {
return OPERATOR_CANCELLED;
}
- if (ID_IS_OVERRIDE_LIBRARY_REAL(owner_id)) {
- PointerRNA idptr;
- /* `idptr` is re-assigned to owner property to ensure proper updates etc. Here we also use it
- * to ensure remapping of the owner property from the linked data to the newly created
- * liboverride (note that in theory this remapping has already been done by code above), but
- * only in case owner ID was already an existing liboverride.
- *
- * Otherwise, owner ID will also have been overridden, and remapped already to use it's
- * override of the data too. */
+ PointerRNA idptr;
+ /* `idptr` is re-assigned to owner property to ensure proper updates etc. Here we also use it
+ * to ensure remapping of the owner property from the linked data to the newly created
+ * liboverride (note that in theory this remapping has already been done by code above), but
+ * only in case owner ID was already local ID (override or pure local data).
+ *
+ * Otherwise, owner ID will also have been overridden, and remapped already to use it's
+ * override of the data too. */
+ if (!ID_IS_LINKED(owner_id)) {
RNA_id_pointer_create(id_override, &idptr);
RNA_property_pointer_set(&owner_ptr, prop, idptr, NULL);
- RNA_property_update(C, &owner_ptr, prop);
}
+ RNA_property_update(C, &owner_ptr, prop);
+
+ /* 'Security' extra tagging, since this process may also affect the owner ID and not only the
+ * used ID, relying on the property update code only is not always enough. */
+ DEG_id_tag_update(&CTX_data_scene(C)->id, ID_RECALC_BASE_FLAGS | ID_RECALC_COPY_ON_WRITE);
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+ WM_event_add_notifier(C, NC_WM | ND_LIB_OVERRIDE_CHANGED, NULL);
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL);
return OPERATOR_FINISHED;
}
-static void UI_OT_override_idtemplate_create(wmOperatorType *ot)
+static void UI_OT_override_idtemplate_make(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Create Library Override";
- ot->idname = "UI_OT_override_idtemplate_create";
+ ot->name = "Make Library Override";
+ ot->idname = "UI_OT_override_idtemplate_make";
ot->description =
"Create a local override of the selected linked data-block, and its hierarchy of "
"dependencies";
/* callbacks */
- ot->poll = override_idtemplate_create_poll;
- ot->exec = override_idtemplate_create_exec;
+ ot->poll = override_idtemplate_make_poll;
+ ot->exec = override_idtemplate_make_exec;
/* flags */
ot->flag = OPTYPE_UNDO;
@@ -884,6 +891,9 @@ static int override_idtemplate_reset_exec(bContext *C, wmOperator *UNUSED(op))
RNA_property_pointer_set(&owner_ptr, prop, idptr, NULL);
RNA_property_update(C, &owner_ptr, prop);
+ /* No need for 'security' extra tagging here, since this process will never affect the owner ID.
+ */
+
return OPERATOR_FINISHED;
}
@@ -922,24 +932,45 @@ static int override_idtemplate_clear_exec(bContext *C, wmOperator *UNUSED(op))
}
Main *bmain = CTX_data_main(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Scene *scene = CTX_data_scene(C);
ID *id_new = id;
+
if (BKE_lib_override_library_is_hierarchy_leaf(bmain, id)) {
id_new = id->override_library->reference;
+ bool do_remap_active = false;
+ if (OBACT(view_layer) == (Object *)id) {
+ BLI_assert(GS(id->name) == ID_OB);
+ BLI_assert(GS(id_new->name) == ID_OB);
+ do_remap_active = true;
+ }
BKE_libblock_remap(bmain, id, id_new, ID_REMAP_SKIP_INDIRECT_USAGE);
+ if (do_remap_active) {
+ Object *ref_object = (Object *)id_new;
+ Base *basact = BKE_view_layer_base_find(view_layer, ref_object);
+ if (basact != NULL) {
+ view_layer->basact = basact;
+ }
+ DEG_id_tag_update(&scene->id, ID_RECALC_SELECT);
+ }
BKE_id_delete(bmain, id);
}
else {
BKE_lib_override_library_id_reset(bmain, id, true);
}
- PointerRNA idptr;
- /* `idptr` is re-assigned to owner property to ensure proper updates etc. Here we also use it to
- * ensure remapping of the owner property from the linked data to the newly created liboverride
- * (note that in theory this remapping has already been done by code above). */
- RNA_id_pointer_create(id_new, &idptr);
- RNA_property_pointer_set(&owner_ptr, prop, idptr, NULL);
+ /* Here the affected ID may remain the same, or be replaced by its linked reference. In either
+ * case, the owner ID remains unchanged, and remapping is already handled by internal code, so
+ * calling `RNA_property_update` on it is enough to ensure proper notifiers are sent. */
RNA_property_update(C, &owner_ptr, prop);
+ /* 'Security' extra tagging, since this process may also affect the owner ID and not only the
+ * used ID, relying on the property update code only is not always enough. */
+ DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS | ID_RECALC_COPY_ON_WRITE);
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+ WM_event_add_notifier(C, NC_WM | ND_LIB_OVERRIDE_CHANGED, NULL);
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
return OPERATOR_FINISHED;
}
@@ -979,7 +1010,7 @@ static bool override_idtemplate_menu_poll(const bContext *C_const, MenuType *UNU
static void override_idtemplate_menu_draw(const bContext *UNUSED(C), Menu *menu)
{
uiLayout *layout = menu->layout;
- uiItemO(layout, IFACE_("Make"), ICON_NONE, "UI_OT_override_idtemplate_create");
+ uiItemO(layout, IFACE_("Make"), ICON_NONE, "UI_OT_override_idtemplate_make");
uiItemO(layout, IFACE_("Reset"), ICON_NONE, "UI_OT_override_idtemplate_reset");
uiItemO(layout, IFACE_("Clear"), ICON_NONE, "UI_OT_override_idtemplate_clear");
}
@@ -2501,7 +2532,7 @@ void ED_operatortypes_ui(void)
WM_operatortype_append(UI_OT_override_type_set_button);
WM_operatortype_append(UI_OT_override_remove_button);
- WM_operatortype_append(UI_OT_override_idtemplate_create);
+ WM_operatortype_append(UI_OT_override_idtemplate_make);
WM_operatortype_append(UI_OT_override_idtemplate_reset);
WM_operatortype_append(UI_OT_override_idtemplate_clear);
override_idtemplate_menu();
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 4eee9927264..86857d784dc 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -653,7 +653,7 @@ static void template_id_liboverride_hierarchy_collections_tag_recursive(
}
}
-ID *ui_template_id_liboverride_hierarchy_create(
+ID *ui_template_id_liboverride_hierarchy_make(
bContext *C, Main *bmain, ID *owner_id, ID *id, const char **r_undo_push_label)
{
const char *undo_push_label;
@@ -872,27 +872,27 @@ ID *ui_template_id_liboverride_hierarchy_create(
return id_override;
}
-static void template_id_liboverride_hierarchy_create(bContext *C,
- Main *bmain,
- TemplateID *template_ui,
- PointerRNA *idptr,
- const char **r_undo_push_label)
+static void template_id_liboverride_hierarchy_make(bContext *C,
+ Main *bmain,
+ TemplateID *template_ui,
+ PointerRNA *idptr,
+ const char **r_undo_push_label)
{
ID *id = idptr->data;
ID *owner_id = template_ui->ptr.owner_id;
- ID *id_override = ui_template_id_liboverride_hierarchy_create(
+ ID *id_override = ui_template_id_liboverride_hierarchy_make(
C, bmain, owner_id, id, r_undo_push_label);
if (id_override != NULL) {
- /* Given `idptr` is re-assigned to owner property by caller to ensure proper updates etc. Here
- * we also use it to ensure remapping of the owner property from the linked data to the newly
- * created liboverride (note that in theory this remapping has already been done by code
- * above), but only in case owner ID was already an existing liboverride.
+ /* `idptr` is re-assigned to owner property to ensure proper updates etc. Here we also use it
+ * to ensure remapping of the owner property from the linked data to the newly created
+ * liboverride (note that in theory this remapping has already been done by code above), but
+ * only in case owner ID was already local ID (override or pure local data).
*
- * Otherwise, owner ID will also have been overridden, and remapped already to use
- * it's override of the data too. */
- if (ID_IS_OVERRIDE_LIBRARY_REAL(owner_id)) {
+ * Otherwise, owner ID will also have been overridden, and remapped already to use it's
+ * override of the data too. */
+ if (!ID_IS_LINKED(owner_id)) {
RNA_id_pointer_create(id_override, idptr);
}
}
@@ -950,8 +950,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
if (id) {
Main *bmain = CTX_data_main(C);
if (CTX_wm_window(C)->eventstate->modifier & KM_SHIFT) {
- template_id_liboverride_hierarchy_create(
- C, bmain, template_ui, &idptr, &undo_push_label);
+ template_id_liboverride_hierarchy_make(C, bmain, template_ui, &idptr, &undo_push_label);
}
else {
if (BKE_lib_id_make_local(bmain, id, 0)) {
@@ -972,8 +971,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
if (id && ID_IS_OVERRIDE_LIBRARY(id)) {
Main *bmain = CTX_data_main(C);
if (CTX_wm_window(C)->eventstate->modifier & KM_SHIFT) {
- template_id_liboverride_hierarchy_create(
- C, bmain, template_ui, &idptr, &undo_push_label);
+ template_id_liboverride_hierarchy_make(C, bmain, template_ui, &idptr, &undo_push_label);
}
else {
BKE_lib_override_library_make_local(id);