[Bf-blender-cvs] [a069d3dc8cc] blender2.8: UI: save statusbar/topbar collapsed state per screen.

Brecht Van Lommel noreply at git.blender.org
Fri Aug 17 20:18:26 CEST 2018


Commit: a069d3dc8cc48dcd55e5eff3d002fb06d99dc123
Author: Brecht Van Lommel
Date:   Fri Aug 17 17:32:36 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBa069d3dc8cc48dcd55e5eff3d002fb06d99dc123

UI: save statusbar/topbar collapsed state per screen.

This can now also be set from the Window menu in addition to dragging.

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

M	release/scripts/addons
M	release/scripts/addons_contrib
M	release/scripts/startup/bl_ui/space_topbar.py
M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/screen/screen_edit.c
M	source/blender/editors/screen/screen_ops.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/makesrna/intern/rna_screen.c
M	source/blender/windowmanager/intern/wm_window.c

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

diff --git a/release/scripts/addons b/release/scripts/addons
index 371960484a3..1a5f14657ee 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 371960484a38fc64e0a2635170a41a0d8ab2f6bd
+Subproject commit 1a5f14657ee06ec2f520326032305dc1f2c5e2d5
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 15b25a42783..b4496a81e4f 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 15b25a42783d1e516b5298d70b582fae2559ae17
+Subproject commit b4496a81e4f3d607a692f7c2e12fce3dbd784de4
diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py
index a417ef856f9..881d3db8a4c 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -504,6 +504,11 @@ class INFO_MT_window(Menu):
 
         layout.separator()
 
