[Bf-blender-cvs] [2517530] pie-menus: Fixes

Antony Riakiotakis noreply at git.blender.org
Wed Jun 11 18:02:08 CEST 2014


Commit: 25175306e307a40647a2f26ff92cbe3c5a9d40f5
Author: Antony Riakiotakis
Date:   Wed Jun 11 19:00:48 2014 +0300
https://developer.blender.org/rB25175306e307a40647a2f26ff92cbe3c5a9d40f5

Fixes

* pie menus with 3 items were not aligned correctly
* clipping translation can be done if one dimension of screen is large
enough.

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

M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
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_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 68afb0d..f6a1bcf 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -1700,14 +1700,6 @@ class VIEW3D_PIE_tests(Menu):
         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
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 58c514e..9d3fb7c 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -327,7 +327,7 @@ static void ui_centered_pie_bounds_block(const bContext *C, uiBlock *block)
 {
 	wmWindow *window = CTX_wm_window(C);
 	int x, y;
-	int startx, starty;
+	int startx;
 	int width, height;
 
 	/* note: this is used for the splash where window bounds event has not been
@@ -342,9 +342,14 @@ static void ui_centered_pie_bounds_block(const bContext *C, uiBlock *block)
 	height = BLI_rctf_size_y(&block->rect);
 
 	startx = x - (width * 0.5f);
-	starty = y - (height * 0.5f);
 
-	ui_block_translate(block, startx - block->rect.xmin, starty - block->rect.ymin);
+	/* special case, 3 items means no top, make it so we are going down the full height */
+	if (block->pie_data.flags & UI_PIE_3_ITEMS)
+		ui_block_translate(block, startx - block->rect.xmin, y);
+	else {
+		int starty = y - (height * 0.5f);
+		ui_block_translate(block, startx - block->rect.xmin, starty - block->rect.ymin);
+	}
 
 	/* now recompute bounds and safety */
 	ui_bounds_block(block);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 5928197..8bdd4d1 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -7797,8 +7797,7 @@ static void ui_block_calculate_pie_segment(uiBlock *block, const float mx, const
 		copy_v2_v2(seg1, block->pie_data.pie_center_init);
 	}
 	else {
-		seg1[0] = BLI_rctf_cent_x(&block->rect);
-		seg1[1] = BLI_rctf_cent_y(&block->rect);
+		copy_v2_v2(seg1, block->pie_data.pie_center_spawned);
 	}
 
 	seg2[0] = mx - seg1[0];
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 97609a6..38dbe6c 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -160,7 +160,8 @@ typedef enum RadialDirection {
 
 /* PieMenuData->flags */
 #define UI_PIE_DEGREES_RANGE_LARGE (1 << 0) /* pie menu item collision is detected at 90 degrees */
-#define UI_PIE_INITIAL_DIRECTION     (1 << 1) /* use initial center of pie menu to calculate direction */
+#define UI_PIE_INITIAL_DIRECTION   (1 << 1) /* use initial center of pie menu to calculate direction */
+#define UI_PIE_3_ITEMS             (1 << 2) /* pie menu has only 3 items, careful when centering */
 
 typedef struct uiLinkLine {  /* only for draw/edit */
 	struct uiLinkLine *next, *prev;
@@ -292,9 +293,9 @@ struct uiBut {
 };
 
 struct PieMenuData {
-	int num_pie_items; /* number of pie items, useful to determine collision based on how pie items are distributed */
 	float pie_dir[2];
 	float pie_center_init[2];
+	float pie_center_spawned[2];
 	int flags;
 	int event; /* initial event used to fire the pie menu, store here so we can query for release */
 };
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 18d4c3c..8b6dd9f 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -2251,6 +2251,9 @@ static void ui_litem_layout_radial(uiLayout *litem)
 	if (totitems < 5)
 		litem->root->block->pie_data.flags |= UI_PIE_DEGREES_RANGE_LARGE;
 
+	if (totitems == 3)
+		litem->root->block->pie_data.flags |= UI_PIE_3_ITEMS;
+
 	for (item = litem->items.first; item; item = item->next) {
 		/* not all button types are drawn in a radial menu, do filtering here */
 		if(ui_item_is_radial_displayable(item)) {
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index e914ca4..22d7fd5 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1583,27 +1583,35 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut
 		ScrArea *sa = CTX_wm_area(C);
 		int ar_w = BLI_rcti_size_x(&sa->totrct);
 		int ar_h = BLI_rcti_size_y(&sa->totrct);
+		int x_offset = 0, y_offset = 0;
 
 		ar->winrct = sa->totrct;
 
 		ui_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
 
-		/* only try translation if area is large enough */
-		if ((BLI_rctf_size_x(&block->rect) < ar_w) && (BLI_rctf_size_y(&block->rect) < ar_h)) {
-			int x_offset = 0, y_offset = 0;
+		/* spawned coordinates still in window space, convert to screen */
+		block->pie_data.pie_center_spawned[0] -= ar->winrct.xmin;
+		block->pie_data.pie_center_spawned[1] -= ar->winrct.ymin;
+
+		copy_v2_v2(block->pie_data.pie_center_init, block->pie_data.pie_center_spawned);
 
-			if (block->rect.xmin < 0 ) x_offset -= block->rect.xmin;
+		/* only try translation if area is large enough */
+		if (BLI_rctf_size_x(&block->rect) < ar_w) {
+			if (block->rect.xmin < 0 )   x_offset -= block->rect.xmin;
 			if (block->rect.xmax > ar_w) x_offset += ar_w - block->rect.xmax;
-			if (block->rect.ymin < 0 ) y_offset -= block->rect.ymin;
+		}
+
+		if (BLI_rctf_size_y(&block->rect) < ar_h) {
+			if (block->rect.ymin < 0 )   y_offset -= block->rect.ymin;
 			if (block->rect.ymax > ar_h) y_offset += ar_h - block->rect.ymax;
+		}
+		/* if we are offsetting set up initial data for timeout functionality */
+		if ((x_offset != 0) || (y_offset != 0)) {
+			block->pie_data.pie_center_spawned[0] += x_offset;
+			block->pie_data.pie_center_spawned[1] += y_offset;
 
-			/* if we are offsetting set up initial data for timeout functionality */
-			if ((x_offset != 0) || (y_offset != 0)) {
-				block->pie_data.pie_center_init[0] = BLI_rctf_cent_x(&block->rect);
-				block->pie_data.pie_center_init[1] = BLI_rctf_cent_y(&block->rect);
-				ui_block_translate(block, x_offset, y_offset);
-				block->pie_data.flags |= UI_PIE_INITIAL_DIRECTION;
-			}
+			ui_block_translate(block, x_offset, y_offset);
+			block->pie_data.flags |= UI_PIE_INITIAL_DIRECTION;
 		}
 	}
 	else {
@@ -2209,6 +2217,7 @@ struct uiPopupMenu {
 struct uiPieMenu {
 	uiBlock *block_radial; /* radial block of the pie menu (more could be added later) */
 	uiLayout *layout;
+	int mx, my;
 };
 
 static uiBlock *ui_block_func_POPUP(bContext *C, uiPopupBlockHandle *handle, void *arg_pup)
@@ -2465,6 +2474,9 @@ static uiBlock *ui_block_func_PIE(bContext *C, uiPopupBlockHandle *handle, void
 	block->my = 0;
 	block->bounds_type = UI_BLOCK_BOUNDS_PIE_CENTER;
 
+	block->pie_data.pie_center_spawned[0] = pie->mx;
+	block->pie_data.pie_center_spawned[1] = pie->my;
+
 	uiEndBlock(C, block);
 
 	return pie->block_radial;
@@ -2517,6 +2529,8 @@ void uiPieMenuEnd(bContext *C, uiPieMenu *pie)
 {
 	wmWindow *window = CTX_wm_window(C);
 	uiPopupBlockHandle *menu;
+	pie->mx = window->eventstate->x;
+	pie->my = window->eventstate->y;
 
 	menu = ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_PIE, pie);
 	menu->popup = true;
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 00c3b9f..8fce9ce 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -3719,8 +3719,8 @@ void ui_draw_menu_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
 void ui_draw_pie_center(uiBlock *block)
 {
 	bTheme *btheme = UI_GetTheme();
-	float cx = BLI_rctf_cent_x(&block->rect);
-	float cy = BLI_rctf_cent_y(&block->rect);
+	float cx = block->pie_data.pie_center_spawned[0];
+	float cy = block->pie_data.pie_center_spawned[1];
 
 	float *pie_dir = block->pie_data.pie_dir;




More information about the Bf-blender-cvs mailing list