diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-05-23 20:46:40 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-05-23 20:48:28 +0300 |
commit | 933a0835875c71dc177227c87e8bbe281f0a7f55 (patch) | |
tree | 452babec7d8b3dd536a5ed7f5bb0980aa44bd3e3 /source/blender/editors/interface/interface_region_popover.c | |
parent | b642b510e110abfe15d37344e67b07f98d73a273 (diff) |
UI: popup panel operator, as we have for menus
Diffstat (limited to 'source/blender/editors/interface/interface_region_popover.c')
-rw-r--r-- | source/blender/editors/interface/interface_region_popover.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c index 54776ad9c91..b6248d3daa1 100644 --- a/source/blender/editors/interface/interface_region_popover.c +++ b/source/blender/editors/interface/interface_region_popover.c @@ -56,6 +56,8 @@ #include "BLI_utildefines.h" #include "BKE_context.h" +#include "BKE_screen.h" +#include "BKE_report.h" #include "ED_screen.h" @@ -251,6 +253,63 @@ uiPopupBlockHandle *ui_popover_panel_create( /** \} */ /* -------------------------------------------------------------------- */ +/** \name Standard Popover Panels + * \{ */ + + +void UI_popover_panel_from_type(bContext *C, uiLayout *layout, PanelType *pt) +{ + /* TODO: move into UI_paneltype_draw */ + Panel *panel = MEM_callocN(sizeof(Panel), "popover panel"); + panel->type = pt; + + + if (pt->draw_header) { + panel->layout = uiLayoutRow(layout, false); + pt->draw_header(C, panel); + panel->layout = NULL; + } + + panel->layout = layout; + pt->draw(C, panel); + panel->layout = NULL; + + MEM_freeN(panel); +} + +int UI_popover_panel_invoke( + bContext *C, int space_id, int region_id, const char *idname, + ReportList *reports) +{ + uiLayout *layout; + PanelType *pt = UI_paneltype_find(space_id, region_id, idname); + if (pt == NULL) { + BKE_reportf( + reports, RPT_ERROR, + "Panel \"%s\" not found (space %d, region %d)", + idname, space_id, region_id); + return OPERATOR_CANCELLED; + } + + if (pt->poll && (pt->poll(C, pt) == false)) { + /* cancel but allow event to pass through, just like operators do */ + return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH); + } + + uiPopover *pup = UI_popover_begin(C); + + layout = UI_popover_layout(pup); + + UI_popover_panel_from_type(C, layout, pt); + + UI_popover_end(C, pup, NULL); + + return OPERATOR_INTERFACE; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ /** \name Popup Menu API with begin & end * \{ */ |