[Bf-blender-cvs] [6d1f76d] pie-menus: Pie Menu fixes - features
Antony Riakiotakis
noreply at git.blender.org
Wed Jun 11 16:31:50 CEST 2014
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);
More information about the Bf-blender-cvs
mailing list