[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