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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to