[Bf-blender-cvs] [6d1f76d] pie-menus: Pie Menu fixes - features

Antony Riakiotakis noreply at git.blender.org
Wed Jun 11 16:31:50 CEST 2014


Commit: 6d1f76d21bad591c2800ba493bb37fa36634a35f
Author: Antony Riakiotakis
Date:   Wed Jun 11 17:31:33 2014 +0300
https://developer.blender.org/rB6d1f76d21bad591c2800ba493bb37fa36634a35f

Pie Menu fixes - features

* Allow setting arbitrary layouts in radial regions.  This can be
used to make nice arrangements of subareas in the pie menu. Only buttons
directly in a pie layout will use pie menu style collision detection,
any buttons in nested layouts will use regular collision detection.
Appended a test menu in Q key, sculpt mode.

* Allow aligning of buttons now to permit any aligned nested layouts to
properly align their buttons

* Operator enums will now spawn to a pie menu if the layout is a root
layout of radial type.

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

M	release/scripts/startup/bl_operators/wm.py
M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_layout.c
M	source/blender/editors/interface/interface_regions.c
M	source/blender/editors/interface/interface_widgets.c

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

diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index 38dfb0e..ff832d9 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -548,8 +548,7 @@ class WM_OT_context_operator_pie_enum(Operator):
 
         def draw_cb(self, context):
             layout = self.layout
-            pie = layout.pie()
-            pie.operator_enum(op.idname_py(), prop_string)
+            layout.operator_enum(op.idname_py(), prop_string)
 
         context.window_manager.pie_menu(draw_func=draw_cb, title=self.title, event=event)
 
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index ea33a6f..68afb0d 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -1689,11 +1689,27 @@ class VIEW3D_PIE_tests(Menu):
         brush = sculpt.brush
 
         pie = layout.pie()
-        pie.prop(sculpt, "use_symmetry_x", text="X", toggle=True)
-        pie.prop(sculpt, "use_symmetry_y", text="Y", toggle=True)
-        pie.prop(sculpt, "use_symmetry_z", text="Z", toggle=True)
+        pie.prop(sculpt, "use_symmetry_feather", toggle=True)
         pie.prop(brush, "strength")
 
+        col = pie.column(align=True)
+        col.label(text="Symmetry")
+
+        row = col.row(align=True)
+        row.prop(sculpt, "use_symmetry_x", text="X", toggle=True)
+        row.prop(sculpt, "use_symmetry_y", text="Y", toggle=True)
+        row.prop(sculpt, "use_symmetry_z", text="Z", toggle=True)
+
+        if context.sculpt_object.use_dynamic_topology_sculpting:
+            pie.operator("sculpt.dynamic_topology_toggle", icon='X', text="Disable Dyntopo")
+        else:
+            pie.operator("sculpt.dynamic_topology_toggle", icon='SCULPT_DYNTOPO', text="Enable Dyntopo")
+
+        col = pie.column(align=True)
+        col.label("Pie menus are so cool!")
+        col.label("No, Really!")
+
+        
     @classmethod
     def poll(cls, context):
         return (context.sculpt_object and context.tool_settings.sculpt)
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 6ca42f1..58c514e 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1168,8 +1168,8 @@ void uiEndBlock(const bContext *C, uiBlock *block)
 	if (block->layouts.first) {
 		uiBlockLayoutResolve(block, NULL, NULL);
 	}
