[Bf-blender-cvs] [20809ec] workspaces: Make layout cycling work (Ctrl+Arrow Left/Right)

Julian Eisel noreply at git.blender.org
Tue Dec 6 02:03:50 CET 2016


Commit: 20809ec279e4a914a0968bed23f615fdb9c78dcd
Author: Julian Eisel
Date:   Tue Dec 6 01:58:22 2016 +0100
Branches: workspaces
https://developer.blender.org/rB20809ec279e4a914a0968bed23f615fdb9c78dcd

Make layout cycling work (Ctrl+Arrow Left/Right)

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

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/screen/screen_ops.c
M	source/blender/editors/screen/workspace_edit.c

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

diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 3144e85..0297e5e 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -127,6 +127,7 @@ void    ED_screen_preview_render(const struct bScreen *screen, int size_x, int s
 bool ED_workspace_change(struct bContext *C, struct wmWindow *win, WorkSpace *ws_new) ATTR_NONNULL();
 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_circle(struct bContext *C, struct wmWindow *win, 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/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index bc5df4f..15f8719 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -2386,64 +2386,16 @@ static void SCREEN_OT_marker_jump(wmOperatorType *ot)
 
 /* ************** switch screen operator ***************************** */
 
-static bool screen_set_is_ok(bScreen *screen, bScreen *screen_prev)
-{
-	return ((screen->winid == 0) &&
-	        /* in typical usage these should have a nonzero winid
-	         * (all temp screens should be used, or closed & freed). */
-	        (screen->temp == false) &&
-	        (screen->state == SCREENNORMAL) &&
-	        (screen != screen_prev) &&
-	        (screen->id.name[2] != '.' || !(U.uiflag & USER_HIDE_DOT)));
-}
-
 /* function to be called outside UI context, or for redo */
 static int screen_set_exec(bContext *C, wmOperator *op)
 {
-	Main *bmain = CTX_data_main(C);
-	bScreen *screen = CTX_wm_screen(C);
-	bScreen *screen_prev = screen;
-	
-	ScrArea *sa = CTX_wm_area(C);
-	int tot = BLI_listbase_count(&bmain->screen);
+	wmWindow *win = CTX_wm_window(C);
 	int delta = RNA_int_get(op->ptr, "delta");
-	
-	/* temp screens are for userpref or render display */
-	if (screen->temp || (sa && sa->full && sa->full->temp)) {
-		return OPERATOR_CANCELLED;
-	}
-	
-	if (delta == 1) {
-		while (tot--) {
-			screen = screen->id.next;
-			if (screen == NULL) screen = bmain->screen.first;
-			if (screen_set_is_ok(screen, screen_prev)) {
-				break;
-			}
-		}
-	}
-	else if (delta == -1) {
-		while (tot--) {
-			screen = screen->id.prev;
-			if (screen == NULL) screen = bmain->screen.last;
-			if (screen_set_is_ok(screen, screen_prev)) {
-				break;
-			}
-		}
-	}
-	else {
-		screen = NULL;
-	}
-	
-	if (screen && screen_prev != screen) {
-		/* return to previous state before switching screens */
-		if (sa && sa->full) {
-			ED_screen_full_restore(C, sa); /* may free 'screen_prev' */
-		}
-		
-		ED_screen_set(C, screen);
+
+	if (ED_workspace_layout_circle(C, win, delta)) {
 		return OPERATOR_FINISHED;
 	}
+
 	return OPERATOR_CANCELLED;
 }
 
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index dba1c40..ba8085b 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -109,6 +109,65 @@ bool ED_workspace_delete(Main *bmain, bContext *C, wmWindow *win, WorkSpace *ws)
 	return true;
 }
 
+static bool workspace_layout_set_poll(const WorkSpaceLayout *layout)
+{
+	const bScreen *screen = layout->screen;
+
+	return ((screen->winid == 0) &&
+	        /* in typical usage these should have a nonzero winid
+	         * (all temp screens should be used, or closed & freed). */
+	        (screen->temp == false) &&
+	        (screen->state == SCREENNORMAL) &&
+	        (screen->id.name[2] != '.' || !(U.uiflag & USER_HIDE_DOT)));
+}
+
+bool ED_workspace_layout_circle(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 */




More information about the Bf-blender-cvs mailing list