Refactor: Move WindowManager and Screen foreach_id to new IDTypeInfo structure.
That one was a bit more complicated, and is still only partial refactor (ultimately we want to have a foreach_id callback in SpaceType itself I think...).
This commit is contained in:
parent
ae97a7ac10
commit
8f10f9d5dc
|
@ -132,6 +132,7 @@ typedef struct LibraryForeachIDData LibraryForeachIDData;
|
|||
bool BKE_lib_query_foreachid_process(struct LibraryForeachIDData *data,
|
||||
struct ID **id_pp,
|
||||
int cb_flag);
|
||||
int BKE_lib_query_foreachid_process_flags_get(struct LibraryForeachIDData *data);
|
||||
|
||||
#define BKE_LIB_FOREACHID_PROCESS_ID(_data, _id, _cb_flag) \
|
||||
{ \
|
||||
|
|
|
@ -48,6 +48,7 @@ struct WorkSpace;
|
|||
struct bContext;
|
||||
struct bContextDataResult;
|
||||
struct bScreen;
|
||||
struct LibraryForeachIDData;
|
||||
struct uiLayout;
|
||||
struct uiList;
|
||||
struct wmGizmoMap;
|
||||
|
@ -389,6 +390,8 @@ float BKE_screen_view3d_zoom_from_fac(float zoomfac);
|
|||
void BKE_screen_view3d_shading_init(struct View3DShading *shading);
|
||||
|
||||
/* screen */
|
||||
void BKE_screen_foreach_id_screen_area(struct LibraryForeachIDData *data, struct ScrArea *area);
|
||||
|
||||
void BKE_screen_free(struct bScreen *screen);
|
||||
void BKE_screen_area_map_free(struct ScrAreaMap *area_map) ATTR_NONNULL();
|
||||
|
||||
|
|
|
@ -79,6 +79,7 @@
|
|||
#include "BKE_node.h"
|
||||
#include "BKE_particle.h"
|
||||
#include "BKE_rigidbody.h"
|
||||
#include "BKE_screen.h"
|
||||
#include "BKE_sequencer.h"
|
||||
#include "BKE_shader_fx.h"
|
||||
#include "BKE_texture.h"
|
||||
|
@ -199,6 +200,11 @@ bool BKE_lib_query_foreachid_process(LibraryForeachIDData *data, ID **id_pp, int
|
|||
}
|
||||
}
|
||||
|
||||
int BKE_lib_query_foreachid_process_flags_get(LibraryForeachIDData *data)
|
||||
{
|
||||
return data->flag;
|
||||
}
|
||||
|
||||
static void library_foreach_ID_link(Main *bmain,
|
||||
ID *id_owner,
|
||||
ID *id,
|
||||
|
@ -370,148 +376,6 @@ static void library_foreach_collection(LibraryForeachIDData *data, Collection *c
|
|||
FOREACH_FINALIZE_VOID;
|
||||
}
|
||||
|
||||
static void library_foreach_dopesheet(LibraryForeachIDData *data, bDopeSheet *ads)
|
||||
{
|
||||
if (ads != NULL) {
|
||||
FOREACH_CALLBACK_INVOKE_ID(data, ads->source, IDWALK_CB_NOP);
|
||||
FOREACH_CALLBACK_INVOKE(data, ads->filter_grp, IDWALK_CB_NOP);
|
||||
}
|
||||
|
||||
FOREACH_FINALIZE_VOID;
|
||||
}
|
||||
|
||||
static void library_foreach_screen_area(LibraryForeachIDData *data, ScrArea *area)
|
||||
{
|
||||
FOREACH_CALLBACK_INVOKE(data, area->full, IDWALK_CB_NOP);
|
||||
|
||||
LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
|
||||
switch (sl->spacetype) {
|
||||
case SPACE_VIEW3D: {
|
||||
View3D *v3d = (View3D *)sl;
|
||||
|
||||
FOREACH_CALLBACK_INVOKE(data, v3d->camera, IDWALK_CB_NOP);
|
||||
FOREACH_CALLBACK_INVOKE(data, v3d->ob_center, IDWALK_CB_NOP);
|
||||
|
||||
if (v3d->localvd) {
|
||||
FOREACH_CALLBACK_INVOKE(data, v3d->localvd->camera, IDWALK_CB_NOP);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPACE_GRAPH: {
|
||||
SpaceGraph *sipo = (SpaceGraph *)sl;
|
||||
|
||||
library_foreach_dopesheet(data, sipo->ads);
|
||||
break;
|
||||
}
|
||||
case SPACE_PROPERTIES: {
|
||||
SpaceProperties *sbuts = (SpaceProperties *)sl;
|
||||
|
||||
FOREACH_CALLBACK_INVOKE_ID(data, sbuts->pinid, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_FILE:
|
||||
break;
|
||||
case SPACE_ACTION: {
|
||||
SpaceAction *saction = (SpaceAction *)sl;
|
||||
|
||||
library_foreach_dopesheet(data, &saction->ads);
|
||||
FOREACH_CALLBACK_INVOKE(data, saction->action, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_IMAGE: {
|
||||
SpaceImage *sima = (SpaceImage *)sl;
|
||||
|
||||
FOREACH_CALLBACK_INVOKE(data, sima->image, IDWALK_CB_USER_ONE);
|
||||
FOREACH_CALLBACK_INVOKE(data, sima->mask_info.mask, IDWALK_CB_USER_ONE);
|
||||
FOREACH_CALLBACK_INVOKE(data, sima->gpd, IDWALK_CB_USER);
|
||||
break;
|
||||
}
|
||||
case SPACE_SEQ: {
|
||||
SpaceSeq *sseq = (SpaceSeq *)sl;
|
||||
|
||||
FOREACH_CALLBACK_INVOKE(data, sseq->gpd, IDWALK_CB_USER);
|
||||
break;
|
||||
}
|
||||
case SPACE_NLA: {
|
||||
SpaceNla *snla = (SpaceNla *)sl;
|
||||
|
||||
library_foreach_dopesheet(data, snla->ads);
|
||||
break;
|
||||
}
|
||||
case SPACE_TEXT: {
|
||||
SpaceText *st = (SpaceText *)sl;
|
||||
|
||||
FOREACH_CALLBACK_INVOKE(data, st->text, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_SCRIPT: {
|
||||
SpaceScript *scpt = (SpaceScript *)sl;
|
||||
|
||||
FOREACH_CALLBACK_INVOKE(data, scpt->script, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_OUTLINER: {
|
||||
SpaceOutliner *so = (SpaceOutliner *)sl;
|
||||
|
||||
FOREACH_CALLBACK_INVOKE_ID(data, so->search_tse.id, IDWALK_CB_NOP);
|
||||
|
||||
if (so->treestore != NULL) {
|
||||
TreeStoreElem *tselem;
|
||||
BLI_mempool_iter iter;
|
||||
|
||||
BLI_mempool_iternew(so->treestore, &iter);
|
||||
while ((tselem = BLI_mempool_iterstep(&iter))) {
|
||||
FOREACH_CALLBACK_INVOKE_ID(data, tselem->id, IDWALK_CB_NOP);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPACE_NODE: {
|
||||
SpaceNode *snode = (SpaceNode *)sl;
|
||||
|
||||
const bool is_private_nodetree = snode->id != NULL &&
|
||||
ntreeFromID(snode->id) == snode->nodetree;
|
||||
|
||||
FOREACH_CALLBACK_INVOKE_ID(data, snode->id, IDWALK_CB_NOP);
|
||||
FOREACH_CALLBACK_INVOKE_ID(data, snode->from, IDWALK_CB_NOP);
|
||||
|
||||
FOREACH_CALLBACK_INVOKE(
|
||||
data, snode->nodetree, is_private_nodetree ? IDWALK_CB_EMBEDDED : IDWALK_CB_USER_ONE);
|
||||
|
||||
LISTBASE_FOREACH (bNodeTreePath *, path, &snode->treepath) {
|
||||
if (path == snode->treepath.first) {
|
||||
/* first nodetree in path is same as snode->nodetree */
|
||||
FOREACH_CALLBACK_INVOKE(data,
|
||||
path->nodetree,
|
||||
is_private_nodetree ? IDWALK_CB_EMBEDDED : IDWALK_CB_USER_ONE);
|
||||
}
|
||||
else {
|
||||
FOREACH_CALLBACK_INVOKE(data, path->nodetree, IDWALK_CB_USER_ONE);
|
||||
}
|
||||
|
||||
if (path->nodetree == NULL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
FOREACH_CALLBACK_INVOKE(data, snode->edittree, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_CLIP: {
|
||||
SpaceClip *sclip = (SpaceClip *)sl;
|
||||
|
||||
FOREACH_CALLBACK_INVOKE(data, sclip->clip, IDWALK_CB_USER_ONE);
|
||||
FOREACH_CALLBACK_INVOKE(data, sclip->mask_info.mask, IDWALK_CB_USER_ONE);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
FOREACH_FINALIZE_VOID;
|
||||
}
|
||||
|
||||
bool BKE_library_foreach_ID_embedded(LibraryForeachIDData *data, ID **id_pp)
|
||||
{
|
||||
/* Needed e.g. for callbacks handling relationships... This call shall be absolutely readonly. */
|
||||
|
@ -987,24 +851,7 @@ static void library_foreach_ID_link(Main *bmain,
|
|||
}
|
||||
|
||||
case ID_WM: {
|
||||
wmWindowManager *wm = (wmWindowManager *)id;
|
||||
|
||||
LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
|
||||
CALLBACK_INVOKE(win->scene, IDWALK_CB_USER_ONE);
|
||||
|
||||
/* This pointer can be NULL during old files reading, better be safe than sorry. */
|
||||
if (win->workspace_hook != NULL) {
|
||||
ID *workspace = (ID *)BKE_workspace_active_get(win->workspace_hook);
|
||||
CALLBACK_INVOKE_ID(workspace, IDWALK_CB_NOP);
|
||||
/* allow callback to set a different workspace */
|
||||
BKE_workspace_active_set(win->workspace_hook, (WorkSpace *)workspace);
|
||||
}
|
||||
if (data.flag & IDWALK_INCLUDE_UI) {
|
||||
LISTBASE_FOREACH (ScrArea *, area, &win->global_areas.areabase) {
|
||||
library_foreach_screen_area(&data, area);
|
||||
}
|
||||
}
|
||||
}
|
||||
BLI_assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1061,13 +908,7 @@ static void library_foreach_ID_link(Main *bmain,
|
|||
}
|
||||
|
||||
case ID_SCR: {
|
||||
if (data.flag & IDWALK_INCLUDE_UI) {
|
||||
bScreen *screen = (bScreen *)id;
|
||||
|
||||
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
|
||||
library_foreach_screen_area(&data, area);
|
||||
}
|
||||
}
|
||||
BLI_assert(0);
|
||||
break;
|
||||
}
|
||||
case ID_SIM: {
|
||||
|
|
|
@ -32,14 +32,18 @@
|
|||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "DNA_defaults.h"
|
||||
#include "DNA_gpencil_types.h"
|
||||
#include "DNA_mask_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_screen_types.h"
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_text_types.h"
|
||||
#include "DNA_view3d_types.h"
|
||||
#include "DNA_workspace_types.h"
|
||||
|
||||
#include "BLI_listbase.h"
|
||||
#include "BLI_math_vector.h"
|
||||
#include "BLI_mempool.h"
|
||||
#include "BLI_rect.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
|
@ -48,6 +52,8 @@
|
|||
#include "BKE_icons.h"
|
||||
#include "BKE_idprop.h"
|
||||
#include "BKE_idtype.h"
|
||||
#include "BKE_lib_query.h"
|
||||
#include "BKE_node.h"
|
||||
#include "BKE_screen.h"
|
||||
#include "BKE_workspace.h"
|
||||
|
||||
|
@ -72,6 +78,158 @@ static void screen_free_data(ID *id)
|
|||
MEM_SAFE_FREE(screen->tool_tip);
|
||||
}
|
||||
|
||||
static void screen_foreach_id_dopesheet(LibraryForeachIDData *data, bDopeSheet *ads)
|
||||
{
|
||||
if (ads != NULL) {
|
||||
BKE_LIB_FOREACHID_PROCESS_ID(data, ads->source, IDWALK_CB_NOP);
|
||||
BKE_LIB_FOREACHID_PROCESS(data, ads->filter_grp, IDWALK_CB_NOP);
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_screen_foreach_id_screen_area(LibraryForeachIDData *data, ScrArea *area)
|
||||
{
|
||||
BKE_LIB_FOREACHID_PROCESS(data, area->full, IDWALK_CB_NOP);
|
||||
|
||||
/* TODO this should be moved to a callback in `SpaceType`, defined in each editor's own code.
|
||||
* Will be for a later round of cleanup though... */
|
||||
LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
|
||||
switch (sl->spacetype) {
|
||||
case SPACE_VIEW3D: {
|
||||
View3D *v3d = (View3D *)sl;
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS(data, v3d->camera, IDWALK_CB_NOP);
|
||||
BKE_LIB_FOREACHID_PROCESS(data, v3d->ob_center, IDWALK_CB_NOP);
|
||||
|
||||
if (v3d->localvd) {
|
||||
BKE_LIB_FOREACHID_PROCESS(data, v3d->localvd->camera, IDWALK_CB_NOP);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPACE_GRAPH: {
|
||||
SpaceGraph *sipo = (SpaceGraph *)sl;
|
||||
|
||||
screen_foreach_id_dopesheet(data, sipo->ads);
|
||||
break;
|
||||
}
|
||||
case SPACE_PROPERTIES: {
|
||||
SpaceProperties *sbuts = (SpaceProperties *)sl;
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS_ID(data, sbuts->pinid, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_FILE:
|
||||
break;
|
||||
case SPACE_ACTION: {
|
||||
SpaceAction *saction = (SpaceAction *)sl;
|
||||
|
||||
screen_foreach_id_dopesheet(data, &saction->ads);
|
||||
BKE_LIB_FOREACHID_PROCESS(data, saction->action, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_IMAGE: {
|
||||
SpaceImage *sima = (SpaceImage *)sl;
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS(data, sima->image, IDWALK_CB_USER_ONE);
|
||||
BKE_LIB_FOREACHID_PROCESS(data, sima->mask_info.mask, IDWALK_CB_USER_ONE);
|
||||
BKE_LIB_FOREACHID_PROCESS(data, sima->gpd, IDWALK_CB_USER);
|
||||
break;
|
||||
}
|
||||
case SPACE_SEQ: {
|
||||
SpaceSeq *sseq = (SpaceSeq *)sl;
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS(data, sseq->gpd, IDWALK_CB_USER);
|
||||
break;
|
||||
}
|
||||
case SPACE_NLA: {
|
||||
SpaceNla *snla = (SpaceNla *)sl;
|
||||
|
||||
screen_foreach_id_dopesheet(data, snla->ads);
|
||||
break;
|
||||
}
|
||||
case SPACE_TEXT: {
|
||||
SpaceText *st = (SpaceText *)sl;
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS(data, st->text, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_SCRIPT: {
|
||||
SpaceScript *scpt = (SpaceScript *)sl;
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS(data, scpt->script, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_OUTLINER: {
|
||||
SpaceOutliner *so = (SpaceOutliner *)sl;
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS_ID(data, so->search_tse.id, IDWALK_CB_NOP);
|
||||
|
||||
if (so->treestore != NULL) {
|
||||
TreeStoreElem *tselem;
|
||||
BLI_mempool_iter iter;
|
||||
|
||||
BLI_mempool_iternew(so->treestore, &iter);
|
||||
while ((tselem = BLI_mempool_iterstep(&iter))) {
|
||||
BKE_LIB_FOREACHID_PROCESS_ID(data, tselem->id, IDWALK_CB_NOP);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPACE_NODE: {
|
||||
SpaceNode *snode = (SpaceNode *)sl;
|
||||
|
||||
const bool is_private_nodetree = snode->id != NULL &&
|
||||
ntreeFromID(snode->id) == snode->nodetree;
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS_ID(data, snode->id, IDWALK_CB_NOP);
|
||||
BKE_LIB_FOREACHID_PROCESS_ID(data, snode->from, IDWALK_CB_NOP);
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS(
|
||||
data, snode->nodetree, is_private_nodetree ? IDWALK_CB_EMBEDDED : IDWALK_CB_USER_ONE);
|
||||
|
||||
LISTBASE_FOREACH (bNodeTreePath *, path, &snode->treepath) {
|
||||
if (path == snode->treepath.first) {
|
||||
/* first nodetree in path is same as snode->nodetree */
|
||||
BKE_LIB_FOREACHID_PROCESS(data,
|
||||
path->nodetree,
|
||||
is_private_nodetree ? IDWALK_CB_EMBEDDED :
|
||||
IDWALK_CB_USER_ONE);
|
||||
}
|
||||
else {
|
||||
BKE_LIB_FOREACHID_PROCESS(data, path->nodetree, IDWALK_CB_USER_ONE);
|
||||
}
|
||||
|
||||
if (path->nodetree == NULL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS(data, snode->edittree, IDWALK_CB_NOP);
|
||||
break;
|
||||
}
|
||||
case SPACE_CLIP: {
|
||||
SpaceClip *sclip = (SpaceClip *)sl;
|
||||
|
||||
BKE_LIB_FOREACHID_PROCESS(data, sclip->clip, IDWALK_CB_USER_ONE);
|
||||
BKE_LIB_FOREACHID_PROCESS(data, sclip->mask_info.mask, IDWALK_CB_USER_ONE);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void screen_foreach_id(ID *id, LibraryForeachIDData *data)
|
||||
{
|
||||
if (BKE_lib_query_foreachid_process_flags_get(data) & IDWALK_INCLUDE_UI) {
|
||||
bScreen *screen = (bScreen *)id;
|
||||
|
||||
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
|
||||
BKE_screen_foreach_id_screen_area(data, area);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IDTypeInfo IDType_ID_SCR = {
|
||||
.id_code = ID_SCR,
|
||||
.id_filter = 0,
|
||||
|
@ -86,6 +244,7 @@ IDTypeInfo IDType_ID_SCR = {
|
|||
.copy_data = NULL,
|
||||
.free_data = screen_free_data,
|
||||
.make_local = NULL,
|
||||
.foreach_id = screen_foreach_id,
|
||||
};
|
||||
|
||||
/* ************ Spacetype/regiontype handling ************** */
|
||||
|
|
|
@ -44,8 +44,10 @@
|
|||
#include "BKE_idprop.h"
|
||||
#include "BKE_idtype.h"
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_lib_query.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_report.h"
|
||||
#include "BKE_screen.h"
|
||||
#include "BKE_workspace.h"
|
||||
|
||||
#include "WM_api.h"
|
||||
|
@ -73,6 +75,28 @@ static void window_manager_free_data(ID *id)
|
|||
wm_close_and_free(NULL, (wmWindowManager *)id);
|
||||
}
|
||||
|
||||
static void window_manager_foreach_id(ID *id, LibraryForeachIDData *data)
|
||||
{
|
||||
wmWindowManager *wm = (wmWindowManager *)id;
|
||||
|
||||
LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
|
||||
BKE_LIB_FOREACHID_PROCESS(data, win->scene, IDWALK_CB_USER_ONE);
|
||||
|
||||
/* This pointer can be NULL during old files reading, better be safe than sorry. */
|
||||
if (win->workspace_hook != NULL) {
|
||||
ID *workspace = (ID *)BKE_workspace_active_get(win->workspace_hook);
|
||||
BKE_LIB_FOREACHID_PROCESS_ID(data, workspace, IDWALK_CB_NOP);
|
||||
/* allow callback to set a different workspace */
|
||||
BKE_workspace_active_set(win->workspace_hook, (WorkSpace *)workspace);
|
||||
}
|
||||
if (BKE_lib_query_foreachid_process_flags_get(data) & IDWALK_INCLUDE_UI) {
|
||||
LISTBASE_FOREACH (ScrArea *, area, &win->global_areas.areabase) {
|
||||
BKE_screen_foreach_id_screen_area(data, area);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IDTypeInfo IDType_ID_WM = {
|
||||
.id_code = ID_WM,
|
||||
.id_filter = 0,
|
||||
|
@ -87,6 +111,7 @@ IDTypeInfo IDType_ID_WM = {
|
|||
.copy_data = NULL,
|
||||
.free_data = window_manager_free_data,
|
||||
.make_local = NULL,
|
||||
.foreach_id = window_manager_foreach_id,
|
||||
};
|
||||
|
||||
#define MAX_OP_REGISTERED 32
|
||||
|
|
Loading…
Reference in New Issue