+        layout.prop(context.screen, "show_topbar")
+        layout.prop(context.screen, "show_statusbar")
+
+        layout.separator()
+
         layout.operator("screen.screenshot")
 
         if sys.platform[:3] == "win":
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 2445cbdb16c..8d7b723002a 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -135,8 +135,8 @@ int     ED_area_header_switchbutton(const struct bContext *C, struct uiBlock *bl
 void    ED_area_initialize(struct wmWindowManager *wm, struct wmWindow *win, struct ScrArea *sa);
 void    ED_area_exit(struct bContext *C, struct ScrArea *sa);
 int     ED_screen_area_active(const struct bContext *C);
-void    ED_screen_global_areas_create(
-            struct wmWindow *win);
+void    ED_screen_global_areas_refresh(struct wmWindow *win);
+void    ED_screen_global_areas_sync(struct wmWindow *win);
 void    ED_area_do_listen(struct wmWindow *win, ScrArea *sa, struct wmNotifier *note, Scene *scene);
 void    ED_area_tag_redraw(ScrArea *sa);
 void    ED_area_tag_redraw_no_rebuild(ScrArea *sa);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 24f7ee506c9..786a34db621 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -240,6 +240,8 @@ void screen_data_copy(bScreen *to, bScreen *from)
 	/* free contents of 'to', is from blenkernel screen.c */
 	BKE_screen_free(to);
 
+	to->flag = from->flag;
+
 	BLI_duplicatelist(&to->vertbase, &from->vertbase);
 	BLI_duplicatelist(&to->edgebase, &from->edgebase);
 	BLI_duplicatelist(&to->areabase, &from->areabase);
@@ -441,6 +443,8 @@ void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
 	if (!G.background) {
 		/* header size depends on DPI, let's verify */
 		WM_window_set_dpi(win);
+
+		ED_screen_global_areas_refresh(win);
 		screen_refresh_headersizes();
 
 		screen_geom_vertices_scale(win, screen);
@@ -476,9 +480,6 @@ void ED_screens_initialize(Main *bmain, wmWindowManager *wm)
 			BKE_workspace_active_set(win->workspace_hook, bmain->workspaces.first);
 		}
 
-		if (BLI_listbase_is_empty(&win->global_areas.areabase)) {
-			ED_screen_global_areas_create(win);
-		}
 		ED_screen_refresh(wm, win);
 		if (win->eventstate) {
 			ED_screen_set_active_region(NULL, win, &win->eventstate->x);
@@ -742,64 +743,118 @@ static ScrArea *screen_area_create_with_geometry(
 	return screen_addarea_ex(area_map, bottom_left, top_left, top_right, bottom_right, spacetype);
 }
 
-static void screen_global_area_create(
-        wmWindow *win, eSpace_Type space_type, GlobalAreaAlign align, const rcti *rect,
+static void screen_area_set_geometry_rect(ScrArea *sa, const rcti *rect)
+{
+	sa->v1->vec.x = rect->xmin;
+	sa->v1->vec.y = rect->ymin;
+	sa->v2->vec.x = rect->xmin;
+	sa->v2->vec.y = rect->ymax;
+	sa->v3->vec.x = rect->xmax;
+	sa->v3->vec.y = rect->ymax;
+	sa->v4->vec.x = rect->xmax;
+	sa->v4->vec.y = rect->ymin;
+}
+
+static void screen_global_area_refresh(
+        wmWindow *win, bScreen *screen,
+        eSpace_Type space_type, GlobalAreaAlign align, const rcti *rect,
         const short height_cur, const short height_min, const short height_max)
 {
-	ScrArea *area = screen_area_create_with_geometry(&win->global_areas, rect, space_type);
-	SpaceType *stype = BKE_spacetype_from_id(space_type);
-	SpaceLink *slink = stype->new(area, WM_window_get_active_scene(win));
+	ScrArea *area;
+
+	for (area = win->global_areas.areabase.first; area; area = area->next) {
+		if (area->spacetype == space_type) {
+			break;
+		}
+	}
+
+	if (area) {
+		screen_area_set_geometry_rect(area, rect);
+	}
+	else {
+		area = screen_area_create_with_geometry(&win->global_areas, rect, space_type);
+		SpaceType *stype = BKE_spacetype_from_id(space_type);
+		SpaceLink *slink = stype->new(area, WM_window_get_active_scene(win));
 
-	area->regionbase = slink->regionbase;
+		area->regionbase = slink->regionbase;
 
-	/* Data specific to global areas. */
-	area->global = MEM_callocN(sizeof(*area->global), __func__);
-	area->global->cur_fixed_height = height_cur;
-	area->global->size_max = height_max;
-	area->global->size_min = height_min;
-	area->global->align = align;
+		BLI_addhead(&area->spacedata, slink);
+		BLI_listbase_clear(&slink->regionbase);
 
-	BLI_addhead(&area->spacedata, slink);
-	BLI_listbase_clear(&slink->regionbase);
+		/* Data specific to global areas. */
+		area->global = MEM_callocN(sizeof(*area->global), __func__);
+		area->global->size_max = height_max;
+		area->global->size_min = height_min;
+		area->global->align = align;
+	}
+
+	if (area->global->cur_fixed_height != height_cur) {
+		/* Refresh layout if size changes. */
+		area->global->cur_fixed_height = height_cur;
+		screen->do_refresh = true;
+	}
 }
 
-static void screen_global_topbar_area_create(wmWindow *win)
+static void screen_global_topbar_area_refresh(wmWindow *win, bScreen *screen)
 {
-	const short size_y = 2.25 * HEADERY;
+	const short size_min = HEADERY;
+	const short size_max = 2.25 * HEADERY;
+	const short size = (screen->flag & SCREEN_COLLAPSE_TOPBAR) ? size_min : size_max;
 	rcti rect;
 
 	BLI_rcti_init(&rect, 0, WM_window_pixels_x(win) - 1, 0, WM_window_pixels_y(win) - 1);
-	rect.ymin = rect.ymax - size_y;
+	rect.ymin = rect.ymax - size_max;
 
-	screen_global_area_create(win, SPACE_TOPBAR, GLOBAL_AREA_ALIGN_TOP, &rect, size_y, HEADERY, size_y);
+	screen_global_area_refresh(win, screen, SPACE_TOPBAR, GLOBAL_AREA_ALIGN_TOP, &rect, size, size_min, size_max);
 }
 
-static void screen_global_statusbar_area_create(wmWindow *win)
+static void screen_global_statusbar_area_refresh(wmWindow *win, bScreen *screen)
 {
-	const short size_y = 0.8f * HEADERY;
+	const short size_min = 1;
+	const short size_max = 0.8f * HEADERY;
+	const short size = (screen->flag & SCREEN_COLLAPSE_STATUSBAR) ? size_min : size_max;
 	rcti rect;
 
 	BLI_rcti_init(&rect, 0, WM_window_pixels_x(win) - 1, 0, WM_window_pixels_y(win) - 1);
-	rect.ymax = rect.ymin + size_y;
+	rect.ymax = rect.ymin + size_max;
 
-	screen_global_area_create(win, SPACE_STATUSBAR, GLOBAL_AREA_ALIGN_BOTTOM, &rect, size_y, 0, size_y);
+	screen_global_area_refresh(win, screen, SPACE_STATUSBAR, GLOBAL_AREA_ALIGN_BOTTOM, &rect, size, size_min, size_max);
 }
 
-void ED_screen_global_areas_create(wmWindow *win)
+void ED_screen_global_areas_sync(wmWindow *win)
 {
-	/* Don't create global areas for child windows. */
-	if (win->parent) {
-		return;
+	/* Update screen flags from height in window, this is weak and perhaps
+	 * global areas should just become part of the screen instead. */
+	bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
+
+	screen->flag &= ~(SCREEN_COLLAPSE_STATUSBAR | SCREEN_COLLAPSE_TOPBAR);
+
+	for (ScrArea *area = win->global_areas.areabase.first; area; area = area->next) {
+		if (area->global->cur_fixed_height == area->global->size_min) {
+			if (area->spacetype == SPACE_TOPBAR) {
+				screen->flag |= SCREEN_COLLAPSE_TOPBAR;
+			}
+			else if (area->spacetype == SPACE_STATUSBAR) {
+				screen->flag |= SCREEN_COLLAPSE_STATUSBAR;
+			}
+		}
 	}
+}
 
-	/* Don't create global area for temporary windows. */
+void ED_screen_global_areas_refresh(wmWindow *win)
+{
+	/* Don't create global area for child and temporary windows. */
 	bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
-	if (screen->temp) {
+	if ((win->parent != NULL) || screen->temp) {
+		if (win->global_areas.areabase.first) {
+			screen->do_refresh = true;
+		    BKE_screen_area_map_free(&win->global_areas);
+		}
 		return;
 	}
 
-	screen_global_topbar_area_create(win);
-	screen_global_statusbar_area_create(win);
+	screen_global_topbar_area_refresh(win, screen);
+	screen_global_statusbar_area_refresh(win, screen);
 }
 
 
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index c8ad2b954a5..0550afda342 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1486,7 +1486,15 @@ static void area_move_apply_do(
 		ED_screen_areas_iter(win, sc, sa) {
 			if (sa->v1->editflag || sa->v2->editflag || sa->v3->editflag || sa->v4->editflag) {
 				if (ED_area_is_global(sa)) {
-					sa->global->cur_fixed_height = round_fl_to_int(screen_geom_area_height(sa) / UI_DPI_FAC);
+					/* Snap to minimum or maximum for global areas. */
+					int height = round_fl_to_int(screen_geom_area_height(sa) / UI_DPI_FAC);
+					if (abs(height - sa->global->size_min) < abs(height - sa->global->size_max)) {
+						sa->global->cur_fixed_height = sa->global->size_min;
+					}
+					else {
+						sa->global->cur_fixed_height = sa->global->size_max;
+					}
+
 					sc->do_refresh = true;
 					redraw_all = true;
 				}
@@ -1499,6 +1507,8 @@ static void area_move_apply_do(
 			}
 		}
 
+		ED_screen_global_areas_sync(win);
+
 		WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL); /* redraw everything */
 		/* Update preview thumbnail */
 		BKE_icon_changed(sc->id.icon_id);
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 3815f01abeb..e17c7e17450 100644
--- a/source/blender/makesdna/DNA_scr

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list