Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-04-27 22:05:58 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-04-27 22:05:58 +0400
commit58cdd37f52591dd47962e00c72564f579e1fc4a7 (patch)
tree3f0ef710931e0e4157b7732ab0152bae2ffba3c4 /source/blender/editors
parentc36fb8c913dd935239c4a9f641766a642bf1bebf (diff)
UI:
* Made separator item work horizontal & vertical. * Add colon (:) automatic for int/float/enum/string. * Added space variables to uiStyle and use them in the layout engine. * Added initial World buttons by Thomas Dinges, thanks! * Added some code for modifiers in the Object Data context. This will become a template though. * Use a common poll() callback in the scripts to reduce code.
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/armature/poselib.c2
-rw-r--r--source/blender/editors/include/UI_interface.h9
-rw-r--r--source/blender/editors/interface/interface.c2
-rw-r--r--source/blender/editors/interface/interface_api.c4
-rw-r--r--source/blender/editors/interface/interface_handlers.c2
-rw-r--r--source/blender/editors/interface/interface_layout.c115
-rw-r--r--source/blender/editors/interface/interface_regions.c6
-rw-r--r--source/blender/editors/interface/interface_style.c6
-rw-r--r--source/blender/editors/interface/interface_utils.c6
-rw-r--r--source/blender/editors/object/object_edit.c6
-rw-r--r--source/blender/editors/object/object_intern.h3
-rw-r--r--source/blender/editors/object/object_modifier.c98
-rw-r--r--source/blender/editors/object/object_ops.c2
-rw-r--r--source/blender/editors/screen/screen_ops.c2
-rw-r--r--source/blender/editors/space_image/image_header.c24
-rw-r--r--source/blender/editors/space_sequencer/sequencer_header.c2
-rw-r--r--source/blender/editors/space_text/text_header.c10
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c18
18 files changed, 227 insertions, 90 deletions
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 9b4a9d63439..43590346299 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -339,7 +339,7 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
uiItemIntO(layout, "Add New (Current Frame)", 0, "POSELIB_OT_pose_add", "frame", CFRA);
/* replace existing - submenu */
- uiItemLevel(layout, "Replace Existing...", 0, poselib_add_menu_invoke__replacemenu);
+ uiItemMenuF(layout, "Replace Existing...", 0, poselib_add_menu_invoke__replacemenu);
}
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index ea1a8efe9fc..26042f70b4a 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -48,6 +48,7 @@ struct PointerRNA;
struct PropertyRNA;
struct ReportList;
struct rcti;
+struct uiStyle;
struct uiFontStyle;
typedef struct uiBut uiBut;
@@ -532,7 +533,7 @@ uiBut *uiDefMenuTogR(uiBlock *block, struct PointerRNA *ptr, char *propname, cha
#define UI_LAYOUT_HEADER 1
#define UI_LAYOUT_MENU 2
-uiLayout *uiLayoutBegin(int dir, int type, int x, int y, int size, int em);
+uiLayout *uiLayoutBegin(int dir, int type, int x, int y, int size, int em, struct uiStyle *style);
void uiLayoutEnd(const struct bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y);
void uiLayoutContext(uiLayout *layout, int opcontext);
@@ -571,9 +572,9 @@ void uiItemM(uiLayout *layout, char *name, int icon, char *menuname); /* menu */
void uiItemV(uiLayout *layout, char *name, int icon, int argval); /* value */
void uiItemS(uiLayout *layout); /* separator */
-void uiItemLevel(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func);
-void uiItemLevelEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname);
-void uiItemLevelEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname);
+void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func);
+void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname);
+void uiItemMenuEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname);
/* utilities */
#define UI_PANEL_WIDTH 340
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 22ecd8ee2f8..fa25153a158 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -444,7 +444,7 @@ static int ui_but_equals_old(uiBut *but, uiBut *oldbut)
if(but->funcN != oldbut->funcN) return 0;
if(oldbut->func_arg1 != oldbut && but->func_arg1 != oldbut->func_arg1) return 0;
if(oldbut->func_arg2 != oldbut && but->func_arg2 != oldbut->func_arg2) return 0;
- if(!but->funcN && (but->poin != oldbut->poin || but->pointype != oldbut->pointype)) return 0;
+ if(!but->funcN && ((but->poin != oldbut->poin && (uiBut*)oldbut->poin != oldbut) || but->pointype != oldbut->pointype)) return 0;
return 1;
}
diff --git a/source/blender/editors/interface/interface_api.c b/source/blender/editors/interface/interface_api.c
index 3153f13bd0b..1cd804851b5 100644
--- a/source/blender/editors/interface/interface_api.c
+++ b/source/blender/editors/interface/interface_api.c
@@ -92,7 +92,7 @@ void RNA_api_ui_layout(StructRNA *srna)
parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in data.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- func= RNA_def_function(srna, "item_level_enumR", "uiItemLevelEnumR");
+ func= RNA_def_function(srna, "item_menu_enumR", "uiItemMenuEnumR");
api_ui_item_common(func);
parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -124,7 +124,7 @@ void RNA_api_ui_layout(StructRNA *srna)
parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- func= RNA_def_function(srna, "item_level_enumO", "uiItemLevelEnumO");
+ func= RNA_def_function(srna, "item_menu_enumO", "uiItemMenuEnumO");
api_ui_item_op_common(func);
parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator.");
RNA_def_property_flag(parm, PROP_REQUIRED);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 924d7df8c45..5aa2cded642 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -2833,11 +2833,11 @@ static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
ui_window_to_block(ar, block, &mx, &my);
for(but=block->buttons.first; but; but= but->next) {
- /* give precedence to already activated buttons */
if(but->flag & UI_NO_HILITE)
continue;
if(ui_but_contains_pt(but, mx, my))
+ /* give precedence to already activated buttons */
if(!butover || (!butover->active && but->active))
butover= but;
}
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index f9e08d29370..6ed02a38ca1 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -9,6 +9,7 @@
#include "DNA_ID.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
#include "BLI_listbase.h"
@@ -45,6 +46,8 @@
#define EM_UNIT_X XIC
#define EM_UNIT_Y YIC
+
+#define EM_SEPR_X 6
#define EM_SEPR_Y 6
/* Item */
@@ -165,14 +168,10 @@ struct uiLayout {
int x, y, w, h;
int emw, emh;
- int column_space;
- int template_space;
- int box_space;
- int button_space_x;
- int button_space_y;
-
uiMenuHandleFunc handlefunc;
void *argv;
+
+ uiStyle *style;
};
void ui_layout_free(uiLayout *layout);
@@ -187,6 +186,15 @@ static void ui_item_name(uiItem *item, char *name)
item->name= item->namestr;
}
}
+static void ui_item_name_add_colon(uiItem *item)
+{
+ int len= strlen(item->namestr);
+
+ if(len != 0 && len+1 < sizeof(item->namestr)) {
+ item->namestr[len]= ':';
+ item->namestr[len+1]= '\0';
+ }
+}
#define UI_FIT_EXPAND 1
@@ -215,6 +223,7 @@ static int ui_item_fit(int item, int pos, int all, int available, int spacing, i
/* create buttons for an item with an RNA array */
static void ui_item_array(uiLayout *layout, uiBlock *block, uiItemRNA *rnaitem, int len, int x, int y, int w, int h)
{
+ uiStyle *style= layout->style;
PropertyType type;
PropertySubType subtype;
int a;
@@ -234,7 +243,7 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, uiItemRNA *rnaitem,
/* special check for layer layout */
int butw, buth;
- butw= ui_item_fit(EM_UNIT_X, 0, EM_UNIT_X*10 + layout->button_space_x, w, 0, 0, UI_FIT_EXPAND);
+ butw= ui_item_fit(EM_UNIT_X, 0, EM_UNIT_X*10 + style->buttonspacex, w, 0, 0, UI_FIT_EXPAND);
buth= MIN2(EM_UNIT_Y, butw);
y += 2*(EM_UNIT_Y - buth);
@@ -246,7 +255,7 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, uiItemRNA *rnaitem,
uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a+10, "", ICON_BLANK1, x + butw*a, y, butw, buth);
uiBlockEndAlign(block);
- x += 5*butw + layout->button_space_x;
+ x += 5*butw + style->buttonspacex;
uiBlockBeginAlign(block);
for(a=0; a<5; a++)
@@ -507,8 +516,14 @@ static void ui_item_size(uiItem *item, int *r_w, int *r_h, int flag)
}
else {
/* other */
- w= ui_text_icon_width(item->name, item->icon, flag & UI_ITEM_VARY_X);
- h= (item->type == ITEM_SEPARATOR)? EM_SEPR_Y: EM_UNIT_Y;
+ if(item->type == ITEM_SEPARATOR) {
+ w= EM_SEPR_X;
+ h= EM_SEPR_Y;
+ }
+ else {
+ w= ui_text_icon_width(item->name, item->icon, flag & UI_ITEM_VARY_X);
+ h= EM_UNIT_Y;
+ }
}
if(r_w) *r_w= w;
@@ -860,7 +875,7 @@ void uiItemS(uiLayout *layout)
}
/* level items */
-void uiItemLevel(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func)
+void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func)
{
uiTemplate *template= layout->templates.last;
uiItemMenu *menuitem;
@@ -872,7 +887,7 @@ void uiItemLevel(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func)
menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu");
- if(!icon)
+ if(!icon && layout->type == UI_LAYOUT_MENU)
icon= ICON_RIGHTARROW_THIN,
ui_item_name(&menuitem->item, name);
@@ -896,11 +911,11 @@ static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg)
{
MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
- uiLayoutContext(layout, lvl->opcontext);
+ uiLayoutContext(layout, WM_OP_EXEC_REGION_WIN);
uiItemsEnumO(layout, lvl->opname, lvl->propname);
}
-void uiItemLevelEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname)
+void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname)
{
wmOperatorType *ot= WM_operatortype_find(opname);
uiTemplate *template= layout->templates.last;
@@ -916,7 +931,7 @@ void uiItemLevelEnumO(uiLayout *layout, char *name, int icon, char *opname, char
menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu");
- if(!icon)
+ if(!icon && layout->type == UI_LAYOUT_MENU)
icon= ICON_RIGHTARROW_THIN;
if(!name)
name= ot->name;
@@ -945,7 +960,7 @@ static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg)
uiItemsEnumR(layout, &lvl->rnapoin, lvl->propname);
}
-void uiItemLevelEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname)
+void uiItemMenuEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname)
{
uiTemplate *template= layout->templates.last;
uiItemMenu *menuitem;
@@ -963,7 +978,7 @@ void uiItemLevelEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA
menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu");
- if(!icon)
+ if(!icon && layout->type == UI_LAYOUT_MENU)
icon= ICON_RIGHTARROW_THIN;
if(!name)
name= (char*)RNA_property_ui_name(prop);
@@ -989,6 +1004,7 @@ void uiItemLevelEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA
/* single row layout */
static void ui_layout_row(uiLayout *layout, uiBlock *block, uiTemplate *template)
{
+ uiStyle *style= layout->style;
uiItem *item;
int tot=0, totw= 0, maxh= 0, itemw, itemh, x, w;
@@ -1009,10 +1025,10 @@ static void ui_layout_row(uiLayout *layout, uiBlock *block, uiTemplate *template
for(item=template->items.first; item; item=item->next) {
ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y);
- itemw= ui_item_fit(itemw, x, totw, w, (tot-1)*layout->button_space_x, !item->next, UI_FIT_EXPAND);
+ itemw= ui_item_fit(itemw, x, totw, w, (tot-1)*style->buttonspacex, !item->next, UI_FIT_EXPAND);
ui_item_buts(layout, block, item, layout->x+x, layout->y-itemh, itemw, itemh);
- x += itemw+layout->button_space_x;
+ x += itemw+style->buttonspacex;
}
layout->y -= maxh;
@@ -1021,6 +1037,7 @@ static void ui_layout_row(uiLayout *layout, uiBlock *block, uiTemplate *template
/* multi-column layout */
static void ui_layout_column(uiLayout *layout, uiBlock *block, uiTemplate *template)
{
+ uiStyle *style= layout->style;
uiItem *item;
int col, totcol= 0, x, y, miny, itemw, itemh, w;
@@ -1039,7 +1056,7 @@ static void ui_layout_column(uiLayout *layout, uiBlock *block, uiTemplate *templ
for(col=0; col<totcol; col++) {
y= 0;
- itemw= ui_item_fit(1, x, totcol, w, (totcol-1)*layout->column_space, col == totcol-1, UI_FIT_EXPAND);
+ itemw= ui_item_fit(1, x, totcol, w, (totcol-1)*style->columnspace, col == totcol-1, UI_FIT_EXPAND);
for(item=template->items.first; item; item=item->next) {
if(item->slot != col)
@@ -1049,10 +1066,10 @@ static void ui_layout_column(uiLayout *layout, uiBlock *block, uiTemplate *templ
y -= itemh;
ui_item_buts(layout, block, item, layout->x+x, layout->y+y, itemw, itemh);
- y -= layout->button_space_y;
+ y -= style->buttonspacey;
}
- x += itemw + layout->column_space;
+ x += itemw + style->columnspace;
miny= MIN2(miny, y);
}
@@ -1062,6 +1079,7 @@ static void ui_layout_column(uiLayout *layout, uiBlock *block, uiTemplate *templ
/* multi-column layout, automatically flowing to the next */
static void ui_layout_column_flow(uiLayout *layout, uiBlock *block, uiTemplate *template)
{
+ uiStyle *style= layout->style;
uiTemplateFlow *flow= (uiTemplateFlow*)template;
uiItem *item;
int col, x, y, w, emh, emy, miny, itemw, itemh, maxw=0;
@@ -1101,17 +1119,17 @@ static void ui_layout_column_flow(uiLayout *layout, uiBlock *block, uiTemplate *
col= 0;
for(item=template->items.first; item; item=item->next) {
ui_item_size(item, NULL, &itemh, UI_ITEM_VARY_Y);
- itemw= ui_item_fit(1, x, totcol, w, (totcol-1)*layout->column_space, col == totcol-1, UI_FIT_EXPAND);
+ itemw= ui_item_fit(1, x, totcol, w, (totcol-1)*style->columnspace, col == totcol-1, UI_FIT_EXPAND);
y -= itemh;
emy -= itemh;
ui_item_buts(layout, block, item, layout->x+x, layout->y+y, itemw, itemh);
- y -= layout->button_space_y;
+ y -= style->buttonspacey;
miny= MIN2(miny, y);
/* decide to go to next one */
if(col < totcol-1 && emy <= -emh) {
- x += itemw + layout->column_space;
+ x += itemw + style->columnspace;
y= 0;
col++;
}
@@ -1141,7 +1159,7 @@ static void ui_layout_split(uiLayout *layout, uiBlock *block, uiTemplate *templa
/* create buttons starting from left and right */
lx= 0;
rx= 0;
- w= layout->w - layout->button_space_x*(tot-1) + layout->button_space_x;
+ w= layout->w - style->buttonspacex*(tot-1) + style->buttonspacex;
for(item=template->items.first; item; item=item->next) {
ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y);
@@ -1149,11 +1167,11 @@ static void ui_layout_split(uiLayout *layout, uiBlock *block, uiTemplate *templa
if(item->slot == UI_TSLOT_LR_LEFT) {
itemw= ui_item_fit(itemw, lx, totw, w, 0, 0);
ui_item_buts(layout, block, item, layout->x+lx, layout->y-itemh, itemw, itemh);
- lx += itemw + layout->button_space_x;
+ lx += itemw + style->buttonspacex;
}
else {
itemw= ui_item_fit(itemw, totw + rx, totw, w, 0, 0);
- rx -= itemw + layout->button_space_x;
+ rx -= itemw + style->buttonspacex;
ui_item_buts(layout, block, item, layout->x+layout->w+rx, layout->y-itemh, itemw, itemh);
}
}
@@ -1165,6 +1183,7 @@ static void ui_layout_split(uiLayout *layout, uiBlock *block, uiTemplate *templa
/* split in columns */
static void ui_layout_split(const bContext *C, uiLayout *layout, uiBlock *block, uiTemplate *template)
{
+ uiStyle *style= layout->style;
uiTemplateSplt *split= (uiTemplateSplt*)template;
uiLayout *sublayout;
int a, x, y, miny, w= layout->w, h= layout->h, splitw;
@@ -1176,7 +1195,7 @@ static void ui_layout_split(const bContext *C, uiLayout *layout, uiBlock *block,
for(a=0; a<split->number; a++) {
sublayout= split->sublayout[a];
- splitw= ui_item_fit(1, x, split->number, w, (split->number-1)*layout->column_space, a == split->number-1, UI_FIT_EXPAND);
+ splitw= ui_item_fit(1, x, split->number, w, (split->number-1)*style->columnspace, a == split->number-1, UI_FIT_EXPAND);
sublayout->x= layout->x + x;
sublayout->w= splitw;
sublayout->y= layout->y;
@@ -1189,7 +1208,7 @@ static void ui_layout_split(const bContext *C, uiLayout *layout, uiBlock *block,
ui_layout_end(C, block, sublayout, NULL, &y);
miny= MIN2(y, miny);
- x += splitw + layout->column_space;
+ x += splitw + style->columnspace;
}
layout->y= miny;
@@ -1198,6 +1217,7 @@ static void ui_layout_split(const bContext *C, uiLayout *layout, uiBlock *block,
/* element in a box layout */
static void ui_layout_box(const bContext *C, uiLayout *layout, uiBlock *block, uiTemplate *template)
{
+ uiStyle *style= layout->style;
uiTemplateBx *box= (uiTemplateBx*)template;
int starty, startx, w= layout->w, h= layout->h;
@@ -1205,9 +1225,9 @@ static void ui_layout_box(const bContext *C, uiLayout *layout, uiBlock *block, u
starty= layout->y;
/* some extra padding */
- box->sublayout->x= layout->x + layout->box_space;
- box->sublayout->w= w - 2*layout->box_space;
- box->sublayout->y= layout->y - layout->box_space;
+ box->sublayout->x= layout->x + style->boxspace;
+ box->sublayout->w= w - 2*style->boxspace;
+ box->sublayout->y= layout->y - style->boxspace;
box->sublayout->h= h;
box->sublayout->emw= layout->emw;
@@ -1433,7 +1453,7 @@ uiLayout *uiLayoutBox(uiLayout *layout)
box= MEM_callocN(sizeof(uiTemplateBx), "uiTemplateBx");
box->template.type= TEMPLATE_BOX;
- box->sublayout= uiLayoutBegin(layout->dir, layout->type, 0, 0, 0, 0);
+ box->sublayout= uiLayoutBegin(layout->dir, layout->type, 0, 0, 0, 0, layout->style);
BLI_addtail(&layout->templates, box);
return box->sublayout;
@@ -1451,7 +1471,7 @@ void uiLayoutSplit(uiLayout *layout, int number, int lr)
split->sublayout= MEM_callocN(sizeof(uiLayout*)*number, "uiTemplateSpltSub");
for(a=0; a<number; a++)
- split->sublayout[a]= uiLayoutBegin(layout->dir, layout->type, 0, 0, 0, 0);
+ split->sublayout[a]= uiLayoutBegin(layout->dir, layout->type, 0, 0, 0, 0, layout->style);
BLI_addtail(&layout->templates, split);
}
@@ -1563,7 +1583,12 @@ static void ui_layout_init_items(const bContext *C, uiLayout *layout)
}
else if(item->type == ITEM_RNA_PROPERTY) {
rnaitem= (uiItemRNA*)item;
+ type= RNA_property_type(rnaitem->prop);
+
ui_item_name(item, (char*)RNA_property_ui_name(rnaitem->prop));
+
+ if(ELEM4(type, PROP_INT, PROP_FLOAT, PROP_STRING, PROP_ENUM))
+ ui_item_name_add_colon(item);
}
else if(item->type == ITEM_OPERATOR) {
opitem= (uiItemOp*)item;
@@ -1593,6 +1618,7 @@ static void ui_layout_init_items(const bContext *C, uiLayout *layout)
static void ui_layout_templates(const bContext *C, uiBlock *block, uiLayout *layout)
{
+ uiStyle *style= layout->style;
uiTemplate *template;
ui_layout_init_items(C, layout);
@@ -1611,7 +1637,7 @@ static void ui_layout_templates(const bContext *C, uiBlock *block, uiLayout *lay
break;
}
- layout->x += layout->template_space;
+ layout->x += style->templatespace;
}
}
else {
@@ -1635,7 +1661,7 @@ static void ui_layout_templates(const bContext *C, uiBlock *block, uiLayout *lay
break;
}
- layout->y -= layout->template_space;
+ layout->y -= style->templatespace;
}
}
}
@@ -1663,7 +1689,7 @@ void ui_layout_free(uiLayout *layout)
MEM_freeN(layout);
}
-uiLayout *uiLayoutBegin(int dir, int type, int x, int y, int size, int em)
+uiLayout *uiLayoutBegin(int dir, int type, int x, int y, int size, int em, uiStyle *style)
{
uiLayout *layout;
@@ -1673,12 +1699,7 @@ uiLayout *uiLayoutBegin(int dir, int type, int x, int y, int size, int em)
layout->type= type;
layout->x= x;
layout->y= y;
-
- layout->column_space= 5;
- layout->template_space= 5;
- layout->box_space= 5;
- layout->button_space_x= 5;
- layout->button_space_y= 2;
+ layout->style= style;
if(dir == UI_LAYOUT_HORIZONTAL) {
layout->h= size;
@@ -1713,6 +1734,7 @@ void uiLayoutEnd(const bContext *C, uiBlock *block, uiLayout *layout, int *x, in
void uiRegionPanelLayout(const bContext *C, ARegion *ar, int vertical, char *context)
{
+ uiStyle *style= U.uistyles.first;
uiBlock *block;
PanelType *pt;
Panel *panel;
@@ -1751,7 +1773,7 @@ void uiRegionPanelLayout(const bContext *C, ARegion *ar, int vertical, char *con
}
panel->type= pt;
- panel->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, PNL_SAFETY, 0, w-2*PNL_SAFETY, em);
+ panel->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, PNL_SAFETY, 0, w-2*PNL_SAFETY, em, style);
pt->draw(C, panel);
@@ -1781,6 +1803,7 @@ void uiRegionPanelLayout(const bContext *C, ARegion *ar, int vertical, char *con
void uiRegionHeaderLayout(const bContext *C, ARegion *ar)
{
+ uiStyle *style= U.uistyles.first;
uiBlock *block;
uiLayout *layout;
HeaderType *ht;
@@ -1808,7 +1831,7 @@ void uiRegionHeaderLayout(const bContext *C, ARegion *ar)
/* draw all headers types */
for(ht= ar->type->headertypes.first; ht; ht= ht->next) {
block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
- layout= uiLayoutBegin(UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER, xco, yco, 24, 1);
+ layout= uiLayoutBegin(UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER, xco, yco, 24, 1, style);
if(ht->draw) {
header.type= ht;
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 7bc7e2e3c19..59725cc4954 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1763,12 +1763,13 @@ static uiBlock *ui_block_func_MENU_ITEM(bContext *C, uiPopupBlockHandle *handle,
uiPopupBlockHandle *ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut *but, uiMenuCreateFunc menu_func, void *arg)
{
+ uiStyle *style= U.uistyles.first;
uiPopupBlockHandle *handle;
uiPopupMenu *pup;
uiMenuInfo info;
pup= MEM_callocN(sizeof(uiPopupMenu), "menu dummy");
- pup->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0);
+ pup->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style);
uiLayoutContext(pup->layout, WM_OP_INVOKE_REGION_WIN);
uiLayoutColumn(pup->layout);
@@ -1793,10 +1794,11 @@ uiPopupBlockHandle *ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut
/* only return handler, and set optional title */
uiPopupMenu *uiPupMenuBegin(const char *title, int icon)
{
+ uiStyle *style= U.uistyles.first;
uiPopupMenu *pup= MEM_callocN(sizeof(uiPopupMenu), "menu start");
pup->icon= icon;
- pup->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0);
+ pup->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style);
uiLayoutContext(pup->layout, WM_OP_EXEC_REGION_WIN);
uiLayoutColumn(pup->layout);
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index 87e70523870..db5dacf5a75 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -115,6 +115,12 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
style->widget.uifont_id= UIFONT_DEFAULT;
style->widget.points= 11;
style->widget.shadowalpha= 0.25f;
+
+ style->columnspace= 5;
+ style->templatespace= 5;
+ style->boxspace= 5;
+ style->buttonspacex= 5;
+ style->buttonspacey= 2;
return style;
}
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 67cca059d77..4ae90dee0bc 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -293,13 +293,14 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
int uiDefAutoButsRNA(const bContext *C, uiBlock *block, PointerRNA *ptr)
{
+ uiStyle *style= U.uistyles.first;
CollectionPropertyIterator iter;
PropertyRNA *iterprop, *prop;
uiLayout *layout;
char *name;
int x= 0, y= 0;
- layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y, DEF_BUT_WIDTH*2, 20);
+ layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y, DEF_BUT_WIDTH*2, 20, style);
uiLayoutColumn(layout);
uiItemL(layout, (char*)RNA_struct_ui_name(ptr->type), 0);
@@ -331,13 +332,14 @@ int uiDefAutoButsRNA(const bContext *C, uiBlock *block, PointerRNA *ptr)
/* temp call, single collumn, test for toolbar only */
int uiDefAutoButsRNA_single(const bContext *C, uiBlock *block, PointerRNA *ptr)
{
+ uiStyle *style= U.uistyles.first;
CollectionPropertyIterator iter;
PropertyRNA *iterprop, *prop;
uiLayout *layout;
char *name;
int x= 0, y= 0;
- layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y, block->panel->sizex, 20);
+ layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y, block->panel->sizex, 20, style);
uiLayoutColumn(layout);
uiItemL(layout, (char*)RNA_struct_ui_name(ptr->type), 0);
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 1a3b3e5e031..37b50da39b4 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -637,9 +637,9 @@ static int object_primitive_add_invoke(bContext *C, wmOperator *op, wmEvent *eve
uiPopupMenu *pup= uiPupMenuBegin("Add Object", 0);
uiLayout *layout= uiPupMenuLayout(pup);
- uiItemLevelEnumO(layout, NULL, 0, "OBJECT_OT_mesh_add", "type");
- uiItemLevelEnumO(layout, NULL, 0, "OBJECT_OT_curve_add", "type");
- uiItemLevelEnumO(layout, NULL, 0, "OBJECT_OT_surface_add", "type");
+ uiItemMenuEnumO(layout, NULL, 0, "OBJECT_OT_mesh_add", "type");
+ uiItemMenuEnumO(layout, NULL, 0, "OBJECT_OT_curve_add", "type");
+ uiItemMenuEnumO(layout, NULL, 0, "OBJECT_OT_surface_add", "type");
uiItemO(layout, NULL, 0, "OBJECT_OT_text_add");
uiItemEnumO(layout, NULL, 0, "OBJECT_OT_object_add", "type", OB_MBALL);
uiItemEnumO(layout, NULL, 0, "OBJECT_OT_object_add", "type", OB_CAMERA);
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 1c56b0c7115..7203f56b40f 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -84,5 +84,8 @@ void GROUP_OT_objects_remove(struct wmOperatorType *ot);
void GROUP_OT_objects_add_active(struct wmOperatorType *ot);
void GROUP_OT_objects_remove_active(struct wmOperatorType *ot);
+/* object_modifier.c */
+void OBJECT_OT_modifier_add(struct wmOperatorType *ot);
+
#endif /* ED_OBJECT_INTERN_H */
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
new file mode 100644
index 00000000000..b430cdd67bc
--- /dev/null
+++ b/source/blender/editors/object/object_modifier.c
@@ -0,0 +1,98 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation, 2009
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BLI_listbase.h"
+
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_modifier.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+#include "ED_screen.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "object_intern.h"
+
+/********************* add modifier operator ********************/
+
+static int modifier_add_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob = CTX_data_active_object(C);
+ ModifierData *md;
+ int type= RNA_enum_get(op->ptr, "type");
+ ModifierTypeInfo *mti = modifierType_getInfo(type);
+
+ if(mti->flags&eModifierTypeFlag_RequiresOriginalData) {
+ md = ob->modifiers.first;
+
+ while(md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform)
+ md = md->next;
+
+ BLI_insertlinkbefore(&ob->modifiers, md, modifier_new(type));
+ }
+ else
+ BLI_addtail(&ob->modifiers, modifier_new(type));
+
+ DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_modifier_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Modifier";
+ ot->description = "Add a modifier to the active object.";
+ ot->idname= "OBJECT_OT_modifier_add";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= modifier_add_exec;
+
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* XXX only some types should be here */
+ RNA_def_enum(ot->srna, "type", modifier_type_items, 0, "Type", "");
+}
+
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 6c8c6e6b60f..e668c494fba 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -98,6 +98,8 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_armature_add);
WM_operatortype_append(OBJECT_OT_object_add);
WM_operatortype_append(OBJECT_OT_primitive_add);
+
+ WM_operatortype_append(OBJECT_OT_modifier_add);
}
void ED_keymap_object(wmWindowManager *wm)
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 85d4d822c0d..e441a93fe23 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1834,7 +1834,7 @@ static int testing123(bContext *C, wmOperator *op, wmEvent *event)
uiItemO(layout, NULL, ICON_PROP_ON, "SCREEN_OT_region_flip");
uiItemO(layout, NULL, ICON_PROP_CON, "SCREEN_OT_screen_full_area");
uiItemO(layout, NULL, ICON_SMOOTHCURVE, "SCREEN_OT_region_foursplit");
- uiItemLevel(layout, "Submenu", 0, newlevel1);
+ uiItemMenuF(layout, "Submenu", 0, newlevel1);
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c
index 7e009dfc479..457d322f565 100644
--- a/source/blender/editors/space_image/image_header.c
+++ b/source/blender/editors/space_image/image_header.c
@@ -155,7 +155,7 @@ static void image_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
uiItemS(layout);
- uiItemLevel(layout, "View Navigation", 0, image_view_viewnavmenu);
+ uiItemMenuF(layout, "View Navigation", 0, image_view_viewnavmenu);
if(show_uvedit) uiItemO(layout, NULL, 0, "IMAGE_OT_view_selected");
uiItemO(layout, NULL, 0, "IMAGE_OT_view_all");
@@ -238,7 +238,7 @@ static void image_imagemenu(bContext *C, uiLayout *layout, void *arg_unused)
/* move to realtime properties panel */
RNA_id_pointer_create(&ima->id, &imaptr);
- uiItemLevelEnumR(layout, NULL, 0, &imaptr, "mapping");
+ uiItemMenuEnumR(layout, NULL, 0, &imaptr, "mapping");
}
}
@@ -357,24 +357,24 @@ static void image_uvsmenu(bContext *C, uiLayout *layout, void *arg_unused)
uiItemS(layout);
- uiItemLevel(layout, "Transform", 0, image_uvs_transformmenu);
- uiItemLevel(layout, "Mirror", 0, image_uvs_mirrormenu);
- uiItemLevel(layout, "Weld/Align", 0, image_uvs_weldalignmenu);
+ uiItemMenuF(layout, "Transform", 0, image_uvs_transformmenu);
+ uiItemMenuF(layout, "Mirror", 0, image_uvs_mirrormenu);
+ uiItemMenuF(layout, "Weld/Align", 0, image_uvs_weldalignmenu);
uiItemS(layout);
uiItemR(layout, NULL, 0, &sceneptr, "proportional_editing", 0);
- uiItemLevelEnumR(layout, NULL, 0, &sceneptr, "proportional_editing_falloff");
+ uiItemMenuEnumR(layout, NULL, 0, &sceneptr, "proportional_editing_falloff");
uiItemS(layout);
- uiItemLevel(layout, "Show/Hide Faces", 0, image_uvs_showhidemenu);
+ uiItemMenuF(layout, "Show/Hide Faces", 0, image_uvs_showhidemenu);
#if 0
#ifndef DISABLE_PYTHON
uiItemS(layout);
- uiItemLevel(layout, "Scripts", image_uvs_scriptsmenu);
+ uiItemMenuF(layout, "Scripts", image_uvs_scriptsmenu);
#endif
#endif
}
@@ -948,10 +948,10 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
pup= uiPupMenuBegin("Toolbox", 0);
layout= uiPupMenuLayout(pup);
- uiItemLevel(layout, "View", 0, image_viewmenu);
- if(show_uvedit) uiItemLevel(layout, "Select", 0, image_selectmenu);
- uiItemLevel(layout, "Image", 0, image_imagemenu);
- if(show_uvedit) uiItemLevel(layout, "UVs", 0, image_uvsmenu);
+ uiItemMenuF(layout, "View", 0, image_viewmenu);
+ if(show_uvedit) uiItemMenuF(layout, "Select", 0, image_selectmenu);
+ uiItemMenuF(layout, "Image", 0, image_imagemenu);
+ if(show_uvedit) uiItemMenuF(layout, "UVs", 0, image_uvsmenu);
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/space_sequencer/sequencer_header.c b/source/blender/editors/space_sequencer/sequencer_header.c
index c8dc4cc006a..0e9a9d7130b 100644
--- a/source/blender/editors/space_sequencer/sequencer_header.c
+++ b/source/blender/editors/space_sequencer/sequencer_header.c
@@ -235,7 +235,7 @@ static void seq_addmenu_effectmenu(bContext *C, uiLayout *layout, void *arg_unus
//static uiBlock *seq_addmenu(bContext *C, ARegion *ar, void *arg_unused)
static void seq_addmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiItemLevel(layout, "Effects...", 0, seq_addmenu_effectmenu);
+ uiItemMenuF(layout, "Effects...", 0, seq_addmenu_effectmenu);
uiItemS(layout);
uiLayoutContext(layout, WM_OP_INVOKE_REGION_WIN);
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index a3b62adf6c8..83c144d88c5 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -188,7 +188,7 @@ static void text_formatmenu(const bContext *C, Menu *menu)
uiItemS(layout);
- uiItemLevelEnumO(layout, NULL, 0, "TEXT_OT_convert_whitespace", "type");
+ uiItemMenuEnumO(layout, NULL, 0, "TEXT_OT_convert_whitespace", "type");
}
static void text_editmenu_to3dmenu(bContext *C, uiLayout *layout, void *arg_unused)
@@ -217,9 +217,9 @@ static void text_editmenu(const bContext *C, Menu *menu)
uiItemS(layout);
- uiItemLevel(layout, "View", 0, text_editmenu_viewmenu);
- uiItemLevel(layout, "Select", 0, text_editmenu_selectmenu);
- uiItemLevel(layout, "Markers", 0, text_editmenu_markermenu);
+ uiItemMenuF(layout, "View", 0, text_editmenu_viewmenu);
+ uiItemMenuF(layout, "Select", 0, text_editmenu_selectmenu);
+ uiItemMenuF(layout, "Markers", 0, text_editmenu_markermenu);
uiItemS(layout);
@@ -228,7 +228,7 @@ static void text_editmenu(const bContext *C, Menu *menu)
uiItemS(layout);
- uiItemLevel(layout, "Text to 3D Object", 0, text_editmenu_to3dmenu);
+ uiItemMenuF(layout, "Text to 3D Object", 0, text_editmenu_to3dmenu);
}
/********************** header buttons ***********************/
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index e968756b11a..fba8e0c4eb7 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -660,7 +660,7 @@ static void view3d_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_FRONT);
uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_RIGHT);
- //uiItemLevel(layout, "Cameras", view3d_view_camerasmenu);
+ //uiItemMenuF(layout, "Cameras", view3d_view_camerasmenu);
uiItemS(layout);
@@ -677,8 +677,8 @@ static void view3d_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
// uiItemS(layout);
- uiItemLevel(layout, "View Navigation", 0, view3d_view_viewnavmenu);
- uiItemLevel(layout, "Align View", 0, view3d_view_alignviewmenu);
+ uiItemMenuF(layout, "View Navigation", 0, view3d_view_viewnavmenu);
+ uiItemMenuF(layout, "Align View", 0, view3d_view_alignviewmenu);
uiItemS(layout);
@@ -3356,17 +3356,17 @@ static void view3d_edit_curvemenu(bContext *C, uiLayout *layout, void *arg_unuse
uiItemS(layout);
- uiItemLevel(layout, "Control Points", 0, view3d_edit_curve_controlpointsmenu);
- uiItemLevel(layout, "Segments", 0, view3d_edit_curve_segmentsmenu);
+ uiItemMenuF(layout, "Control Points", 0, view3d_edit_curve_controlpointsmenu);
+ uiItemMenuF(layout, "Segments", 0, view3d_edit_curve_segmentsmenu);
uiItemS(layout);
uiItemR(layout, NULL, 0, &sceneptr, "proportional_editing", 0); // |O
- uiItemLevelEnumR(layout, NULL, 0, &sceneptr, "proportional_editing_falloff");
+ uiItemMenuEnumR(layout, NULL, 0, &sceneptr, "proportional_editing_falloff");
uiItemS(layout);
- uiItemLevel(layout, "Show/Hide Control Points", 0, view3d_edit_curve_showhidemenu);
+ uiItemMenuF(layout, "Show/Hide Control Points", 0, view3d_edit_curve_showhidemenu);
}
static void do_view3d_edit_mball_showhidemenu(bContext *C, void *arg, int event)
@@ -3513,7 +3513,7 @@ static void view3d_edit_textmenu(bContext *C, uiLayout *layout, void *arg_unused
{
uiItemO(layout, NULL, 0, "FONT_OT_file_paste");
uiItemS(layout);
- uiItemLevel(layout, "Special Characters", 0, view3d_edit_text_charsmenu);
+ uiItemMenuF(layout, "Special Characters", 0, view3d_edit_text_charsmenu);
}
static void do_view3d_edit_latticemenu(bContext *C, void *arg, int event)
@@ -4747,7 +4747,7 @@ static void view3d_particlemenu(bContext *C, uiLayout *layout, void *arg_unused)
uiItemS(layout);
- uiItemLevel(layout, "Show/Hide Particles", 0, view3d_particle_showhidemenu);
+ uiItemMenuF(layout, "Show/Hide Particles", 0, view3d_particle_showhidemenu);
}
static char *view3d_modeselect_pup(Scene *scene)