From a069d3dc8cc48dcd55e5eff3d002fb06d99dc123 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 17 Aug 2018 17:32:36 +0200 Subject: UI: save statusbar/topbar collapsed state per screen. This can now also be set from the Window menu in addition to dragging. --- source/blender/editors/include/ED_screen.h | 4 +- source/blender/editors/screen/screen_edit.c | 121 +++++++++++++++++------- source/blender/editors/screen/screen_ops.c | 12 ++- source/blender/makesdna/DNA_screen_types.h | 9 +- source/blender/makesrna/intern/rna_screen.c | 16 ++++ source/blender/windowmanager/intern/wm_window.c | 4 +- 6 files changed, 126 insertions(+), 40 deletions(-) (limited to 'source/blender') 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_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -66,6 +66,7 @@ typedef struct bScreen { struct Scene *scene DNA_DEPRECATED; + short flag; /* general flags */ short winid; /* winid from WM, starts with 1 */ short redraws_flag; /* user-setting for which editors get redrawn during anim playback (used to be time->redraws) */ @@ -78,7 +79,7 @@ typedef struct bScreen { char do_draw_drag; /* notifier for dragging draw. */ char skip_handling; /* set to delay screen handling after switching back from maximized area */ char scrubbing; /* set when scrubbing to avoid some costly updates */ - char pad[3]; + char pad[1]; struct ARegion *active_region; /* active region that has mouse focus */ @@ -382,6 +383,12 @@ enum { #define AREAMINX 32 #define HEADERY 26 +/* screen->flag */ +enum { + SCREEN_COLLAPSE_TOPBAR = 1, + SCREEN_COLLAPSE_STATUSBAR = 2, +}; + /* screen->state */ enum { SCREENNORMAL = 0, diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index a6a23d6322d..5f199608f65 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -68,6 +68,12 @@ const EnumPropertyItem rna_enum_region_type_items[] = { # include "BPY_extern.h" #endif +static void rna_Screen_bar_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) +{ + bScreen *screen = (bScreen *)ptr->data; + screen->do_draw = true; + screen->do_refresh = true; +} static void rna_Screen_redraw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) { @@ -530,6 +536,16 @@ static void rna_def_screen(BlenderRNA *brna) RNA_def_property_boolean_funcs(prop, "rna_Screen_fullscreen_get", NULL); RNA_def_property_ui_text(prop, "Maximize", "An area is maximized, filling this screen"); + prop = RNA_def_property(srna, "show_topbar", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SCREEN_COLLAPSE_TOPBAR); + RNA_def_property_ui_text(prop, "Show Top Bar", "Show top bar with tool settings"); + RNA_def_property_update(prop, 0, "rna_Screen_bar_update"); + + prop = RNA_def_property(srna, "show_statusbar", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SCREEN_COLLAPSE_STATUSBAR); + RNA_def_property_ui_text(prop, "Show Status Bar", "Show status bar"); + RNA_def_property_update(prop, 0, "rna_Screen_bar_update"); + /* Define Anim Playback Areas */ prop = RNA_def_property(srna, "use_play_top_left_3d_editor", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_REGION); diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index c5226a0b809..398ed7f1b70 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -784,9 +784,7 @@ void wm_window_ghostwindows_ensure(wmWindowManager *wm) wm_window_title(wm, win); /* add topbar */ - if (BLI_listbase_is_empty(&win->global_areas.areabase)) { - ED_screen_global_areas_create(win); - } + ED_screen_global_areas_refresh(win); } } -- cgit v1.2.3