-	if (!(block->flag & UI_BLOCK_RADIAL))
-		ui_block_do_align(block);
+
+	ui_block_do_align(block);
 
 	if ((block->flag & UI_BLOCK_LOOP) && (block->flag & UI_BLOCK_NUMSELECT)) {
 		ui_menu_block_set_keyaccels(block); /* could use a different flag to check */
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 516a007..18d4c3c 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -873,7 +873,8 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
 	PointerRNA ptr;
 	PropertyRNA *prop;
 	uiBlock *block = layout->root->block;
-	bool radial = layout->item.type == ITEM_LAYOUT_RADIAL;
+	bool radial = (layout->item.type == ITEM_LAYOUT_RADIAL) ||
+	              ((layout->item.type == ITEM_LAYOUT_ROOT) && (layout->root->type == UI_LAYOUT_PIEMENU));
 
 	if (!ot || !ot->srna) {
 		ui_item_disabled(layout, opname);
@@ -893,7 +894,12 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
 		EnumPropertyItem *item, *item_array = NULL;
 		bool free;
 		uiLayout *split = uiLayoutSplit(layout, 0.0f, false);
-		uiLayout *column = uiLayoutColumn(split, layout->align);
+		uiLayout *target;
+
+		if (radial)
+			target = uiLayoutRadial(layout);
+		else
+			target = uiLayoutColumn(split, layout->align);
 
 		RNA_property_enum_items_gettexted(block->evil_C, &ptr, prop, &item_array, NULL, &free);
 		for (item = item_array; item->identifier; item++) {
@@ -910,10 +916,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
 				}
 				RNA_property_enum_set(&tptr, prop, item->value);
 
-				if (radial)
-					uiItemFullO_ptr(layout, ot, item->name, item->icon, tptr.data, context, flag);
-				else
-					uiItemFullO_ptr(column, ot, item->name, item->icon, tptr.data, context, flag);
+				uiItemFullO_ptr(target, ot, item->name, item->icon, tptr.data, context, flag);
 
 				ui_but_tip_from_enum_item(block->buttons.last, item);
 			}
@@ -922,17 +925,14 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
 					uiBut *but;
 
 					if (item != item_array && !radial) {
-						column = uiLayoutColumn(split, layout->align);
+						target = uiLayoutColumn(split, layout->align);
 
 						/* inconsistent, but menus with labels do not look good flipped */
 						block->flag |= UI_BLOCK_NO_FLIP;
 					}
 
 					if (item->icon || radial) {
-						if (radial)
-							uiItemL(layout, item->name, item->icon);
-						else
-							uiItemL(column, item->name, item->icon);
+						uiItemL(target, item->name, item->icon);
 
 						but = block->buttons.last;
 					}
@@ -947,7 +947,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
 					if (radial)
 						;
 					else
-						uiItemS(column);
+						uiItemS(target);
 				}
 			}
 		}
@@ -2215,9 +2215,10 @@ static RadialDirection ui_get_radialbut_vec(float *vec, short itemnum, short tot
 	return dir;
 }
 
