Commit: 6d1f76d21bad591c2800ba493bb37fa36634a35f
Author: Antony Riakiotakis
Date:   Wed Jun 11 17:31:33 2014 +0300
https://developer.blender.org/rB6d1f76d21bad591c2800ba493bb37fa36634a35f

Pie Menu fixes - features

* Allow setting arbitrary layouts in radial regions.  This can be
used to make nice arrangements of subareas in the pie menu. Only buttons
directly in a pie layout will use pie menu style collision detection,
any buttons in nested layouts will use regular collision detection.
Appended a test menu in Q key, sculpt mode.

* Allow aligning of buttons now to permit any aligned nested layouts to
properly align their buttons

* Operator enums will now spawn to a pie menu if the layout is a root
layout of radial type.

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

M       release/scripts/startup/bl_operators/wm.py
M       release/scripts/startup/bl_ui/space_view3d_toolbar.py
M       source/blender/editors/interface/interface.c
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_operators/wm.py 
b/release/scripts/startup/bl_operators/wm.py
index 38dfb0e..ff832d9 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -548,8 +548,7 @@ class WM_OT_context_operator_pie_enum(Operator):
 
         def draw_cb(self, context):
             layout = self.layout
-            pie = layout.pie()
-            pie.operator_enum(op.idname_py(), prop_string)
+            layout.operator_enum(op.idname_py(), prop_string)
 
         context.window_manager.pie_menu(draw_func=draw_cb, title=self.title, 
event=event)
 
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py 
b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index ea33a6f..68afb0d 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -1689,11 +1689,27 @@ class VIEW3D_PIE_tests(Menu):
         brush = sculpt.brush
 
         pie = layout.pie()
-        pie.prop(sculpt, "use_symmetry_x", text="X", toggle=True)
-        pie.prop(sculpt, "use_symmetry_y", text="Y", toggle=True)
-        pie.prop(sculpt, "use_symmetry_z", text="Z", toggle=True)
+        pie.prop(sculpt, "use_symmetry_feather", toggle=True)
         pie.prop(brush, "strength")
 
+        col = pie.column(align=True)
+        col.label(text="Symmetry")
+
+        row = col.row(align=True)
+        row.prop(sculpt, "use_symmetry_x", text="X", toggle=True)
+        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
     def poll(cls, context):
         return (context.sculpt_object and context.tool_settings.sculpt)
diff --git a/source/blender/editors/interface/interface.c 
b/source/blender/editors/interface/interface.c
index 6ca42f1..58c514e 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1168,8 +1168,8 @@ void uiEndBlock(const bContext *C, uiBlock *block)
        if (block->layouts.first) {
                uiBlockLayoutResolve(block, NULL, NULL);
        }
-       if (!(block->flag & UI_BLOCK_RADIAL))
-               ui_block_do_align(block);
+
+       ui_block_do_align(block);
 
        if ((block->flag & UI_BLOCK_LOOP) && (block->flag & 
UI_BLOCK_NUMSELECT)) {
                ui_menu_block_set_keyaccels(block); /* could use a different 
flag to check */
diff --git a/source/blender/editors/interface/interface_layout.c 
b/source/blender/editors/interface/interface_layout.c
index 516a007..18d4c3c 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -873,7 +873,8 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, 
const char *propname
        PointerRNA ptr;
        PropertyRNA *prop;
        uiBlock *block = layout->root->block;
-       bool radial = layout->item.type == ITEM_LAYOUT_RADIAL;
+       bool radial = (layout->item.type == ITEM_LAYOUT_RADIAL) ||
+                     ((layout->item.type == ITEM_LAYOUT_ROOT) && 
(layout->root->type == UI_LAYOUT_PIEMENU));
 
        if (!ot || !ot->srna) {
                ui_item_disabled(layout, opname);
@@ -893,7 +894,12 @@ void uiItemsFullEnumO(uiLayout *layout, const char 
*opname, const char *propname
                EnumPropertyItem *item, *item_array = NULL;
                bool free;
                uiLayout *split = uiLayoutSplit(layout, 0.0f, false);
-               uiLayout *column = uiLayoutColumn(split, layout->align);
+               uiLayout *target;
+
+               if (radial)
+                       target = uiLayoutRadial(layout);
+               else
+                       target = uiLayoutColumn(split, layout->align);
 
                RNA_property_enum_items_gettexted(block->evil_C, &ptr, prop, 
&item_array, NULL, &free);
                for (item = item_array; item->identifier; item++) {
@@ -910,10 +916,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char 
*opname, const char *propname
                                }
                                RNA_property_enum_set(&tptr, prop, item->value);
 
-                               if (radial)
-                                       uiItemFullO_ptr(layout, ot, item->name, 
item->icon, tptr.data, context, flag);
-                               else
-                                       uiItemFullO_ptr(column, ot, item->name, 
item->icon, tptr.data, context, flag);
+                               uiItemFullO_ptr(target, ot, item->name, 
item->icon, tptr.data, context, flag);
 
                                ui_but_tip_from_enum_item(block->buttons.last, 
item);
                        }
@@ -922,17 +925,14 @@ void uiItemsFullEnumO(uiLayout *layout, const char 
*opname, const char *propname
                                        uiBut *but;
 
                                        if (item != item_array && !radial) {
-                                               column = uiLayoutColumn(split, 
layout->align);
+                                               target = uiLayoutColumn(split, 
layout->align);
 
                                                /* inconsistent, but menus with 
labels do not look good flipped */
                                                block->flag |= UI_BLOCK_NO_FLIP;
                                        }
 
                                        if (item->icon || radial) {
-                                               if (radial)
-                                                       uiItemL(layout, 
item->name, item->icon);
-                                               else
-                                                       uiItemL(column, 
item->name, item->icon);
+                                               uiItemL(target, item->name, 
item->icon);
 
                                                but = block->buttons.last;
                                        }
@@ -947,7 +947,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, 
const char *propname
                                        if (radial)
                                                ;
                                        else
-                                               uiItemS(column);
+                                               uiItemS(target);
                                }
                        }
                }
