Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-05-23 20:46:40 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-05-23 20:48:28 +0300
commit933a0835875c71dc177227c87e8bbe281f0a7f55 (patch)
tree452babec7d8b3dd536a5ed7f5bb0980aa44bd3e3 /source/blender/editors/interface/interface_region_popover.c
parentb642b510e110abfe15d37344e67b07f98d73a273 (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.c59
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
* \{ */