Link/Append: Refactor flags.
Flags controlling link/append code are split between two enums, one in `DNA_space_types.h` and one in `BLO_readfile.h`. This commit: - Moves flags exclusively used in WM and BLO code to `eBLOLibLinkFlags` in `BLO_readfile.h`. Flags in `eFileSel_Params_Flag` from `DNA_space_types.h` are now only the ones effectively used by the file browser editor code too. - Fixes some internal utils in `readfile.c` still taking `short` flag parameter instead of proper `int` one. NOTE: there are a few other flags that could probably be moved to `eBLOLibLinkFlags` (at the very least `FILE_LINK`, probably also `FILE_AUTOSELECT` and `FILE_ACTIVE_COLLECTION`), since those are not effectively used by the file browser, and control linking/appending behavior, not filebrowser behavior. However for now think it's safer to not touch that.
This commit is contained in:
@@ -209,6 +209,14 @@ typedef enum eBLOLibLinkFlags {
|
||||
* don't need to remember to set this flag.
|
||||
*/
|
||||
BLO_LIBLINK_NEEDS_ID_TAG_DOIT = 1 << 18,
|
||||
/** Set fake user on appended IDs. */
|
||||
BLO_LIBLINK_APPEND_SET_FAKEUSER = 1 << 19,
|
||||
/** Append (make local) also indirect dependencies of appendeds IDs. */
|
||||
BLO_LIBLINK_APPEND_RECURSIVE = 1 << 20,
|
||||
/** Instantiate object data IDs (i.e. create objects for them if needed). */
|
||||
BLO_LIBLINK_OBDATA_INSTANCE = 1 << 21,
|
||||
/** Instantiate collections as empties, instead of linking them into current view layer. */
|
||||
BLO_LIBLINK_COLLECTION_INSTANCE = 1 << 22,
|
||||
} eBLOLibLinkFlags;
|
||||
|
||||
/**
|
||||
|
||||
@@ -4496,7 +4496,7 @@ static void add_loose_objects_to_scene(Main *mainvar,
|
||||
ViewLayer *view_layer,
|
||||
const View3D *v3d,
|
||||
Library *lib,
|
||||
const short flag)
|
||||
const int flag)
|
||||
{
|
||||
Collection *active_collection = NULL;
|
||||
const bool do_append = (flag & FILE_LINK) == 0;
|
||||
@@ -4556,9 +4556,9 @@ static void add_loose_object_data_to_scene(Main *mainvar,
|
||||
Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
const View3D *v3d,
|
||||
const short flag)
|
||||
const int flag)
|
||||
{
|
||||
if ((flag & FILE_OBDATA_INSTANCE) == 0) {
|
||||
if ((flag & BLO_LIBLINK_OBDATA_INSTANCE) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4617,7 +4617,7 @@ static void add_collections_to_scene(Main *mainvar,
|
||||
ViewLayer *view_layer,
|
||||
const View3D *v3d,
|
||||
Library *lib,
|
||||
const short flag)
|
||||
const int flag)
|
||||
{
|
||||
Collection *active_collection = scene->master_collection;
|
||||
if (flag & FILE_ACTIVE_COLLECTION) {
|
||||
@@ -4627,7 +4627,7 @@ static void add_collections_to_scene(Main *mainvar,
|
||||
|
||||
/* Give all objects which are tagged a base. */
|
||||
LISTBASE_FOREACH (Collection *, collection, &mainvar->collections) {
|
||||
if ((flag & FILE_COLLECTION_INSTANCE) && (collection->id.tag & LIB_TAG_DOIT)) {
|
||||
if ((flag & BLO_LIBLINK_COLLECTION_INSTANCE) && (collection->id.tag & LIB_TAG_DOIT)) {
|
||||
/* Any indirect collection should not have been tagged. */
|
||||
BLI_assert((collection->id.tag & LIB_TAG_INDIRECT) == 0);
|
||||
|
||||
@@ -4830,7 +4830,7 @@ static bool library_link_idcode_needs_tag_check(const short idcode, const int fl
|
||||
if (ELEM(idcode, ID_OB, ID_GR)) {
|
||||
return true;
|
||||
}
|
||||
if (flag & FILE_OBDATA_INSTANCE) {
|
||||
if (flag & BLO_LIBLINK_OBDATA_INSTANCE) {
|
||||
if (OB_DATA_SUPPORT_ID(idcode)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3416,8 +3416,8 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
||||
case SPACE_FILE: {
|
||||
SpaceFile *sfile = (SpaceFile *)sl;
|
||||
if (sfile->params) {
|
||||
sfile->params->flag &= ~(FILE_APPEND_SET_FAKEUSER | FILE_APPEND_RECURSIVE |
|
||||
FILE_OBDATA_INSTANCE);
|
||||
sfile->params->flag &= ~(FILE_PARAMS_FLAG_UNUSED_1 | FILE_PARAMS_FLAG_UNUSED_2 |
|
||||
FILE_PARAMS_FLAG_UNUSED_3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1438,5 +1438,24 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
|
||||
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
|
||||
LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
|
||||
switch (sl->spacetype) {
|
||||
case SPACE_FILE: {
|
||||
SpaceFile *sfile = (SpaceFile *)sl;
|
||||
if (sfile->params) {
|
||||
sfile->params->flag &= ~(FILE_PARAMS_FLAG_UNUSED_1 | FILE_PARAMS_FLAG_UNUSED_2 |
|
||||
FILE_PARAMS_FLAG_UNUSED_3 | FILE_PARAMS_FLAG_UNUSED_4);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -984,17 +984,17 @@ typedef enum eFileSel_Action {
|
||||
* (WM and BLO code area, see #eBLOLibLinkFlags in BLO_readfile.h).
|
||||
*/
|
||||
typedef enum eFileSel_Params_Flag {
|
||||
FILE_APPEND_SET_FAKEUSER = (1 << 0),
|
||||
FILE_PARAMS_FLAG_UNUSED_1 = (1 << 0),
|
||||
FILE_RELPATH = (1 << 1),
|
||||
FILE_LINK = (1 << 2),
|
||||
FILE_HIDE_DOT = (1 << 3),
|
||||
FILE_AUTOSELECT = (1 << 4),
|
||||
FILE_ACTIVE_COLLECTION = (1 << 5),
|
||||
FILE_APPEND_RECURSIVE = (1 << 6),
|
||||
FILE_PARAMS_FLAG_UNUSED_2 = (1 << 6),
|
||||
FILE_DIRSEL_ONLY = (1 << 7),
|
||||
FILE_FILTER = (1 << 8),
|
||||
FILE_OBDATA_INSTANCE = (1 << 9),
|
||||
FILE_COLLECTION_INSTANCE = (1 << 10),
|
||||
FILE_PARAMS_FLAG_UNUSED_3 = (1 << 9),
|
||||
FILE_PARAMS_FLAG_UNUSED_4 = (1 << 10),
|
||||
FILE_SORT_INVERT = (1 << 11),
|
||||
FILE_HIDE_TOOL_PROPS = (1 << 12),
|
||||
FILE_CHECK_EXISTING = (1 << 13),
|
||||
|
||||
@@ -127,10 +127,10 @@ static int wm_link_append_invoke(bContext *C, wmOperator *op, const wmEvent *UNU
|
||||
return OPERATOR_RUNNING_MODAL;
|
||||
}
|
||||
|
||||
static short wm_link_append_flag(wmOperator *op)
|
||||
static int wm_link_append_flag(wmOperator *op)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
short flag = 0;
|
||||
int flag = 0;
|
||||
|
||||
if (RNA_boolean_get(op->ptr, "autoselect")) {
|
||||
flag |= FILE_AUTOSELECT;
|
||||
@@ -147,17 +147,17 @@ static short wm_link_append_flag(wmOperator *op)
|
||||
}
|
||||
else {
|
||||
if (RNA_boolean_get(op->ptr, "use_recursive")) {
|
||||
flag |= FILE_APPEND_RECURSIVE;
|
||||
flag |= BLO_LIBLINK_APPEND_RECURSIVE;
|
||||
}
|
||||
if (RNA_boolean_get(op->ptr, "set_fake")) {
|
||||
flag |= FILE_APPEND_SET_FAKEUSER;
|
||||
flag |= BLO_LIBLINK_APPEND_SET_FAKEUSER;
|
||||
}
|
||||
}
|
||||
if (RNA_boolean_get(op->ptr, "instance_collections")) {
|
||||
flag |= FILE_COLLECTION_INSTANCE;
|
||||
flag |= BLO_LIBLINK_COLLECTION_INSTANCE;
|
||||
}
|
||||
if (RNA_boolean_get(op->ptr, "instance_object_data")) {
|
||||
flag |= FILE_OBDATA_INSTANCE;
|
||||
flag |= BLO_LIBLINK_OBDATA_INSTANCE;
|
||||
}
|
||||
|
||||
return flag;
|
||||
@@ -396,7 +396,7 @@ static void wm_append_loose_data_instantiate(WMLinkAppendData *lapp_data,
|
||||
|
||||
LinkNode *itemlink;
|
||||
Collection *active_collection = NULL;
|
||||
const bool do_obdata = (lapp_data->flag & FILE_OBDATA_INSTANCE) != 0;
|
||||
const bool do_obdata = (lapp_data->flag & BLO_LIBLINK_OBDATA_INSTANCE) != 0;
|
||||
|
||||
const bool object_set_selected = (lapp_data->flag & FILE_AUTOSELECT) != 0;
|
||||
/* Do NOT make base active here! screws up GUI stuff,
|
||||
@@ -472,7 +472,7 @@ static void wm_append_loose_data_instantiate(WMLinkAppendData *lapp_data,
|
||||
|
||||
/* In case user requested instantiation of collections as empties, we do so for the one they
|
||||
* explicitly selected (originally directly linked IDs). */
|
||||
if ((lapp_data->flag & FILE_COLLECTION_INSTANCE) != 0 &&
|
||||
if ((lapp_data->flag & BLO_LIBLINK_COLLECTION_INSTANCE) != 0 &&
|
||||
(item->append_tag & WM_APPEND_TAG_INDIRECT) == 0) {
|
||||
/* BKE_object_add(...) messes with the selection. */
|
||||
Object *ob = BKE_object_add_only_object(bmain, OB_EMPTY, collection->id.name + 2);
|
||||
@@ -626,8 +626,8 @@ static void wm_append_do(WMLinkAppendData *lapp_data,
|
||||
{
|
||||
BLI_assert((lapp_data->flag & FILE_LINK) == 0);
|
||||
|
||||
const bool do_recursive = (lapp_data->flag & FILE_APPEND_RECURSIVE) != 0;
|
||||
const bool set_fakeuser = (lapp_data->flag & FILE_APPEND_SET_FAKEUSER) != 0;
|
||||
const bool do_recursive = (lapp_data->flag & BLO_LIBLINK_APPEND_RECURSIVE) != 0;
|
||||
const bool set_fakeuser = (lapp_data->flag & BLO_LIBLINK_APPEND_SET_FAKEUSER) != 0;
|
||||
|
||||
LinkNode *itemlink;
|
||||
|
||||
@@ -1057,7 +1057,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
short flag = wm_link_append_flag(op);
|
||||
int flag = wm_link_append_flag(op);
|
||||
const bool do_append = (flag & FILE_LINK) == 0;
|
||||
|
||||
/* sanity checks for flag */
|
||||
@@ -1066,12 +1066,10 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
|
||||
RPT_WARNING,
|
||||
"Scene '%s' is linked, instantiation of objects is disabled",
|
||||
scene->id.name + 2);
|
||||
flag &= ~(FILE_COLLECTION_INSTANCE | FILE_OBDATA_INSTANCE);
|
||||
flag &= ~(BLO_LIBLINK_COLLECTION_INSTANCE | BLO_LIBLINK_OBDATA_INSTANCE);
|
||||
scene = NULL;
|
||||
}
|
||||
|
||||
/* We need to add nothing from #eBLOLibLinkFlags to flag here. */
|
||||
|
||||
/* from here down, no error returns */
|
||||
|
||||
if (view_layer && RNA_boolean_get(op->ptr, "autoselect")) {
|
||||
@@ -1305,7 +1303,8 @@ static ID *wm_file_link_append_datablock_ex(Main *bmain,
|
||||
BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, true);
|
||||
|
||||
/* Define working data, with just the one item we want to link. */
|
||||
WMLinkAppendData *lapp_data = wm_link_append_data_new(do_append ? FILE_APPEND_RECURSIVE : 0);
|
||||
WMLinkAppendData *lapp_data = wm_link_append_data_new(do_append ? BLO_LIBLINK_APPEND_RECURSIVE :
|
||||
0);
|
||||
|
||||
wm_link_append_data_library_add(lapp_data, filepath);
|
||||
WMLinkAppendDataItem *item = wm_link_append_data_item_add(lapp_data, id_name, id_code, NULL);
|
||||
|
||||
Reference in New Issue
Block a user