[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