[Bf-blender-cvs] [e6d1fb87c6b] blender2.8: UI: Initial popover support for panels

Campbell Barton noreply at git.blender.org
Sun Apr 22 17:45:29 CEST 2018


Commit: e6d1fb87c6b0184416ce202ccba6a96a3ee04552
Author: Campbell Barton
Date:   Sun Apr 22 17:16:39 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBe6d1fb87c6b0184416ce202ccba6a96a3ee04552

UI: Initial popover support for panels

- UILayout.popover(.. panel_type ..)
  A single panel
- UILayout.popover_group(.. panel categories ..)
  Expands all panels matching args.

Currently used in the topbar for redo and paint options.

===================================================================

M	release/scripts/modules/bpy_types.py
M	release/scripts/startup/bl_ui/space_topbar.py
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/CMakeLists.txt
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_layout.c
A	source/blender/editors/interface/interface_region_popover.c
M	source/blender/editors/interface/interface_widgets.c
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_ui_api.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/makesrna/intern/rna_wm_api.c

===================================================================

diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index 1124070fea2..324bb43d890 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -144,6 +144,15 @@ class WindowManager(bpy_types.ID):
         finally:
             self.popmenu_end__internal(popup)
 
+    def popover(self, draw_func, title="", icon='NONE'):
+        import bpy
+        popup = self.popover_begin__internal(title, icon)
+
+        try:
+            draw_func(popup, bpy.context)
+        finally:
+            self.popover_end__internal(popup)
+
     def popup_menu_pie(self, event, draw_func, title="", icon='NONE'):
         import bpy
         pie = self.piemenu_begin__internal(title, icon, event)
diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py
index e9258f10882..868c60b6a1a 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -113,12 +113,37 @@ class TOPBAR_HT_lower_bar(Header):
         act_mode_item = bpy.types.Object.bl_rna.properties['mode'].enum_items[object_mode]
         layout.operator_menu_enum("object.mode_set", "mode", text=act_mode_item.name, icon=act_mode_item.icon)
 
+        mode = context.mode
+
+        # Example of how toolsettings can be accessed as pop-overs.
+        if mode == 'SCULPT':
+            layout.popover_group(space_type='VIEW_3D', region_type='TOOLS', context="", category="Tools")
+        elif mode == 'PAINT_VERTEX':
+            layout.popover_group(space_type='VIEW_3D', region_type='TOOLS', context="", category="Tools")
+        elif mode == 'PAINT_WEIGHT':
+            layout.popover_group(space_type='VIEW_3D', region_type='TOOLS', context="", category="Tools")
+        elif mode == 'PAINT_TEXTURE':
+            layout.popover_group(space_type='VIEW_3D', region_type='TOOLS', context="", category="Tools")
+
     def draw_right(self, context):
         layout = self.layout
 
         # Placeholder
         layout.operator("ed.undo_history", text="...")
 