-static bool ui_item_is_radial_displayable (uiButtonItem *bitem)
+static bool ui_item_is_radial_displayable (uiItem *item)
 {
-	if (bitem->but->type == LABEL)
+
+	if ((item->type == ITEM_BUTTON) && (((uiButtonItem *)item)->but->type == LABEL))
 		return false;
 
 	return true;
@@ -2229,7 +2230,6 @@ static void ui_litem_layout_radial(uiLayout *litem)
 	int itemh, itemw, x, y;
 	int itemnum = 0;
 	int totitems = 0;
-	float vec[2];
 
 	int minx, miny, maxx, maxy;
 	/* For the radial layout we will use Matt Ebb's design
@@ -2252,27 +2252,35 @@ static void ui_litem_layout_radial(uiLayout *litem)
 		litem->root->block->pie_data.flags |= UI_PIE_DEGREES_RANGE_LARGE;
 
 	for (item = litem->items.first; item; item = item->next) {
-		if (item->type == ITEM_BUTTON) {
-			uiButtonItem *bitem = (uiButtonItem *) item;
+		/* not all button types are drawn in a radial menu, do filtering here */
+		if(ui_item_is_radial_displayable(item)) {
+			RadialDirection dir;
+			float vec[2];
+
+			itemnum++;
 
-			/* not all button types are drawn in a radial menu, do filtering here */
-			if(ui_item_is_radial_displayable(bitem)) {
-				itemnum++;
+			dir = ui_get_radialbut_vec(vec, itemnum, totitems);
 
-				bitem->but->pie_dir = ui_get_radialbut_vec(vec, itemnum, totitems);
+			if (item->type == ITEM_BUTTON) {
+				uiButtonItem *bitem = (uiButtonItem *) item;
+
+				bitem->but->pie_dir = dir;
 				/* scale the buttons */
 				bitem->but->rect.ymax *= 1.5;
 				/* add a little bit more here */
 				bitem->but->rect.xmax += UI_UNIT_X;
-				ui_item_size(item, &itemw, &itemh);
+				/* enable drawing as pie item */
+				bitem->but->dt = UI_EMBOSSR;
+			}
 
-				ui_item_position(item, x + vec[0] * pie_radius - itemw / 2, y + vec[1] * pie_radius - itemh / 2, itemw, itemh);
+			ui_item_size(item, &itemw, &itemh);
 
-				minx = min_ii(minx, x + vec[0] * pie_radius - itemw/2);
-				maxx = max_ii(maxx, x + vec[0] * pie_radius + itemw/2);
-				miny = min_ii(miny, y + vec[1] * pie_radius - itemh/2);
-				maxy = max_ii(maxy, y + vec[1] * pie_radius + itemh/2);
-			}
+			ui_item_position(item, x + vec[0] * pie_radius - itemw / 2, y + vec[1] * pie_radius - itemh / 2, itemw, itemh);
+
+			minx = min_ii(minx, x + vec[0] * pie_radius - itemw/2);
+			maxx = max_ii(maxx, x + vec[0] * pie_radius + itemw/2);
+			miny = min_ii(miny, y + vec[1] * pie_radius - itemh/2);
+			maxy = max_ii(maxy, y + vec[1] * pie_radius + itemh/2);
 		}
 	}
 
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 7008a55..e914ca4 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -2482,8 +2482,10 @@ struct uiPieMenu *uiPieMenuBegin(struct bContext *C, const char *title, int icon
 	uiPieMenu *pie = MEM_callocN(sizeof(uiPopupMenu), "pie menu");
 	uiBut *but;
 
-	pie->block_radial = uiBeginBlock(C, NULL, __func__, UI_EMBOSSR);
-	//pie->block_radial->flag |= UI_BLOCK_POPUP_MEMORY;
+	pie->block_radial = uiBeginBlock(C, NULL, __func__, UI_EMBOSS);
+	/* may be useful later to allow spawning pies
+	 * from old positions */
+	/* pie->block_radial->flag |= UI_BLOCK_POPUP_MEMORY; */
 	pie->block_radial->puphash = ui_popup_menu_hash(title);
 	pie->block_radial->flag |= UI_BLOCK_RADIAL;
 	pie->block_radial->pie_data.event = event;
@@ -2520,7 +2522,6 @@ void uiPieMenuEnd(bContext *C, uiPieMenu *pie)
 	menu->popup = true;
 	menu->towardstime = PIL_check_seconds_timer();
 
-	/* change to pie version! */
 	UI_add_pie_handlers(C, &window->modalhandlers, menu);
 	WM_event_add_mousemove(C);
 
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index cf4ce91a..00c3b9f 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -3729,9 +3729,11 @@ void ui_draw_pie_center(uiBlock *block)
 	glPushMatrix();
 	glTranslatef(cx, cy, 0.0);
 
-	glColor4ub(btheme->tui.wcol_pie_menu.inner[0], btheme->tui.wcol_pie_menu.inner[1], btheme->tui.wcol_pie_menu.inner[2], btheme->tui.wcol_pie_menu.inner[3]);
+	glColor4ubv((GLubyte *)btheme->tui.wcol_pie_menu.inner);
 	glEnable(GL_BLEND);
 	glutil_draw_filled_arc(0.0, (float)(M_PI * 2.0), pie_radius_internal, 40);
+	glColor4ubv((GLubyte *)btheme->tui.wcol_pie_menu.outline);
+	glutil_draw_lined_arc(0.0, (float)(M_PI * 2.0), pie_radius_internal, 40);
 
 	glColor4ub(255, 255, 0, btheme->tui.wcol_pie_menu.inner[3]);
 	glBegin(GL_TRIANGLE_FAN);




More information about the Bf-blender-cvs mailing list