[Bf-blender-cvs] [bd5aa57] pie-menus: Refactor: Isolate pie menu data in own struct.

Antony Riakiotakis noreply at git.blender.org
Thu Jun 5 23:54:05 CEST 2014


Commit: bd5aa57c356b3265fc540912c764a0ad3f5a709c
Author: Antony Riakiotakis
Date:   Thu Jun 5 21:32:26 2014 +0300
https://developer.blender.org/rBbd5aa57c356b3265fc540912c764a0ad3f5a709c

Refactor: Isolate pie menu data in own struct.

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

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/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index b4d9d26..1746c72 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -6231,7 +6231,7 @@ static bool ui_but_contains_pt(uiBut *but, float mx, float my)
 
 static bool ui_but_isect_pie_seg(uiBlock *block, uiBut *but)
 {
-	float angle_range = (block->num_pie_items < 5) ? M_PI_4 : M_PI_4 / 2.0f;
+	float angle_range = (block->pie_data.flags & UI_PIE_DEGREES_RANGE_LARGE) ? M_PI_4 : M_PI_4 / 2.0f;
 	float angle_pie;
 	float vec[2];
 
@@ -6272,7 +6272,7 @@ static bool ui_but_isect_pie_seg(uiBlock *block, uiBut *but)
 	vec[0] = cosf(angle_pie);
 	vec[1] = sinf(angle_pie);
 
-	if (saacos(dot_v2v2(vec, block->pie_dir)) < angle_range)
+	if (saacos(dot_v2v2(vec, block->pie_data.pie_dir)) < angle_range)
 		return true;
 
 	return false;
@@ -7787,7 +7787,7 @@ static void ui_block_calculate_pie_segment(uiBlock *block, const float mx, const
 	seg2[0] = mx - seg1[0];
 	seg2[1] = my - seg1[1];
 
-	normalize_v2_v2(block->pie_dir, seg2);
+	normalize_v2_v2(block->pie_data.pie_dir, seg2);
 }
 
 static int ui_handle_menu_event(
@@ -7814,7 +7814,7 @@ static int ui_handle_menu_event(
 	if (block->flag & UI_BLOCK_RADIAL) {
 		ui_block_calculate_pie_segment(block, mx, my);
 
-		if ((event->type == block->event) && !(event->val == KM_RELEASE)) {
+		if ((event->type == block->pie_data.event) && !(event->val == KM_RELEASE)) {
 			ED_region_tag_redraw(ar);
 			return WM_UI_HANDLER_BREAK;
 		}
@@ -7860,7 +7860,7 @@ static int ui_handle_menu_event(
 			ui_menu_scroll(ar, block, my, NULL);
 	}
 	else if ((block->flag & UI_BLOCK_RADIAL) &&
-		     (((event->type == block->event) && event->val == KM_RELEASE) ||
+		     (((event->type == block->pie_data.event) && event->val == KM_RELEASE) ||
 		     ((event->type == LEFTMOUSE) && event->val == KM_PRESS)))
 	{
 		if (but) {
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index bc159f9..29cb1ae 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -158,6 +158,10 @@ typedef enum RadialDirection {
 /* split numbuts by ':' and align l/r */
 #define USE_NUMBUTS_LR_ALIGN
 
+/* PieMenuData->flags */
+#define UI_PIE_DEGREES_RANGE_LARGE (1 << 0) /* pie menu item collision is detected at 90 degrees */
+#define UI_PIE_VALID_DIRECTION     (1 << 1) /* pie menu direction has been initialized */
+
 typedef struct uiLinkLine {  /* only for draw/edit */
 	struct uiLinkLine *next, *prev;
 	struct uiBut *from, *to;
@@ -287,6 +291,13 @@ struct uiBut {
 	uiBlock *block;
 };
 
+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];
+	int flags;
+	int event; /* initial event used to fire the pie menu, store here so we can query for release */
+};
+
 struct uiBlock {
 	uiBlock *next, *prev;
 
@@ -369,9 +380,7 @@ struct uiBlock {
 	char display_device[64]; /* display device name used to display this block,
 	                          * used by color widgets to transform colors from/to scene linear
 	                          */
-	int num_pie_items; /* number of pie items, useful to determine collision based on how pie items are distributed */
-	float pie_dir[2];
-	int event; /* initial event used to fire the pie menu, store here so we can query for release */
+	struct PieMenuData pie_data;
 };
 
 typedef struct uiSafetyRct {
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 0d3ea9b..ecb8852 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -2248,6 +2248,9 @@ static void ui_litem_layout_radial(uiLayout *litem)
 	for (item = litem->items.first; item; item = item->next)
 		totitems++;
 
+	if (totitems < 5)
+		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;
@@ -2269,8 +2272,6 @@ static void ui_litem_layout_radial(uiLayout *litem)
 				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);
-
-				bitem->but->block->num_pie_items = totitems;
 			}
 		}
 	}
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 881389b..55cb97b 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -2479,7 +2479,7 @@ struct uiPieMenu *uiPieMenuBegin(struct bContext *C, const char *title, int icon
 	//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->event = event;
+	pie->block_radial->pie_data.event = event;
 
 	pie->layout = uiBlockLayout(pie->block_radial, UI_LAYOUT_VERTICAL, UI_LAYOUT_PIEMENU, 0, 0, 200, 0, 0, style);
 
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index b0fdcb1..6a0217e 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -3676,6 +3676,7 @@ 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 *pie_dir = block->pie_data.pie_dir;
 
 	float pie_radius_internal = UI_UNIT_Y;
 
@@ -3688,10 +3689,10 @@ void ui_draw_pie_center(uiBlock *block)
 
 	glColor4ub(255, 255, 0, btheme->tui.wcol_menu_back.inner[3]);
 	glBegin(GL_TRIANGLE_FAN);
-	glVertex2f(block->pie_dir[0] * pie_radius_internal + block->pie_dir[1] * 5.0, block->pie_dir[1] * pie_radius_internal - block->pie_dir[0] * 5.0);
-	glVertex2f(block->pie_dir[0] * (pie_radius_internal - 10.0f), block->pie_dir[1] * (pie_radius_internal - 10.0f));
-	glVertex2f(block->pie_dir[0] * pie_radius_internal - block->pie_dir[1] * 5.0, block->pie_dir[1] * pie_radius_internal + block->pie_dir[0] * 5.0);
-	glVertex2f(block->pie_dir[0] * (pie_radius_internal + 10.0f), block->pie_dir[1] * (pie_radius_internal + 10.0f));
+	glVertex2f(pie_dir[0] * pie_radius_internal + pie_dir[1] * 5.0, pie_dir[1] * pie_radius_internal - pie_dir[0] * 5.0);
+	glVertex2f(pie_dir[0] * (pie_radius_internal - 10.0f), pie_dir[1] * (pie_radius_internal - 10.0f));
+	glVertex2f(pie_dir[0] * pie_radius_internal - pie_dir[1] * 5.0, pie_dir[1] * pie_radius_internal + pie_dir[0] * 5.0);
+	glVertex2f(pie_dir[0] * (pie_radius_internal + 10.0f), pie_dir[1] * (pie_radius_internal + 10.0f));
 	glEnd();
 
 	glDisable(GL_BLEND);




More information about the Bf-blender-cvs mailing list