[Bf-blender-cvs] [e5f3acb123] workspaces: Merge branch 'blender2.8' into workspaces
Julian Eisel
noreply at git.blender.org
Thu Mar 16 19:55:13 CET 2017
Commit: e5f3acb123dcf8a753eda1c408bd0351643f3521
Author: Julian Eisel
Date: Thu Mar 16 19:54:35 2017 +0100
Branches: workspaces
https://developer.blender.org/rBe5f3acb123dcf8a753eda1c408bd0351643f3521
Merge branch 'blender2.8' into workspaces
Conflicts:
source/blender/blenloader/intern/versioning_280.c
source/blenderplayer/bad_level_call_stubs/stubs.c
Also had to do some more changes in versioning_280.c to prevent startup
crash.
===================================================================
===================================================================
diff --cc source/blender/blenkernel/BKE_layer.h
index 85e4aab49e,4bb775362e..f2ed15b043
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@@ -55,7 -55,7 +55,8 @@@ struct SceneCollection
struct SceneLayer;
struct SceneLayer *BKE_scene_layer_render_active(const struct Scene *scene);
-struct SceneLayer *BKE_scene_layer_context_active(struct Scene *scene);
++struct SceneLayer *BKE_scene_layer_context_active_ex(const struct Main *bmain, const struct Scene *scene);
+struct SceneLayer *BKE_scene_layer_context_active(const struct Scene *scene);
struct SceneLayer *BKE_scene_layer_add(struct Scene *scene, const char *name);
bool BKE_scene_layer_remove(struct Main *bmain, struct Scene *scene, struct SceneLayer *sl);
diff --cc source/blender/blenkernel/intern/layer.c
index 182cf250c6,418dc68a50..50922482f2
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@@ -79,19 -76,12 +79,23 @@@ SceneLayer *BKE_scene_layer_render_acti
* Returns the SceneLayer to be used for drawing, outliner, and
* other context related areas.
*/
- SceneLayer *BKE_scene_layer_context_active(const Scene *scene)
-SceneLayer *BKE_scene_layer_context_active(Scene *scene)
++SceneLayer *BKE_scene_layer_context_active_ex(const Main *bmain, const Scene *scene)
{
- /* waiting for workspace to get the layer from context*/
- TODO_LAYER_CONTEXT;
- return BKE_scene_layer_render_active(scene);
+ /* XXX iterating over windows here is not so nice, we could pass the workspace or the window as argument. */
- for (wmWindowManager *wm = G.main->wm.first; wm; wm = wm->id.next) {
++ for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) {
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (win->scene == scene) {
+ return BKE_workspace_render_layer_get(BKE_workspace_active_get(win->workspace_hook));
+ }
+ }
+ }
+
+ return NULL;
+}
++SceneLayer *BKE_scene_layer_context_active(const Scene *scene)
++{
++ return BKE_scene_layer_context_active_ex(G.main, scene);
+ }
/**
* Add a new renderlayer
diff --cc source/blender/blenloader/intern/versioning_280.c
index 190e4f211c,ac3f703fbd..cc78537c34
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@@ -39,9 -40,9 +40,10 @@@
#include "BKE_layer.h"
#include "BKE_main.h"
#include "BKE_scene.h"
+#include "BKE_workspace.h"
#include "BLI_listbase.h"
+ #include "BLI_mempool.h"
#include "BLI_string.h"
#include "BLO_readfile.h"
@@@ -49,69 -50,12 +51,72 @@@
#include "MEM_guardedalloc.h"
-void do_versions_after_linking_280(Main *main)
+/**
+ * \brief Before lib-link versioning for new workspace design.
+ *
+ * Adds a workspace for each screen of the old file and adds the needed workspace-layout to wrap the screen.
+ * Rest of the conversion is done in #do_version_workspaces_after_lib_link.
+ *
+ * Note that some of the created workspaces might be deleted again in case of reading the default startup.blend.
+ */
+static void do_version_workspaces_before_lib_link(Main *main)
+{
+ BLI_assert(BLI_listbase_is_empty(&main->workspaces));
+
+ for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
+ WorkSpace *ws = BKE_workspace_add(main, screen->id.name + 2);
+ BKE_workspace_layout_add(ws, screen, screen->id.name + 2);
+
+ /* For compatibility, the workspace should be activated that represents the active
+ * screen of the old file. This is done in blo_do_versions_after_linking_270. */
+ }
+
+ for (wmWindowManager *wm = main->wm.first; wm; wm = wm->id.next) {
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ win->workspace_hook = BKE_workspace_instance_hook_create(main);
+ }
+ }
+}
+
+/**
+ * \brief After lib-link versioning for new workspace design.
+ *
+ * * Active screen isn't stored directly in window anymore, but in the active workspace.
+ * We already created a new workspace for each screen in #do_version_workspaces_before_lib_link,
+ * here we need to find and activate the workspace that contains the active screen of the old file.
+ * * Active scene isn't stored in screen anymore, but in window.
+ */
+static void do_version_workspaces_after_lib_link(Main *main)
+{
+ for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
+ WorkSpace *workspace = BLI_findstring(&main->workspaces, screen->id.name + 2, offsetof(ID, name) + 2);
+
+ BKE_workspace_render_layer_set(workspace, screen->scene->render_layers.first);
+ }
+
+ for (wmWindowManager *wm = main->wm.first; wm; wm = wm->id.next) {
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ bScreen *screen = win->screen;
+ WorkSpace *workspace = BLI_findstring(&main->workspaces, screen->id.name + 2, offsetof(ID, name) + 2);
+ ListBase *layouts = BKE_workspace_layouts_get(workspace);
+
+ BKE_workspace_active_set(win->workspace_hook, workspace);
+ win->scene = screen->scene;
+ BKE_workspace_active_layout_set(win->workspace_hook, layouts->first);
+
+ /* Deprecated from now on! */
+ win->screen = NULL;
+ screen->scene = NULL;
+ }
+ }
+}
+
+void do_versions_after_linking_280(FileData *fd, Main *main)
{
if (!MAIN_VERSION_ATLEAST(main, 280, 0)) {
+ char version[48];
+ BKE_blender_version_string(version, sizeof(version), main->versionfile, main->subversionfile, false, false);
+
for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
/* since we don't have access to FileData we check the (always valid) first render layer instead */
if (scene->render_layers.first == NULL) {
@@@ -232,14 -181,31 +242,54 @@@
scene->basact = NULL;
}
}
+ }
- for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
- for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
- for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
- if (sl->spacetype == SPACE_OUTLINER) {
- SpaceOops *soutliner = (SpaceOops *)sl;
- SceneLayer *layer = BKE_scene_layer_context_active(screen->scene);
-
- soutliner->outlinevis = SO_ACT_LAYER;
-
- if (BLI_listbase_count_ex(&layer->layer_collections, 2) == 1) {
- /* Create a tree store element for the collection. This is normally
- * done in check_persistent (outliner_tree.c), but we need to access
- * it here :/ (expand element if it's the only one) */
- TreeStoreElem *tselem = BLI_mempool_alloc(soutliner->treestore);
- tselem->type = TSE_LAYER_COLLECTION;
- tselem->id = layer->layer_collections.first;
- tselem->nr = tselem->used = 0;
- tselem->flag &= ~TSE_CLOSED;
+ {
+ /* New workspace design */
+ if (!DNA_struct_find(fd->filesdna, "WorkSpace")) {
+ do_version_workspaces_after_lib_link(main);
+ }
+ }
++
++ if (!MAIN_VERSION_ATLEAST(main, 280, 0)) {
++ BKE_workspace_iter_begin(workspace, main->workspaces.first)
++ {
++ SceneLayer *layer = BKE_workspace_render_layer_get(workspace);
++ const bool is_single_collection = BLI_listbase_count_ex(&layer->layer_collections, 2) == 1;
++ ListBase *layouts = BKE_workspace_layouts_get(workspace);
++
++ BKE_workspace_layout_iter_begin(layout, layouts->first)
++ {
++ bScreen *screen = BKE_workspace_layout_screen_get(layout);
++
++ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
++ for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
++ if (sl->spacetype == SPACE_OUTLINER) {
++ SpaceOops *soutliner = (SpaceOops *)sl;
++
++ soutliner->outlinevis = SO_ACT_LAYER;
++
++ if (is_single_collection) {
++ /* Create a tree store element for the collection. This is normally
++ * done in check_persistent (outliner_tree.c), but we need to access
++ * it here :/ (expand element if it's the only one) */
++ TreeStoreElem *tselem = BLI_mempool_alloc(soutliner->treestore);
++ tselem->type = TSE_LAYER_COLLECTION;
++ tselem->id = layer->layer_collections.first;
++ tselem->nr = tselem->used = 0;
++ tselem->flag &= ~TSE_CLOSED;
++ }
+ }
+ }
+ }
+ }
++ BKE_workspace_layout_iter_end;
++ }
++ BKE_workspace_iter_end;
++
++ for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
+ }
+ }
}
static void blo_do_version_temporary(Main *main)
diff --cc source/blenderplayer/bad_level_call_stubs/stubs.c
index cf18a7173e,09869664d6..9aaa1c910f
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@@ -310,12 -310,7 +310,13 @@@ int WM_operator_confirm(struct bContex
struct MenuType *WM_menutype_find(const char *idname, bool quiet) RET_NULL
void WM_operator_stack_clear(struct wmWindowManager *wm) RET_NONE
void WM_operator_handlers_clear(wmWindowManager *wm, struct wmOperatorType *ot) RET_NONE
+ bool WM_operator_is_repeat(const struct bContext *C, const struct wmOperator *op) RET_ZERO;
+void WM_windows_scene_data_sync(const struct ListBase *win_lb, struct Scene *scene) RET_NONE
+struct Scene *WM_windows_scene_get_from_screen(const struct wmWindowManager *wm, const struct bScreen *screen) RET_NULL
+struct bScreen *WM_window_get_active_screen(const struct wmWindow *win) RET_NULL
+struct Scene *WM_window_get_active_scene(const struct wmWindow *win) RET_NULL
+void WM_window_change_active_scene(struct Main *bmain, struct bContext *C, struct wmWindow *win, struct Scene *scene_new) RET_NONE
+bool WM_window_is_temp_screen(const struct wmWindow *win) RET_ZERO
void WM_autosave_init(wmWindowManager *wm) RET_NONE
void WM_jobs_kill_all_except(struct wmWindowManager *wm, void *owner) RET_NONE
More information about the Bf-blender-cvs
mailing list