diff options
Diffstat (limited to 'source/blender/makesrna/intern/rna_screen.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_screen.c | 86 |
1 files changed, 44 insertions, 42 deletions
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index b44e404c364..a145ac95d6b 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -57,6 +57,7 @@ EnumPropertyItem rna_enum_region_type_items[] = { #include "BKE_global.h" #include "BKE_depsgraph.h" +#include "BKE_workspace.h" #include "UI_view2d.h" @@ -64,55 +65,58 @@ EnumPropertyItem rna_enum_region_type_items[] = { # include "BPY_extern.h" #endif -static void rna_Screen_scene_set(PointerRNA *ptr, PointerRNA value) -{ - bScreen *sc = (bScreen *)ptr->data; - if (value.data == NULL) - return; +static void rna_Screen_redraw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) +{ + bScreen *screen = (bScreen *)ptr->data; - sc->newscene = value.data; + /* the settings for this are currently only available from a menu in the TimeLine, hence refresh=SPACE_TIME */ + ED_screen_animation_timer_update(screen, screen->redraws_flag, SPACE_TIME); } -static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr) +static int rna_Screen_is_animation_playing_get(PointerRNA *UNUSED(ptr)) { - bScreen *sc = (bScreen *)ptr->data; - - /* exception: must use context so notifier gets to the right window */ - if (sc->newscene) { -#ifdef WITH_PYTHON - BPy_BEGIN_ALLOW_THREADS; -#endif - - ED_screen_set_scene(C, sc, sc->newscene); - -#ifdef WITH_PYTHON - BPy_END_ALLOW_THREADS; -#endif - - WM_event_add_notifier(C, NC_SCENE | ND_SCENEBROWSE, sc->newscene); + /* can be NULL on file load, T42619 */ + wmWindowManager *wm = G.main->wm.first; + return wm ? (ED_screen_animation_playing(wm) != NULL) : 0; +} - if (G.debug & G_DEBUG) - printf("scene set %p\n", sc->newscene); +static void rna_Screen_layout_name_get(PointerRNA *ptr, char *value) +{ + const bScreen *screen = ptr->data; + const WorkSpaceLayout *layout = BKE_workspace_layout_find_global(G.main, screen, NULL); - sc->newscene = NULL; + if (layout) { + const char *name = BKE_workspace_layout_name_get(layout); + strcpy(value, name); + } + else { + value[0] = '\0'; } } -static void rna_Screen_redraw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) +static int rna_Screen_layout_name_length(PointerRNA *ptr) { - bScreen *screen = (bScreen *)ptr->data; + const bScreen *screen = ptr->data; + const WorkSpaceLayout *layout = BKE_workspace_layout_find_global(G.main, screen, NULL); - /* the settings for this are currently only available from a menu in the TimeLine, hence refresh=SPACE_TIME */ - ED_screen_animation_timer_update(screen, screen->redraws_flag, SPACE_TIME); -} + if (layout) { + const char *name = BKE_workspace_layout_name_get(layout); + return strlen(name); + } + return 0; +} -static int rna_Screen_is_animation_playing_get(PointerRNA *UNUSED(ptr)) +static void rna_Screen_layout_name_set(PointerRNA *ptr, const char *value) { - /* can be NULL on file load, T42619 */ - wmWindowManager *wm = G.main->wm.first; - return wm ? (ED_screen_animation_playing(wm) != NULL) : 0; + bScreen *screen = ptr->data; + WorkSpace *workspace; + WorkSpaceLayout *layout = BKE_workspace_layout_find_global(G.main, screen, &workspace); + + if (layout) { + BKE_workspace_layout_name_set(workspace, layout, value); + } } static int rna_Screen_fullscreen_get(PointerRNA *ptr) @@ -152,7 +156,7 @@ static void rna_Area_type_update(bContext *C, PointerRNA *ptr) /* XXX this call still use context, so we trick it to work in the right context */ for (win = wm->windows.first; win; win = win->next) { - if (sc == win->screen) { + if (sc == WM_window_get_active_screen(win)) { wmWindow *prevwin = CTX_wm_window(C); ScrArea *prevsa = CTX_wm_area(C); ARegion *prevar = CTX_wm_region(C); @@ -377,13 +381,11 @@ static void rna_def_screen(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Screen", "Screen data-block, defining the layout of areas in a window"); RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN); - /* pointers */ - prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL); - RNA_def_property_pointer_funcs(prop, NULL, "rna_Screen_scene_set", NULL, NULL); - RNA_def_property_ui_text(prop, "Scene", "Active scene to be edited in the screen"); - RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, 0, "rna_Screen_scene_update"); + prop = RNA_def_property(srna, "layout_name", PROP_STRING, PROP_NONE); + RNA_def_property_string_funcs(prop, "rna_Screen_layout_name_get", "rna_Screen_layout_name_length", + "rna_Screen_layout_name_set"); + RNA_def_property_ui_text(prop, "Layout Name", "The name of the layout that refers to the screen"); + RNA_def_struct_name_property(srna, prop); /* collections */ prop = RNA_def_property(srna, "areas", PROP_COLLECTION, PROP_NONE); |