From a180b754eb40637a5d37eeb0ae60066f5a6f93d8 Mon Sep 17 00:00:00 2001 From: George Vogiatzis Date: Fri, 5 Apr 2019 13:48:26 +0200 Subject: Interface: New region type 'Footer', used by text editor * It can be hidden by dragging it up/down. * It can be at the top or bottom, independent of the header. * It uses the color theme from the header. * It does not change its color, when the area becomes active. Currently, it is used in the text editor to display the file path. Differential Revision: https://developer.blender.org/D4601 --- source/blender/blenkernel/intern/screen.c | 7 ++ source/blender/blenloader/intern/versioning_280.c | 24 +++++ source/blender/editors/include/ED_screen.h | 5 + .../editors/interface/interface_context_menu.c | 3 + .../blender/editors/interface/interface_handlers.c | 2 +- .../interface/interface_region_menu_popup.c | 18 +++- .../editors/interface/interface_region_popover.c | 15 ++- source/blender/editors/interface/resources.c | 8 +- source/blender/editors/screen/area.c | 60 +++++++++--- source/blender/editors/screen/screen_edit.c | 9 +- source/blender/editors/screen/screen_ops.c | 108 ++++++++++++++++++++- source/blender/editors/space_text/space_text.c | 14 +++ source/blender/makesdna/DNA_screen_types.h | 3 +- source/blender/makesrna/intern/rna_screen.c | 1 + .../blender/windowmanager/intern/wm_event_system.c | 4 +- 15 files changed, 247 insertions(+), 34 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index 7a2b93e6833..7b4b11674ed 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -860,6 +860,13 @@ void BKE_screen_header_alignment_reset(bScreen *screen) } ar->alignment = alignment; } + if (ar->regiontype == RGN_TYPE_FOOTER) { + if (ELEM(sa->spacetype, SPACE_FILE, SPACE_USERPREF, SPACE_OUTLINER, SPACE_PROPERTIES)) { + ar->alignment = RGN_ALIGN_BOTTOM; + continue; + } + ar->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_TOP : RGN_ALIGN_BOTTOM; + } } } screen->do_refresh = true; diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index a1087caf40c..5c0ff1af7b2 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -2969,5 +2969,29 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) { /* Versioning code until next subversion bump goes here. */ + + for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { + if (sl->spacetype == SPACE_TEXT) { + ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase; + ARegion *ar = MEM_callocN(sizeof(ARegion), "footer for text"); + ARegion *ar_header = NULL; + + for (ar_header = regionbase->first; ar_header; ar_header = ar_header->next) { + if (ar_header->regiontype == RGN_TYPE_HEADER) { + break; + } + } + BLI_assert(ar_header); + + BLI_insertlinkafter(regionbase, ar_header, ar); + + ar->regiontype = RGN_TYPE_FOOTER; + ar->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_TOP : RGN_ALIGN_BOTTOM; + } + } + } + } } } diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index f44f951123a..10a1eab265a 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -147,6 +147,9 @@ void ED_area_swapspace(struct bContext *C, ScrArea *sa1, ScrArea *sa2); int ED_area_headersize(void); int ED_area_header_alignment_or_fallback(const ScrArea *area, int fallback); int ED_area_header_alignment(const ScrArea *area); +int ED_area_footersize(void); +int ED_area_footer_alignment_or_fallback(const ScrArea *area, int fallback); +int ED_area_footer_alignment(const ScrArea *area); int ED_area_global_size_y(const ScrArea *area); int ED_area_global_min_size_y(const ScrArea *area); int ED_area_global_max_size_y(const ScrArea *area); @@ -192,6 +195,7 @@ void ED_screen_full_prevspace(struct bContext *C, ScrArea *sa); void ED_screen_full_restore(struct bContext *C, ScrArea *sa); struct ScrArea *ED_screen_state_toggle(struct bContext *C, struct wmWindow *win, struct ScrArea *sa, const short state); void ED_screens_header_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg); +void ED_screens_footer_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg); void ED_screens_navigation_bar_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg); bool ED_screen_stereo3d_required(const struct bScreen *screen, const struct Scene *scene); Scene *ED_screen_scene_find(const struct bScreen *screen, const struct wmWindowManager *wm); @@ -365,6 +369,7 @@ enum { ED_KEYMAP_FRAMES = (1 << 7), ED_KEYMAP_HEADER = (1 << 8), ED_KEYMAP_GPENCIL = (1 << 9), + ED_KEYMAP_FOOTER = (1 << 10), }; /* SCREEN_OT_space_context_cycle direction */ diff --git a/source/blender/editors/interface/interface_context_menu.c b/source/blender/editors/interface/interface_context_menu.c index b5eb6302f81..4ca92fbb386 100644 --- a/source/blender/editors/interface/interface_context_menu.c +++ b/source/blender/editors/interface/interface_context_menu.c @@ -847,6 +847,9 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but) else if (ar->regiontype == RGN_TYPE_NAV_BAR) { uiItemMenuF(layout, IFACE_("Navigation Bar"), ICON_NONE, ED_screens_navigation_bar_tools_menu_create, NULL); } + else if (ar->regiontype == RGN_TYPE_FOOTER) { + uiItemMenuF(layout, IFACE_("Footer"), ICON_NONE, ED_screens_footer_tools_menu_create, NULL); + } } MenuType *mt = WM_menutype_find("WM_MT_button_context", true); diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 208c1a90b89..07be2253969 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -1784,7 +1784,7 @@ static bool ui_but_drag_init( /* Initialize alignment for single row/column regions, * otherwise we use the relative position of the first other button dragged over. */ - if (ELEM(data->region->regiontype, RGN_TYPE_NAV_BAR, RGN_TYPE_HEADER)) { + if (ELEM(data->region->regiontype, RGN_TYPE_NAV_BAR, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) { int lock_axis = -1; if (ELEM(data->region->alignment, RGN_ALIGN_LEFT, RGN_ALIGN_RIGHT)) { lock_axis = 0; diff --git a/source/blender/editors/interface/interface_region_menu_popup.c b/source/blender/editors/interface/interface_region_menu_popup.c index a20c4fe9379..0fe847caa20 100644 --- a/source/blender/editors/interface/interface_region_menu_popup.c +++ b/source/blender/editors/interface/interface_region_menu_popup.c @@ -278,11 +278,19 @@ static uiBlock *ui_block_func_POPUP(bContext *C, uiPopupBlockHandle *handle, voi /* for a header menu we set the direction automatic */ if (!pup->slideout && flip) { ScrArea *sa = CTX_wm_area(C); - if (sa && ED_area_header_alignment(sa) == RGN_ALIGN_BOTTOM) { - ARegion *ar = CTX_wm_region(C); - if (ar && ar->regiontype == RGN_TYPE_HEADER) { - UI_block_direction_set(block, UI_DIR_UP); - UI_block_order_flip(block); + ARegion *ar = CTX_wm_region(C); + if (sa && ar) { + if (ar->regiontype == RGN_TYPE_HEADER) { + if (ED_area_header_alignment(sa) == RGN_ALIGN_BOTTOM) { + UI_block_direction_set(block, UI_DIR_UP); + UI_block_order_flip(block); + } + } + if (ar->regiontype == RGN_TYPE_FOOTER) { + if (ED_area_footer_alignment(sa) == RGN_ALIGN_BOTTOM) { + UI_block_direction_set(block, UI_DIR_UP); + UI_block_order_flip(block); + } } } } diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c index 0b1d3f19919..7ca6db2ca21 100644 --- a/source/blender/editors/interface/interface_region_popover.c +++ b/source/blender/editors/interface/interface_region_popover.c @@ -180,10 +180,17 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v * see the values of the buttons below changing. */ UI_block_direction_set(block, UI_DIR_UP | UI_DIR_CENTER_X); } - else if (sa && ED_area_header_alignment(sa) == RGN_ALIGN_BOTTOM) { - /* Prefer popover from header to be positioned into the editor. */ - if (ar && ar->regiontype == RGN_TYPE_HEADER) { - UI_block_direction_set(block, UI_DIR_UP | UI_DIR_CENTER_X); + /* Prefer popover from header to be positioned into the editor. */ + else if (sa && ar) { + if (ar->regiontype == RGN_TYPE_HEADER){ + if (ED_area_header_alignment(sa) == RGN_ALIGN_BOTTOM) { + UI_block_direction_set(block, UI_DIR_UP | UI_DIR_CENTER_X); + } + } + if (ar->regiontype == RGN_TYPE_FOOTER) { + if (ED_area_footer_alignment(sa) == RGN_ALIGN_BOTTOM) { + UI_block_direction_set(block, UI_DIR_UP | UI_DIR_CENTER_X); + } } } } diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 72739b99e14..8d908375c1b 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -173,7 +173,7 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) else if (theme_regionid == RGN_TYPE_CHANNELS) { cp = ts->list; } - else if (theme_regionid == RGN_TYPE_HEADER) { + else if (ELEM(theme_regionid, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) { cp = ts->header; } else if (theme_regionid == RGN_TYPE_NAV_BAR) { @@ -207,7 +207,7 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) else if (theme_regionid == RGN_TYPE_CHANNELS) { cp = ts->list_text; } - else if (theme_regionid == RGN_TYPE_HEADER) { + else if (ELEM(theme_regionid, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) { cp = ts->header_text; } else { @@ -221,7 +221,7 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) else if (theme_regionid == RGN_TYPE_CHANNELS) { cp = ts->list_text_hi; } - else if (theme_regionid == RGN_TYPE_HEADER) { + else if (ELEM(theme_regionid, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) { cp = ts->header_text_hi; } else { @@ -235,7 +235,7 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) else if (theme_regionid == RGN_TYPE_CHANNELS) { cp = ts->list_title; } - else if (theme_regionid == RGN_TYPE_HEADER) { + else if (ELEM(theme_regionid, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) { cp = ts->header_title; } else { diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 886f2781312..0150127d6fb 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -1111,15 +1111,9 @@ bool ED_region_is_overlap(int spacetype, int regiontype) } } else if (ELEM(spacetype, SPACE_VIEW3D, SPACE_IMAGE)) { - if (ELEM(regiontype, RGN_TYPE_TOOLS, RGN_TYPE_UI, RGN_TYPE_TOOL_PROPS)) { + if (ELEM(regiontype, RGN_TYPE_TOOLS, RGN_TYPE_UI, RGN_TYPE_TOOL_PROPS, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) { return true; } - - if (ELEM(spacetype, SPACE_VIEW3D, SPACE_IMAGE)) { - if (regiontype == RGN_TYPE_HEADER) { - return true; - } - } } } @@ -1167,6 +1161,9 @@ static void region_rect_recursive(ScrArea *sa, ARegion *ar, rcti *remainder, rct else if (ar->regiontype == RGN_TYPE_HEADER) { prefsizey = ED_area_headersize(); } + else if (ar->regiontype == RGN_TYPE_FOOTER) { + prefsizey = ED_area_footersize(); + } else if (ED_area_is_global(sa)) { prefsizey = ED_region_global_size_y(); } @@ -1520,6 +1517,11 @@ static void ed_default_handlers(wmWindowManager *wm, ScrArea *sa, ARegion *ar, L wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Header", 0, 0); WM_event_add_keymap_handler(handlers, keymap); } + if (flag & ED_KEYMAP_FOOTER) { + /* standard keymap for footer regions */ + wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Footer", 0, 0); + WM_event_add_keymap_handler(handlers, keymap); + } /* Keep last because of LMB/RMB handling, see: T57527. */ if (flag & ED_KEYMAP_GPENCIL) { @@ -1910,10 +1912,25 @@ void ED_area_newspace(bContext *C, ScrArea *sa, int type, const bool skip_ar_exi /* Sync header alignment. */ if (sync_header_alignment) { - for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { - if (ar->regiontype == RGN_TYPE_HEADER) { - ar->alignment = header_alignment; - break; + /* Spaces with footer. */ + if (st->spaceid == SPACE_TEXT){ + for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { + if (ar->regiontype == RGN_TYPE_HEADER) { + ar->alignment = header_alignment; + } + if (ar->regiontype == RGN_TYPE_FOOTER) { + int footer_alignment = (header_alignment == RGN_ALIGN_BOTTOM) ? RGN_ALIGN_TOP : RGN_ALIGN_BOTTOM; + ar->alignment = footer_alignment; + break; + } + } + } + else { + for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { + if (ar->regiontype == RGN_TYPE_HEADER) { + ar->alignment = header_alignment; + break; + } } } } @@ -2538,6 +2555,27 @@ int ED_area_header_alignment(const ScrArea *area) area, (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP); } +int ED_area_footersize(void) +{ + return ED_area_headersize(); +} + +int ED_area_footer_alignment_or_fallback(const ScrArea *area, int fallback) +{ + for (ARegion *ar = area->regionbase.first; ar; ar = ar->next) { + if (ar->regiontype == RGN_TYPE_FOOTER) { + return ar->alignment; + } + } + return fallback; +} + +int ED_area_footer_alignment(const ScrArea *area) +{ + return ED_area_footer_alignment_or_fallback( + area, (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_TOP : RGN_ALIGN_BOTTOM); +} + /** * \return the final height of a global \a area, accounting for DPI. */ diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index cd5b557f986..41ce5455c3b 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -421,7 +421,11 @@ static void screen_refresh_headersizes(void) SpaceType *st; for (st = lb->first; st; st = st->next) { - ARegionType *art = BKE_regiontype_from_id(st, RGN_TYPE_HEADER); + ARegionType *art; + art = BKE_regiontype_from_id(st, RGN_TYPE_HEADER); + if (art) art->prefsizey = ED_area_headersize(); + + art = BKE_regiontype_from_id(st, RGN_TYPE_FOOTER); if (art) art->prefsizey = ED_area_headersize(); } } @@ -1259,7 +1263,8 @@ ScrArea *ED_screen_state_toggle(bContext *C, wmWindow *win, ScrArea *sa, const s for (ar = newa->regionbase.first; ar; ar = ar->next) { ar->flagfullscreen = ar->flag; - if (ELEM(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_HEADER, RGN_TYPE_TOOLS, RGN_TYPE_NAV_BAR, RGN_TYPE_EXECUTE)) { + if (ELEM(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_HEADER, RGN_TYPE_FOOTER, + RGN_TYPE_TOOLS, RGN_TYPE_NAV_BAR, RGN_TYPE_EXECUTE)) { ar->flag |= RGN_FLAG_HIDDEN; } } diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index ed96621a906..09ca0476b10 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -2317,12 +2317,13 @@ static int area_max_regionsize(ScrArea *sa, ARegion *scalear, AZEdge edge) dist -= ar->winx; } else if (scalear->alignment == RGN_ALIGN_TOP && - (ar->alignment == RGN_ALIGN_BOTTOM || ar->regiontype == RGN_TYPE_HEADER)) + (ar->alignment == RGN_ALIGN_BOTTOM || ELEM(ar->regiontype, RGN_TYPE_HEADER, RGN_TYPE_FOOTER))) { dist -= ar->winy; } else if (scalear->alignment == RGN_ALIGN_BOTTOM && - (ar->alignment == RGN_ALIGN_TOP || ar->regiontype == RGN_TYPE_HEADER)) { + (ar->alignment == RGN_ALIGN_TOP || ELEM(ar->regiontype, RGN_TYPE_HEADER, RGN_TYPE_FOOTER))) + { dist -= ar->winy; } } @@ -2469,8 +2470,8 @@ static int region_scale_modal(bContext *C, wmOperator *op, const wmEvent *event) } CLAMP(rmd->ar->sizey, 0, rmd->maxsize); - /* note, 'UI_UNIT_Y/4' means you need to drag the header almost - * all the way down for it to become hidden, this is done + /* note, 'UI_UNIT_Y/4' means you need to drag the footer and execute region + * almost all the way down for it to become hidden, this is done * otherwise its too easy to do this by accident */ if (rmd->ar->sizey < UI_UNIT_Y / 4) { rmd->ar->sizey = rmd->origval; @@ -3849,6 +3850,103 @@ static void SCREEN_OT_header_context_menu(wmOperatorType *ot) /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Footer Toggle Operator + * \{ */ + +static int footer_exec(bContext *C, wmOperator *UNUSED(op)) +{ + ARegion *ar = screen_find_region_type(C, RGN_TYPE_FOOTER); + + if (ar == NULL) { + return OPERATOR_CANCELLED; + } + + ar->flag ^= RGN_FLAG_HIDDEN; + + ED_area_tag_redraw(CTX_wm_area(C)); + + WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL); + + return OPERATOR_FINISHED; +} + +static void SCREEN_OT_footer(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Toggle Footer"; + ot->description = "Toggle footer display"; + ot->idname = "SCREEN_OT_footer"; + + /* api callbacks */ + ot->exec = footer_exec; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Footer Tools Operator + * \{ */ + +static bool footer_context_menu_poll(bContext *C) +{ + ScrArea *sa = CTX_wm_area(C); + return sa; +} + +void ED_screens_footer_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg)) +{ + ScrArea *sa = CTX_wm_area(C); + ARegion *ar = CTX_wm_region(C); + const char *but_flip_str = (ar->alignment == RGN_ALIGN_TOP) ? IFACE_("Flip to Bottom") : IFACE_("Flip to Top"); + + uiItemO(layout, IFACE_("Toggle Footer"), ICON_NONE, "SCREEN_OT_footer"); + + /* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */ + uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT); + + uiItemO(layout, but_flip_str, ICON_NONE, "SCREEN_OT_region_flip"); + + + /* file browser should be fullscreen all the time, topbar should + * never be. But other regions can be maximized/restored... */ + if (!ELEM(sa->spacetype, SPACE_FILE, SPACE_TOPBAR)) { + uiItemS(layout); + + const char *but_str = sa->full ? IFACE_("Tile Area") : IFACE_("Maximize Area"); + uiItemO(layout, but_str, ICON_NONE, "SCREEN_OT_screen_full_area"); + } +} + +static int footer_context_menu_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event)) +{ + uiPopupMenu *pup; + uiLayout *layout; + + pup = UI_popup_menu_begin(C, IFACE_("Footer"), ICON_NONE); + layout = UI_popup_menu_layout(pup); + + ED_screens_footer_tools_menu_create(C, layout, NULL); + + UI_popup_menu_end(C, pup); + + return OPERATOR_INTERFACE; +} + +static void SCREEN_OT_footer_context_menu(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Footer Context Menu"; + ot->description = "Display footer region context menu"; + ot->idname = "SCREEN_OT_footer_context_menu"; + + /* api callbacks */ + ot->poll = footer_context_menu_poll; + ot->invoke = footer_context_menu_invoke; +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Navigation Bar Tools Menu * \{ */ @@ -4968,6 +5066,8 @@ void ED_operatortypes_screen(void) WM_operatortype_append(SCREEN_OT_header); WM_operatortype_append(SCREEN_OT_header_toggle_menus); WM_operatortype_append(SCREEN_OT_header_context_menu); + WM_operatortype_append(SCREEN_OT_footer); + WM_operatortype_append(SCREEN_OT_footer_context_menu); WM_operatortype_append(SCREEN_OT_screen_set); WM_operatortype_append(SCREEN_OT_screen_full_area); WM_operatortype_append(SCREEN_OT_back_to_previous); diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index cd5b3facfe9..55165e4840f 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -74,6 +74,12 @@ static SpaceLink *text_new(const ScrArea *UNUSED(area), const Scene *UNUSED(scen ar->regiontype = RGN_TYPE_HEADER; ar->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP; + /* footer */ + ar = MEM_callocN(sizeof(ARegion), "footer for text"); + BLI_addtail(&stext->regionbase, ar); + ar->regiontype = RGN_TYPE_FOOTER; + ar->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_TOP : RGN_ALIGN_BOTTOM; + /* properties region */ ar = MEM_callocN(sizeof(ARegion), "properties region for text"); @@ -469,7 +475,15 @@ void ED_spacetype_text(void) art->init = text_header_region_init; art->draw = text_header_region_draw; + BLI_addhead(&st->regiontypes, art); + /* regions: footer */ + art = MEM_callocN(sizeof(ARegionType), "spacetype text region"); + art->regionid = RGN_TYPE_FOOTER; + art->prefsizey = HEADERY; + art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_FOOTER; + art->init = text_header_region_init; + art->draw = text_header_region_draw; BLI_addhead(&st->regiontypes, art); BKE_spacetype_register(st); diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index fb111fad335..a04d16b56fa 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -590,8 +590,9 @@ enum { RGN_TYPE_HUD = 8, /* Region to navigate the main region from (RGN_TYPE_WINDOW). */ RGN_TYPE_NAV_BAR = 9, - /* A place for buttons to trigger execution of somthing that was set up in other regions. */ + /* A place for buttons to trigger execution of something that was set up in other regions. */ RGN_TYPE_EXECUTE = 10, + RGN_TYPE_FOOTER = 11, }; /* use for function args */ #define RGN_TYPE_ANY -1 diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index c42bfd55412..a6f321e614d 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -43,6 +43,7 @@ const EnumPropertyItem rna_enum_region_type_items[] = { {RGN_TYPE_HUD, "HUD", 0, "Floating Region", ""}, {RGN_TYPE_NAV_BAR, "NAVIGATION_BAR", 0, "Navigation Bar", ""}, {RGN_TYPE_EXECUTE, "EXECUTE", 0, "Execute Buttons", ""}, + {RGN_TYPE_FOOTER, "FOOTER", 0, "Footer", ""}, {0, NULL, 0, NULL, NULL}, }; diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 70c2470e764..940e7fa8e96 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1401,7 +1401,7 @@ static int wm_operator_invoke( /* exception, cont. grab in header is annoying */ if (wrap) { ARegion *ar = CTX_wm_region(C); - if (ar && ar->regiontype == RGN_TYPE_HEADER) { + if (ar && ELEM(ar->regiontype, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) { wrap = false; } } @@ -4699,7 +4699,7 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win) if (ELEM(sa->spacetype, SPACE_STATUSBAR, SPACE_TOPBAR)) { return; } - if (ELEM(ar->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TEMPORARY, RGN_TYPE_HUD)) { + if (ELEM(ar->regiontype, RGN_TYPE_HEADER, RGN_TYPE_FOOTER, RGN_TYPE_TEMPORARY, RGN_TYPE_HUD)) { return; } /* Fallback to window. */ -- cgit v1.2.3