forked from bartvdbraak/blender
UI: save statusbar/topbar collapsed state per screen.
This can now also be set from the Window menu in addition to dragging.
This commit is contained in:
parent
7f9a1d2f3b
commit
a069d3dc8c
@ -1 +1 @@
|
||||
Subproject commit 371960484a38fc64e0a2635170a41a0d8ab2f6bd
|
||||
Subproject commit 1a5f14657ee06ec2f520326032305dc1f2c5e2d5
|
@ -1 +1 @@
|
||||
Subproject commit 15b25a42783d1e516b5298d70b582fae2559ae17
|
||||
Subproject commit b4496a81e4f3d607a692f7c2e12fce3dbd784de4
|
@ -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":
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static void screen_global_topbar_area_create(wmWindow *win)
|
||||
{
|
||||
const short size_y = 2.25 * HEADERY;
|
||||
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;
|
||||
|
||||
screen_global_area_create(win, SPACE_TOPBAR, GLOBAL_AREA_ALIGN_TOP, &rect, size_y, HEADERY, size_y);
|
||||
}
|
||||
|
||||
static void screen_global_statusbar_area_create(wmWindow *win)
|
||||
{
|
||||
const short size_y = 0.8f * HEADERY;
|
||||
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;
|
||||
|
||||
screen_global_area_create(win, SPACE_STATUSBAR, GLOBAL_AREA_ALIGN_BOTTOM, &rect, size_y, 0, size_y);
|
||||
}
|
||||
|
||||
void ED_screen_global_areas_create(wmWindow *win)
|
||||
{
|
||||
/* Don't create global areas for child windows. */
|
||||
if (win->parent) {
|
||||
return;
|
||||
for (area = win->global_areas.areabase.first; area; area = area->next) {
|
||||
if (area->spacetype == space_type) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Don't create global area for temporary windows. */
|
||||
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;
|
||||
|
||||
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_refresh(wmWindow *win, bScreen *screen)
|
||||
{
|
||||
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_max;
|
||||
|
||||
screen_global_area_refresh(win, screen, SPACE_TOPBAR, GLOBAL_AREA_ALIGN_TOP, &rect, size, size_min, size_max);
|
||||
}
|
||||
|
||||
static void screen_global_statusbar_area_refresh(wmWindow *win, bScreen *screen)
|
||||
{
|
||||
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_max;
|
||||
|
||||
screen_global_area_refresh(win, screen, SPACE_STATUSBAR, GLOBAL_AREA_ALIGN_BOTTOM, &rect, size, size_min, size_max);
|
||||
}
|
||||
|
||||
void ED_screen_global_areas_sync(wmWindow *win)
|
||||
{
|
||||
/* 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);
|
||||
if (screen->temp) {
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 ((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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user