@@ -2215,9 +2215,10 @@ static RadialDirection ui_get_radialbut_vec(float *vec, 
short itemnum, short tot
        return dir;
 }
 
-static bool ui_item_is_radial_displayable (uiButtonItem *bitem)
+static bool ui_item_is_radial_displayable (uiItem *item)
 {
-       if (bitem->but->type == LABEL)
+
+       if ((item->type == ITEM_BUTTON) && (((uiButtonItem *)item)->but->type 
== LABEL))
                return false;
 
        return true;
@@ -2229,7 +2230,6 @@ static void ui_litem_layout_radial(uiLayout *litem)
        int itemh, itemw, x, y;
        int itemnum = 0;
        int totitems = 0;
-       float vec[2];
 
        int minx, miny, maxx, maxy;
        /* For the radial layout we will use Matt Ebb's design
@@ -2252,27 +2252,35 @@ static void ui_litem_layout_radial(uiLayout *litem)
                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;
+               /* not all button types are drawn in a radial menu, do 
filtering here */
+               if(ui_item_is_radial_displayable(item)) {
+                       RadialDirection dir;
+                       float vec[2];
+
+                       itemnum++;
 
-                       /* not all button types are drawn in a radial menu, do 
filtering here */
-                       if(ui_item_is_radial_displayable(bitem)) {
-                               itemnum++;
+                       dir = ui_get_radialbut_vec(vec, itemnum, totitems);
 
-                               bitem->but->pie_dir = ui_get_radialbut_vec(vec, 
itemnum, totitems);
+                       if (item->type == ITEM_BUTTON) {
+                               uiButtonItem *bitem = (uiButtonItem *) item;
+
+                               bitem->but->pie_dir = dir;
                                /* scale the buttons */
                                bitem->but->rect.ymax *= 1.5;
                                /* add a little bit more here */
                                bitem->but->rect.xmax += UI_UNIT_X;
-                               ui_item_size(item, &itemw, &itemh);
+                               /* enable drawing as pie item */
+                               bitem->but->dt = UI_EMBOSSR;
+                       }
 
-                               ui_item_position(item, x + vec[0] * pie_radius 
- itemw / 2, y + vec[1] * pie_radius - itemh / 2, itemw, itemh);
+                       ui_item_size(item, &itemw, &itemh);
 
-                               minx = min_ii(minx, x + vec[0] * pie_radius - 
itemw/2);
-                               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);
-                       }
+                       ui_item_position(item, x + vec[0] * pie_radius - itemw 
/ 2, y + vec[1] * pie_radius - itemh / 2, itemw, itemh);
+
+                       minx = min_ii(minx, x + vec[0] * pie_radius - itemw/2);
+                       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);
                }
        }
 
diff --git a/source/blender/editors/interface/interface_regions.c 
b/source/blender/editors/interface/interface_regions.c
index 7008a55..e914ca4 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -2482,8 +2482,10 @@ struct uiPieMenu *uiPieMenuBegin(struct bContext *C, 
const char *title, int icon
        uiPieMenu *pie = MEM_callocN(sizeof(uiPopupMenu), "pie menu");
        uiBut *but;
 
-       pie->block_radial = uiBeginBlock(C, NULL, __func__, UI_EMBOSSR);
-       //pie->block_radial->flag |= UI_BLOCK_POPUP_MEMORY;
+       pie->block_radial = uiBeginBlock(C, NULL, __func__, UI_EMBOSS);
+       /* may be useful later to allow spawning pies
+        * from old positions */
+       /* 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->pie_data.event = event;
@@ -2520,7 +2522,6 @@ void uiPieMenuEnd(bContext *C, uiPieMenu *pie)
        menu->popup = true;
        menu->towardstime = PIL_check_seconds_timer();
 
-       /* change to pie version! */
        UI_add_pie_handlers(C, &window->modalhandlers, menu);
        WM_event_add_mousemove(C);
 
diff --git a/source/blender/editors/interface/interface_widgets.c 
b/source/blender/editors/interface/interface_widgets.c
index cf4ce91a..00c3b9f 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -3729,9 +3729,11 @@ void ui_draw_pie_center(uiBlock *block)
        glPushMatrix();
        glTranslatef(cx, cy, 0.0);
 
-       glColor4ub(btheme->tui.wcol_pie_menu.inner[0], 
btheme->tui.wcol_pie_menu.inner[1], btheme->tui.wcol_pie_menu.inner[2], 
btheme->tui.wcol_pie_menu.inner[3]);
+       glColor4ubv((GLubyte *)btheme->tui.wcol_pie_menu.inner);
        glEnable(GL_BLEND);
        glutil_draw_filled_arc(0.0, (float)(M_PI * 2.0), pie_radius_internal, 
40);
+       glColor4ubv((GLubyte *)btheme->tui.wcol_pie_menu.outline);
+       glutil_draw_lined_arc(0.0, (float)(M_PI * 2.0), pie_radius_internal, 
40);
 
        glColor4ub(255, 255, 0, btheme->tui.wcol_pie_menu.inner[3]);
        glBegin(GL_TRIANGLE_FAN);

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

Reply via email to