[Bf-blender-cvs] [788319b] workspaces: Move ED_workspace_layout API into own file

Julian Eisel noreply at git.blender.org
Tue Dec 6 23:16:40 CET 2016


Commit: 788319b13ddb6fea0562503d67eed4f6d3c8da6a
Author: Julian Eisel
Date:   Tue Dec 6 17:43:30 2016 +0100
Branches: workspaces
https://developer.blender.org/rB788319b13ddb6fea0562503d67eed4f6d3c8da6a

Move ED_workspace_layout API into own file

===================================================================

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/screen/CMakeLists.txt
M	source/blender/editors/screen/screen_ops.c
M	source/blender/editors/screen/workspace_edit.c
A	source/blender/editors/screen/workspace_layout_edit.c

===================================================================

diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 207a8bd..55799c5 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -127,7 +127,7 @@ bool ED_workspace_change(struct bContext *C, struct wmWindow *win, WorkSpace *ws
 WorkSpace *ED_workspace_duplicate(struct Main *bmain, struct wmWindow *win);
 bool ED_workspace_delete(struct Main *bmain, struct bContext *C, struct wmWindow *win, WorkSpace *ws);
 bool ED_workspace_layout_delete(struct bContext *C, WorkSpace *workspace, WorkSpaceLayout *layout_old) ATTR_NONNULL();
-bool ED_workspace_layout_cycle(struct bContext *C, struct wmWindow *win, const short direction) ATTR_NONNULL();
+bool ED_workspace_layout_cycle(struct bContext *C, WorkSpace *workspace, const short direction) ATTR_NONNULL();
 
 /* anim */
 void    ED_update_for_newframe(struct Main *bmain, struct Scene *scene, int mute);
diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt
index 816c0ca..d7aaf58 100644
--- a/source/blender/editors/screen/CMakeLists.txt
+++ b/source/blender/editors/screen/CMakeLists.txt
@@ -47,6 +47,7 @@ set(SRC
 	screen_ops.c
 	screendump.c
 	workspace_edit.c
+	workspace_layout_edit.c
 
 	screen_intern.h
 )
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 0ae582f..660c39f 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -2390,10 +2390,10 @@ static void SCREEN_OT_marker_jump(wmOperatorType *ot)
 /* function to be called outside UI context, or for redo */
 static int screen_set_exec(bContext *C, wmOperator *op)
 {
-	wmWindow *win = CTX_wm_window(C);
+	WorkSpace *workspace = CTX_wm_workspace(C);
 	int delta = RNA_int_get(op->ptr, "delta");
 
-	if (ED_workspace_layout_cycle(C, win, delta)) {
+	if (ED_workspace_layout_cycle(C, workspace, delta)) {
 		return OPERATOR_FINISHED;
 	}
 
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index d4097f6..51e6cf5 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -110,128 +110,6 @@ bool ED_workspace_delete(Main *bmain, bContext *C, wmWindow *win, WorkSpace *ws)
 	return true;
 }
 
-static bool workspace_layout_delete_doit(bContext *C, WorkSpace *workspace,
-                                         WorkSpaceLayout *layout_old, WorkSpaceLayout *layout_new)
-{
-	Main *bmain = CTX_data_main(C);
-	bScreen *screen_new = BKE_workspace_layout_screen_get(layout_new);
-
-	ED_screen_set(C, screen_new);
-
-	if (BKE_workspace_active_layout_get(workspace) != layout_old) {
-		BKE_workspace_layout_remove(workspace, layout_old, bmain);
-		return true;
-	}
-
-	return false;
-}
-
-static bool workspace_layout_set_poll(const WorkSpaceLayout *layout)
-{
-	const bScreen *screen = BKE_workspace_layout_screen_get(layout);
-
-	return ((BKE_screen_is_used(screen) == false) &&
-	        /* in typical usage temp screens should have a nonzero winid
-	         * (all temp screens should be used, or closed & freed). */
-	        (screen->temp == false) &
-	        (BKE_screen_is_fullscreen_area(screen) == false) &&
-	        (screen->id.name[2] != '.' || !(U.uiflag & USER_HIDE_DOT)));
-}
-
-static WorkSpaceLayout *workspace_layout_delete_find_new(const WorkSpaceLayout *layout_old)
-{
-	WorkSpaceLayout *layout_new;
-
-	for (layout_new = layout_old->prev; layout_new; layout_new = layout_new->prev) {
-		if (workspace_layout_set_poll(layout_new)) {
-			return layout_new;
-		}
-	}
-	for (layout_new = layout_old->next; layout_new; layout_new = layout_new->next) {
-		if (workspace_layout_set_poll(layout_new)) {
-			return layout_new;
-		}
-	}
-
-	return NULL;
-}
-
-/**
- * \warning Only call outside of area/region loops!
- * \return true if succeeded.
- */
-bool ED_workspace_layout_delete(bContext *C, WorkSpace *workspace, WorkSpaceLayout *layout_old)
-{
-	const bScreen *screen_old = layout_old->screen;
-	WorkSpaceLayout *layout_new;
-
-	BLI_assert(BLI_findindex(&workspace->layouts, layout_old) != -1);
-
-	/* don't allow deleting temp fullscreens for now */
-	if (BKE_screen_is_fullscreen_area(screen_old)) {
-		return false;
-	}
-
-	/* A layout/screen can only be in use by one window at a time, so as
-	 * long as we are able to find a layout/screen that is unused, we
-	 * can safely assume ours is not in use anywhere an delete it. */
-
-	layout_new = workspace_layout_delete_find_new(layout_old);
-
-	if (layout_new) {
-		return workspace_layout_delete_doit(C, workspace, layout_old, layout_new);
-	}
-
-	return false;
-}
-
-bool ED_workspace_layout_cycle(bContext *C, wmWindow *win, const short direction)
-{
-	const WorkSpace *workspace = win->workspace;
-	WorkSpaceLayout *old_layout = WM_window_get_active_layout(win);
-	WorkSpaceLayout *new_layout;
-	ScrArea *sa = CTX_wm_area(C);
-
-	if (WM_window_is_temp_screen(win) || (sa && sa->full && sa->full->temp)) {
-		return false;
-	}
-
-	if (direction == 1) {
-		BLI_LISTBASE_CIRCULAR_FORWARD_BEGIN(&workspace->layouts, new_layout, old_layout)
-		{
-			if (workspace_layout_set_poll(new_layout)) {
-				break;
-			}
-		}
-		BLI_LISTBASE_CIRCULAR_FORWARD_END(&workspace->layouts, new_layout, old_layout)
-	}
-	else if (direction == -1) {
-		BLI_LISTBASE_CIRCULAR_BACKWARD_BEGIN(&workspace->layouts, new_layout, old_layout)
-		{
-			if (workspace_layout_set_poll(new_layout)) {
-				break;
-			}
-		}
-		BLI_LISTBASE_CIRCULAR_BACKWARD_END(&workspace->layouts, new_layout, old_layout)
-	}
-	else {
-		BLI_assert(0);
-	}
-
-	if (new_layout && (old_layout != new_layout)) {
-		if (sa && sa->full) {
-			/* return to previous state before switching screens */
-			ED_screen_full_restore(C, sa); /* may free screen of old_layout */
-		}
-
-		ED_screen_set(C, new_layout->screen);
-
-		return true;
-	}
-
-	return false;
-}
-
 /** \} Workspace API */
 
 
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_layout_edit.c
similarity index 53%
copy from source/blender/editors/screen/workspace_edit.c
copy to source/blender/editors/screen/workspace_layout_edit.c
index d4097f6..b70d047 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_layout_edit.c
@@ -18,97 +18,22 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file blender/editors/screen/workspace_edit.c
+/** \file blender/editors/screen/workspace_layout_edit.c
  *  \ingroup edscr
  */
 
 #include "BKE_context.h"
 #include "BKE_main.h"
-#include "BKE_library.h"
 #include "BKE_screen.h"
 #include "BKE_workspace.h"
 
 #include "BLI_listbase.h"
+#include "BLI_utildefines.h"
 
 #include "DNA_screen_types.h"
-#include "DNA_windowmanager_types.h"
 
 #include "ED_screen.h"
 
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "screen_intern.h"
-
-
-/** \name Workspace API
- *
- * \brief API for managing workspaces and their data.
- * \{ */
-
-
-/**
- * \brief Change the active workspace.
- *
- * Operator call, WM + Window + screen already existed before
- * Pretty similar to #ED_screen_set since changing workspace also changes screen.
- *
- * \warning Do NOT call in area/region queues!
- * \returns success.
- */
-bool ED_workspace_change(bContext *C, wmWindow *win, WorkSpace *ws_new)
-{
-	Main *bmain = CTX_data_main(C);
-	bScreen *screen_old = BKE_workspace_active_screen_get(win->workspace);
-	bScreen *screen_new = BKE_workspace_active_screen_get(ws_new);
-
-	if (!(screen_new = screen_set_ensure_valid(bmain, win, screen_new))) {
-		return false;
-	}
-
-	if (screen_old != screen_new) {
-		screen_set_prepare(C, win, screen_new, screen_old);
-		win->workspace = ws_new;
-		screen_set_refresh(bmain, C, win, screen_old->scene != screen_new->scene);
-	}
-	BLI_assert(CTX_wm_workspace(C) == ws_new);
-
-	return true;
-}
-
-/**
- * Duplicate a workspace including its active screen (since two workspaces can't show the same screen).
- */
-WorkSpace *ED_workspace_duplicate(Main *bmain, wmWindow *win)
-{
-	bScreen *old_screen = WM_window_get_active_screen(win);
-	bScreen *new_screen = ED_screen_duplicate(win, old_screen, NULL);
-	WorkSpace *old_ws = win->workspace;
-
-	new_screen->winid = win->winid;
-	new_screen->do_refresh = true;
-	new_screen->do_draw = true;
-
-	return BKE_workspace_duplicate(bmain, old_ws, new_screen);
-}
-
-/**
- * \return if succeeded.
- */
-bool ED_workspace_delete(Main *bmain, bContext *C, wmWindow *win, WorkSpace *ws)
-{
-	if (BLI_listbase_is_single(&bmain->workspaces)) {
-		return false;
-	}
-
-	if (win->workspace == ws) {
-		WorkSpace *fallback_ws = ws->id.prev ? ws->id.prev : ws->id.next;
-		ED_workspace_change(C, win, fallback_ws);
-	}
-	BKE_libblock_free(bmain, &ws->id);
-
-	return true;
-}
 
 static bool workspace_layout_delete_doit(bContext *C, WorkSpace *workspace,
                                          WorkSpaceLayout *layout_old, WorkSpaceLayout *layout_new)
@@ -185,14 +110,13 @@ bool ED_workspace_layout_delete(bContext *C, WorkSpace *workspace, WorkSpaceLayo
 	return false;
 }
 
-bool ED_workspace_layout_cycle(bContext *C, wmWindow *win, const short direction)
+bool ED_workspace_layout_cycle(bContext *C, WorkSpace *workspace, const short direction)
 {
-	const WorkSpace *workspace = win->workspace;
-	WorkSpaceLayout *old_layout = WM_window_get_active_layout(win);
+	WorkSpaceLayout *old_layout = BKE_workspace_active_layout_get(workspace);
 	WorkSpaceLayout *new_layout;
 	ScrArea *sa = CTX_wm_area(C);
 
-	if (WM_window_is_temp_screen(win) || (sa && sa->full && sa->full->temp)) {
+	if (old_layout->screen->temp || (sa && sa->full && sa->full->temp)) {
 		return false;
 	}
 
@@ -231,63 +155,3 @@ bool ED_workspace_layout_cycle(bContext *C, wmWindow *win, const short direction
 
 	return false;
 }
-
-/** \} Workspace API */
-
-
-/** \name Workspace Operators
- *
- * \{ */
-
-static int workspace_new_exec(bContext *C, wmOperator *UNUSED(op))
-{
-	Main *bmain = CTX_data_main(C);
-	wmWindow *win = CTX_wm_window(C);
-	WorkSpace *workspace;
-
-	workspace = ED_workspace_duplicate(bmain, win);
-	WM_event_add_notifier(C, NC_SCREEN | ND_WORKSPACE

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list