Merge branch 'blender-v3.2-release'
This commit is contained in:
commit
b2e5fc72c8
|
@ -252,65 +252,6 @@ static int object_add_drop_xy_generic_invoke(bContext *C, wmOperator *op, const
|
|||
return op->type->exec(C, op);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to find an ID in \a bmain. Three needs to be either a "name" string or "session_uuid" int
|
||||
* property defined and set. The former has priority.
|
||||
*
|
||||
* See #id_add_lookup_props for a helper to add the properties.
|
||||
*/
|
||||
static ID *id_add_lookup_from_name_or_session_uuid_props(Main *bmain,
|
||||
const wmOperator *op,
|
||||
const ID_Type type)
|
||||
{
|
||||
PropertyRNA *prop_name = RNA_struct_find_property(op->ptr, "name");
|
||||
PropertyRNA *prop_session_uuid = RNA_struct_find_property(op->ptr, "session_uuid");
|
||||
|
||||
if (prop_name && RNA_property_is_set(op->ptr, prop_name)) {
|
||||
char name[MAX_ID_NAME - 2];
|
||||
RNA_property_string_get(op->ptr, prop_name, name);
|
||||
return BKE_libblock_find_name(bmain, type, name);
|
||||
}
|
||||
|
||||
if (prop_session_uuid && RNA_property_is_set(op->ptr, prop_session_uuid)) {
|
||||
const uint32_t session_uuid = (uint32_t)RNA_property_int_get(op->ptr, prop_session_uuid);
|
||||
return BKE_libblock_find_session_uuid(bmain, type, session_uuid);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds "name" and "session_uuid" properties to the operator so the caller can tell the operator
|
||||
* which ID to add. See #id_add_find_from_name_or_session_uuid_op_props(). Both properties will be
|
||||
* hidden in the UI.
|
||||
*
|
||||
* \note New operators should probably use "session_uuid" only (set \a add_name_prop to #false),
|
||||
* since this works with linked data and/or library overrides (in both cases, multiple IDs with the
|
||||
* same name and type may be present). The "name" property is only kept to not break compatibility
|
||||
* with old scripts using these operators.
|
||||
*/
|
||||
static void id_add_lookup_props(wmOperatorType *ot, const bool add_name_prop = false)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
|
||||
if (add_name_prop) {
|
||||
prop = RNA_def_string(
|
||||
ot->srna, "name", nullptr, MAX_ID_NAME - 2, "Name", "Name of the data-block to add");
|
||||
RNA_def_property_flag(prop, (PropertyFlag)(PROP_SKIP_SAVE | PROP_HIDDEN));
|
||||
}
|
||||
|
||||
prop = RNA_def_int(ot->srna,
|
||||
"session_uuid",
|
||||
0,
|
||||
INT32_MIN,
|
||||
INT32_MAX,
|
||||
"Session UUID",
|
||||
"Session UUID of the data-block to add",
|
||||
INT32_MIN,
|
||||
INT32_MAX);
|
||||
RNA_def_property_flag(prop, (PropertyFlag)(PROP_SKIP_SAVE | PROP_HIDDEN));
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
@ -1712,7 +1653,7 @@ static std::optional<CollectionAddInfo> collection_add_info_get_from_op(bContext
|
|||
PropertyRNA *prop_location = RNA_struct_find_property(op->ptr, "location");
|
||||
|
||||
add_info.collection = reinterpret_cast<Collection *>(
|
||||
id_add_lookup_from_name_or_session_uuid_props(bmain, op, ID_GR));
|
||||
WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op, ID_GR));
|
||||
|
||||
bool update_location_if_necessary = false;
|
||||
if (add_info.collection) {
|
||||
|
@ -3860,7 +3801,7 @@ static int object_add_named_exec(bContext *C, wmOperator *op)
|
|||
/* Find object, create fake base. */
|
||||
|
||||
Object *ob = reinterpret_cast<Object *>(
|
||||
id_add_lookup_from_name_or_session_uuid_props(bmain, op, ID_OB));
|
||||
WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op, ID_OB));
|
||||
|
||||
if (ob == nullptr) {
|
||||
BKE_report(op->reports, RPT_ERROR, "Object not found");
|
||||
|
@ -3948,7 +3889,7 @@ void OBJECT_OT_add_named(wmOperatorType *ot)
|
|||
"Linked",
|
||||
"Duplicate object but not object data, linking to the original data");
|
||||
|
||||
id_add_lookup_props(ot, true);
|
||||
WM_operator_properties_id_lookup(ot, true);
|
||||
|
||||
prop = RNA_def_float_matrix(
|
||||
ot->srna, "matrix", 4, 4, nullptr, 0.0f, 0.0f, "Matrix", "", 0.0f, 0.0f);
|
||||
|
@ -3972,7 +3913,7 @@ static int object_transform_to_mouse_exec(bContext *C, wmOperator *op)
|
|||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
|
||||
Object *ob = reinterpret_cast<Object *>(
|
||||
id_add_lookup_from_name_or_session_uuid_props(bmain, op, ID_OB));
|
||||
WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op, ID_OB));
|
||||
|
||||
if (!ob) {
|
||||
ob = OBACT(view_layer);
|
||||
|
|
|
@ -2640,11 +2640,9 @@ static int drop_named_material_invoke(bContext *C, wmOperator *op, const wmEvent
|
|||
Object *ob = ED_view3d_give_material_slot_under_cursor(C, event->mval, &mat_slot);
|
||||
mat_slot = max_ii(mat_slot, 1);
|
||||
|
||||
Material *ma;
|
||||
char name[MAX_ID_NAME - 2];
|
||||
Material *ma = (Material *)WM_operator_properties_id_lookup_from_name_or_session_uuid(
|
||||
bmain, op, ID_MA);
|
||||
|
||||
RNA_string_get(op->ptr, "name", name);
|
||||
ma = (Material *)BKE_libblock_find_name(bmain, ID_MA, name);
|
||||
if (ob == NULL || ma == NULL) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
@ -2674,7 +2672,7 @@ void OBJECT_OT_drop_named_material(wmOperatorType *ot)
|
|||
ot->flag = OPTYPE_UNDO | OPTYPE_INTERNAL;
|
||||
|
||||
/* properties */
|
||||
RNA_def_string(ot->srna, "name", "Material", MAX_ID_NAME - 2, "Name", "Material name to assign");
|
||||
WM_operator_properties_id_lookup(ot, true);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -823,15 +823,15 @@ static void view3d_id_drop_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *dr
|
|||
{
|
||||
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
|
||||
|
||||
RNA_string_set(drop->ptr, "name", id->name + 2);
|
||||
WM_operator_properties_id_lookup_set_from_id(drop->ptr, id);
|
||||
}
|
||||
|
||||
static void view3d_id_drop_copy_with_type(bContext *UNUSED(C), wmDrag *drag, wmDropBox *drop)
|
||||
{
|
||||
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
|
||||
|
||||
RNA_string_set(drop->ptr, "name", id->name + 2);
|
||||
RNA_enum_set(drop->ptr, "type", GS(id->name));
|
||||
WM_operator_properties_id_lookup_set_from_id(drop->ptr, id);
|
||||
}
|
||||
|
||||
static void view3d_id_path_drop_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *drop)
|
||||
|
@ -839,7 +839,7 @@ static void view3d_id_path_drop_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBo
|
|||
ID *id = WM_drag_get_local_ID_or_import_from_asset(drag, 0);
|
||||
|
||||
if (id) {
|
||||
RNA_string_set(drop->ptr, "name", id->name + 2);
|
||||
WM_operator_properties_id_lookup_set_from_id(drop->ptr, id);
|
||||
RNA_struct_property_unset(drop->ptr, "filepath");
|
||||
}
|
||||
else if (drag->path[0]) {
|
||||
|
|
|
@ -770,6 +770,36 @@ void WM_operator_properties_filesel(struct wmOperatorType *ot,
|
|||
eFileSel_Flag flag,
|
||||
short display,
|
||||
short sort);
|
||||
|
||||
/**
|
||||
* Tries to pass \a id to an operator via either a "session_uuid" or a "name" property defined in
|
||||
* the properties of \a ptr. The former is preferred, since it works properly with linking and
|
||||
* library overrides (which may both result in multiple IDs with the same name and type).
|
||||
*
|
||||
* Also see #WM_operator_properties_id_lookup() and
|
||||
* #WM_operator_properties_id_lookup_from_name_or_session_uuid()
|
||||
*/
|
||||
void WM_operator_properties_id_lookup_set_from_id(PointerRNA *ptr, const ID *id);
|
||||
/**
|
||||
* Tries to find an ID in \a bmain. There needs to be either a "name" string or "session_uuid" int
|
||||
* property defined and set. The former has priority. See #WM_operator_properties_id_lookup() for a
|
||||
* helper to add the properties.
|
||||
*/
|
||||
struct ID *WM_operator_properties_id_lookup_from_name_or_session_uuid(struct Main *bmain,
|
||||
const struct wmOperator *op,
|
||||
enum ID_Type type);
|
||||
/**
|
||||
* Adds "name" and "session_uuid" properties so the caller can tell the operator which ID to act
|
||||
* on. See #WM_operator_properties_id_lookup_from_name_or_session_uuid(). Both properties will be
|
||||
* hidden in the UI and not be saved over consecutive operator calls.
|
||||
*
|
||||
* \note New operators should probably use "session_uuid" only (set \a add_name_prop to #false),
|
||||
* since this works properly with linked data and/or library overrides (in both cases, multiple IDs
|
||||
* with the same name and type may be present). The "name" property is only kept to not break
|
||||
* compatibility with old scripts using some previously existing operators.
|
||||
*/
|
||||
void WM_operator_properties_id_lookup(wmOperatorType *ot, const bool add_name_prop);
|
||||
|
||||
/**
|
||||
* Disable using cursor position,
|
||||
* use when view operators are initialized from buttons.
|
||||
|
|
|
@ -8,8 +8,12 @@
|
|||
* (`WM_operator_properties_*` functions).
|
||||
*/
|
||||
|
||||
#include "DNA_ID_enums.h"
|
||||
#include "DNA_space_types.h"
|
||||
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_main.h"
|
||||
|
||||
#include "BLI_math_base.h"
|
||||
#include "BLI_rect.h"
|
||||
|
||||
|
@ -222,6 +226,69 @@ void WM_operator_properties_filesel(wmOperatorType *ot,
|
|||
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
||||
}
|
||||
|
||||
void WM_operator_properties_id_lookup_set_from_id(PointerRNA *ptr, const ID *id)
|
||||
{
|
||||
PropertyRNA *prop_session_uuid = RNA_struct_find_property(ptr, "session_uuid");
|
||||
PropertyRNA *prop_name = RNA_struct_find_property(ptr, "name");
|
||||
|
||||
if (prop_session_uuid) {
|
||||
RNA_int_set(ptr, "session_uuid", (int)id->session_uuid);
|
||||
}
|
||||
else if (prop_name) {
|
||||
RNA_string_set(ptr, "name", id->name + 2);
|
||||
}
|
||||
else {
|
||||
BLI_assert_unreachable();
|
||||
}
|
||||
}
|
||||
|
||||
ID *WM_operator_properties_id_lookup_from_name_or_session_uuid(Main *bmain,
|
||||
const wmOperator *op,
|
||||
const ID_Type type)
|
||||
{
|
||||
PropertyRNA *prop_name = RNA_struct_find_property(op->ptr, "name");
|
||||
PropertyRNA *prop_session_uuid = RNA_struct_find_property(op->ptr, "session_uuid");
|
||||
|
||||
if (prop_name && RNA_property_is_set(op->ptr, prop_name)) {
|
||||
char name[MAX_ID_NAME - 2];
|
||||
RNA_property_string_get(op->ptr, prop_name, name);
|
||||
return BKE_libblock_find_name(bmain, type, name);
|
||||
}
|
||||
|
||||
if (prop_session_uuid && RNA_property_is_set(op->ptr, prop_session_uuid)) {
|
||||
const uint32_t session_uuid = (uint32_t)RNA_property_int_get(op->ptr, prop_session_uuid);
|
||||
return BKE_libblock_find_session_uuid(bmain, type, session_uuid);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void WM_operator_properties_id_lookup(wmOperatorType *ot, const bool add_name_prop)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
|
||||
if (add_name_prop) {
|
||||
prop = RNA_def_string(ot->srna,
|
||||
"name",
|
||||
NULL,
|
||||
MAX_ID_NAME - 2,
|
||||
"Name",
|
||||
"Name of the data-block to use by the operator");
|
||||
RNA_def_property_flag(prop, (PropertyFlag)(PROP_SKIP_SAVE | PROP_HIDDEN));
|
||||
}
|
||||
|
||||
prop = RNA_def_int(ot->srna,
|
||||
"session_uuid",
|
||||
0,
|
||||
INT32_MIN,
|
||||
INT32_MAX,
|
||||
"Session UUID",
|
||||
"Session UUID of the data-block to use by the operator",
|
||||
INT32_MIN,
|
||||
INT32_MAX);
|
||||
RNA_def_property_flag(prop, (PropertyFlag)(PROP_SKIP_SAVE | PROP_HIDDEN));
|
||||
}
|
||||
|
||||
static void wm_operator_properties_select_action_ex(wmOperatorType *ot,
|
||||
int default_action,
|
||||
const EnumPropertyItem *select_actions,
|
||||
|
|
Loading…
Reference in New Issue