+        # Last Action (redo)
+        layout.label("Last Action:")
+        operators = context.window_manager.operators
+        op = operators[-1] if operators else None
+        row = layout.row()
+        row.enabled = op is not None
+        row.popover(
+            space_type='VIEW_3D',
+            region_type='TOOL_PROPS',
+            panel_type="VIEW3D_PT_last_operator",
+            text=op.name if op else "Last Action...",
+        )
+
 
 class INFO_MT_editor_menus(Menu):
     bl_idname = "INFO_MT_editor_menus"
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 67b9f391ac6..191c34fc7f2 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -265,6 +265,7 @@ typedef enum {
 	UI_BTYPE_CHECKBOX_N             = (14 << 9),
 	UI_BTYPE_COLOR                  = (15 << 9),
 	UI_BTYPE_TAB                    = (16 << 9),
+	UI_BTYPE_POPOVER                = (17 << 9),
 	UI_BTYPE_SCROLL                 = (18 << 9),
 	UI_BTYPE_BLOCK                  = (19 << 9),
 	UI_BTYPE_LABEL                  = (20 << 9),
@@ -409,6 +410,17 @@ int UI_popup_menu_invoke(struct bContext *C, const char *idname, struct ReportLi
 void UI_popup_menu_retval_set(const uiBlock *block, const int retval, const bool enable);
 void UI_popup_menu_but_set(uiPopupMenu *pup, struct ARegion *butregion, uiBut *but);
 
+/* interface_region_popover.c */
+
+typedef struct uiPopover uiPopover;
+
+uiPopover *UI_popover_begin(
+        struct bContext *C) ATTR_NONNULL();
+uiPopover *UI_popover_begin_ex(
+        struct bContext *C, const char *block_name) ATTR_NONNULL();
+void UI_popover_end(struct bContext *C, struct uiPopover *head);
+struct uiLayout *UI_popover_layout(uiPopover *head);
+
 /* interface_region_menu_pie.c */
 /* Pie menus */
 typedef struct uiPieMenu uiPieMenu;
@@ -911,6 +923,7 @@ void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct Pointe
 void uiLayoutContextCopy(uiLayout *layout, struct bContextStore *context);
 const char *uiLayoutIntrospect(uiLayout *layout); // XXX - testing
 struct MenuType *UI_but_menutype_get(uiBut *but);
+struct PanelType *UI_but_paneltype_get(uiBut *but);
 void UI_menutype_draw(struct bContext *C, struct MenuType *mt, struct uiLayout *layout);
 
 /* Only for convenience. */
@@ -1090,6 +1103,19 @@ void uiItemM(uiLayout *layout, struct bContext *C, const char *menuname, const c
 void uiItemV(uiLayout *layout, const char *name, int icon, int argval); /* value */
 void uiItemS(uiLayout *layout); /* separator */
 
+void uiItemPopoverPanel_ptr(
+        uiLayout *layout, struct bContext *C,
+        struct PanelType *pt,
+        const char *name, int icon);
+void uiItemPopoverPanel(
+        uiLayout *layout, struct bContext *C,
+        int space_id, int region_id, const char *panelname,
+        const char *name, int icon);
+void uiItemPopoverPanelFromGroup(
+        uiLayout *layout, struct bContext *C,
+        int space_id, int region_id,
+        const char *context, const char *category);
+
 void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg);
 void uiItemMenuEnumO_ptr(uiLayout *layout, struct bContext *C, struct wmOperatorType *ot, const char *propname, const char *name, int icon);
 void uiItemMenuEnumO(uiLayout *layout, struct bContext *C, const char *opname, const char *propname, const char *name, int icon);
diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt
index c023816b52c..cc5c580ad38 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -59,6 +59,7 @@ set(SRC
 	interface_region_color_picker.c
 	interface_region_menu_pie.c
 	interface_region_menu_popup.c
+	interface_region_popover.c
 	interface_region_popup.c
 	interface_region_search.c
 	interface_region_tooltip.c
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 9e88c3cbb7f..4fbb8025af1 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -3431,6 +3431,7 @@ static void ui_block_open_begin(bContext *C, uiBut *but, uiHandleButtonData *dat
 	uiBlockCreateFunc func = NULL;
 	uiBlockHandleCreateFunc handlefunc = NULL;
 	uiMenuCreateFunc menufunc = NULL;
+	uiMenuCreateFunc popoverfunc = NULL;
 	void *arg = NULL;
 
 	switch (but->type) {
@@ -3450,6 +3451,11 @@ static void ui_block_open_begin(bContext *C, uiBut *but, uiHandleButtonData *dat
 			menufunc = but->menu_create_func;
 			arg = but->poin;
 			break;
+		case UI_BTYPE_POPOVER:
+			BLI_assert(but->menu_create_func);
+			popoverfunc = but->menu_create_func;
+			arg = but->poin;
+			break;
 		case UI_BTYPE_COLOR:
 			ui_but_v3_get(but, data->origvec);
 			copy_v3_v3(data->vec, data->origvec);
@@ -3474,6 +3480,11 @@ static void ui_block_open_begin(bContext *C, uiBut *but, uiHandleButtonData *dat
 		if (but->block->handle)
 			data->menu->popup = but->block->handle->popup;
 	}
+	else if (popoverfunc) {
+		data->menu = ui_popover_panel_create(C, data->region, but, popoverfunc, arg);
+		if (but->block->handle)
+			data->menu->popup = but->block->handle->popup;
+	}
 
 #ifdef USE_ALLSELECT
 	{
@@ -7046,6 +7057,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
 			retval = ui_do_but_TEX(C, block, but, data, event);
 			break;
 		case UI_BTYPE_MENU:
+		case UI_BTYPE_POPOVER:
 		case UI_BTYPE_BLOCK:
 		case UI_BTYPE_PULLDOWN:
 			retval = ui_do_but_BLOCK(C, but, data, event);
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index e0b0a8eeaab..b9e680f009a 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -615,6 +615,18 @@ uiPopupBlockHandle *ui_popup_menu_create(
         struct bContext *C, struct ARegion *butregion, uiBut *but,
         uiMenuCreateFunc create_func, void *arg);
 
+/* interface_region_popover.c */
+uiBlock *ui_popover_block_refresh(
+        struct bContext *C, uiPopupBlockHandle *handle,
+        ARegion *butregion, uiBut *but);
+uiPopupBlockHandle *ui_popover_block_create(
+        struct bContext *C, struct ARegion *butregion, uiBut *but,
+        uiBlockCreateFunc create_func, uiBlockHandleCreateFunc handle_create_func,
+        void *arg);
+uiPopupBlockHandle *ui_popover_panel_create(
+        struct bContext *C, struct ARegion *butregion, uiBut *but,
+        uiMenuCreateFunc create_func, void *arg);
+
 /* interface_region_menu_pie.c */
 void ui_pie_menu_level_create(
         uiBlock *block, struct wmOperatorType *ot, const char *propname, IDProperty *properties,
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 7193ad64359..3ea6ae08173 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -1824,6 +1824,35 @@ static void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt)
 	layout->root->block->flag ^= UI_BLOCK_IS_FLIP;
 }
 
+static void ui_item_paneltype_func(bContext *C, uiLayout *layout, void *arg_mt)
+{
+	PanelType *pt = (PanelType *)arg_mt;
+
+	/* TODO: move into UI_paneltype_draw */
+	Panel *panel = MEM_callocN(sizeof(Panel), "popover panel");
+	panel->type = pt;
+
+	if (layout->context) {
+		CTX_store_set(C, layout->context);
+	}
+
+	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;
+
+	if (layout->context) {
+		CTX_store_set(C, NULL);
+	}
+
+	MEM_freeN(panel);
+}
+
 static uiBut *ui_item_menu(
         uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg, void *argN,
         const char *tip, bool force_menu)
@@ -1901,6 +1930,79 @@ void uiItemM(uiLayout *layout, bContext *UNUSED(C), const c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list