[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