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:
-rw-r--r--release/ui/space_text.py145
-rw-r--r--source/blender/blenkernel/BKE_library.h1
-rw-r--r--source/blender/blenkernel/BKE_screen.h25
-rw-r--r--source/blender/blenkernel/intern/library.c21
-rw-r--r--source/blender/blenkernel/intern/screen.c11
-rw-r--r--source/blender/editors/animation/keyframing.c18
-rw-r--r--source/blender/editors/armature/editarmature.c19
-rw-r--r--source/blender/editors/armature/poselib.c32
-rw-r--r--source/blender/editors/curve/curve_ops.c22
-rw-r--r--source/blender/editors/curve/editcurve.c29
-rw-r--r--source/blender/editors/include/BIF_transform.h4
-rw-r--r--source/blender/editors/include/UI_interface.h79
-rw-r--r--source/blender/editors/interface/interface_anim.c32
-rw-r--r--source/blender/editors/interface/interface_api.c99
-rw-r--r--source/blender/editors/interface/interface_layout.c818
-rw-r--r--source/blender/editors/interface/interface_regions.c449
-rw-r--r--source/blender/editors/interface/interface_utils.c17
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c10
-rw-r--r--source/blender/editors/object/object_edit.c58
-rw-r--r--source/blender/editors/physics/editparticle.c18
-rw-r--r--source/blender/editors/screen/screen_ops.c37
-rw-r--r--source/blender/editors/space_buttons/buttons_header.c29
-rw-r--r--source/blender/editors/space_image/image_header.c186
-rw-r--r--source/blender/editors/space_image/image_ops.c10
-rw-r--r--source/blender/editors/space_image/space_image.c1
-rw-r--r--source/blender/editors/space_info/info_header.c20
-rw-r--r--source/blender/editors/space_sequencer/sequencer_header.c155
-rw-r--r--source/blender/editors/space_text/space_text.c10
-rw-r--r--source/blender/editors/space_text/text_header.c436
-rw-r--r--source/blender/editors/space_text/text_intern.h2
-rw-r--r--source/blender/editors/space_text/text_ops.c119
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c342
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c19
-rw-r--r--source/blender/editors/transform/transform_ops.c10
-rw-r--r--source/blender/editors/transform/transform_orientations.c12
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c28
-rw-r--r--source/blender/makesdna/DNA_screen_types.h5
-rw-r--r--source/blender/makesdna/DNA_space_types.h12
-rw-r--r--source/blender/makesrna/intern/rna_context.c12
-rw-r--r--source/blender/makesrna/intern/rna_screen.c2
-rw-r--r--source/blender/makesrna/intern/rna_space.c2
-rw-r--r--source/blender/makesrna/intern/rna_text.c13
-rw-r--r--source/blender/makesrna/intern/rna_ui.c159
-rw-r--r--source/blender/python/intern/bpy_ui.c15
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c32
45 files changed, 2030 insertions, 1545 deletions
diff --git a/release/ui/space_text.py b/release/ui/space_text.py
new file mode 100644
index 00000000000..a3d27370ffa
--- /dev/null
+++ b/release/ui/space_text.py
@@ -0,0 +1,145 @@
+
+import bpy
+
+# temporary
+ICON_LINENUMBERS_OFF = 588
+ICON_WORDWRAP_OFF = 584
+ICON_SYNTAX_OFF = 586
+ICON_TEXT = 120
+ICON_HELP = 1
+ICON_SCRIPTPLUGINS = 1
+
+class TEXT_HT_header(bpy.types.Header):
+ __space_type__ = "TEXT_EDITOR"
+ __idname__ = "TEXT_HT_header"
+
+ def draw(self, context):
+ st = context.space_data
+ text = st.text
+ layout = self.layout
+
+ layout.template_header()
+ layout.itemM("TEXT_MT_text")
+ if text:
+ layout.itemM("TEXT_MT_edit")
+ layout.itemM("TEXT_MT_format")
+
+ if text and text.modified:
+ layout.row()
+ # layout.color(redalert)
+ layout.itemO("TEXT_OT_resolve_conflict", text="", icon=ICON_HELP)
+
+ layout.row()
+ layout.itemR(st, "line_numbers", text="", icon=ICON_LINENUMBERS_OFF)
+ layout.itemR(st, "word_wrap", text="", icon=ICON_WORDWRAP_OFF)
+ layout.itemR(st, "syntax_highlight", text="", icon=ICON_SYNTAX_OFF)
+ # layout.itemR(st, "do_python_plugins", text="", icon=ICON_SCRIPTPLUGINS)
+
+ layout.row()
+ layout.template_header_ID(st, "text", new="TEXT_OT_new", open="TEXT_OT_open", unlink="TEXT_OT_unlink")
+
+ if text:
+ layout.row()
+ if text.filename != "":
+ if text.dirty:
+ layout.itemL(text="File: *" + text.filename + " (unsaved)")
+ else:
+ layout.itemL(text="File: " + text.filename)
+ else:
+ if text.library:
+ layout.itemL(text="Text: External")
+ else:
+ layout.itemL(text="Text: Internal")
+
+class TEXT_PT_properties(bpy.types.Panel):
+ __space_type__ = "TEXT_EDITOR"
+ __region_type__ = "UI"
+ __label__ = "Properties"
+
+ def draw(self, context):
+ st = context.space_data
+ layout = self.layout
+
+ layout.column_flow()
+ layout.itemR(st, "line_numbers", icon=ICON_LINENUMBERS_OFF)
+ layout.itemR(st, "word_wrap", icon=ICON_WORDWRAP_OFF)
+ layout.itemR(st, "syntax_highlight", icon=ICON_SYNTAX_OFF)
+
+ layout.column_flow()
+ layout.itemR(st, "font_size")
+ layout.itemR(st, "tab_width")
+
+class TEXT_PT_find(bpy.types.Panel):
+ __space_type__ = "TEXT_EDITOR"
+ __region_type__ = "UI"
+ __label__ = "Find"
+
+ def draw(self, context):
+ st = context.space_data
+ layout = self.layout
+
+ # find
+ layout.row()
+ layout.itemR(st, "find_text", text="")
+ layout.itemO("TEXT_OT_find_set_selected", text="", icon=ICON_TEXT)
+ layout.column()
+ layout.itemO("TEXT_OT_find")
+
+ # replace
+ layout.row()
+ layout.itemR(st, "replace_text", text="")
+ layout.itemO("TEXT_OT_replace_set_selected", text="", icon=ICON_TEXT)
+ layout.column()
+ layout.itemO("TEXT_OT_replace")
+
+ # mark
+ layout.column()
+ layout.itemO("TEXT_OT_mark_all")
+
+ # settings
+ layout.row()
+ layout.itemR(st, "find_wrap", text="Wrap")
+ layout.itemR(st, "find_all", text="All")
+
+class TEXT_MT_text(bpy.types.Menu):
+ __space_type__ = "TEXT_EDITOR"
+ __label__ = "Text"
+
+ def draw(self, context):
+ layout = self.layout
+ st = context.space_data
+ text = st.text
+
+ layout.column()
+ layout.itemO("TEXT_OT_new")
+ layout.itemO("TEXT_OT_open")
+
+ if text:
+ layout.itemO("TEXT_OT_reload")
+
+ layout.column()
+ layout.itemO("TEXT_OT_save")
+ layout.itemO("TEXT_OT_save_as")
+
+ if text.filename != "":
+ layout.itemO("TEXT_OT_make_internal")
+
+ layout.column()
+ layout.itemO("TEXT_OT_run_script")
+
+ #ifndef DISABLE_PYTHON
+ # XXX if(BPY_is_pyconstraint(text))
+ # XXX uiMenuItemO(head, 0, "TEXT_OT_refresh_pyconstraints");
+ #endif
+
+ #ifndef DISABLE_PYTHON
+ # XXX layout.column()
+ # XXX uiDefIconTextBlockBut(block, text_template_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Script Templates", 0, yco-=20, 120, 19, "");
+ # XXX uiDefIconTextBlockBut(block, text_plugin_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Text Plugins", 0, yco-=20, 120, 19, "");
+ #endif
+
+bpy.types.register(TEXT_HT_header)
+bpy.types.register(TEXT_PT_properties)
+bpy.types.register(TEXT_PT_find)
+bpy.types.register(TEXT_MT_text)
+
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index 212e9f08c35..e598394cc60 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -61,6 +61,7 @@ void free_main(struct Main *mainvar);
void splitIDname(char *name, char *left, int *nr);
void rename_id(struct ID *id, char *name);
void test_idbutton(char *name);
+void text_idbutton(struct ID *id, char *text);
void all_local(struct Library *lib, int untagged_only);
struct ID *find_id(char *type, char *name);
void clear_id_newpoins(void);
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 8ac3b4b0b51..4797616a471 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -38,6 +38,7 @@ struct bScreen;
struct ListBase;
struct Panel;
struct Header;
+struct Menu;
struct ScrArea;
struct SpaceType;
struct wmNotifier;
@@ -136,6 +137,9 @@ typedef struct ARegionType {
/* header type definitions */
ListBase headertypes;
+ /* menu type definitions */
+ ListBase menutypes;
+
/* hardcoded constraints, smaller than these values region is not visible */
int minsizex, minsizey;
/* default keymaps to add */
@@ -183,6 +187,27 @@ typedef struct HeaderType {
void (*py_free)(void *py_data);
} HeaderType;
+/* menu types */
+
+typedef struct MenuType {
+ struct MenuType *next, *prev;
+
+ char idname[BKE_ST_MAXNAME]; /* unique name */
+ char label[BKE_ST_MAXNAME]; /* for button text */
+ int space_type;
+
+ /* verify if the menu should draw or not */
+ int (*poll)(const struct bContext *, struct MenuType *);
+ /* draw entirely, view changes should be handled here */
+ void (*draw)(const struct bContext *, struct Menu *);
+
+ /* python integration */
+ void *py_data;
+ struct StructRNA *py_srna;
+ int (*py_call)(struct PointerRNA *, struct FunctionRNA *, struct ParameterList *);
+ void (*py_free)(void *py_data);
+} MenuType;
+
/* spacetypes */
struct SpaceType *BKE_spacetype_from_id(int spaceid);
struct ARegionType *BKE_regiontype_from_id(struct SpaceType *st, int regionid);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 5728b844a88..d0e4c1a15bc 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1102,6 +1102,27 @@ void test_idbutton(char *name)
if(idtest) if( new_id(lb, idtest, name)==0 ) sort_alpha_id(lb, idtest);
}
+void text_idbutton(struct ID *id, char *text)
+{
+ if(id) {
+ if(GS(id->name)==ID_SCE)
+ strcpy(text, "SCE: ");
+ else if(GS(id->name)==ID_SCE)
+ strcpy(text, "SCR: ");
+ else if(GS(id->name)==ID_MA && ((Material*)id)->use_nodes)
+ strcpy(text, "NT: ");
+ else {
+ text[0]= id->name[0];
+ text[1]= id->name[1];
+ text[2]= ':';
+ text[3]= ' ';
+ text[4]= 0;
+ }
+ }
+ else
+ strcpy(text, "");
+}
+
void rename_id(ID *id, char *name)
{
ListBase *lb;
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index f43dc287062..e25e4be90c8 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -54,6 +54,8 @@ static void spacetype_free(SpaceType *st)
{
ARegionType *art;
PanelType *pt;
+ HeaderType *ht;
+ MenuType *mt;
for(art= st->regiontypes.first; art; art= art->next) {
BLI_freelistN(&art->drawcalls);
@@ -62,8 +64,17 @@ static void spacetype_free(SpaceType *st)
if(pt->py_free)
pt->py_free(pt->py_data);
+ for(ht= art->headertypes.first; ht; ht= ht->next)
+ if(ht->py_free)
+ ht->py_free(ht->py_data);
+
+ for(mt= art->menutypes.first; mt; mt= mt->next)
+ if(mt->py_free)
+ mt->py_free(mt->py_data);
+
BLI_freelistN(&art->paneltypes);
BLI_freelistN(&art->headertypes);
+ BLI_freelistN(&art->menutypes);
}
BLI_freelistN(&st->regiontypes);
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index c341e32db8c..b09cc3b78e1 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -989,22 +989,24 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
KeyingSet *ks;
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
int i = 0;
- head= uiPupMenuBegin("Insert Keyframe", 0);
+ pup= uiPupMenuBegin("Insert Keyframe", 0);
+ layout= uiPupMenuLayout(pup);
/* active Keying Set */
- uiMenuItemIntO(head, "Active Keying Set", 0, "ANIM_OT_insert_keyframe_menu", "type", i++);
- uiMenuSeparator(head);
+ uiItemIntO(layout, "Active Keying Set", 0, "ANIM_OT_insert_keyframe_menu", "type", i++);
+ uiItemS(layout);
/* user-defined Keying Sets
* - these are listed in the order in which they were defined for the active scene
*/
if (scene->keyingsets.first) {
for (ks= scene->keyingsets.first; ks; ks= ks->next)
- uiMenuItemIntO(head, ks->name, 0, "ANIM_OT_insert_keyframe_menu", "type", i++);
- uiMenuSeparator(head);
+ uiItemIntO(layout, ks->name, 0, "ANIM_OT_insert_keyframe_menu", "type", i++);
+ uiItemS(layout);
}
/* builtin Keying Sets */
@@ -1013,11 +1015,11 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
for (ks= builtin_keyingsets.first; ks; ks= ks->next) {
/* only show KeyingSet if context is suitable */
if (keyingset_context_ok_poll(C, ks)) {
- uiMenuItemIntO(head, ks->name, 0, "ANIM_OT_insert_keyframe_menu", "type", i--);
+ uiItemIntO(layout, ks->name, 0, "ANIM_OT_insert_keyframe_menu", "type", i--);
}
}
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 80f51f3797c..ca0694a7ece 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -3460,11 +3460,13 @@ void ARMATURE_OT_subdivide_multi(wmOperatorType *ot)
static int armature_subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
- head= uiPupMenuBegin("Subdivision Type", 0);
- uiMenuItemsEnumO(head, "ARMATURE_OT_subdivs", "type");
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("Subdivision Type", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemsEnumO(layout, "ARMATURE_OT_subdivs", "type");
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
@@ -3744,7 +3746,8 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
EditBone *actbone = CTX_data_active_bone(C);
- uiMenuItem *head= uiPupMenuBegin("Make Parent ", 0);
+ uiPopupMenu *pup= uiPupMenuBegin("Make Parent ", 0);
+ uiLayout *layout= uiPupMenuLayout(pup);
int allchildbones = 0;
CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) {
@@ -3754,13 +3757,13 @@ static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *even
}
CTX_DATA_END;
- uiMenuItemEnumO(head, "", 0, "ARMATURE_OT_parent_set", "type", ARM_PAR_CONNECT);
+ uiItemEnumO(layout, NULL, 0, "ARMATURE_OT_parent_set", "type", ARM_PAR_CONNECT);
/* ob becomes parent, make the associated menus */
if (allchildbones)
- uiMenuItemEnumO(head, "", 0, "ARMATURE_OT_parent_set", "type", ARM_PAR_OFFSET);
+ uiItemEnumO(layout, NULL, 0, "ARMATURE_OT_parent_set", "type", ARM_PAR_OFFSET);
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index fc5b98b1690..9b4a9d63439 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -301,7 +301,7 @@ static void poselib_get_builtin_keyingsets (void)
/* ----- */
-static void poselib_add_menu_invoke__replacemenu (bContext *C, uiMenuItem *head, void *arg)
+static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout, void *arg)
{
Object *ob= CTX_data_active_object(C);
bAction *act= ob->poselib;
@@ -309,7 +309,7 @@ static void poselib_add_menu_invoke__replacemenu (bContext *C, uiMenuItem *head,
/* add each marker to this menu */
for (marker= act->markers.first; marker; marker= marker->next)
- uiMenuItemIntO(head, marker->name, ICON_ARMATURE_DATA, "POSELIB_OT_pose_add", "frame", marker->frame);
+ uiItemIntO(layout, marker->name, ICON_ARMATURE_DATA, "POSELIB_OT_pose_add", "frame", marker->frame);
}
static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
@@ -318,29 +318,31 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
Object *ob= CTX_data_active_object(C);
bArmature *arm= (ob) ? ob->data : NULL;
bPose *pose= (ob) ? ob->pose : NULL;
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
/* sanity check */
if (ELEM3(NULL, ob, arm, pose))
return OPERATOR_CANCELLED;
/* start building */
- head= uiPupMenuBegin(op->type->name, 0);
- uiMenuContext(head, WM_OP_EXEC_DEFAULT);
+ pup= uiPupMenuBegin(op->type->name, 0);
+ layout= uiPupMenuLayout(pup);
+ uiLayoutContext(layout, WM_OP_EXEC_DEFAULT);
/* add new (adds to the first unoccupied frame) */
- uiMenuItemIntO(head, "Add New", 0, "POSELIB_OT_pose_add", "frame", poselib_get_free_index(ob->poselib));
+ uiItemIntO(layout, "Add New", 0, "POSELIB_OT_pose_add", "frame", poselib_get_free_index(ob->poselib));
/* check if we have any choices to add a new pose in any other way */
if ((ob->poselib) && (ob->poselib->markers.first)) {
/* add new (on current frame) */
- uiMenuItemIntO(head, "Add New (Current Frame)", 0, "POSELIB_OT_pose_add", "frame", CFRA);
+ uiItemIntO(layout, "Add New (Current Frame)", 0, "POSELIB_OT_pose_add", "frame", CFRA);
/* replace existing - submenu */
- uiMenuLevel(head, "Replace Existing...", poselib_add_menu_invoke__replacemenu);
+ uiItemLevel(layout, "Replace Existing...", 0, poselib_add_menu_invoke__replacemenu);
}
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
/* this operator is only for a menu, not used further */
return OPERATOR_CANCELLED;
@@ -449,7 +451,8 @@ static int poselib_stored_pose_menu_invoke (bContext *C, wmOperator *op, wmEvent
Object *ob= CTX_data_active_object(C);
bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
int i;
/* sanity check */
@@ -457,14 +460,15 @@ static int poselib_stored_pose_menu_invoke (bContext *C, wmOperator *op, wmEvent
return OPERATOR_CANCELLED;
/* start building */
- head= uiPupMenuBegin(op->type->name, 0);
- uiMenuContext(head, WM_OP_EXEC_DEFAULT);
+ pup= uiPupMenuBegin(op->type->name, 0);
+ layout= uiPupMenuLayout(pup);
+ uiLayoutContext(layout, WM_OP_EXEC_DEFAULT);
/* add each marker to this menu */
for (marker=act->markers.first, i=0; marker; marker= marker->next, i++)
- uiMenuItemIntO(head, marker->name, ICON_ARMATURE_DATA, op->idname, "index", i);
+ uiItemIntO(layout, marker->name, ICON_ARMATURE_DATA, op->idname, "index", i);
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
/* this operator is only for a menu, not used further */
return OPERATOR_CANCELLED;
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index c27c498f55e..49d86d08db2 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -67,16 +67,18 @@
static int specials_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- uiMenuItem *head;
-
- head= uiPupMenuBegin("Specials", 0);
- uiMenuItemO(head, 0, "CURVE_OT_subdivide");
- uiMenuItemO(head, 0, "CURVE_OT_switch_direction");
- uiMenuItemO(head, 0, "CURVE_OT_spline_weight_set");
- uiMenuItemO(head, 0, "CURVE_OT_radius_set");
- uiMenuItemO(head, 0, "CURVE_OT_smooth");
- uiMenuItemO(head, 0, "CURVE_OT_smooth_radius");
- uiPupMenuEnd(C, head);
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin("Specials", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemO(layout, NULL, 0, "CURVE_OT_subdivide");
+ uiItemO(layout, NULL, 0, "CURVE_OT_switch_direction");
+ uiItemO(layout, NULL, 0, "CURVE_OT_spline_weight_set");
+ uiItemO(layout, NULL, 0, "CURVE_OT_radius_set");
+ uiItemO(layout, NULL, 0, "CURVE_OT_smooth");
+ uiItemO(layout, NULL, 0, "CURVE_OT_smooth_radius");
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 72806a79c50..78b86ad7f32 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -3562,15 +3562,17 @@ static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
Nurb *nu;
for(nu= editnurb->first; nu; nu= nu->next) {
if(nu->pntsu>1 || nu->pntsv>1) {
if(nu->type==CU_NURBS) {
- head= uiPupMenuBegin("Direction", 0);
- uiMenuItemsEnumO(head, op->type->idname, "direction");
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("Direction", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemsEnumO(layout, op->type->idname, "direction");
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
}
@@ -4507,18 +4509,21 @@ static int delete_exec(bContext *C, wmOperator *op)
static int delete_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Object *obedit= CTX_data_edit_object(C);
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
if(obedit->type==OB_SURF) {
- head= uiPupMenuBegin("Delete", 0);
- uiMenuItemEnumO(head, "", 0, op->type->idname, "type", 0);
- uiMenuItemEnumO(head, "", 0, op->type->idname, "type", 2);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("Delete", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemEnumO(layout, NULL, 0, op->type->idname, "type", 0);
+ uiItemEnumO(layout, NULL, 0, op->type->idname, "type", 2);
+ uiPupMenuEnd(C, pup);
}
else {
- head= uiPupMenuBegin("Delete", 0);
- uiMenuItemsEnumO(head, op->type->idname, "type");
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("Delete", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemsEnumO(layout, op->type->idname, "type");
+ uiPupMenuEnd(C, pup);
}
return OPERATOR_CANCELLED;
diff --git a/source/blender/editors/include/BIF_transform.h b/source/blender/editors/include/BIF_transform.h
index d16ac563eb3..e02202eb8e0 100644
--- a/source/blender/editors/include/BIF_transform.h
+++ b/source/blender/editors/include/BIF_transform.h
@@ -37,7 +37,7 @@ struct ListBase;
struct wmEvent;
struct bContext;
struct Object;
-struct uiMenuItem;
+struct uiLayout;
void transform_keymap_for_space(struct wmWindowManager *wm, struct ListBase *keymap, int spaceid);
void transform_operatortypes(void);
@@ -114,7 +114,7 @@ int BIF_menuselectTransformOrientation(void);
void BIF_selectTransformOrientation(struct bContext *C, struct TransformOrientation *ts);
void BIF_selectTransformOrientationValue(struct bContext *C, int orientation);
-void BIF_menuTransformOrientation(struct bContext *C, struct uiMenuItem *head, void *arg);
+void BIF_menuTransformOrientation(struct bContext *C, struct uiLayout *layout, void *arg);
char * BIF_menustringTransformOrientation(const struct bContext *C, char *title); /* the returned value was allocated and needs to be freed after use */
int BIF_countTransformOrientation(const struct bContext *C);
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 5a827a2311b..c491dee6ba6 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -53,6 +53,7 @@ struct uiFontStyle;
typedef struct uiBut uiBut;
typedef struct uiBlock uiBlock;
typedef struct uiPopupBlockHandle uiPopupBlockHandle;
+typedef struct uiLayout uiLayout;
/* Defines */
@@ -199,51 +200,23 @@ void uiRoundRect(float minx, float miny, float maxx, float maxy, float rad);
void uiDrawMenuBox(float minx, float miny, float maxx, float maxy, short flag, short direction);
void uiDrawBoxShadow(unsigned char alpha, float minx, float miny, float maxx, float maxy);
-/* Menus
- *
- * These functions are used by popup menus, toolbox and header menus. They
- * assume uiMenuItem head is already created, which is done by uiMenuButton
- * for header menus, or can be done with uiPupMenuBegin for popups. These
- * functions do not use uiDefBut functions in order to simplify creating
- * them, and to permit other types of menus (radial, ..) in the future. */
-
-typedef struct uiMenuItem uiMenuItem;
+/* Menu Callbacks */
-typedef void (*uiMenuCreateFunc)(struct bContext *C, uiMenuItem *head, void *arg1);
+typedef void (*uiMenuCreateFunc)(struct bContext *C, struct uiLayout *layout, void *arg1);
typedef void (*uiMenuHandleFunc)(struct bContext *C, void *arg, int event);
-void uiMenuFunc(uiMenuItem *head, uiMenuHandleFunc handlefunc, void *argv);
-void uiMenuContext(uiMenuItem *head, int opcontext);
-
-void uiMenuItemVal(uiMenuItem *head, const char *name, int icon, int argval);
-
-void uiMenuItemEnumO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value);
-void uiMenuItemBooleanO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value);
-void uiMenuItemsEnumO(uiMenuItem *head, char *opname, char *propname);
-void uiMenuItemIntO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value);
-void uiMenuItemFloatO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, float value);
-void uiMenuItemStringO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, char *value);
-void uiMenuItemO(uiMenuItem *head, int icon, char *opname);
-
-void uiMenuItemBooleanR(uiMenuItem *head, struct PointerRNA *ptr, char *propname);
-void uiMenuItemEnumR(uiMenuItem *head, struct PointerRNA *ptr, char *propname, int value);
-void uiMenuItemsEnumR(uiMenuItem *head, struct PointerRNA *ptr, char *propname);
-
-void uiMenuLevel(uiMenuItem *head, const char *name, uiMenuCreateFunc newlevel);
-void uiMenuLevelEnumO(uiMenuItem *head, char *opname, char *propname);
-void uiMenuLevelEnumR(uiMenuItem *head, struct PointerRNA *ptr, char *propname);
-
-void uiMenuSeparator(uiMenuItem *head);
-
/* Popup Menus
*
* Functions used to create popup menus. For more extended menus the
* uiPupMenuBegin/End functions can be used to define own items with
- * the uiMenu functions inbetween. If it is a simple confirmation menu
+ * the uiItem functions inbetween. If it is a simple confirmation menu
* or similar, popups can be created with a single function call. */
-uiMenuItem *uiPupMenuBegin(const char *title, int icon);
-void uiPupMenuEnd(struct bContext *C, struct uiMenuItem *head);
+typedef struct uiPopupMenu uiPopupMenu;
+
+uiPopupMenu *uiPupMenuBegin(const char *title, int icon);
+void uiPupMenuEnd(struct bContext *C, struct uiPopupMenu *head);
+struct uiLayout *uiPupMenuLayout(uiPopupMenu *head);
void uiPupMenuOkee(struct bContext *C, char *opname, char *str, ...);
void uiPupMenuSaveOver(struct bContext *C, struct wmOperator *op, char *filename);
@@ -555,12 +528,16 @@ uiBut *uiDefMenuTogR(uiBlock *block, struct PointerRNA *ptr, char *propname, cha
#define UI_LAYOUT_HORIZONTAL 0
#define UI_LAYOUT_VERTICAL 1
-typedef struct uiLayout uiLayout;
+#define UI_LAYOUT_PANEL 0
+#define UI_LAYOUT_HEADER 1
+#define UI_LAYOUT_MENU 2
-uiLayout *uiLayoutBegin(int dir, int x, int y, int size, int em);
-void uiLayoutContext(uiLayout *layout, int opcontext);
+uiLayout *uiLayoutBegin(int dir, int type, int x, int y, int size, int em);
void uiLayoutEnd(const struct bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y);
+void uiLayoutContext(uiLayout *layout, int opcontext);
+void uiLayoutFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
+
/* layout specifiers */
void uiLayoutRow(uiLayout *layout);
void uiLayoutColumn(uiLayout *layout);
@@ -570,10 +547,9 @@ uiLayout *uiLayoutBox(uiLayout *layout);
uiLayout *uiLayoutSub(uiLayout *layout, int n);
/* templates */
-void uiTemplateHeaderMenus(uiLayout *layout);
-void uiTemplateHeaderButtons(uiLayout *layout);
-void uiTemplateHeaderID(uiLayout *layout, struct PointerRNA *ptr, char *propname, int flag, uiIDPoinFunc func);
-void uiTemplateSetColor(uiLayout *layout, int color);
+void uiTemplateHeader(uiLayout *layout);
+void uiTemplateHeaderID(uiLayout *layout, struct PointerRNA *ptr, char *propname,
+ char *newop, char *openop, char *unlinkop);
/* items */
void uiItemO(uiLayout *layout, char *name, int icon, char *opname);
@@ -586,11 +562,18 @@ void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *p
void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, struct IDProperty *properties, int context);
void uiItemR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int expand);
-void uiItemFullR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int expand);
-
-void uiItemL(uiLayout *layout, char *name, int icon);
-
-void uiItemM(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func);
+void uiItemFullR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int expand);
+void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value);
+void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname);
+
+void uiItemL(uiLayout *layout, char *name, int icon); /* label */
+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);
/* utilities */
#define UI_PANEL_WIDTH 340
diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c
index 6775a639597..af8aa91f358 100644
--- a/source/blender/editors/interface/interface_anim.c
+++ b/source/blender/editors/interface/interface_anim.c
@@ -114,44 +114,46 @@ void ui_but_anim_remove_driver(bContext *C)
// TODO: refine the logic for adding/removing drivers...
void ui_but_anim_menu(bContext *C, uiBut *but)
{
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
int length;
if(but->rnapoin.data && but->rnaprop) {
- head= uiPupMenuBegin(RNA_property_ui_name(but->rnaprop), 0);
+ pup= uiPupMenuBegin(RNA_property_ui_name(but->rnaprop), 0);
+ layout= uiPupMenuLayout(pup);
length= RNA_property_array_length(but->rnaprop);
if(but->flag & UI_BUT_ANIMATED_KEY) {
if(length) {
- uiMenuItemBooleanO(head, "Delete Keyframes", 0, "ANIM_OT_delete_keyframe_button", "all", 1);
- uiMenuItemBooleanO(head, "Delete Single Keyframe", 0, "ANIM_OT_delete_keyframe_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Keyframes", 0, "ANIM_OT_delete_keyframe_button", "all", 1);
+ uiItemBooleanO(layout, "Delete Single Keyframe", 0, "ANIM_OT_delete_keyframe_button", "all", 0);
- uiMenuItemBooleanO(head, "Remove Driver", 0, "ANIM_OT_remove_driver_button", "all", 1);
- uiMenuItemBooleanO(head, "Remove Single Driver", 0, "ANIM_OT_remove_driver_button", "all", 0);
+ uiItemBooleanO(layout, "Remove Driver", 0, "ANIM_OT_remove_driver_button", "all", 1);
+ uiItemBooleanO(layout, "Remove Single Driver", 0, "ANIM_OT_remove_driver_button", "all", 0);
}
else {
- uiMenuItemBooleanO(head, "Delete Keyframe", 0, "ANIM_OT_delete_keyframe_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Keyframe", 0, "ANIM_OT_delete_keyframe_button", "all", 0);
- uiMenuItemBooleanO(head, "Remove Driver", 0, "ANIM_OT_remove_driver_button", "all", 0);
+ uiItemBooleanO(layout, "Remove Driver", 0, "ANIM_OT_remove_driver_button", "all", 0);
}
}
else if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
if(length) {
- uiMenuItemBooleanO(head, "Insert Keyframes", 0, "ANIM_OT_insert_keyframe_button", "all", 1);
- uiMenuItemBooleanO(head, "Insert Single Keyframe", 0, "ANIM_OT_insert_keyframe_button", "all", 0);
+ uiItemBooleanO(layout, "Insert Keyframes", 0, "ANIM_OT_insert_keyframe_button", "all", 1);
+ uiItemBooleanO(layout, "Insert Single Keyframe", 0, "ANIM_OT_insert_keyframe_button", "all", 0);
- uiMenuItemBooleanO(head, "Add Driver", 0, "ANIM_OT_add_driver_button", "all", 1);
- uiMenuItemBooleanO(head, "Add Single Driver", 0, "ANIM_OT_add_driver_button", "all", 0);
+ uiItemBooleanO(layout, "Add Driver", 0, "ANIM_OT_add_driver_button", "all", 1);
+ uiItemBooleanO(layout, "Add Single Driver", 0, "ANIM_OT_add_driver_button", "all", 0);
}
else {
- uiMenuItemBooleanO(head, "Insert Keyframe", 0, "ANIM_OT_insert_keyframe_button", "all", 0);
+ uiItemBooleanO(layout, "Insert Keyframe", 0, "ANIM_OT_insert_keyframe_button", "all", 0);
- uiMenuItemBooleanO(head, "Add Driver", 0, "ANIM_OT_add_driver_button", "all", 0);
+ uiItemBooleanO(layout, "Add Driver", 0, "ANIM_OT_add_driver_button", "all", 0);
}
}
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
}
}
diff --git a/source/blender/editors/interface/interface_api.c b/source/blender/editors/interface/interface_api.c
index a184655df83..3153f13bd0b 100644
--- a/source/blender/editors/interface/interface_api.c
+++ b/source/blender/editors/interface/interface_api.c
@@ -40,6 +40,15 @@ static void api_ui_item_common(FunctionRNA *func)
RNA_def_int(func, "icon", 0, 0, INT_MAX, "", "Override automatic icon of the item.", 0, INT_MAX);
}
+static void api_ui_item_op_common(FunctionRNA *func)
+{
+ PropertyRNA *parm;
+
+ api_ui_item_common(func);
+ parm= RNA_def_string(func, "operator", "", 0, "", "Identifier of the operator.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
void RNA_api_ui_layout(StructRNA *srna)
{
FunctionRNA *func;
@@ -68,9 +77,6 @@ void RNA_api_ui_layout(StructRNA *srna)
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
RNA_def_function_return(func, parm);
- func= RNA_def_function(srna, "template_header_menus", "uiTemplateHeaderMenus");
- //func= RNA_def_function(srna, "template_header_ID", "uiTemplateHeaderID");
-
/* items */
func= RNA_def_function(srna, "itemR", "uiItemR");
api_ui_item_common(func);
@@ -80,12 +86,97 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED);
RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
- func= RNA_def_function(srna, "itemO", "uiItemO");
+ func= RNA_def_function(srna, "items_enumR", "uiItemsEnumR");
+ parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ 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");
+ 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);
+ 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_enumR", "uiItemEnumR");
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);
+ parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in data.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_string(func, "value", "", 0, "", "Enum property value.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);*/
+
+ func= RNA_def_function(srna, "itemO", "uiItemO");
+ api_ui_item_op_common(func);
+
+ /*func= RNA_def_function(srna, "item_enumO", "uiItemEnumO");
+ 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);
+ parm= RNA_def_string(func, "value", "", 0, "", "Enum property value.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);*/
+
+ func= RNA_def_function(srna, "items_enumO", "uiItemsEnumO");
parm= RNA_def_string(func, "operator", "", 0, "", "Identifier of the operator.");
RNA_def_property_flag(parm, PROP_REQUIRED);
+ 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");
+ 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);
+
+ func= RNA_def_function(srna, "item_booleanO", "uiItemBooleanO");
+ 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);
+ parm= RNA_def_boolean(func, "value", 0, "", "Value of the property to call the operator with.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "item_intO", "uiItemIntO");
+ 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);
+ parm= RNA_def_int(func, "value", 0, INT_MIN, INT_MAX, "", "Value of the property to call the operator with.", INT_MIN, INT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "item_floatO", "uiItemFloatO");
+ 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);
+ parm= RNA_def_float(func, "value", 0, -FLT_MAX, FLT_MAX, "", "Value of the property to call the operator with.", -FLT_MAX, FLT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "item_stringO", "uiItemStringO");
+ 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);
+ parm= RNA_def_string(func, "value", "", 0, "", "Value of the property to call the operator with.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
func= RNA_def_function(srna, "itemL", "uiItemL");
api_ui_item_common(func);
+
+ func= RNA_def_function(srna, "itemM", "uiItemM");
+ api_ui_item_common(func);
+ parm= RNA_def_string(func, "menu", "", 0, "", "Identifier of the menu.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "itemS", "uiItemS");
+
+ /* templates */
+ func= RNA_def_function(srna, "template_header", "uiTemplateHeader");
+
+ func= RNA_def_function(srna, "template_header_ID", "uiTemplateHeaderID");
+ parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_string(func, "property", "", 0, "", "Identifier of pointer property in data.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_string(func, "new", "", 0, "", "Operator identifier to create a new ID block.");
+ RNA_def_string(func, "open", "", 0, "", "Operator identifier to open a new ID block.");
+ RNA_def_string(func, "unlink", "", 0, "", "Operator identifier to unlink the ID block.");
}
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index e0059041774..56acd755205 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -12,10 +12,12 @@
#include "DNA_windowmanager_types.h"
#include "BLI_listbase.h"
+#include "BLI_string.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
+#include "BKE_library.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@@ -38,16 +40,12 @@
/************************ Structs and Defines *************************/
-#define COLUMN_SPACE 5
-#define TEMPLATE_SPACE 5
-#define BOX_SPACE 5
-#define BUTTON_SPACE_X 5
-#define BUTTON_SPACE_Y 2
-
#define RNA_NO_INDEX -1
+#define RNA_ENUM_VALUE -2
#define EM_UNIT_X XIC
#define EM_UNIT_Y YIC
+#define EM_SEPR_Y 6
/* Item */
@@ -55,7 +53,9 @@ typedef enum uiItemType {
ITEM_OPERATOR,
ITEM_RNA_PROPERTY,
ITEM_MENU,
- ITEM_LABEL
+ ITEM_LABEL,
+ ITEM_VALUE,
+ ITEM_SEPARATOR
} uiItemType;
enum uiItemFlag {
@@ -69,7 +69,9 @@ typedef struct uiItem {
int slot;
char *name;
+ char namestr[UI_MAX_NAME_STR];
int icon;
+ int disabled;
} uiItem;
typedef struct uiItemRNA {
@@ -77,7 +79,7 @@ typedef struct uiItemRNA {
PointerRNA ptr;
PropertyRNA *prop;
- int index;
+ int index, value;
int expand;
} uiItemRNA;
@@ -89,11 +91,19 @@ typedef struct uiItemOp {
int context;
} uiItemOp;
-typedef struct uiItemLMenu {
+typedef struct uiItemMenu {
uiItem item;
+ char *menuname;
uiMenuCreateFunc func;
-} uiItemLMenu;
+ void *arg, *argN;
+} uiItemMenu;
+
+typedef struct uiItemValue {
+ uiItem item;
+
+ int argval;
+} uiItemValue;
/* Template */
@@ -104,8 +114,7 @@ typedef enum uiTemplateType {
TEMPLATE_SPLIT,
TEMPLATE_BOX,
- TEMPLATE_HEADER_MENUS,
- TEMPLATE_HEADER_BUTTONS,
+ TEMPLATE_HEADER,
TEMPLATE_HEADER_ID
} uiTemplateType;
@@ -114,7 +123,7 @@ typedef struct uiTemplate {
uiTemplateType type;
ListBase items;
- int color, slot;
+ int slot;
} uiTemplate;
typedef struct uiTemplateFlow {
@@ -138,9 +147,13 @@ typedef struct uiTemplateHeadID {
uiTemplate template;
PointerRNA ptr;
- char *propname;
+ PropertyRNA *prop;
+
int flag;
- uiIDPoinFunc func;
+ short browse;
+ char *newop;
+ char *openop;
+ char *unlinkop;
} uiTemplateHeadID;
/* Layout */
@@ -148,9 +161,18 @@ typedef struct uiTemplateHeadID {
struct uiLayout {
ListBase templates;
int opcontext;
- int dir;
+ int dir, type;
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;
};
void ui_layout_free(uiLayout *layout);
@@ -158,6 +180,14 @@ void ui_layout_end(const bContext *C, uiBlock *block, uiLayout *layout, int *x,
/************************** Item ***************************/
+static void ui_item_name(uiItem *item, char *name)
+{
+ if(!item->name && name) {
+ BLI_strncpy(item->namestr, name, sizeof(item->namestr));
+ item->name= item->namestr;
+ }
+}
+
#define UI_FIT_EXPAND 1
static int ui_item_fit(int item, int pos, int all, int available, int spacing, int last, int flag)
@@ -183,11 +213,10 @@ 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(uiBlock *block, uiItemRNA *rnaitem, int len, int x, int y, int w, int h)
+static void ui_item_array(uiLayout *layout, uiBlock *block, uiItemRNA *rnaitem, int len, int x, int y, int w, int h)
{
PropertyType type;
PropertySubType subtype;
- char *name;
int a;
/* retrieve type and subtype */
@@ -195,13 +224,8 @@ static void ui_item_array(uiBlock *block, uiItemRNA *rnaitem, int len, int x, in
subtype= RNA_property_subtype(rnaitem->prop);
/* create label */
- if(rnaitem->item.name)
- name= (char*)rnaitem->item.name;
- else
- name= (char*)RNA_property_ui_name(rnaitem->prop);
-
- if(strcmp(name, "") != 0)
- uiDefBut(block, LABEL, 0, name, x, y + h - EM_UNIT_Y, w, EM_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ if(strcmp(rnaitem->item.name, "") != 0)
+ uiDefBut(block, LABEL, 0, rnaitem->item.name, x, y + h - EM_UNIT_Y, w, EM_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
/* create buttons */
uiBlockBeginAlign(block);
@@ -210,7 +234,7 @@ static void ui_item_array(uiBlock *block, uiItemRNA *rnaitem, int len, int x, in
/* special check for layer layout */
int butw, buth;
- butw= ui_item_fit(EM_UNIT_X, 0, EM_UNIT_X*10 + BUTTON_SPACE_X, w, 0, 0, UI_FIT_EXPAND);
+ butw= ui_item_fit(EM_UNIT_X, 0, EM_UNIT_X*10 + layout->button_space_x, w, 0, 0, UI_FIT_EXPAND);
buth= MIN2(EM_UNIT_Y, butw);
y += 2*(EM_UNIT_Y - buth);
@@ -222,7 +246,7 @@ static void ui_item_array(uiBlock *block, uiItemRNA *rnaitem, int len, int x, in
uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a+10, "", ICON_BLANK1, x + butw*a, y, butw, buth);
uiBlockEndAlign(block);
- x += 5*butw + BUTTON_SPACE_X;
+ x += 5*butw + layout->button_space_x;
uiBlockBeginAlign(block);
for(a=0; a<5; a++)
@@ -305,16 +329,9 @@ static void ui_item_enum_row(uiBlock *block, uiItemRNA *rnaitem, int x, int y, i
/* create label + button for RNA property */
static void ui_item_with_label(uiBlock *block, uiItemRNA *rnaitem, int x, int y, int w, int h)
{
- char *name;
-
- if(rnaitem->item.name)
- name= (char*)rnaitem->item.name;
- else
- name= (char*)RNA_property_ui_name(rnaitem->prop);
-
- if(strcmp(name, "") != 0) {
+ if(strcmp(rnaitem->item.name, "") != 0) {
w= w/2;
- uiDefBut(block, LABEL, 0, name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, rnaitem->item.name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, "");
x += w;
}
@@ -322,7 +339,7 @@ static void ui_item_with_label(uiBlock *block, uiItemRNA *rnaitem, int x, int y,
}
/* create buttons for an arbitrary item */
-static void ui_item_buts(uiBlock *block, uiItem *item, int x, int y, int w, int h)
+static void ui_item_buts(uiLayout *layout, uiBlock *block, uiItem *item, int x, int y, int w, int h)
{
if(item->type == ITEM_RNA_PROPERTY) {
/* RNA property */
@@ -336,7 +353,18 @@ static void ui_item_buts(uiBlock *block, uiItem *item, int x, int y, int w, int
/* array property */
if(rnaitem->index == RNA_NO_INDEX && len > 0)
- ui_item_array(block, rnaitem, len, x, y, w, h);
+ ui_item_array(layout, block, rnaitem, len, x, y, w, h);
+ /* enum item */
+ else if(type == PROP_ENUM && rnaitem->index == RNA_ENUM_VALUE) {
+ char *identifier= (char*)RNA_property_identifier(rnaitem->prop);
+
+ if(item->icon && strcmp(item->name, "") != 0)
+ uiDefIconTextButR(block, ROW, 0, item->icon, item->name, x, y, w, h, &rnaitem->ptr, identifier, -1, 0, rnaitem->value, -1, -1, NULL);
+ else if(item->icon)
+ uiDefIconButR(block, ROW, 0, item->icon, x, y, w, h, &rnaitem->ptr, identifier, -1, 0, rnaitem->value, -1, -1, NULL);
+ else
+ uiDefButR(block, ROW, 0, item->name, x, y, w, h, &rnaitem->ptr, identifier, -1, 0, rnaitem->value, -1, -1, NULL);
+ }
/* expanded enum */
else if(type == PROP_ENUM && rnaitem->expand)
ui_item_enum_row(block, rnaitem, x, y, w, h);
@@ -352,7 +380,7 @@ static void ui_item_buts(uiBlock *block, uiItem *item, int x, int y, int w, int
uiItemOp *opitem= (uiItemOp*)item;
uiBut *but;
- if(item->icon && item->name)
+ if(item->icon && strcmp(item->name, "") != 0)
but= uiDefIconTextButO(block, BUT, opitem->ot->idname, opitem->context, item->icon, (char*)item->name, x, y, w, h, NULL);
else if(item->icon)
but= uiDefIconButO(block, BUT, opitem->ot->idname, opitem->context, item->icon, x, y, w, h, NULL);
@@ -369,19 +397,53 @@ static void ui_item_buts(uiBlock *block, uiItem *item, int x, int y, int w, int
}
else if(item->type == ITEM_MENU) {
/* menu */
- uiItemLMenu *menuitem= (uiItemLMenu*)item;
+ uiBut *but;
+ uiItemMenu *menuitem= (uiItemMenu*)item;
- uiDefMenuBut(block, menuitem->func, NULL, (char*)item->name, x, y-2, w-3, h+4, "");
+ if(layout->type == UI_LAYOUT_HEADER) { /* ugly .. */
+ y -= 2;
+ w -= 3;
+ h += 4;
+ }
+
+ if(item->icon)
+ but= uiDefIconTextMenuBut(block, menuitem->func, menuitem->arg, item->icon, (char*)item->name, x, y, w, h, "");
+ else
+ but= uiDefMenuBut(block, menuitem->func, menuitem->arg, (char*)item->name, x, y, w, h, "");
+
+ if(menuitem->argN) { /* ugly .. */
+ but->poin= (char*)but;
+ but->func_argN= menuitem->argN;
+ }
}
else if(item->type == ITEM_LABEL) {
/* label */
+ uiBut *but;
- if(item->icon && item->name)
- uiDefIconTextBut(block, LABEL, 0, item->icon, (char*)item->name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, "");
+ if(item->icon && strcmp(item->name, "") != 0)
+ but= uiDefIconTextBut(block, LABEL, 0, item->icon, (char*)item->name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, "");
else if(item->icon)
- uiDefIconBut(block, LABEL, 0, item->icon, x, y, w, h, NULL, 0.0, 0.0, 0, 0, "");
- else if((char*)item->name)
- uiDefBut(block, LABEL, 0, (char*)item->name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, "");
+ but= uiDefIconBut(block, LABEL, 0, item->icon, x, y, w, h, NULL, 0.0, 0.0, 0, 0, "");
+ else
+ but= uiDefBut(block, LABEL, 0, (char*)item->name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, "");
+
+ if(item->disabled) {
+ but->flag |= UI_BUT_DISABLED;
+ but->lock = 1;
+ but->lockstr = "";
+ }
+ }
+ else if(item->type == ITEM_VALUE) {
+ /* label */
+ uiItemValue *vitem= (uiItemValue*)item;
+ float *retvalue= (block->handle)? &block->handle->retvalue: NULL;
+
+ if(item->icon && strcmp(item->name, "") != 0)
+ uiDefIconTextButF(block, BUTM, 0, item->icon, (char*)item->name, x, y, w, h, retvalue, 0.0, 0.0, 0, vitem->argval, "");
+ else if(item->icon)
+ uiDefIconButF(block, BUTM, 0, item->icon, x, y, w, h, retvalue, 0.0, 0.0, 0, vitem->argval, "");
+ else
+ uiDefButF(block, BUTM, 0, (char*)item->name, x, y, w, h, retvalue, 0.0, 0.0, 0, vitem->argval, "");
}
else {
/* separator */
@@ -390,18 +452,21 @@ static void ui_item_buts(uiBlock *block, uiItem *item, int x, int y, int w, int
}
/* estimated size of text + icon */
-static int ui_text_icon_width(char *name, int icon)
+static int ui_text_icon_width(char *name, int icon, int variable)
{
- if(icon && name && strcmp(name, "") == 0)
+ if(icon && strcmp(name, "") == 0)
return EM_UNIT_X; /* icon only */
else if(icon)
- return 10*EM_UNIT_X; /* icon + text */
+ return (variable)? UI_GetStringWidth(name) + EM_UNIT_X: 10*EM_UNIT_X; /* icon + text */
else
- return 10*EM_UNIT_X; /* text only */
+ return (variable)? UI_GetStringWidth(name) + EM_UNIT_X: 10*EM_UNIT_X; /* text only */
}
/* estimated size of an item */
-static void ui_item_size(uiItem *item, int *r_w, int *r_h)
+#define UI_ITEM_VARY_X 1
+#define UI_ITEM_VARY_Y 2
+
+static void ui_item_size(uiItem *item, int *r_w, int *r_h, int flag)
{
int w, h;
@@ -412,7 +477,7 @@ static void ui_item_size(uiItem *item, int *r_w, int *r_h)
PropertySubType subtype;
int len;
- w= ui_text_icon_width(item->name, item->icon);
+ w= ui_text_icon_width(item->name, item->icon, flag & UI_ITEM_VARY_X);
h= EM_UNIT_Y;
/* arbitrary extended width by type */
@@ -425,7 +490,7 @@ static void ui_item_size(uiItem *item, int *r_w, int *r_h)
/* increase height for arrays */
if(rnaitem->index == RNA_NO_INDEX && len > 0) {
- if(item->name && strcmp(item->name, "") == 0 && item->icon == 0)
+ if(strcmp(item->name, "") == 0 && item->icon == 0)
h= 0;
if(type == PROP_BOOLEAN && len == 20)
@@ -435,11 +500,15 @@ static void ui_item_size(uiItem *item, int *r_w, int *r_h)
else
h += len*EM_UNIT_Y;
}
+ else if(flag & UI_ITEM_VARY_X) {
+ if(type == PROP_BOOLEAN && strcmp(item->name, "") != 0)
+ w += EM_UNIT_X;
+ }
}
else {
/* other */
- w= ui_text_icon_width(item->name, item->icon);
- h= EM_UNIT_Y;
+ 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(r_w) *r_w= w;
@@ -458,6 +527,25 @@ static void ui_item_free(uiItem *item)
}
}
+/* disabled item */
+static void ui_item_disabled(uiLayout *layout, char *name)
+{
+ uiTemplate *template= layout->templates.last;
+ uiItem *item;
+
+ if(!template)
+ return;
+
+ item= MEM_callocN(sizeof(uiItem), "uiItem");
+
+ ui_item_name(item, name);
+ item->disabled= 1;
+ item->type= ITEM_LABEL;
+ item->slot= template->slot;
+
+ BLI_addtail(&template->items, item);
+}
+
/* operator items */
void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDProperty *properties, int context)
{
@@ -467,12 +555,14 @@ void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDPropert
if(!template)
return;
- if(!ot)
+ if(!ot) {
+ ui_item_disabled(layout, idname);
return;
+ }
opitem= MEM_callocN(sizeof(uiItemOp), "uiItemOp");
- opitem->item.name= name;
+ ui_item_name(&opitem->item, name);
opitem->item.icon= icon;
opitem->item.type= ITEM_OPERATOR;
opitem->item.slot= template->slot;
@@ -484,6 +574,33 @@ void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDPropert
BLI_addtail(&template->items, opitem);
}
+static char *ui_menu_enumpropname(char *opname, char *propname, int retval)
+{
+ wmOperatorType *ot= WM_operatortype_find(opname);
+ PointerRNA ptr;
+ PropertyRNA *prop;
+
+ if(!ot || !ot->srna)
+ return "";
+
+ RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
+ prop= RNA_struct_find_property(&ptr, propname);
+
+ if(prop) {
+ const EnumPropertyItem *item;
+ int totitem, i;
+
+ RNA_property_enum_items(&ptr, prop, &item, &totitem);
+
+ for (i=0; i<totitem; i++) {
+ if(item[i].value==retval)
+ return (char*)item[i].name;
+ }
+ }
+
+ return "";
+}
+
void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value)
{
PointerRNA ptr;
@@ -491,6 +608,9 @@ void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *pro
WM_operator_properties_create(&ptr, opname);
RNA_enum_set(&ptr, propname, value);
+ if(!name)
+ name= ui_menu_enumpropname(opname, propname, value);
+
uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext);
}
@@ -500,8 +620,10 @@ void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
PointerRNA ptr;
PropertyRNA *prop;
- if(!ot || !ot->srna)
+ if(!ot || !ot->srna) {
+ ui_item_disabled(layout, opname);
return;
+ }
RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
prop= RNA_struct_find_property(&ptr, propname);
@@ -513,7 +635,7 @@ void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
RNA_property_enum_items(&ptr, prop, &item, &totitem);
for(i=0; i<totitem; i++)
- uiItemEnumO(layout, "", 0, opname, propname, item[i].value);
+ uiItemEnumO(layout, NULL, 0, opname, propname, item[i].value);
}
}
@@ -563,7 +685,7 @@ void uiItemO(uiLayout *layout, char *name, int icon, char *opname)
}
/* RNA property items */
-void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int expand)
+void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int expand)
{
uiTemplate *template= layout->templates.last;
uiItemRNA *rnaitem;
@@ -575,7 +697,7 @@ void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, Proper
rnaitem= MEM_callocN(sizeof(uiItemRNA), "uiItemRNA");
- rnaitem->item.name= name;
+ ui_item_name(&rnaitem->item, name);
rnaitem->item.icon= icon;
rnaitem->item.type= ITEM_RNA_PROPERTY;
rnaitem->item.slot= template->slot;
@@ -583,6 +705,7 @@ void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, Proper
rnaitem->ptr= *ptr;
rnaitem->prop= prop;
rnaitem->index= index;
+ rnaitem->value= value;
rnaitem->expand= expand;
BLI_addtail(&template->items, rnaitem);
@@ -592,35 +715,90 @@ void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *prop
{
PropertyRNA *prop;
+ if(!ptr->data || !propname)
+ return;
+
prop= RNA_struct_find_property(ptr, propname);
- if(!ptr->data)
+ if(!prop) {
+ ui_item_disabled(layout, propname);
+ printf("uiItemR: property not found: %s\n", propname);
return;
+ }
+
+ uiItemFullR(layout, name, icon, ptr, prop, RNA_NO_INDEX, 0, expand);
+}
+
+void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value)
+{
+ PropertyRNA *prop;
+
+ if(!ptr->data || !propname)
+ return;
+
+ prop= RNA_struct_find_property(ptr, propname);
+
if(!prop) {
- printf("uiItemR: property not found: %s\n",propname);
+ ui_item_disabled(layout, propname);
+ printf("uiItemEnumR: property not found: %s\n", propname);
return;
}
- uiItemFullR(layout, name, icon, ptr, prop, RNA_NO_INDEX, expand);
+ uiItemFullR(layout, name, icon, ptr, prop, RNA_ENUM_VALUE, value, 0);
+}
+
+void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
+{
+ PropertyRNA *prop;
+
+ prop= RNA_struct_find_property(ptr, propname);
+
+ if(!prop) {
+ ui_item_disabled(layout, propname);
+ return;
+ }
+
+ if(RNA_property_type(prop) == PROP_ENUM) {
+ const EnumPropertyItem *item;
+ int totitem, i;
+
+ RNA_property_enum_items(ptr, prop, &item, &totitem);
+
+ for(i=0; i<totitem; i++)
+ uiItemEnumR(layout, (char*)item[i].name, 0, ptr, propname, item[i].value);
+ }
}
/* menu item */
-void uiItemM(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func)
+static void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt)
+{
+ MenuType *mt= (MenuType*)arg_mt;
+ Menu menu = {0};
+
+ menu.type= mt;
+ menu.layout= layout;
+ mt->draw(C, &menu);
+}
+
+void uiItemM(uiLayout *layout, char *name, int icon, char *menuname)
{
uiTemplate *template= layout->templates.last;
- uiItemLMenu *menuitem;
+ uiItemMenu *menuitem;
if(!template)
return;
+ if(!menuname)
+ return;
- menuitem= MEM_callocN(sizeof(uiItemLMenu), "uiItemLMenu");
+ menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu");
- menuitem->item.name= name;
+ ui_item_name(&menuitem->item, name);
menuitem->item.icon= icon;
menuitem->item.type= ITEM_MENU;
menuitem->item.slot= template->slot;
- menuitem->func= func;
+ menuitem->func= ui_item_menutype_func;
+ menuitem->menuname= menuname;
BLI_addtail(&template->items, menuitem);
}
@@ -636,7 +814,7 @@ void uiItemL(uiLayout *layout, char *name, int icon)
item= MEM_callocN(sizeof(uiItem), "uiItem");
- item->name= name;
+ ui_item_name(item, name);
item->icon= icon;
item->type= ITEM_LABEL;
item->slot= template->slot;
@@ -644,6 +822,168 @@ void uiItemL(uiLayout *layout, char *name, int icon)
BLI_addtail(&template->items, item);
}
+/* value item */
+void uiItemV(uiLayout *layout, char *name, int icon, int argval)
+{
+ uiTemplate *template= layout->templates.last;
+ uiItemValue *vitem;
+
+ if(!template)
+ return;
+
+ vitem= MEM_callocN(sizeof(uiItemValue), "uiItemValue");
+
+ vitem->item.name= name;
+ vitem->item.icon= icon;
+ vitem->item.type= ITEM_VALUE;
+ vitem->item.slot= template->slot;
+ vitem->argval= argval;
+
+ BLI_addtail(&template->items, vitem);
+}
+
+/* separator item */
+void uiItemS(uiLayout *layout)
+{
+ uiTemplate *template= layout->templates.last;
+ uiItem *item;
+
+ if(!template)
+ return;
+
+ item= MEM_callocN(sizeof(uiItem), "uiItem");
+
+ item->type= ITEM_SEPARATOR;
+ item->slot= template->slot;
+
+ BLI_addtail(&template->items, item);
+}
+
+/* level items */
+void uiItemLevel(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func)
+{
+ uiTemplate *template= layout->templates.last;
+ uiItemMenu *menuitem;
+
+ if(!template)
+ return;
+ if(!func)
+ return;
+
+ menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu");
+
+ if(!icon)
+ icon= ICON_RIGHTARROW_THIN,
+
+ ui_item_name(&menuitem->item, name);
+ menuitem->item.icon= icon;
+ menuitem->item.type= ITEM_MENU;
+ menuitem->item.slot= template->slot;
+
+ menuitem->func= func;
+
+ BLI_addtail(&template->items, menuitem);
+}
+
+typedef struct MenuItemLevel {
+ int opcontext;
+ char *opname;
+ char *propname;
+ PointerRNA rnapoin;
+} MenuItemLevel;
+
+static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg)
+{
+ MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
+
+ uiLayoutContext(layout, lvl->opcontext);
+ uiItemsEnumO(layout, lvl->opname, lvl->propname);
+}
+
+void uiItemLevelEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname)
+{
+ wmOperatorType *ot= WM_operatortype_find(opname);
+ uiTemplate *template= layout->templates.last;
+ uiItemMenu *menuitem;
+ MenuItemLevel *lvl;
+
+ if(!ot || !ot->srna) {
+ ui_item_disabled(layout, opname);
+ return;
+ }
+ if(!template)
+ return;
+
+ menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu");
+
+ if(!icon)
+ icon= ICON_RIGHTARROW_THIN;
+ if(!name)
+ name= ot->name;
+
+ ui_item_name(&menuitem->item, name);
+ menuitem->item.icon= icon;
+ menuitem->item.type= ITEM_MENU;
+ menuitem->item.slot= template->slot;
+
+ lvl= MEM_callocN(sizeof(MenuItemLevel), "MenuItemLevel");
+ lvl->opname= opname;
+ lvl->propname= propname;
+ lvl->opcontext= layout->opcontext;
+
+ menuitem->func= menu_item_enum_opname_menu;
+ menuitem->argN= lvl;
+
+ BLI_addtail(&template->items, menuitem);
+}
+
+static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg)
+{
+ MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
+
+ uiLayoutContext(layout, lvl->opcontext);
+ uiItemsEnumR(layout, &lvl->rnapoin, lvl->propname);
+}
+
+void uiItemLevelEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname)
+{
+ uiTemplate *template= layout->templates.last;
+ uiItemMenu *menuitem;
+ MenuItemLevel *lvl;
+ PropertyRNA *prop;
+
+ if(!template)
+ return;
+
+ prop= RNA_struct_find_property(ptr, propname);
+ if(!prop) {
+ ui_item_disabled(layout, propname);
+ return;
+ }
+
+ menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu");
+
+ if(!icon)
+ icon= ICON_RIGHTARROW_THIN;
+ if(!name)
+ name= (char*)RNA_property_ui_name(prop);
+
+ ui_item_name(&menuitem->item, name);
+ menuitem->item.icon= icon;
+ menuitem->item.type= ITEM_MENU;
+ menuitem->item.slot= template->slot;
+
+ lvl= MEM_callocN(sizeof(MenuItemLevel), "MenuItemLevel");
+ lvl->rnapoin= *ptr;
+ lvl->propname= propname;
+ lvl->opcontext= layout->opcontext;
+
+ menuitem->func= menu_item_enum_rna_menu;
+ menuitem->argN= lvl;
+
+ BLI_addtail(&template->items, menuitem);
+}
+
/**************************** Template ***************************/
/* single row layout */
@@ -654,7 +994,7 @@ static void ui_layout_row(uiLayout *layout, uiBlock *block, uiTemplate *template
/* estimate total width of buttons */
for(item=template->items.first; item; item=item->next) {
- ui_item_size(item, &itemw, &itemh);
+ ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y);
totw += itemw;
maxh= MAX2(maxh, itemh);
tot++;
@@ -668,11 +1008,11 @@ static void ui_layout_row(uiLayout *layout, uiBlock *block, uiTemplate *template
w= layout->w;
for(item=template->items.first; item; item=item->next) {
- ui_item_size(item, &itemw, &itemh);
- itemw= ui_item_fit(itemw, x, totw, w, (tot-1)*BUTTON_SPACE_X, !item->next, UI_FIT_EXPAND);
+ 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);
- ui_item_buts(block, item, layout->x+x, layout->y-itemh, itemw, itemh);
- x += itemw+BUTTON_SPACE_X;
+ ui_item_buts(layout, block, item, layout->x+x, layout->y-itemh, itemw, itemh);
+ x += itemw+layout->button_space_x;
}
layout->y -= maxh;
@@ -699,20 +1039,20 @@ 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)*COLUMN_SPACE, col == totcol-1, UI_FIT_EXPAND);
+ itemw= ui_item_fit(1, x, totcol, w, (totcol-1)*layout->column_space, col == totcol-1, UI_FIT_EXPAND);
for(item=template->items.first; item; item=item->next) {
if(item->slot != col)
continue;
- ui_item_size(item, NULL, &itemh);
+ ui_item_size(item, NULL, &itemh, UI_ITEM_VARY_Y);
y -= itemh;
- ui_item_buts(block, item, layout->x+x, layout->y+y, itemw, itemh);
- y -= BUTTON_SPACE_Y;
+ ui_item_buts(layout, block, item, layout->x+x, layout->y+y, itemw, itemh);
+ y -= layout->button_space_y;
}
- x += itemw + COLUMN_SPACE;
+ x += itemw + layout->column_space;
miny= MIN2(miny, y);
}
@@ -731,7 +1071,7 @@ static void ui_layout_column_flow(uiLayout *layout, uiBlock *block, uiTemplate *
toth= 0;
totitem= 0;
for(item=template->items.first; item; item=item->next) {
- ui_item_size(item, &itemw, &itemh);
+ ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y);
maxw= MAX2(maxw, itemw);
toth += itemh;
totitem++;
@@ -760,18 +1100,18 @@ static void ui_layout_column_flow(uiLayout *layout, uiBlock *block, uiTemplate *
/* create column per column */
col= 0;
for(item=template->items.first; item; item=item->next) {
- ui_item_size(item, NULL, &itemh);
- itemw= ui_item_fit(1, x, totcol, w, (totcol-1)*COLUMN_SPACE, col == totcol-1, UI_FIT_EXPAND);
+ 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);
y -= itemh;
emy -= itemh;
- ui_item_buts(block, item, layout->x+x, layout->y+y, itemw, itemh);
- y -= BUTTON_SPACE_Y;
+ ui_item_buts(layout, block, item, layout->x+x, layout->y+y, itemw, itemh);
+ y -= layout->button_space_y;
miny= MIN2(miny, y);
/* decide to go to next one */
if(col < totcol-1 && emy <= -emh) {
- x += itemw + COLUMN_SPACE;
+ x += itemw + layout->column_space;
y= 0;
col++;
}
@@ -789,7 +1129,7 @@ static void ui_layout_split(uiLayout *layout, uiBlock *block, uiTemplate *templa
/* estimate total width of buttons */
for(item=template->items.first; item; item=item->next) {
- ui_item_size(item, &itemw, &itemh);
+ ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y);
totw += itemw;
maxh= MAX2(maxh, itemh);
tot++;
@@ -801,20 +1141,20 @@ 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 - BUTTON_SPACE_X*(tot-1) + BUTTON_SPACE_X;
+ w= layout->w - layout->button_space_x*(tot-1) + layout->button_space_x;
for(item=template->items.first; item; item=item->next) {
- ui_item_size(item, &itemw, &itemh);
+ ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y);
if(item->slot == UI_TSLOT_LR_LEFT) {
itemw= ui_item_fit(itemw, lx, totw, w, 0, 0);
- ui_item_buts(block, item, layout->x+lx, layout->y-itemh, itemw, itemh);
- lx += itemw + BUTTON_SPACE_X;
+ ui_item_buts(layout, block, item, layout->x+lx, layout->y-itemh, itemw, itemh);
+ lx += itemw + layout->button_space_x;
}
else {
itemw= ui_item_fit(itemw, totw + rx, totw, w, 0, 0);
- rx -= itemw + BUTTON_SPACE_X;
- ui_item_buts(block, item, layout->x+layout->w+rx, layout->y-itemh, itemw, itemh);
+ rx -= itemw + layout->button_space_x;
+ ui_item_buts(layout, block, item, layout->x+layout->w+rx, layout->y-itemh, itemw, itemh);
}
}
@@ -836,7 +1176,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)*COLUMN_SPACE, a == split->number-1, UI_FIT_EXPAND);
+ splitw= ui_item_fit(1, x, split->number, w, (split->number-1)*layout->column_space, a == split->number-1, UI_FIT_EXPAND);
sublayout->x= layout->x + x;
sublayout->w= splitw;
sublayout->y= layout->y;
@@ -849,7 +1189,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 + COLUMN_SPACE;
+ x += splitw + layout->column_space;
}
layout->y= miny;
@@ -865,9 +1205,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 + BOX_SPACE;
- box->sublayout->w= w - 2*BOX_SPACE;
- box->sublayout->y= layout->y - BOX_SPACE;
+ 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->h= h;
box->sublayout->emw= layout->emw;
@@ -888,15 +1228,15 @@ static void ui_layout_header_buttons(uiLayout *layout, uiBlock *block, uiTemplat
uiBlockBeginAlign(block);
for(item=template->items.first; item; item=item->next) {
- ui_item_size(item, &itemw, &itemh);
- ui_item_buts(block, item, layout->x, layout->y, itemw, itemh);
+ ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_X);
+ ui_item_buts(layout, block, item, layout->x, layout->y, itemw, itemh);
layout->x += itemw;
}
uiBlockEndAlign(block);
}
-static void ui_layout_header_menus(const bContext *C, uiLayout *layout, uiBlock *block, uiTemplate *template)
+static void ui_layout_header(const bContext *C, uiLayout *layout, uiBlock *block, uiTemplate *template)
{
ScrArea *sa= CTX_wm_area(C);
@@ -910,16 +1250,127 @@ static void ui_layout_header_menus(const bContext *C, uiLayout *layout, uiBlock
uiBlockSetEmboss(block, UI_EMBOSS);
}
+static void header_id_cb(bContext *C, void *arg_template, void *arg_event)
+{
+ uiTemplateHeadID *idtemplate= (uiTemplateHeadID*)arg_template;
+ PointerRNA idptr= RNA_property_pointer_get(&idtemplate->ptr, idtemplate->prop);
+ ID *idtest, *id= idptr.data;
+ ListBase *lb= wich_libbase(CTX_data_main(C), ID_TXT); // XXX
+ int nr, event= GET_INT_FROM_POINTER(arg_event);
+
+ if(event == UI_ID_BROWSE && idtemplate->browse == 32767)
+ event= UI_ID_ADD_NEW;
+ else if(event == UI_ID_BROWSE && idtemplate->browse == 32766)
+ event= UI_ID_OPEN;
+
+ switch(event) {
+ case UI_ID_BROWSE: {
+ if(id==0) id= lb->first;
+ if(id==0) return;
+
+ if(idtemplate->browse== -2) {
+ /* XXX implement or find a replacement
+ * activate_databrowse((ID *)G.buts->lockpoin, GS(id->name), 0, B_MESHBROWSE, &idtemplate->browse, do_global_buttons); */
+ return;
+ }
+ if(idtemplate->browse < 0)
+ return;
+
+ for(idtest=lb->first, nr=1; idtest; idtest=idtest->next, nr++) {
+ if(nr==idtemplate->browse) {
+ if(id == idtest)
+ return;
+
+ id= idtest;
+ RNA_id_pointer_create(id, &idptr);
+ RNA_property_pointer_set(&idtemplate->ptr, idtemplate->prop, idptr);
+ RNA_property_update(C, &idtemplate->ptr, idtemplate->prop);
+ /* XXX */
+
+ break;
+ }
+ }
+ break;
+ }
+#if 0
+ case UI_ID_DELETE:
+ id= NULL;
+ break;
+ case UI_ID_FAKE_USER:
+ if(id) {
+ if(id->flag & LIB_FAKEUSER) id->us++;
+ else id->us--;
+ }
+ else return;
+ break;
+#endif
+ case UI_ID_PIN:
+ break;
+ case UI_ID_ADD_NEW:
+ WM_operator_name_call(C, idtemplate->newop, WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case UI_ID_OPEN:
+ WM_operator_name_call(C, idtemplate->openop, WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+#if 0
+ case UI_ID_ALONE:
+ if(!id || id->us < 1)
+ return;
+ break;
+ case UI_ID_LOCAL:
+ if(!id || id->us < 1)
+ return;
+ break;
+ case UI_ID_AUTO_NAME:
+ break;
+#endif
+ }
+}
+
static void ui_layout_header_id(const bContext *C, uiLayout *layout, uiBlock *block, uiTemplate *template)
{
- uiTemplateHeadID *idtemplate= (uiTemplateHeadID*)template;
- PointerRNA idptr;
+ uiTemplateHeadID *duptemplate, *idtemplate= (uiTemplateHeadID*)template;
+ uiBut *but;
+ PointerRNA idptr= RNA_property_pointer_get(&idtemplate->ptr, idtemplate->prop);
+ ListBase *lb= wich_libbase(CTX_data_main(C), ID_TXT); // XXX
+
+ if(idtemplate->flag & UI_ID_BROWSE) {
+ char *extrastr, *str;
+
+ if((idtemplate->flag & UI_ID_ADD_NEW) && (idtemplate->flag && UI_ID_OPEN))
+ extrastr= "OPEN NEW %x 32766 |ADD NEW %x 32767";
+ else if(idtemplate->flag & UI_ID_ADD_NEW)
+ extrastr= "ADD NEW %x 32767";
+ else if(idtemplate->flag & UI_ID_OPEN)
+ extrastr= "OPEN NEW %x 32766";
+ else
+ extrastr= NULL;
- idptr= RNA_pointer_get(&idtemplate->ptr, idtemplate->propname);
+ duptemplate= MEM_dupallocN(idtemplate);
+ IDnames_to_pupstring(&str, NULL, extrastr, lb, idptr.data, &duptemplate->browse);
- layout->x= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)idptr.data, ID_TXT, NULL,
- layout->x, layout->y, idtemplate->func,
- UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE);
+ but= uiDefButS(block, MENU, 0, str, layout->x, layout->y, EM_UNIT_X, EM_UNIT_Y, &duptemplate->browse, 0, 0, 0, 0, "Browse existing choices, or add new");
+ uiButSetNFunc(but, header_id_cb, duptemplate, SET_INT_IN_POINTER(UI_ID_BROWSE));
+ layout->x+= EM_UNIT_X;
+
+ MEM_freeN(str);
+ }
+
+ /* text button with name */
+ if(idptr.data) {
+ char name[64];
+
+ text_idbutton(idptr.data, name);
+ but= uiDefButR(block, TEX, 0, name, layout->x, layout->y, EM_UNIT_X*6, EM_UNIT_Y, &idptr, "name", -1, 0, 0, -1, -1, NULL);
+ uiButSetNFunc(but, header_id_cb, MEM_dupallocN(idtemplate), SET_INT_IN_POINTER(UI_ID_RENAME));
+ layout->x += EM_UNIT_X*6;
+
+ /* delete button */
+ if(idtemplate->flag & UI_ID_DELETE) {
+ but= uiDefIconButO(block, BUT, idtemplate->unlinkop, WM_OP_EXEC_REGION_WIN, ICON_X, layout->x, layout->y, EM_UNIT_X, EM_UNIT_Y, NULL);
+ layout->x += EM_UNIT_X;
+ }
+ }
}
void ui_template_free(uiTemplate *template)
@@ -982,7 +1433,7 @@ uiLayout *uiLayoutBox(uiLayout *layout)
box= MEM_callocN(sizeof(uiTemplateBx), "uiTemplateBx");
box->template.type= TEMPLATE_BOX;
- box->sublayout= uiLayoutBegin(layout->dir, 0, 0, 0, 0);
+ box->sublayout= uiLayoutBegin(layout->dir, layout->type, 0, 0, 0, 0);
BLI_addtail(&layout->templates, box);
return box->sublayout;
@@ -1000,7 +1451,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, 0, 0, 0, 0);
+ split->sublayout[a]= uiLayoutBegin(layout->dir, layout->type, 0, 0, 0, 0);
BLI_addtail(&layout->templates, split);
}
@@ -1026,46 +1477,51 @@ uiLayout *uiLayoutSub(uiLayout *layout, int n)
return NULL;
}
-void uiTemplateHeaderMenus(uiLayout *layout)
+void uiTemplateHeader(uiLayout *layout)
{
uiTemplate *template;
template= MEM_callocN(sizeof(uiTemplate), "uiTemplate");
- template->type= TEMPLATE_HEADER_MENUS;
+ template->type= TEMPLATE_HEADER;
BLI_addtail(&layout->templates, template);
}
-void uiTemplateHeaderButtons(uiLayout *layout)
+void uiTemplateHeaderID(uiLayout *layout, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop)
{
- uiTemplate *template;
+ uiTemplateHeadID *idtemplate;
+ PropertyRNA *prop;
- template= MEM_callocN(sizeof(uiTemplate), "uiTemplate");
- template->type= TEMPLATE_HEADER_BUTTONS;
+ if(!ptr->data)
+ return;
- BLI_addtail(&layout->templates, template);
-}
+ prop= RNA_struct_find_property(ptr, propname);
-void uiTemplateHeaderID(uiLayout *layout, PointerRNA *ptr, char *propname, int flag, uiIDPoinFunc func)
-{
- uiTemplateHeadID *idtemplate;
+ if(!prop) {
+ printf("uiTemplateHeaderID: property not found: %s\n", propname);
+ return;
+ }
idtemplate= MEM_callocN(sizeof(uiTemplateHeadID), "uiTemplateHeadID");
idtemplate->template.type= TEMPLATE_HEADER_ID;
idtemplate->ptr= *ptr;
- idtemplate->propname= propname;
- idtemplate->flag= flag;
- idtemplate->func= func;
+ idtemplate->prop= prop;
+ idtemplate->flag= UI_ID_BROWSE|UI_ID_RENAME;
- BLI_addtail(&layout->templates, idtemplate);
-}
-
-void uiTemplateSetColor(uiLayout *layout, int color)
-{
- uiTemplate *template= layout->templates.last;
+ if(newop) {
+ idtemplate->flag |= UI_ID_ADD_NEW;
+ idtemplate->newop= newop;
+ }
+ if(openop) {
+ idtemplate->flag |= UI_ID_OPEN;
+ idtemplate->openop= openop;
+ }
+ if(unlinkop) {
+ idtemplate->flag |= UI_ID_DELETE;
+ idtemplate->unlinkop= unlinkop;
+ }
- if(template)
- template->color= color;
+ BLI_addtail(&layout->templates, idtemplate);
}
void uiTemplateSlot(uiLayout *layout, int slot)
@@ -1078,35 +1534,88 @@ void uiTemplateSlot(uiLayout *layout, int slot)
/********************** Layout *******************/
+static void ui_layout_init_items(const bContext *C, uiLayout *layout)
+{
+ ARegion *ar= CTX_wm_region(C);
+ MenuType *mt;
+ uiTemplate *template;
+ uiItem *item;
+ uiItemMenu *menuitem;
+ uiItemRNA *rnaitem;
+ uiItemOp *opitem;
+ PropertyType type;
+
+ for(template=layout->templates.first; template; template=template->next) {
+ for(item=template->items.first; item; item=item->next) {
+ /* initialize buttons names */
+ if(item->type == ITEM_MENU) {
+ menuitem= (uiItemMenu*)item;
+
+ if(menuitem->menuname) {
+ for(mt=ar->type->menutypes.first; mt; mt=mt->next) {
+ if(strcmp(menuitem->menuname, mt->idname) == 0) {
+ menuitem->arg= mt;
+ ui_item_name(item, mt->label);
+ break;
+ }
+ }
+ }
+ }
+ else if(item->type == ITEM_RNA_PROPERTY) {
+ rnaitem= (uiItemRNA*)item;
+ ui_item_name(item, (char*)RNA_property_ui_name(rnaitem->prop));
+ }
+ else if(item->type == ITEM_OPERATOR) {
+ opitem= (uiItemOp*)item;
+ ui_item_name(item, opitem->ot->name);
+ }
+
+ ui_item_name(item, "");
+
+ /* initialize icons */
+ if(layout->type == UI_LAYOUT_MENU) {
+ if(item->type == ITEM_RNA_PROPERTY) {
+ rnaitem= (uiItemRNA*)item;
+ type= RNA_property_type(rnaitem->prop);
+
+ if(type == PROP_BOOLEAN)
+ item->icon= (RNA_property_boolean_get(&rnaitem->ptr, rnaitem->prop))? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
+ else if(type == PROP_ENUM && rnaitem->index == RNA_ENUM_VALUE)
+ item->icon= (RNA_property_enum_get(&rnaitem->ptr, rnaitem->prop) == rnaitem->value)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
+ }
+
+ if(!item->icon)
+ item->icon= ICON_BLANK1;
+ }
+ }
+ }
+}
+
static void ui_layout_templates(const bContext *C, uiBlock *block, uiLayout *layout)
{
uiTemplate *template;
+ ui_layout_init_items(C, layout);
+
if(layout->dir == UI_LAYOUT_HORIZONTAL) {
for(template=layout->templates.first; template; template=template->next) {
switch(template->type) {
- case TEMPLATE_HEADER_MENUS:
- ui_layout_header_menus(C, layout, block, template);
+ case TEMPLATE_HEADER:
+ ui_layout_header(C, layout, block, template);
break;
case TEMPLATE_HEADER_ID:
ui_layout_header_id(C, layout, block, template);
break;
- case TEMPLATE_HEADER_BUTTONS:
default:
ui_layout_header_buttons(layout, block, template);
break;
}
- }
- layout->x += TEMPLATE_SPACE;
+ layout->x += layout->template_space;
+ }
}
else {
for(template=layout->templates.first; template; template=template->next) {
- if(template->color) {
- // XXX oldcolor= uiBlockGetCol(block);
- // XXX uiBlockSetCol(block, template->color);
- }
-
switch(template->type) {
case TEMPLATE_ROW:
ui_layout_row(layout, block, template);
@@ -1126,16 +1635,16 @@ static void ui_layout_templates(const bContext *C, uiBlock *block, uiLayout *lay
break;
}
- // XXX if(template->color)
- // XXX uiBlockSetCol(block, oldcolor);
-
- layout->y -= TEMPLATE_SPACE;
+ layout->y -= layout->template_space;
}
}
}
void ui_layout_end(const bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y)
{
+ if(layout->handlefunc)
+ uiBlockSetButmFunc(block, layout->handlefunc, layout->argv);
+
ui_layout_templates(C, block, layout);
if(x) *x= layout->x;
@@ -1154,16 +1663,23 @@ void ui_layout_free(uiLayout *layout)
MEM_freeN(layout);
}
-uiLayout *uiLayoutBegin(int dir, int x, int y, int size, int em)
+uiLayout *uiLayoutBegin(int dir, int type, int x, int y, int size, int em)
{
uiLayout *layout;
layout= MEM_callocN(sizeof(uiLayout), "uiLayout");
layout->opcontext= WM_OP_INVOKE_REGION_WIN;
layout->dir= dir;
+ 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;
+
if(dir == UI_LAYOUT_HORIZONTAL) {
layout->h= size;
layout->emh= em*EM_UNIT_Y;
@@ -1181,6 +1697,12 @@ void uiLayoutContext(uiLayout *layout, int opcontext)
layout->opcontext= opcontext;
}
+void uiLayoutFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv)
+{
+ layout->handlefunc= handlefunc;
+ layout->argv= argv;
+}
+
void uiLayoutEnd(const bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y)
{
ui_layout_end(C, block, layout, x, y);
@@ -1229,7 +1751,7 @@ void uiRegionPanelLayout(const bContext *C, ARegion *ar, int vertical, char *con
}
panel->type= pt;
- panel->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, 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);
pt->draw(C, panel);
@@ -1286,7 +1808,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, xco, yco, 24, 1);
+ layout= uiLayoutBegin(UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER, xco, yco, 24, 1);
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 181513b58bc..7bc7e2e3c19 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1643,30 +1643,14 @@ static uiBlock *ui_block_func_MENU_ITEM(bContext *C, uiPopupBlockHandle *handle,
#define MENU_ITEM_LEVEL_OPNAME_ENUM 31
#define MENU_ITEM_LEVEL_RNA_ENUM 32
-struct uiMenuItem {
- struct uiMenuItem *next, *prev;
-
- int type;
+struct uiPopupMenu {
+ uiLayout *layout;
int icon;
char name[MAX_MENU_STR];
-
- char *opname; /* static string */
- char *propname; /* static string */
-
- int retval, enumval, boolval, intval;
- float fltval;
- char *strval;
- int opcontext;
- uiMenuHandleFunc eventfunc;
- void *argv;
- uiMenuCreateFunc newlevel;
- PointerRNA rnapoin;
-
- ListBase items;
};
typedef struct uiMenuInfo {
- uiMenuItem *head;
+ uiPopupMenu *pup;
int mx, my, popup, slideout;
int startx, starty;
} uiMenuInfo;
@@ -1707,201 +1691,49 @@ typedef struct MenuItemLevel {
PointerRNA rnapoin;
} MenuItemLevel;
-/* make a menu level from enum properties */
-static void menu_item_enum_opname_menu(bContext *C, uiMenuItem *head, void *arg)
-{
- MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
-
- head->opcontext= lvl->opcontext;
- uiMenuItemsEnumO(head, lvl->opname, lvl->propname);
-}
-
-static void menu_item_enum_rna_menu(bContext *C, uiMenuItem *head, void *arg)
-{
- MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
-
- head->opcontext= lvl->opcontext;
- uiMenuItemsEnumR(head, &lvl->rnapoin, lvl->propname);
-}
-
static uiBlock *ui_block_func_MENU_ITEM(bContext *C, uiPopupBlockHandle *handle, void *arg_info)
{
uiBlock *block;
uiBut *but;
uiMenuInfo *info= arg_info;
- uiMenuItem *head, *item;
- MenuItemLevel *lvl;
+ uiPopupMenu *pup;
ScrArea *sa;
ARegion *ar;
static int counter= 0;
- int width, height, icon;
- int startx, starty, x1, y1;
char str[16];
- head= info->head;
- height= 0;
+ pup= info->pup;
/* block stuff first, need to know the font */
sprintf(str, "tb %d", counter++);
block= uiBeginBlock(C, handle->region, str, UI_EMBOSSP);
- uiBlockSetButmFunc(block, head->eventfunc, head->argv);
block->direction= UI_DOWN;
- width= 50; // fixed with, uiMenuPopupBoundsBlock will compute actual width
-
- for(item= head->items.first; item; item= item->next) {
- if(0) height+= PUP_LABELH; // XXX sepr line
- else height+= MENU_BUTTON_HEIGHT;
- }
-
- startx= 0;
- starty= 0;
-
/* here we go! */
- if(head->name[0]) {
+ if(pup->name[0]) {
char titlestr[256];
- if(head->icon) {
- width+= 20;
- sprintf(titlestr, " %s", head->name);
- uiDefIconTextBut(block, LABEL, 0, head->icon, titlestr, startx, (short)(starty+height), width, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
+ if(pup->icon) {
+ sprintf(titlestr, " %s", pup->name);
+ uiDefIconTextBut(block, LABEL, 0, pup->icon, titlestr, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
}
else {
- but= uiDefBut(block, LABEL, 0, head->name, startx, (short)(starty+height), width, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
+ but= uiDefBut(block, LABEL, 0, pup->name, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
but->flag= UI_TEXT_LEFT;
}
//uiDefBut(block, SEPR, 0, "", startx, (short)(starty+height)-MENU_SEPR_HEIGHT, width, MENU_SEPR_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
}
- x1= startx;
- y1= starty + height - MENU_BUTTON_HEIGHT; // - MENU_SEPR_HEIGHT;
-
- for(item= head->items.first; item; item= item->next) {
-
- if(item->type==MENU_ITEM_LEVEL) {
- uiDefIconTextMenuBut(block, item->newlevel, NULL, ICON_RIGHTARROW_THIN, item->name, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, NULL);
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_LEVEL_OPNAME_ENUM) {
- but= uiDefIconTextMenuBut(block, menu_item_enum_opname_menu, NULL, ICON_RIGHTARROW_THIN, item->name, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, NULL);
-
- /* XXX warning, abuse of func_arg! */
- lvl= MEM_callocN(sizeof(MenuItemLevel), "MenuItemLevel");
- lvl->opname= item->opname;
- lvl->propname= item->propname;
- lvl->opcontext= item->opcontext;
-
- but->poin= (char*)but;
- but->func_argN= lvl;
-
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_LEVEL_RNA_ENUM) {
- but= uiDefIconTextMenuBut(block, menu_item_enum_rna_menu, NULL, ICON_RIGHTARROW_THIN, item->name, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, NULL);
-
- /* XXX warning, abuse of func_arg! */
- lvl= MEM_callocN(sizeof(MenuItemLevel), "MenuItemLevel");
- lvl->rnapoin= item->rnapoin;
- lvl->propname= item->propname;
- lvl->opcontext= item->opcontext;
-
- but->poin= (char*)but;
- but->func_argN= lvl;
-
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_OPNAME_BOOL) {
- but= uiDefIconTextButO(block, BUTM, item->opname, item->opcontext, item->icon, item->name, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, "");
- RNA_boolean_set(uiButGetOperatorPtrRNA(but), item->propname, item->boolval);
-
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_OPNAME_ENUM) {
- const char *name;
- char bname[64];
-
- /* If no name is given, use the enum name */
- if (item->name[0] == '\0')
- name= ui_menu_enumpropname(item->opname, item->propname, item->enumval);
- else
- name= item->name;
-
- BLI_strncpy(bname, name, sizeof(bname));
-
- but= uiDefIconTextButO(block, BUTM, item->opname, item->opcontext, item->icon, bname, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, "");
- RNA_enum_set(uiButGetOperatorPtrRNA(but), item->propname, item->enumval);
-
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_OPNAME_INT) {
- but= uiDefIconTextButO(block, BUTM, item->opname, head->opcontext, item->icon, item->name, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, "");
- RNA_int_set(uiButGetOperatorPtrRNA(but), item->propname, item->intval);
-
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_OPNAME_FLOAT) {
- but= uiDefIconTextButO(block, BUTM, item->opname, item->opcontext, item->icon, item->name, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, "");
- RNA_float_set(uiButGetOperatorPtrRNA(but), item->propname, item->fltval);
-
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_OPNAME_STRING) {
- but= uiDefIconTextButO(block, BUTM, item->opname, item->opcontext, item->icon, item->name, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, "");
- RNA_string_set(uiButGetOperatorPtrRNA(but), item->propname, item->strval);
-
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_OPNAME) {
- uiDefIconTextButO(block, BUTM, item->opname, item->opcontext, item->icon, NULL, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, NULL);
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_RNA_BOOL) {
- PropertyRNA *prop= RNA_struct_find_property(&item->rnapoin, item->propname);
-
- if(prop && RNA_property_type(prop) == PROP_BOOLEAN) {
- icon= (RNA_property_boolean_get(&item->rnapoin, prop))? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
- uiDefIconTextButR(block, TOG, 0, icon, NULL, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, &item->rnapoin, item->propname, 0, 0, 0, 0, 0, NULL);
- }
- else {
- uiBlockSetButLock(block, 1, "");
- uiDefIconTextBut(block, BUT, 0, ICON_BLANK1, item->propname, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, NULL, 0.0, 0.0, 0, 0, "");
- uiBlockClearButLock(block);
- }
-
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type==MENU_ITEM_RNA_ENUM) {
- PropertyRNA *prop= RNA_struct_find_property(&item->rnapoin, item->propname);
-
- if(prop && RNA_property_type(prop) == PROP_ENUM) {
- icon= (RNA_property_enum_get(&item->rnapoin, prop) == item->enumval)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
- uiDefIconTextButR(block, ROW, 0, icon, NULL, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, &item->rnapoin, item->propname, 0, 0, item->enumval, 0, 0, NULL);
- }
- else {
- uiBlockSetButLock(block, 1, "");
- uiDefIconTextBut(block, BUT, 0, ICON_BLANK1, item->propname, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, NULL, 0.0, 0.0, 0, 0, "");
- uiBlockClearButLock(block);
- }
-
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else if(item->type == MENU_ITEM_ITEM) {
- uiDefIconTextButF(block, BUTM, B_NOP, item->icon, item->name, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, &handle->retvalue, 0.0, 0.0, 0, item->retval, "");
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else {
- uiDefBut(block, SEPR, 0, "", x1, y1, width+16, MENU_SEPR_HEIGHT-1, NULL, 0.0, 0.0, 0, 0, "");
- y1 -= MENU_SEPR_HEIGHT;
- }
- }
+ block->handle= handle;
+ uiLayoutEnd(C, block, pup->layout, NULL, NULL);
if(info->popup) {
uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT|UI_BLOCK_RET_1);
uiBlockSetDirection(block, UI_DOWN);
/* here we set an offset for the mouse position */
- uiMenuPopupBoundsBlock(block, 1, 0, -height+MENU_BUTTON_HEIGHT/2);
+ uiMenuPopupBoundsBlock(block, 1, 0, MENU_BUTTON_HEIGHT/2);
}
else {
/* for a header menu we set the direction automatic */
@@ -1932,262 +1764,51 @@ 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)
{
uiPopupBlockHandle *handle;
- uiMenuItem *head;
+ uiPopupMenu *pup;
uiMenuInfo info;
- head= MEM_callocN(sizeof(uiMenuItem), "menu dummy");
- head->opcontext= WM_OP_INVOKE_REGION_WIN;
+ pup= MEM_callocN(sizeof(uiPopupMenu), "menu dummy");
+ pup->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0);
+ uiLayoutContext(pup->layout, WM_OP_INVOKE_REGION_WIN);
+ uiLayoutColumn(pup->layout);
- menu_func(C, head, arg);
+ menu_func(C, pup->layout, arg);
memset(&info, 0, sizeof(info));
- info.head= head;
+ info.pup= pup;
info.slideout= (but && (but->block->flag & UI_BLOCK_LOOP));
handle= ui_popup_block_create(C, butregion, but, NULL, ui_block_func_MENU_ITEM, &info);
- BLI_freelistN(&head->items);
- MEM_freeN(head);
+ MEM_freeN(pup);
return handle;
}
/*************************** Menu Creating API **************************/
-/* internal add func */
-static uiMenuItem *ui_menu_add_item(uiMenuItem *head, const char *name, int icon, int argval)
-{
- uiMenuItem *item= MEM_callocN(sizeof(uiMenuItem), "menu item");
-
- BLI_strncpy(item->name, name, MAX_MENU_STR);
- if(icon)
- item->icon= icon;
- else
- item->icon= ICON_BLANK1;
- item->retval= argval;
-
- item->opcontext= head->opcontext;
-
- BLI_addtail(&head->items, item);
-
- return item;
-}
-
-/* set callback for regular items */
-void uiMenuFunc(uiMenuItem *head, void (*eventfunc)(bContext *, void *, int), void *argv)
-{
- head->eventfunc= eventfunc;
- head->argv= argv;
-}
-
-/* optionally set different context for all items in one level */
-void uiMenuContext(uiMenuItem *head, int opcontext)
-{
- head->opcontext= opcontext;
-}
-
-
-/* regular item, with retval */
-void uiMenuItemVal(uiMenuItem *head, const char *name, int icon, int argval)
-{
- uiMenuItem *item= ui_menu_add_item(head, name, icon, argval);
-
- item->type = MENU_ITEM_ITEM;
-}
-
-/* regular operator item */
-void uiMenuItemO(uiMenuItem *head, int icon, char *opname)
-{
- uiMenuItem *item= ui_menu_add_item(head, "", icon, 0);
-
- item->opname= opname; // static!
- item->type = MENU_ITEM_OPNAME;
-}
-
-/* single operator item with property */
-void uiMenuItemEnumO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value)
-{
- uiMenuItem *item= ui_menu_add_item(head, name, icon, 0);
-
- item->opname= opname; // static!
- item->propname= propname; // static!
- item->enumval= value;
- item->type = MENU_ITEM_OPNAME_ENUM;
-}
-
-/* single operator item with property */
-void uiMenuItemIntO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value)
-{
- uiMenuItem *item= ui_menu_add_item(head, name, icon, 0);
-
- item->opname= opname; // static!
- item->propname= propname; // static!
- item->intval= value;
- item->type = MENU_ITEM_OPNAME_INT;
-}
-
-/* single operator item with property */
-void uiMenuItemFloatO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, float value)
-{
- uiMenuItem *item= ui_menu_add_item(head, name, icon, 0);
-
- item->opname= opname; // static!
- item->propname= propname; // static!
- item->fltval= value;
- item->type = MENU_ITEM_OPNAME_FLOAT;
-}
-
-/* single operator item with property */
-void uiMenuItemBooleanO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, int value)
-{
- uiMenuItem *item= ui_menu_add_item(head, name, icon, 0);
-
- item->opname= opname; // static!
- item->propname= propname; // static!
- item->boolval= value;
- item->type = MENU_ITEM_OPNAME_BOOL;
-}
-
-/* single operator item with property */
-void uiMenuItemStringO(uiMenuItem *head, const char *name, int icon, char *opname, char *propname, char *value)
-{
- uiMenuItem *item= ui_menu_add_item(head, name, icon, 0);
-
- item->opname= opname; // static!
- item->propname= propname; // static!
- item->strval= value;
- item->type = MENU_ITEM_OPNAME_STRING;
-}
-
-/* add all operator items with property */
-void uiMenuItemsEnumO(uiMenuItem *head, char *opname, char *propname)
-{
- wmOperatorType *ot= WM_operatortype_find(opname);
- PointerRNA ptr;
- PropertyRNA *prop;
-
- if(!ot || !ot->srna)
- return;
-
- RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
- prop= RNA_struct_find_property(&ptr, propname);
-
- if(prop && RNA_property_type(prop) == PROP_ENUM) {
- const EnumPropertyItem *item;
- int totitem, i;
-
- RNA_property_enum_items(&ptr, prop, &item, &totitem);
-
- for (i=0; i<totitem; i++)
- uiMenuItemEnumO(head, "", 0, opname, propname, item[i].value);
- }
-}
-
-/* rna property toggle */
-void uiMenuItemBooleanR(uiMenuItem *head, PointerRNA *ptr, char *propname)
-{
- uiMenuItem *item= ui_menu_add_item(head, "", 0, 0);
-
- item->propname= propname; // static!
- item->rnapoin= *ptr;
- item->type = MENU_ITEM_RNA_BOOL;
-}
-
-void uiMenuItemEnumR(uiMenuItem *head, PointerRNA *ptr, char *propname, int value)
-{
- uiMenuItem *item= ui_menu_add_item(head, "", 0, 0);
-
- item->propname= propname; // static!
- item->rnapoin= *ptr;
- item->enumval= value;
- item->type = MENU_ITEM_RNA_ENUM;
-}
-
-/* add all rna items with property */
-void uiMenuItemsEnumR(uiMenuItem *head, PointerRNA *ptr, char *propname)
-{
- PropertyRNA *prop;
-
- prop= RNA_struct_find_property(ptr, propname);
-
- if(prop && RNA_property_type(prop) == PROP_ENUM) {
- const EnumPropertyItem *item;
- int totitem, i;
-
- RNA_property_enum_items(ptr, prop, &item, &totitem);
-
- for (i=0; i<totitem; i++)
- uiMenuItemEnumR(head, ptr, propname, item[i].value);
- }
-}
-
-/* generic new menu level */
-void uiMenuLevel(uiMenuItem *head, const char *name, uiMenuCreateFunc newlevel)
-{
- uiMenuItem *item= ui_menu_add_item(head, name, 0, 0);
-
- item->type = MENU_ITEM_LEVEL;
- item->newlevel= newlevel;
-}
-
-/* make a new level from enum properties */
-void uiMenuLevelEnumO(uiMenuItem *head, char *opname, char *propname)
-{
- uiMenuItem *item= ui_menu_add_item(head, "", 0, 0);
- wmOperatorType *ot;
-
- item->type = MENU_ITEM_LEVEL_OPNAME_ENUM;
- ot= WM_operatortype_find(opname);
- if(ot)
- BLI_strncpy(item->name, ot->name, MAX_MENU_STR);
-
- item->opname= opname; // static!
- item->propname= propname; // static!
-}
-
-/* make a new level from enum properties */
-void uiMenuLevelEnumR(uiMenuItem *head, PointerRNA *ptr, char *propname)
-{
- uiMenuItem *item= ui_menu_add_item(head, "", 0, 0);
- PropertyRNA *prop;
-
- item->type = MENU_ITEM_LEVEL_RNA_ENUM;
- prop= RNA_struct_find_property(ptr, propname);
- if(prop)
- BLI_strncpy(item->name, RNA_property_ui_name(prop), MAX_MENU_STR);
-
- item->rnapoin= *ptr;
- item->propname= propname; // static!
-}
-
-/* separator */
-void uiMenuSeparator(uiMenuItem *head)
-{
- uiMenuItem *item= ui_menu_add_item(head, "", 0, 0);
-
- item->type = MENU_ITEM_SEPARATOR;
-}
/*************************** Popup Menu API **************************/
/* only return handler, and set optional title */
-uiMenuItem *uiPupMenuBegin(const char *title, int icon)
+uiPopupMenu *uiPupMenuBegin(const char *title, int icon)
{
- uiMenuItem *item= MEM_callocN(sizeof(uiMenuItem), "menu start");
+ uiPopupMenu *pup= MEM_callocN(sizeof(uiPopupMenu), "menu start");
- item->type = MENU_ITEM_TITLE;
- item->opcontext= WM_OP_EXEC_REGION_WIN;
- item->icon= icon;
+ pup->icon= icon;
+ pup->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0);
+ uiLayoutContext(pup->layout, WM_OP_EXEC_REGION_WIN);
+ uiLayoutColumn(pup->layout);
/* NULL is no title */
if(title)
- BLI_strncpy(item->name, title, MAX_MENU_STR);
+ BLI_strncpy(pup->name, title, MAX_MENU_STR);
- return item;
+ return pup;
}
/* set the whole structure to work */
-void uiPupMenuEnd(bContext *C, uiMenuItem *head)
+void uiPupMenuEnd(bContext *C, uiPopupMenu *pup)
{
wmWindow *window= CTX_wm_window(C);
uiMenuInfo info;
@@ -2197,7 +1818,7 @@ void uiPupMenuEnd(bContext *C, uiMenuItem *head)
info.popup= 1;
info.mx= window->eventstate->x;
info.my= window->eventstate->y;
- info.head= head;
+ info.pup= pup;
menu= ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_MENU_ITEM, &info);
menu->popup= 1;
@@ -2205,8 +1826,12 @@ void uiPupMenuEnd(bContext *C, uiMenuItem *head)
UI_add_popup_handlers(C, &window->handlers, menu);
WM_event_add_mousemove(C);
- BLI_freelistN(&head->items);
- MEM_freeN(head);
+ MEM_freeN(pup);
+}
+
+uiLayout *uiPupMenuLayout(uiPopupMenu *pup)
+{
+ return pup->layout;
}
/* ************** standard pupmenus *************** */
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 5ef1e68bd59..3bb7581b16c 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -297,7 +297,7 @@ int uiDefAutoButsRNA(const bContext *C, uiBlock *block, PointerRNA *ptr)
char *name;
int x= 0, y= 0;
- layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, x, y, DEF_BUT_WIDTH*2, 20);
+ layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y, DEF_BUT_WIDTH*2, 20);
uiLayoutColumn(layout);
uiItemL(layout, (char*)RNA_struct_ui_name(ptr->type), 0);
@@ -317,7 +317,7 @@ int uiDefAutoButsRNA(const bContext *C, uiBlock *block, PointerRNA *ptr)
uiLayoutColumn(uiLayoutSub(layout, 0));
uiItemL(uiLayoutSub(layout, 0), name, 0);
uiLayoutColumn(uiLayoutSub(layout, 1));
- uiItemFullR(uiLayoutSub(layout, 1), "", 0, ptr, prop, -1, 0);
+ uiItemFullR(uiLayoutSub(layout, 1), "", 0, ptr, prop, -1, 0, 0);
}
RNA_property_collection_end(&iter);
@@ -506,18 +506,7 @@ int uiDefIDPoinButs(uiBlock *block, Main *bmain, ID *parid, ID *id, int id_code,
uiBlockSetButLock(block, id->lib!=0, "Can't edit external libdata");
/* name button */
- if(GS(id->name)==ID_SCE)
- strcpy(str1, "SCE:");
- else if(GS(id->name)==ID_SCE)
- strcpy(str1, "SCR:");
- else if(GS(id->name)==ID_MA && ((Material*)id)->use_nodes)
- strcpy(str1, "NT:");
- else {
- str1[0]= id->name[0];
- str1[1]= id->name[1];
- str1[2]= ':';
- str1[3]= 0;
- }
+ text_idbutton(id, str1);
if(GS(id->name)==ID_IP) len= 110;
else if((y) && (GS(id->name)==ID_AC)) len= 100; // comes from button panel (poselib)
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index f3868b1f01c..90b26d0f425 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -6587,11 +6587,13 @@ void MESH_OT_subdivide_smooth(wmOperatorType *ot)
static int subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
- head= uiPupMenuBegin("Subdivision Type", 0);
- uiMenuItemsEnumO(head, "MESH_OT_subdivs", "type");
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("Subdivision Type", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemsEnumO(layout, "MESH_OT_subdivs", "type");
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index eeba0ad22ae..1a3b3e5e031 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -462,14 +462,16 @@ static int object_add_curve_exec(bContext *C, wmOperator *op)
static int object_add_curve_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Object *obedit= CTX_data_edit_object(C);
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
- head= uiPupMenuBegin(op->type->name, 0);
+ pup= uiPupMenuBegin(op->type->name, 0);
+ layout= uiPupMenuLayout(pup);
if(!obedit || obedit->type == OB_CURVE)
- uiMenuItemsEnumO(head, op->type->idname, "type");
+ uiItemsEnumO(layout, op->type->idname, "type");
else
- uiMenuItemsEnumO(head, "OBJECT_OT_surface_add", "type");
- uiPupMenuEnd(C, head);
+ uiItemsEnumO(layout, "OBJECT_OT_surface_add", "type");
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
@@ -632,20 +634,21 @@ void OBJECT_OT_armature_add(wmOperatorType *ot)
static int object_primitive_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- uiMenuItem *head= uiPupMenuBegin("Add Object", 0);
+ uiPopupMenu *pup= uiPupMenuBegin("Add Object", 0);
+ uiLayout *layout= uiPupMenuLayout(pup);
- uiMenuLevelEnumO(head, "OBJECT_OT_mesh_add", "type");
- uiMenuLevelEnumO(head, "OBJECT_OT_curve_add", "type");
- uiMenuLevelEnumO(head, "OBJECT_OT_surface_add", "type");
- uiMenuItemO(head, 0, "OBJECT_OT_text_add");
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_MBALL);
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_CAMERA);
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_LAMP);
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_EMPTY);
- uiMenuItemO(head, 0, "OBJECT_OT_armature_add");
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_object_add", "type", OB_LATTICE);
+ 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");
+ 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);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_object_add", "type", OB_LAMP);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_object_add", "type", OB_EMPTY);
+ uiItemO(layout, NULL, 0, "OBJECT_OT_armature_add");
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_object_add", "type", OB_LATTICE);
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
/* this operator is only for a menu, not used further */
return OPERATOR_CANCELLED;
@@ -2622,26 +2625,27 @@ static int parent_set_exec(bContext *C, wmOperator *op)
static int parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Object *ob= CTX_data_active_object(C);
- uiMenuItem *head= uiPupMenuBegin("Set Parent To", 0);
+ uiPopupMenu *pup= uiPupMenuBegin("Set Parent To", 0);
+ uiLayout *layout= uiPupMenuLayout(pup);
- uiMenuContext(head, WM_OP_EXEC_DEFAULT);
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_parent_set", "type", PAR_OBJECT);
+ uiLayoutContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_OBJECT);
/* ob becomes parent, make the associated menus */
if(ob->type==OB_ARMATURE) {
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE);
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_parent_set", "type", PAR_BONE);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_BONE);
}
else if(ob->type==OB_CURVE) {
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_parent_set", "type", PAR_CURVE);
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_parent_set", "type", PAR_FOLLOW);
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_parent_set", "type", PAR_PATH_CONST);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_CURVE);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_FOLLOW);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_PATH_CONST);
}
else if(ob->type == OB_LATTICE) {
- uiMenuItemEnumO(head, "", 0, "OBJECT_OT_parent_set", "type", PAR_LATTICE);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_LATTICE);
}
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/physics/editparticle.c b/source/blender/editors/physics/editparticle.c
index 96f3ad2f8df..0d58a0bfdcd 100644
--- a/source/blender/editors/physics/editparticle.c
+++ b/source/blender/editors/physics/editparticle.c
@@ -3839,19 +3839,21 @@ void PE_change_act_psys(Scene *scene, Object *ob, ParticleSystem *psys)
static int specials_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
- head= uiPupMenuBegin("Specials", 0);
+ pup= uiPupMenuBegin("Specials", 0);
+ layout= uiPupMenuLayout(pup);
- uiMenuItemO(head, 0, "PARTICLE_OT_rekey");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_rekey");
if(scene->selectmode & SCE_SELECT_POINT) {
- uiMenuItemO(head, 0, "PARTICLE_OT_subdivide");
- uiMenuItemO(head, 0, "PARTICLE_OT_select_first");
- uiMenuItemO(head, 0, "PARTICLE_OT_select_last");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_subdivide");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_select_first");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_select_last");
}
- uiMenuItemO(head, 0, "PARTICLE_OT_remove_doubles");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_remove_doubles");
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index bf57e2e7d52..ce7022d8176 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1573,19 +1573,21 @@ static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *lastop;
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
int items, i;
items= BLI_countlist(&wm->operators);
if(items==0)
return OPERATOR_CANCELLED;
- head= uiPupMenuBegin(op->type->name, 0);
+ pup= uiPupMenuBegin(op->type->name, 0);
+ layout= uiPupMenuLayout(pup);
for (i=items-1, lastop= wm->operators.last; lastop; lastop= lastop->prev, i--)
- uiMenuItemIntO(head, lastop->type->name, 0, op->type->idname, "index", i);
+ uiItemIntO(layout, lastop->type->name, 0, op->type->idname, "index", i);
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
@@ -1813,27 +1815,28 @@ static void testfunc(bContext *C, void *argv, int arg)
printf("arg %d\n", arg);
}
-static void newlevel1(bContext *C, uiMenuItem *head, void *arg)
+static void newlevel1(bContext *C, uiLayout *layout, void *arg)
{
- uiMenuFunc(head, testfunc, NULL);
+ uiLayoutFunc(layout, testfunc, NULL);
- uiMenuItemVal(head, "First", ICON_PROP_ON, 1);
- uiMenuItemVal(head, "Second", ICON_PROP_CON, 2);
- uiMenuItemVal(head, "Third", ICON_SMOOTHCURVE, 3);
- uiMenuItemVal(head, "Fourth", ICON_SHARPCURVE, 4);
+ uiItemV(layout, "First", ICON_PROP_ON, 1);
+ uiItemV(layout, "Second", ICON_PROP_CON, 2);
+ uiItemV(layout, "Third", ICON_SMOOTHCURVE, 3);
+ uiItemV(layout, "Fourth", ICON_SHARPCURVE, 4);
}
static int testing123(bContext *C, wmOperator *op, wmEvent *event)
{
- uiMenuItem *head= uiPupMenuBegin("Hello world", 0);
+ uiPopupMenu *pup= uiPupMenuBegin("Hello world", 0);
+ uiLayout *layout= uiPupMenuLayout(pup);
- uiMenuContext(head, WM_OP_EXEC_DEFAULT);
- uiMenuItemO(head, ICON_PROP_ON, "SCREEN_OT_region_flip");
- uiMenuItemO(head, ICON_PROP_CON, "SCREEN_OT_screen_full_area");
- uiMenuItemO(head, ICON_SMOOTHCURVE, "SCREEN_OT_region_foursplit");
- uiMenuLevel(head, "Submenu", newlevel1);
+ uiLayoutContext(layout, WM_OP_EXEC_DEFAULT);
+ 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);
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
/* this operator is only for a menu, not used further */
return OPERATOR_CANCELLED;
diff --git a/source/blender/editors/space_buttons/buttons_header.c b/source/blender/editors/space_buttons/buttons_header.c
index 53fb4c388d3..5ca8330694e 100644
--- a/source/blender/editors/space_buttons/buttons_header.c
+++ b/source/blender/editors/space_buttons/buttons_header.c
@@ -29,6 +29,7 @@
#include <string.h>
#include <stdio.h>
+#include "DNA_object_types.h"
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -40,6 +41,7 @@
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "BKE_utildefines.h"
#include "ED_screen.h"
#include "ED_types.h"
@@ -133,8 +135,9 @@ void buttons_header_buttons(const bContext *C, ARegion *ar)
{
ScrArea *sa= CTX_wm_area(C);
SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
+ Object *ob= CTX_data_active_object(C);
uiBlock *block;
- int xco, yco= 3;
+ int xco, yco= 3, dataicon= ICON_OBJECT_DATA;
block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
uiBlockSetHandleFunc(block, do_buttons_buttons, NULL);
@@ -150,6 +153,22 @@ void buttons_header_buttons(const bContext *C, ARegion *ar)
xco+=XIC+xmax;
}
+
+ if(ob) {
+ switch(ob->type) {
+ case OB_EMPTY: dataicon= ICON_OUTLINER_OB_EMPTY; break;
+ case OB_MESH: dataicon= ICON_OUTLINER_OB_MESH; break;
+ case OB_CURVE: dataicon= ICON_OUTLINER_OB_CURVE; break;
+ case OB_SURF: dataicon= ICON_OUTLINER_OB_SURFACE; break;
+ case OB_FONT: dataicon= ICON_OUTLINER_OB_FONT; break;
+ case OB_MBALL: dataicon= ICON_OUTLINER_OB_META; break;
+ case OB_LAMP: dataicon= ICON_OUTLINER_OB_LAMP; break;
+ case OB_CAMERA: dataicon= ICON_OUTLINER_OB_CAMERA; break;
+ case OB_LATTICE: dataicon= ICON_OUTLINER_OB_LATTICE; break;
+ case OB_ARMATURE: dataicon= ICON_OUTLINER_OB_ARMATURE; break;
+ default: break;
+ }
+ }
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -157,10 +176,12 @@ void buttons_header_buttons(const bContext *C, ARegion *ar)
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_SCENE, xco, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_SCENE, 0, 0, "Scene");
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_WORLD, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_WORLD, 0, 0, "World");
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_OBJECT_DATA, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_OBJECT, 0, 0, "Object");
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_EDIT, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_GAME, 0, 0, "Object Data");
- uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_MATERIAL, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MATERIAL, 0, 0, "Material");
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, dataicon, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_DATA, 0, 0, "Object Data");
+ if(ELEM5(ob->type, OB_MESH, OB_SURF, OB_MBALL, OB_CURVE, OB_FONT))
+ uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_MATERIAL, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MATERIAL, 0, 0, "Material");
uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_TEXTURE, 0, 0, "Texture");
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PARTICLES, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PARTICLE, 0, 0, "Particles");
+ if(ELEM5(ob->type, OB_MESH, OB_SURF, OB_MBALL, OB_CURVE, OB_FONT))
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PARTICLES, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PARTICLE, 0, 0, "Particles");
uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PHYSICS, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PHYSICS, 0, 0, "Physics");
xco+= XIC;
diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c
index 288fc76d8e4..7e009dfc479 100644
--- a/source/blender/editors/space_image/image_header.c
+++ b/source/blender/editors/space_image/image_header.c
@@ -86,21 +86,21 @@
#define B_SIMA_RECORD 8
#define B_SIMA_PLAY 9
-static void image_view_viewnavmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void image_view_viewnavmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
int a;
- uiMenuItemO(head, 0, "IMAGE_OT_view_zoom_in");
- uiMenuItemO(head, 0, "IMAGE_OT_view_zoom_out");
+ uiItemO(layout, NULL, 0, "IMAGE_OT_view_zoom_in");
+ uiItemO(layout, NULL, 0, "IMAGE_OT_view_zoom_out");
- uiMenuSeparator(head);
+ uiItemS(layout);
for(a=0; a<7; a++) {
const int ratios[7][2] = {{1, 8}, {1, 4}, {1, 2}, {1, 1}, {2, 1}, {4, 1}, {8, 1}};
char namestr[128];
sprintf(namestr, "Zoom %d:%d", ratios[a][0], ratios[a][1]);
- uiMenuItemFloatO(head, namestr, 0, "IMAGE_OT_view_zoom_ratio", "ratio", (float)ratios[a][0]/(float)ratios[a][1]);
+ uiItemFloatO(layout, namestr, 0, "IMAGE_OT_view_zoom_ratio", "ratio", (float)ratios[a][0]/(float)ratios[a][1]);
}
}
@@ -123,7 +123,7 @@ static void do_viewmenu(bContext *C, void *arg, int event)
}
#endif
-static void image_viewmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void image_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
bScreen *sc= CTX_wm_screen(C);
ScrArea *sa= CTX_wm_area(C);
@@ -140,44 +140,44 @@ static void image_viewmenu(bContext *C, uiMenuItem *head, void *arg_unused)
show_uvedit= ED_space_image_show_uvedit(sima, CTX_data_edit_object(C));
/* create menu */
- uiMenuItemO(head, ICON_MENU_PANEL, "IMAGE_OT_toggle_view_properties_panel"); // View Properties...
- uiMenuItemO(head, ICON_MENU_PANEL, "IMAGE_OT_toggle_image_properties_panel"); // Image Properties...|N
- uiMenuItemO(head, ICON_MENU_PANEL, "IMAGE_OT_toggle_realtime_properties_panel"); // Real-time properties...
- if(show_paint) uiMenuItemO(head, ICON_MENU_PANEL, "IMAGE_OT_toggle_paint_panel"); // Paint Tool...|C
- uiMenuItemO(head, ICON_MENU_PANEL, "IMAGE_OT_toggle_curves_panel"); // Curves Tool...
- if(show_render) uiMenuItemO(head, ICON_MENU_PANEL, "IMAGE_OT_toggle_compositing_preview_panel"); // Compositing Preview...|Shift P
- uiMenuItemO(head, ICON_MENU_PANEL, "IMAGE_OT_toggle_grease_pencil_panel"); // Grease Pencil...
+ uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_view_properties_panel"); // View Properties...
+ uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_image_properties_panel"); // Image Properties...|N
+ uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_realtime_properties_panel"); // Real-time properties...
+ if(show_paint) uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_paint_panel"); // Paint Tool...|C
+ uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_curves_panel"); // Curves Tool...
+ if(show_render) uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_compositing_preview_panel"); // Compositing Preview...|Shift P
+ uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_grease_pencil_panel"); // Grease Pencil...
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemBooleanR(head, &spaceptr, "update_automatically");
- // XXX if(show_uvedit) uiMenuItemBooleanR(head, &uvptr, "local_view"); // "UV Local View", Numpad /
+ uiItemR(layout, NULL, 0, &spaceptr, "update_automatically", 0);
+ // XXX if(show_uvedit) uiItemR(layout, NULL, 0, &uvptr, "local_view", 0); // "UV Local View", Numpad /
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuLevel(head, "View Navigation", image_view_viewnavmenu);
- if(show_uvedit) uiMenuItemO(head, 0, "IMAGE_OT_view_selected");
- uiMenuItemO(head, 0, "IMAGE_OT_view_all");
+ uiItemLevel(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");
- if(sa->full) uiMenuItemO(head, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
- else uiMenuItemO(head, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctr DownArrow
+ if(sa->full) uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
+ else uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctr DownArrow
}
-static void image_selectmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void image_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemO(head, 0, "UV_OT_select_border");
- uiMenuItemBooleanO(head, "Border Select Pinned", 0, "UV_OT_select_border", "pinned", 1); // Border Select Pinned|Shift B
+ uiItemO(layout, NULL, 0, "UV_OT_select_border");
+ uiItemBooleanO(layout, "Border Select Pinned", 0, "UV_OT_select_border", "pinned", 1); // Border Select Pinned|Shift B
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "UV_OT_select_all_toggle");
- uiMenuItemO(head, 0, "UV_OT_select_invert");
- uiMenuItemO(head, 0, "UV_OT_unlink_selection");
+ uiItemO(layout, NULL, 0, "UV_OT_select_all_toggle");
+ uiItemO(layout, NULL, 0, "UV_OT_select_invert");
+ uiItemO(layout, NULL, 0, "UV_OT_unlink_selection");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "UV_OT_select_pinned");
- uiMenuItemO(head, 0, "UV_OT_select_linked");
+ uiItemO(layout, NULL, 0, "UV_OT_select_pinned");
+ uiItemO(layout, NULL, 0, "UV_OT_select_linked");
}
#if 0
@@ -190,7 +190,7 @@ static void do_image_imagemenu(void *arg, int event)
}
#endif
-static void image_imagemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void image_imagemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
bScreen *sc= CTX_wm_screen(C);
SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
@@ -208,37 +208,37 @@ static void image_imagemenu(bContext *C, uiMenuItem *head, void *arg_unused)
RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr);
/* create menu */
- uiMenuItemO(head, 0, "IMAGE_OT_new"); // New...
- uiMenuItemO(head, 0, "IMAGE_OT_open"); // Open...
+ uiItemO(layout, NULL, 0, "IMAGE_OT_new"); // New...
+ uiItemO(layout, NULL, 0, "IMAGE_OT_open"); // Open...
if(ima) {
if(!show_render) {
- uiMenuItemO(head, 0, "IMAGE_OT_replace"); // Replace...
- uiMenuItemO(head, 0, "IMAGE_OT_reload"); // Reload...
+ uiItemO(layout, NULL, 0, "IMAGE_OT_replace"); // Replace...
+ uiItemO(layout, NULL, 0, "IMAGE_OT_reload"); // Reload...
}
- uiMenuItemO(head, 0, "IMAGE_OT_save"); // Save
- uiMenuItemO(head, 0, "IMAGE_OT_save_as"); // Save As...
+ uiItemO(layout, NULL, 0, "IMAGE_OT_save"); // Save
+ uiItemO(layout, NULL, 0, "IMAGE_OT_save_as"); // Save As...
if(ima->source == IMA_SRC_SEQUENCE)
- uiMenuItemO(head, 0, "IMAGE_OT_save_sequence"); // Save Changed Sequence Images
+ uiItemO(layout, NULL, 0, "IMAGE_OT_save_sequence"); // Save Changed Sequence Images
if(!show_render) {
- uiMenuSeparator(head);
+ uiItemS(layout);
- if(ima->packedfile) uiMenuItemO(head, 0, "IMAGE_OT_unpack"); // Unpack Image...
- else uiMenuItemO(head, 0, "IMAGE_OT_pack"); // Pack Image
+ if(ima->packedfile) uiItemO(layout, NULL, 0, "IMAGE_OT_unpack"); // Unpack Image...
+ else uiItemO(layout, NULL, 0, "IMAGE_OT_pack"); // Pack Image
/* only for dirty && specific image types : XXX poll? */
if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
if(ELEM(ima->source, IMA_SRC_FILE, IMA_SRC_GENERATED) && ima->type != IMA_TYPE_MULTILAYER)
- uiMenuItemBooleanO(head, "Pack As PNG", 0, "IMAGE_OT_pack", "as_png", 1); // Pack Image As PNG
+ uiItemBooleanO(layout, "Pack As PNG", 0, "IMAGE_OT_pack", "as_png", 1); // Pack Image As PNG
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemBooleanR(head, &spaceptr, "image_painting");
+ uiItemR(layout, NULL, 0, &spaceptr, "image_painting", 0);
/* move to realtime properties panel */
RNA_id_pointer_create(&ima->id, &imaptr);
- uiMenuLevelEnumR(head, &imaptr, "mapping");
+ uiItemLevelEnumR(layout, NULL, 0, &imaptr, "mapping");
}
}
@@ -260,30 +260,30 @@ static void image_imagemenu(bContext *C, uiMenuItem *head, void *arg_unused)
#endif
}
-static void image_uvs_showhidemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void image_uvs_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemO(head, 0, "UV_OT_reveal");
- uiMenuItemO(head, 0, "UV_OT_hide");
- uiMenuItemBooleanO(head, "Hide Unselected", 0, "UV_OT_hide", "unselected", 1);
+ uiItemO(layout, NULL, 0, "UV_OT_reveal");
+ uiItemO(layout, NULL, 0, "UV_OT_hide");
+ uiItemBooleanO(layout, "Hide Unselected", 0, "UV_OT_hide", "unselected", 1);
}
-static void image_uvs_transformmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void image_uvs_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TRANSLATION);
- uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_ROTATION);
- uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_RESIZE);
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_TRANSLATION);
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_ROTATION);
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_RESIZE);
}
-static void image_uvs_mirrormenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void image_uvs_mirrormenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemEnumO(head, "", 0, "UV_OT_mirror", "axis", 'x'); // "X Axis", M, 1
- uiMenuItemEnumO(head, "", 0, "UV_OT_mirror", "axis", 'y'); // "Y Axis", M, 2
+ uiItemEnumO(layout, NULL, 0, "UV_OT_mirror", "axis", 'x'); // "X Axis", M, 1
+ uiItemEnumO(layout, NULL, 0, "UV_OT_mirror", "axis", 'y'); // "Y Axis", M, 2
}
-static void image_uvs_weldalignmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void image_uvs_weldalignmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemO(head, 0, "UV_OT_weld"); // W, 1
- uiMenuItemsEnumO(head, "UV_OT_align", "axis"); // W, 2/3/4
+ uiItemO(layout, NULL, 0, "UV_OT_weld"); // W, 1
+ uiItemsEnumO(layout, "UV_OT_align", "axis"); // W, 2/3/4
}
#if 0
@@ -321,7 +321,7 @@ static void image_uvs_scriptsmenu (void *args_unused)
#endif /* DISABLE_PYTHON */
#endif
-static void image_uvsmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void image_uvsmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
bScreen *sc= CTX_wm_screen(C);
Scene *scene= CTX_data_scene(C);
@@ -338,43 +338,43 @@ static void image_uvsmenu(bContext *C, uiMenuItem *head, void *arg_unused)
RNA_id_pointer_create(&scene->id, &sceneptr);
/* create menu */
- uiMenuItemBooleanR(head, &uvptr, "snap_to_pixels");
- uiMenuItemBooleanR(head, &uvptr, "constrain_to_image_bounds");
+ uiItemR(layout, NULL, 0, &uvptr, "snap_to_pixels", 0);
+ uiItemR(layout, NULL, 0, &uvptr, "constrain_to_image_bounds", 0);
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemBooleanR(head, &uvptr, "live_unwrap");
- uiMenuItemO(head, 0, "UV_OT_unwrap");
- uiMenuItemBooleanO(head, "Unpin", 0, "UV_OT_pin", "clear", 1);
- uiMenuItemO(head, 0, "UV_OT_pin");
+ uiItemR(layout, NULL, 0, &uvptr, "live_unwrap", 0);
+ uiItemO(layout, NULL, 0, "UV_OT_unwrap");
+ uiItemBooleanO(layout, "Unpin", 0, "UV_OT_pin", "clear", 1);
+ uiItemO(layout, NULL, 0, "UV_OT_pin");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "UV_OT_pack_islands");
- uiMenuItemO(head, 0, "UV_OT_average_islands_scale");
- uiMenuItemO(head, 0, "UV_OT_minimize_stretch");
- uiMenuItemO(head, 0, "UV_OT_stitch");
+ uiItemO(layout, NULL, 0, "UV_OT_pack_islands");
+ uiItemO(layout, NULL, 0, "UV_OT_average_islands_scale");
+ uiItemO(layout, NULL, 0, "UV_OT_minimize_stretch");
+ uiItemO(layout, NULL, 0, "UV_OT_stitch");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuLevel(head, "Transform", image_uvs_transformmenu);
- uiMenuLevel(head, "Mirror", image_uvs_mirrormenu);
- uiMenuLevel(head, "Weld/Align", image_uvs_weldalignmenu);
+ uiItemLevel(layout, "Transform", 0, image_uvs_transformmenu);
+ uiItemLevel(layout, "Mirror", 0, image_uvs_mirrormenu);
+ uiItemLevel(layout, "Weld/Align", 0, image_uvs_weldalignmenu);
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemBooleanR(head, &sceneptr, "proportional_editing");
- uiMenuLevelEnumR(head, &sceneptr, "proportional_editing_falloff");
+ uiItemR(layout, NULL, 0, &sceneptr, "proportional_editing", 0);
+ uiItemLevelEnumR(layout, NULL, 0, &sceneptr, "proportional_editing_falloff");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuLevel(head, "Show/Hide Faces", image_uvs_showhidemenu);
+ uiItemLevel(layout, "Show/Hide Faces", 0, image_uvs_showhidemenu);
#if 0
#ifndef DISABLE_PYTHON
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuLevel(head, "Scripts", image_uvs_scriptsmenu);
+ uiItemLevel(layout, "Scripts", image_uvs_scriptsmenu);
#endif
#endif
}
@@ -939,19 +939,21 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
Object *obedit= CTX_data_edit_object(C);
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
int show_uvedit;
show_uvedit= ED_space_image_show_uvedit(sima, obedit);
- head= uiPupMenuBegin("Toolbox", 0);
+ pup= uiPupMenuBegin("Toolbox", 0);
+ layout= uiPupMenuLayout(pup);
- uiMenuLevel(head, "View", image_viewmenu);
- if(show_uvedit) uiMenuLevel(head, "Select", image_selectmenu);
- uiMenuLevel(head, "Image", image_imagemenu);
- if(show_uvedit) uiMenuLevel(head, "UVs", image_uvsmenu);
+ 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);
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index fcafcd22a3d..908b24bd84d 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1125,16 +1125,18 @@ static int pack_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
ImBuf *ibuf= ED_space_image_buffer(sima);
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
int as_png= RNA_boolean_get(op->ptr, "as_png");
if(!pack_test(C, op))
return OPERATOR_CANCELLED;
if(!as_png && (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))) {
- head= uiPupMenuBegin("OK", ICON_HELP);
- uiMenuItemBooleanO(head, "Can't pack edited image from disk. Pack as internal PNG?", 0, op->idname, "as_png", 1);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("OK", ICON_HELP);
+ layout= uiPupMenuLayout(pup);
+ uiItemBooleanO(layout, "Can't pack edited image from disk. Pack as internal PNG?", 0, op->idname, "as_png", 1);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index fab9317bbd0..5f743afd65d 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -47,6 +47,7 @@
#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_image.h"
+#include "BKE_mesh.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
diff --git a/source/blender/editors/space_info/info_header.c b/source/blender/editors/space_info/info_header.c
index 8b940bd6ca8..af792d0b22c 100644
--- a/source/blender/editors/space_info/info_header.c
+++ b/source/blender/editors/space_info/info_header.c
@@ -258,22 +258,22 @@ uiBlock *info_externalfiles(bContext *C, ARegion *ar, void *arg_unused)
-static void info_filemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void info_filemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuContext(head, WM_OP_EXEC_AREA);
- uiMenuItemO(head, 0, "WM_OT_read_homefile");
- uiMenuContext(head, WM_OP_INVOKE_AREA);
- uiMenuItemO(head, 0, "WM_OT_open_mainfile");
+ uiLayoutContext(layout, WM_OP_EXEC_AREA);
+ uiItemO(layout, NULL, 0, "WM_OT_read_homefile");
+ uiLayoutContext(layout, WM_OP_INVOKE_AREA);
+ uiItemO(layout, NULL, 0, "WM_OT_open_mainfile");
// uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, "");
// uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuContext(head, WM_OP_EXEC_AREA);
- uiMenuItemO(head, 0, "WM_OT_save_mainfile");
- uiMenuContext(head, WM_OP_INVOKE_AREA);
- uiMenuItemO(head, 0, "WM_OT_save_as_mainfile");
+ uiLayoutContext(layout, WM_OP_EXEC_AREA);
+ uiItemO(layout, NULL, 0, "WM_OT_save_mainfile");
+ uiLayoutContext(layout, WM_OP_INVOKE_AREA);
+ uiItemO(layout, NULL, 0, "WM_OT_save_as_mainfile");
#if 0
if(U.flag & USER_FILECOMPRESS) {
diff --git a/source/blender/editors/space_sequencer/sequencer_header.c b/source/blender/editors/space_sequencer/sequencer_header.c
index aee589cb982..c8dc4cc006a 100644
--- a/source/blender/editors/space_sequencer/sequencer_header.c
+++ b/source/blender/editors/space_sequencer/sequencer_header.c
@@ -144,22 +144,22 @@ static uiBlock *seq_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
}
//static uiBlock *seq_selectmenu(bContext *C, ARegion *ar, void *arg_unused)
-static void seq_selectmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void seq_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuContext(head, WM_OP_INVOKE_REGION_WIN);
-
- uiMenuItemEnumO(head, "Strips to the Left", 0, "SEQUENCER_OT_select_active_side", "side", SEQ_SIDE_LEFT);
- uiMenuItemEnumO(head, "Strips to the Right", 0, "SEQUENCER_OT_select_active_side", "side", SEQ_SIDE_RIGHT);
- uiMenuSeparator(head);
- uiMenuItemEnumO(head, "Surrounding Handles", 0, "SEQUENCER_OT_select_handles", "side", SEQ_SIDE_BOTH);
- uiMenuItemEnumO(head, "Left Handles", 0, "SEQUENCER_OT_select_handles", "side", SEQ_SIDE_LEFT);
- uiMenuItemEnumO(head, "Right Handles", 0, "SEQUENCER_OT_select_handles", "side", SEQ_SIDE_RIGHT);
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_select_linked");
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_select_linked");
- uiMenuItemO(head, 0, "SEQUENCER_OT_select_all_toggle");
- uiMenuItemO(head, 0, "SEQUENCER_OT_select_invert");
+ uiLayoutContext(layout, WM_OP_INVOKE_REGION_WIN);
+
+ uiItemEnumO(layout, "Strips to the Left", 0, "SEQUENCER_OT_select_active_side", "side", SEQ_SIDE_LEFT);
+ uiItemEnumO(layout, "Strips to the Right", 0, "SEQUENCER_OT_select_active_side", "side", SEQ_SIDE_RIGHT);
+ uiItemS(layout);
+ uiItemEnumO(layout, "Surrounding Handles", 0, "SEQUENCER_OT_select_handles", "side", SEQ_SIDE_BOTH);
+ uiItemEnumO(layout, "Left Handles", 0, "SEQUENCER_OT_select_handles", "side", SEQ_SIDE_LEFT);
+ uiItemEnumO(layout, "Right Handles", 0, "SEQUENCER_OT_select_handles", "side", SEQ_SIDE_RIGHT);
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_select_linked");
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_select_linked");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_select_all_toggle");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_select_invert");
}
static uiBlock *seq_markermenu(bContext *C, ARegion *ar, void *arg_unused)
@@ -210,114 +210,113 @@ static uiBlock *seq_markermenu(bContext *C, ARegion *ar, void *arg_unused)
}
//static uiBlock *seq_addmenu_effectmenu(bContext *C, ARegion *ar, void *arg_unused)
-static void seq_addmenu_effectmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void seq_addmenu_effectmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuContext(head, WM_OP_INVOKE_REGION_WIN);
+ uiLayoutContext(layout, WM_OP_INVOKE_REGION_WIN);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_ADD);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_SUB);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_MUL);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_CROSS);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_GAMCROSS);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_ALPHAOVER);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_ALPHAUNDER);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_OVERDROP);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_WIPE);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_GLOW);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_TRANSFORM);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_ADD);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_SUB);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_MUL);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_CROSS);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_GAMCROSS);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_ALPHAOVER);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_ALPHAUNDER);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_OVERDROP);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_WIPE);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_GLOW);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_TRANSFORM);
/* Color is an effect but moved to the other menu since its not that exciting */
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_SPEED);
- uiMenuSeparator(head);
- uiMenuItemEnumO(head, "", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_PLUGIN);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_SPEED);
+ uiItemS(layout);
+ uiItemEnumO(layout, NULL, 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_PLUGIN);
}
//static uiBlock *seq_addmenu(bContext *C, ARegion *ar, void *arg_unused)
-static void seq_addmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void seq_addmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuLevel(head, "Effects...", seq_addmenu_effectmenu);
- uiMenuSeparator(head);
+ uiItemLevel(layout, "Effects...", 0, seq_addmenu_effectmenu);
+ uiItemS(layout);
- uiMenuContext(head, WM_OP_INVOKE_REGION_WIN);
+ uiLayoutContext(layout, WM_OP_INVOKE_REGION_WIN);
#ifdef WITH_FFMPEG
- uiMenuItemBooleanO(head, "Audio (RAM)", 0, "SEQUENCER_OT_sound_strip_add", "hd", FALSE);
- uiMenuItemBooleanO(head, "Audio (HD)", 0, "SEQUENCER_OT_sound_strip_add", "hd", TRUE);
+ uiItemBooleanO(layout, "Audio (RAM)", 0, "SEQUENCER_OT_sound_strip_add", "hd", FALSE);
+ uiItemBooleanO(layout, "Audio (HD)", 0, "SEQUENCER_OT_sound_strip_add", "hd", TRUE);
#else
- uiMenuItemO(head, 0, "SEQUENCER_OT_sound_strip_add");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_sound_strip_add");
#endif
- uiMenuItemEnumO(head, "Add Color Strip", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_COLOR);
+ uiItemEnumO(layout, "Add Color Strip", 0, "SEQUENCER_OT_effect_strip_add", "type", SEQ_COLOR);
- uiMenuItemO(head, 0, "SEQUENCER_OT_image_strip_add");
- uiMenuItemO(head, 0, "SEQUENCER_OT_movie_strip_add");
- uiMenuItemO(head, 0, "SEQUENCER_OT_scene_strip_add");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_image_strip_add");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_movie_strip_add");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_scene_strip_add");
#ifdef WITH_FFMPEG
- uiMenuItemBooleanO(head, "Movie and Sound", 0, "SEQUENCER_OT_movie_strip_add", "sound", TRUE);
+ uiItemBooleanO(layout, "Movie and Sound", 0, "SEQUENCER_OT_movie_strip_add", "sound", TRUE);
#endif
}
//static uiBlock *seq_editmenu(bContext *C, ARegion *ar, void *arg_unused)
-static void seq_editmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void seq_editmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
-
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
- uiMenuContext(head, WM_OP_INVOKE_REGION_WIN);
+ uiLayoutContext(layout, WM_OP_INVOKE_REGION_WIN);
- uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TRANSLATION);
- uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TIME_EXTEND);
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_TRANSLATION);
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_TIME_EXTEND);
- // uiMenuItemO(head, 0, "SEQUENCER_OT_strip_snap"); // TODO - add this operator
+ // uiItemO(layout, NULL, 0, "SEQUENCER_OT_strip_snap"); // TODO - add this operator
- uiMenuItemEnumO(head, "Cut Hard", 0, "SEQUENCER_OT_cut", "type", SEQ_CUT_HARD);
- uiMenuItemEnumO(head, "Cut Soft", 0, "SEQUENCER_OT_cut", "type", SEQ_CUT_SOFT);
+ uiItemEnumO(layout, "Cut Hard", 0, "SEQUENCER_OT_cut", "type", SEQ_CUT_HARD);
+ uiItemEnumO(layout, "Cut Soft", 0, "SEQUENCER_OT_cut", "type", SEQ_CUT_SOFT);
- uiMenuItemO(head, 0, "SEQUENCER_OT_images_separate");
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_duplicate_add");
- uiMenuItemO(head, 0, "SEQUENCER_OT_delete");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_images_separate");
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_duplicate_add");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_delete");
if (ed && ed->act_seq) {
switch(ed->act_seq->type) {
case SEQ_EFFECT:
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_effect_change");
- uiMenuItemO(head, 0, "SEQUENCER_OT_effect_reassign_inputs");
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_effect_change");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_effect_reassign_inputs");
break;
case SEQ_IMAGE:
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_image_change"); // Change Scene...
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_image_change"); // Change Scene...
break;
case SEQ_SCENE:
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_scene_change"); // Remap Paths...
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_scene_change"); // Remap Paths...
break;
case SEQ_MOVIE:
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_movie_change"); // Remap Paths...
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_movie_change"); // Remap Paths...
break;
}
}
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "SEQUENCER_OT_meta_make");
- uiMenuItemO(head, 0, "SEQUENCER_OT_meta_separate");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_meta_make");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_meta_separate");
if (ed && (ed->metastack.first || (ed->act_seq && ed->act_seq->type == SEQ_META))) {
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_meta_toggle");
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_meta_toggle");
}
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_reload");
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "SEQUENCER_OT_lock");
- uiMenuItemO(head, 0, "SEQUENCER_OT_unlock");
- uiMenuItemO(head, 0, "SEQUENCER_OT_mute");
- uiMenuItemO(head, 0, "SEQUENCER_OT_unmute");
-
- uiMenuItemEnumO(head, "Mute Deselected Strips", 0, "SEQUENCER_OT_mute", "type", SEQ_UNSELECTED);
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_reload");
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_lock");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_unlock");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_mute");
+ uiItemO(layout, NULL, 0, "SEQUENCER_OT_unmute");
+
+ uiItemEnumO(layout, "Mute Deselected Strips", 0, "SEQUENCER_OT_mute", "type", SEQ_UNSELECTED);
}
void sequencer_header_buttons(const bContext *C, ARegion *ar)
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 89852955ca3..577dae433c1 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -127,13 +127,17 @@ static void text_listener(ScrArea *sa, wmNotifier *wmn)
if(!wmn->reference || wmn->reference == st->text) {
ED_area_tag_redraw(sa);
- if(wmn->data == ND_CURSOR) {
+ if(wmn->data == ND_CURSOR || wmn->action == NA_EDITED) {
ARegion *ar;
for(ar=sa->regionbase.first; ar; ar= ar->next)
if(ar->regiontype==RGN_TYPE_WINDOW)
text_update_cursor_moved(st, ar);
}
+
+ if(wmn->action == NA_EDITED)
+ if(st->text)
+ text_update_edited(st->text);
}
else if(wmn->data == ND_DISPLAY)
ED_area_tag_redraw(sa);
@@ -147,6 +151,7 @@ static void text_operatortypes(void)
WM_operatortype_append(TEXT_OT_new);
WM_operatortype_append(TEXT_OT_open);
WM_operatortype_append(TEXT_OT_reload);
+ WM_operatortype_append(TEXT_OT_unlink);
WM_operatortype_append(TEXT_OT_save);
WM_operatortype_append(TEXT_OT_save_as);
WM_operatortype_append(TEXT_OT_make_internal);
@@ -401,9 +406,6 @@ void ED_spacetype_text(void)
art->init= text_properties_area_init;
art->draw= text_properties_area_draw;
-
- text_properties_register(art);
-
BLI_addhead(&st->regiontypes, art);
/* regions: header */
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index 0ab43cbf455..a3b62adf6c8 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -155,44 +155,46 @@ static uiBlock *text_plugin_scriptsmenu(bContext *C, void *args_unused)
}
#endif
-static void text_editmenu_viewmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void text_editmenu_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemEnumO(head, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP);
- uiMenuItemEnumO(head, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM);
+ uiItemEnumO(layout, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP);
+ uiItemEnumO(layout, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM);
}
-static void text_editmenu_selectmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void text_editmenu_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemO(head, 0, "TEXT_OT_select_all");
- uiMenuItemO(head, 0, "TEXT_OT_select_line");
+ uiItemO(layout, NULL, 0, "TEXT_OT_select_all");
+ uiItemO(layout, NULL, 0, "TEXT_OT_select_line");
}
-static void text_editmenu_markermenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void text_editmenu_markermenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemO(head, 0, "TEXT_OT_markers_clear");
- uiMenuItemO(head, 0, "TEXT_OT_next_marker");
- uiMenuItemO(head, 0, "TEXT_OT_previous_marker");
+ uiItemO(layout, NULL, 0, "TEXT_OT_markers_clear");
+ uiItemO(layout, NULL, 0, "TEXT_OT_next_marker");
+ uiItemO(layout, NULL, 0, "TEXT_OT_previous_marker");
}
-static void text_formatmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void text_formatmenu(const bContext *C, Menu *menu)
{
- uiMenuItemO(head, 0, "TEXT_OT_indent");
- uiMenuItemO(head, 0, "TEXT_OT_unindent");
+ uiLayout *layout= menu->layout;
- uiMenuSeparator(head);
+ uiItemO(layout, NULL, 0, "TEXT_OT_indent");
+ uiItemO(layout, NULL, 0, "TEXT_OT_unindent");
- uiMenuItemO(head, 0, "TEXT_OT_comment");
- uiMenuItemO(head, 0, "TEXT_OT_uncomment");
+ uiItemS(layout);
- uiMenuSeparator(head);
+ uiItemO(layout, NULL, 0, "TEXT_OT_comment");
+ uiItemO(layout, NULL, 0, "TEXT_OT_uncomment");
- uiMenuLevelEnumO(head, "TEXT_OT_convert_whitespace", "type");
+ uiItemS(layout);
+
+ uiItemLevelEnumO(layout, NULL, 0, "TEXT_OT_convert_whitespace", "type");
}
-static void text_editmenu_to3dmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void text_editmenu_to3dmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemBooleanO(head, "One Object", 0, "TEXT_OT_to_3d_object", "split_lines", 0);
- uiMenuItemBooleanO(head, "One Object Per Line", 0, "TEXT_OT_to_3d_object", "split_lines", 1);
+ uiItemBooleanO(layout, "One Object", 0, "TEXT_OT_to_3d_object", "split_lines", 0);
+ uiItemBooleanO(layout, "One Object Per Line", 0, "TEXT_OT_to_3d_object", "split_lines", 1);
}
static int text_menu_edit_poll(bContext *C)
@@ -200,308 +202,56 @@ static int text_menu_edit_poll(bContext *C)
return (CTX_data_edit_text(C) != NULL);
}
-static void text_editmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void text_editmenu(const bContext *C, Menu *menu)
{
- uiMenuItemO(head, 0, "ED_OT_undo");
- uiMenuItemO(head, 0, "ED_OT_redo");
-
- uiMenuSeparator(head);
-
- uiMenuItemO(head, 0, "TEXT_OT_cut");
- uiMenuItemO(head, 0, "TEXT_OT_copy");
- uiMenuItemO(head, 0, "TEXT_OT_paste");
-
- uiMenuSeparator(head);
-
- uiMenuLevel(head, "View", text_editmenu_viewmenu);
- uiMenuLevel(head, "Select", text_editmenu_selectmenu);
- uiMenuLevel(head, "Markers", text_editmenu_markermenu);
-
- uiMenuSeparator(head);
-
- uiMenuItemO(head, 0, "TEXT_OT_jump");
- uiMenuItemO(head, 0, "TEXT_OT_properties");
-
- uiMenuSeparator(head);
-
- uiMenuLevel(head, "Text to 3D Object", text_editmenu_to3dmenu);
-}
+ uiLayout *layout= menu->layout;
-static void text_filemenu(bContext *C, uiMenuItem *head, void *arg_unused)
-{
- SpaceText *st= (SpaceText*)CTX_wm_space_data(C);
- Text *text= st->text;
-
- uiMenuItemO(head, 0, "TEXT_OT_new");
- uiMenuItemO(head, 0, "TEXT_OT_open");
-
- if(text) {
- uiMenuItemO(head, 0, "TEXT_OT_reload");
-
- uiMenuSeparator(head);
-
- uiMenuItemO(head, 0, "TEXT_OT_save");
- uiMenuItemO(head, 0, "TEXT_OT_save_as");
-
- if(text->name)
- uiMenuItemO(head, 0, "TEXT_OT_make_internal");
-
- uiMenuSeparator(head);
-
- uiMenuItemO(head, 0, "TEXT_OT_run_script");
+ uiItemO(layout, NULL, 0, "ED_OT_undo");
+ uiItemO(layout, NULL, 0, "ED_OT_redo");
-#ifndef DISABLE_PYTHON
- if(BPY_is_pyconstraint(text))
- uiMenuItemO(head, 0, "TEXT_OT_refresh_pyconstraints");
-#endif
- }
+ uiItemS(layout);
-#ifndef DISABLE_PYTHON
- // XXX uiMenuSeparator(head);
+ uiItemO(layout, NULL, 0, "TEXT_OT_cut");
+ uiItemO(layout, NULL, 0, "TEXT_OT_copy");
+ uiItemO(layout, NULL, 0, "TEXT_OT_paste");
- // XXX uiDefIconTextBlockBut(block, text_template_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Script Templates", 0, yco-=20, 120, 19, "");
- // XXX uiDefIconTextBlockBut(block, text_plugin_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Text Plugins", 0, yco-=20, 120, 19, "");
-#endif
-}
+ uiItemS(layout);
-/*********************** datablock browse *************************/
+ uiItemLevel(layout, "View", 0, text_editmenu_viewmenu);
+ uiItemLevel(layout, "Select", 0, text_editmenu_selectmenu);
+ uiItemLevel(layout, "Markers", 0, text_editmenu_markermenu);
-static void text_unlink(Main *bmain, Text *text)
-{
- bScreen *scr;
- ScrArea *area;
- SpaceLink *sl;
+ uiItemS(layout);
- /* XXX this ifdef is in fact dangerous, if python is
- * disabled it will leave invalid pointers in files! */
+ uiItemO(layout, NULL, 0, "TEXT_OT_jump");
+ uiItemO(layout, NULL, 0, "TEXT_OT_properties");
-#ifndef DISABLE_PYTHON
- // XXX BPY_clear_bad_scriptlinks(text);
- // XXX BPY_free_pyconstraint_links(text);
- // XXX free_text_controllers(text);
- // XXX free_dome_warp_text(text);
-
- /* check if this text was used as script link:
- * this check function unsets the pointers and returns how many
- * script links used this Text */
- if(0) // XXX BPY_text_check_all_scriptlinks (text))
- ; // XXX notifier: allqueue(REDRAWBUTSSCRIPT, 0);
-
- /* equivalently for pynodes: */
- if(0) // XXX nodeDynamicUnlinkText ((ID*)text))
- ; // XXX notifier: allqueue(REDRAWNODE, 0);
-#endif
-
- for(scr= bmain->screen.first; scr; scr= scr->id.next) {
- for(area= scr->areabase.first; area; area= area->next) {
- for(sl= area->spacedata.first; sl; sl= sl->next) {
- if(sl->spacetype==SPACE_TEXT) {
- SpaceText *st= (SpaceText*) sl;
-
- if(st->text==text) {
- st->text= NULL;
- st->top= 0;
-
- if(st==area->spacedata.first)
- ED_area_tag_redraw(area);
- }
- }
- }
- }
- }
+ uiItemS(layout);
- free_libblock(&bmain->text, text);
-}
-
-static void text_idpoin_handle(bContext *C, ID *id, int event)
-{
- SpaceText *st= (SpaceText*)CTX_wm_space_data(C);
- Text *text;
-
- switch(event) {
- case UI_ID_BROWSE:
- st->text= (Text*)id;
- st->top= 0;
-
- text_update_edited(st->text);
- WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
-
- ED_undo_push(C, "Browse Text");
- break;
- case UI_ID_DELETE:
- text= st->text;
-
- /* make the previous text active, if its not there make the next text active */
- if(text->id.prev) {
- st->text = text->id.prev;
- WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
- }
- else if(text->id.next) {
- st->text = text->id.next;
- WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
- }
-
- text_unlink(CTX_data_main(C), text);
- WM_event_add_notifier(C, NC_TEXT|NA_REMOVED, text);
-
- ED_undo_push(C, "Delete Text");
- break;
- case UI_ID_RENAME:
- break;
- case UI_ID_ADD_NEW:
- WM_operator_name_call(C, "TEXT_OT_new", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case UI_ID_OPEN:
- WM_operator_name_call(C, "TEXT_OT_open", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- }
+ uiItemLevel(layout, "Text to 3D Object", 0, text_editmenu_to3dmenu);
}
/********************** header buttons ***********************/
-static void text_header_draw(const bContext *C, Header *header)
-{
- bScreen *sc= CTX_wm_screen(C);
- SpaceText *st= (SpaceText*)CTX_wm_space_data(C);
- PointerRNA spaceptr;
- Text *text= st->text;
- uiLayout *layout= header->layout;
-
- RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr);
-
- uiTemplateHeaderMenus(layout);
- uiItemM(layout, "Text", 0, text_filemenu);
- if(text) {
- uiItemM(layout, "Edit", 0, text_editmenu);
- uiItemM(layout, "Format", 0, text_formatmenu);
- }
-
- /* warning button if text is out of date */
- if(text && text_file_modified(text)) {
- uiTemplateHeaderButtons(layout);
- uiTemplateSetColor(layout, TH_REDALERT);
- uiItemO(layout, "", ICON_HELP, "TEXT_OT_resolve_conflict");
- }
-
- uiTemplateHeaderButtons(layout);
- uiItemR(layout, "", ICON_LINENUMBERS_OFF, &spaceptr, "line_numbers", 0);
- uiItemR(layout, "", ICON_WORDWRAP_OFF, &spaceptr, "word_wrap", 0);
- uiItemR(layout, "", ICON_SYNTAX_OFF, &spaceptr, "syntax_highlight", 0);
- // XXX uiItemR(layout, "", ICON_SCRIPTPLUGINS, &spaceptr, "do_python_plugins", 0);
-
- uiTemplateHeaderID(layout, &spaceptr, "text",
- UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE,
- text_idpoin_handle);
-
- /* file info */
- if(text) {
- char fname[HEADER_PATH_MAX];
- static char headtxt[HEADER_PATH_MAX+17];
- int len;
-
- if(text->name) {
- len = strlen(text->name);
- if(len > HEADER_PATH_MAX-1)
- len = HEADER_PATH_MAX-1;
- strncpy(fname, text->name, len);
- fname[len]='\0';
- if(text->flags & TXT_ISDIRTY)
- sprintf(headtxt, "File: *%s (unsaved)", fname);
- else
- sprintf(headtxt, "File: %s", fname);
- }
- else
- sprintf(headtxt, text->id.lib? "Text: External": "Text: Internal");
-
- uiTemplateHeaderButtons(layout);
- uiItemL(layout, headtxt, 0);
- }
-}
-
void text_header_register(ARegionType *art)
{
- HeaderType *ht;
-
- /* header */
- ht= MEM_callocN(sizeof(HeaderType), "spacetype text header");
- strcpy(ht->idname, "TEXT_HT_header");
- ht->draw= text_header_draw;
- BLI_addhead(&art->headertypes, ht);
+ MenuType *mt;
+
+ mt= MEM_callocN(sizeof(MenuType), "spacetype text menu edit");
+ strcpy(mt->idname, "TEXT_MT_edit");
+ strcpy(mt->label, "Edit");
+ mt->draw= text_editmenu;
+ BLI_addhead(&art->menutypes, mt);
+
+ mt= MEM_callocN(sizeof(MenuType), "spacetype text menu format");
+ strcpy(mt->idname, "TEXT_MT_format");
+ strcpy(mt->label, "Format");
+ mt->draw= text_formatmenu;
+ BLI_addhead(&art->menutypes, mt);
}
/************************** properties ******************************/
-static void text_properties_panel_draw(const bContext *C, Panel *panel)
-{
- bScreen *sc= CTX_wm_screen(C);
- SpaceText *st= CTX_wm_space_text(C);
- uiLayout *layout= panel->layout;
- PointerRNA spaceptr;
-
- RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr);
-
- uiLayoutColumn(layout);
- uiItemR(layout, NULL, ICON_LINENUMBERS_OFF, &spaceptr, "line_numbers", 0);
- uiItemR(layout, NULL, ICON_WORDWRAP_OFF, &spaceptr, "word_wrap", 0);
- uiItemR(layout, NULL, ICON_SYNTAX_OFF, &spaceptr, "syntax_highlight", 0);
-
- uiLayoutColumn(layout);
- uiItemR(layout, NULL, 0, &spaceptr, "font_size", 0);
- uiItemR(layout, NULL, 0, &spaceptr, "tab_width", 0);
-}
-
-static void text_find_panel_draw(const bContext *C, Panel *panel)
-{
- bScreen *sc= CTX_wm_screen(C);
- SpaceText *st= CTX_wm_space_text(C);
- uiLayout *layout= panel->layout;
- PointerRNA spaceptr;
-
- RNA_pointer_create(&sc->id, &RNA_SpaceTextEditor, st, &spaceptr);
-
- /* find */
- uiLayoutRow(layout);
- uiItemR(layout, "", 0, &spaceptr, "find_text", 0);
- uiItemO(layout, "", ICON_TEXT, "TEXT_OT_find_set_selected");
- uiLayoutColumn(layout);
- uiItemO(layout, NULL, 0, "TEXT_OT_find");
-
- /* replace */
- uiLayoutRow(layout);
- uiItemR(layout, "", 0, &spaceptr, "replace_text", 0);
- uiItemO(layout, "", ICON_TEXT, "TEXT_OT_replace_set_selected");
- uiLayoutColumn(layout);
- uiItemO(layout, NULL, 0, "TEXT_OT_replace");
-
- /* mark */
- uiLayoutColumn(layout);
- uiItemO(layout, NULL, 0, "TEXT_OT_mark_all");
-
- /* settings */
- uiLayoutColumnFlow(layout, 0);
- uiItemR(layout, "Wrap", 0, &spaceptr, "find_wrap", 0);
- uiItemR(layout, "All", 0, &spaceptr, "find_all", 0);
-}
-
-void text_properties_register(ARegionType *art)
-{
- PanelType *pt;
-
- /* panels: properties */
- pt= MEM_callocN(sizeof(PanelType), "spacetype text panel");
- strcpy(pt->idname, "TEXT_PT_properties");
- strcpy(pt->label, "Properties");
- pt->draw= text_properties_panel_draw;
- BLI_addtail(&art->paneltypes, pt);
-
- /* panels: find */
- pt= MEM_callocN(sizeof(PanelType), "spacetype text panel");
- strcpy(pt->idname, "TEXT_PT_find");
- strcpy(pt->label, "Find");
- pt->draw= text_find_panel_draw;
- BLI_addtail(&art->paneltypes, pt);
-}
-
ARegion *text_has_properties_region(ScrArea *sa)
{
ARegion *ar, *arnew;
@@ -570,75 +320,75 @@ void TEXT_OT_properties(wmOperatorType *ot)
{
// RMB
- uiMenuItem *head;
+ uiPopupMenu *pup;
if(text) {
- head= uiPupMenuBegin("Text", 0);
+ pup= uiPupMenuBegin("Text", 0);
if(txt_has_sel(text)) {
- uiMenuItemO(head, 0, "TEXT_OT_cut");
- uiMenuItemO(head, 0, "TEXT_OT_copy");
+ uiItemO(layout, NULL, 0, "TEXT_OT_cut");
+ uiItemO(layout, NULL, 0, "TEXT_OT_copy");
}
- uiMenuItemO(head, 0, "TEXT_OT_paste");
- uiMenuItemO(head, 0, "TEXT_OT_new");
- uiMenuItemO(head, 0, "TEXT_OT_open");
- uiMenuItemO(head, 0, "TEXT_OT_save");
- uiMenuItemO(head, 0, "TEXT_OT_save_as");
- uiMenuItemO(head, 0, "TEXT_OT_run_script");
- uiPupMenuEnd(C, head);
+ uiItemO(layout, NULL, 0, "TEXT_OT_paste");
+ uiItemO(layout, NULL, 0, "TEXT_OT_new");
+ uiItemO(layout, NULL, 0, "TEXT_OT_open");
+ uiItemO(layout, NULL, 0, "TEXT_OT_save");
+ uiItemO(layout, NULL, 0, "TEXT_OT_save_as");
+ uiItemO(layout, NULL, 0, "TEXT_OT_run_script");
+ uiPupMenuEnd(C, pup);
}
else {
- head= uiPupMenuBegin("File", 0);
- uiMenuItemO(head, 0, "TEXT_OT_new");
- uiMenuItemO(head, 0, "TEXT_OT_open");
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("File", 0);
+ uiItemO(layout, NULL, 0, "TEXT_OT_new");
+ uiItemO(layout, NULL, 0, "TEXT_OT_open");
+ uiPupMenuEnd(C, pup);
}
}
{
// Alt+Shift+E
- uiMenuItem *head;
+ uiPopupMenu *pup;
- head= uiPupMenuBegin("Edit", 0);
- uiMenuItemO(head, 0, "TEXT_OT_cut");
- uiMenuItemO(head, 0, "TEXT_OT_copy");
- uiMenuItemO(head, 0, "TEXT_OT_paste");
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("Edit", 0);
+ uiItemO(layout, NULL, 0, "TEXT_OT_cut");
+ uiItemO(layout, NULL, 0, "TEXT_OT_copy");
+ uiItemO(layout, NULL, 0, "TEXT_OT_paste");
+ uiPupMenuEnd(C, pup);
}
{
// Alt+Shift+F
- uiMenuItem *head;
+ uiPopupMenu *pup;
if(text) {
- head= uiPupMenuBegin("Text", 0);
- uiMenuItemO(head, 0, "TEXT_OT_new");
- uiMenuItemO(head, 0, "TEXT_OT_open");
- uiMenuItemO(head, 0, "TEXT_OT_save");
- uiMenuItemO(head, 0, "TEXT_OT_save_as");
- uiMenuItemO(head, 0, "TEXT_OT_run_script");
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("Text", 0);
+ uiItemO(layout, NULL, 0, "TEXT_OT_new");
+ uiItemO(layout, NULL, 0, "TEXT_OT_open");
+ uiItemO(layout, NULL, 0, "TEXT_OT_save");
+ uiItemO(layout, NULL, 0, "TEXT_OT_save_as");
+ uiItemO(layout, NULL, 0, "TEXT_OT_run_script");
+ uiPupMenuEnd(C, pup);
}
else {
- head= uiPupMenuBegin("File", 0);
- uiMenuItemO(head, 0, "TEXT_OT_new");
- uiMenuItemO(head, 0, "TEXT_OT_open");
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("File", 0);
+ uiItemO(layout, NULL, 0, "TEXT_OT_new");
+ uiItemO(layout, NULL, 0, "TEXT_OT_open");
+ uiPupMenuEnd(C, pup);
}
}
{
// Alt+Shift+V
- uiMenuItem *head;
+ uiPopupMenu *pup;
- head= uiPupMenuBegin("Text", 0);
- uiMenuItemEnumO(head, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP);
- uiMenuItemEnumO(head, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM);
- uiMenuItemEnumO(head, "Page Up", 0, "TEXT_OT_move", "type", PREV_PAGE);
- uiMenuItemEnumO(head, "Page Down", 0, "TEXT_OT_move", "type", NEXT_PAGE);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("Text", 0);
+ uiItemEnumO(layout, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP);
+ uiItemEnumO(layout, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM);
+ uiItemEnumO(layout, "Page Up", 0, "TEXT_OT_move", "type", PREV_PAGE);
+ uiItemEnumO(layout, "Page Down", 0, "TEXT_OT_move", "type", NEXT_PAGE);
+ uiPupMenuEnd(C, pup);
}
#endif
diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h
index 7ec75e292ce..50109ba8c42 100644
--- a/source/blender/editors/space_text/text_intern.h
+++ b/source/blender/editors/space_text/text_intern.h
@@ -43,7 +43,6 @@ struct wmOperatorType;
struct wmWindowManager;
/* text_header.c */
-void text_properties_register(struct ARegionType *art);
void text_header_register(struct ARegionType *art);
/* text_draw.c */
@@ -106,6 +105,7 @@ enum { DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_NEXT_WORD, DEL_PREV_WORD };
void TEXT_OT_new(struct wmOperatorType *ot);
void TEXT_OT_open(struct wmOperatorType *ot);
void TEXT_OT_reload(struct wmOperatorType *ot);
+void TEXT_OT_unlink(struct wmOperatorType *ot);
void TEXT_OT_save(struct wmOperatorType *ot);
void TEXT_OT_save_as(struct wmOperatorType *ot);
void TEXT_OT_make_internal(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index c7fe02975ef..913bd307ab2 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -49,6 +49,7 @@
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_suggestions.h"
@@ -269,6 +270,90 @@ void TEXT_OT_reload(wmOperatorType *ot)
ot->poll= text_edit_poll;
}
+/******************* delete operator *********************/
+
+static void text_unlink(Main *bmain, Text *text)
+{
+ bScreen *scr;
+ ScrArea *area;
+ SpaceLink *sl;
+
+ /* XXX this ifdef is in fact dangerous, if python is
+ * disabled it will leave invalid pointers in files! */
+
+#ifndef DISABLE_PYTHON
+ // XXX BPY_clear_bad_scriptlinks(text);
+ // XXX BPY_free_pyconstraint_links(text);
+ // XXX free_text_controllers(text);
+ // XXX free_dome_warp_text(text);
+
+ /* check if this text was used as script link:
+ * this check function unsets the pointers and returns how many
+ * script links used this Text */
+ if(0) // XXX BPY_text_check_all_scriptlinks (text))
+ ; // XXX notifier: allqueue(REDRAWBUTSSCRIPT, 0);
+
+ /* equivalently for pynodes: */
+ if(0) // XXX nodeDynamicUnlinkText ((ID*)text))
+ ; // XXX notifier: allqueue(REDRAWNODE, 0);
+#endif
+
+ for(scr= bmain->screen.first; scr; scr= scr->id.next) {
+ for(area= scr->areabase.first; area; area= area->next) {
+ for(sl= area->spacedata.first; sl; sl= sl->next) {
+ if(sl->spacetype==SPACE_TEXT) {
+ SpaceText *st= (SpaceText*) sl;
+
+ if(st->text==text) {
+ st->text= NULL;
+ st->top= 0;
+
+ if(st==area->spacedata.first)
+ ED_area_tag_redraw(area);
+ }
+ }
+ }
+ }
+ }
+
+ free_libblock(&bmain->text, text);
+}
+
+static int unlink_exec(bContext *C, wmOperator *op)
+{
+ SpaceText *st= CTX_wm_space_text(C);
+ Text *text= CTX_data_edit_text(C);
+
+ /* make the previous text active, if its not there make the next text active */
+ if(st) {
+ if(text->id.prev) {
+ st->text = text->id.prev;
+ WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
+ }
+ else if(text->id.next) {
+ st->text = text->id.next;
+ WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
+ }
+ }
+
+ text_unlink(CTX_data_main(C), text);
+ WM_event_add_notifier(C, NC_TEXT|NA_REMOVED, text);
+
+ return OPERATOR_FINISHED;
+}
+
+void TEXT_OT_unlink(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Unlink";
+ ot->idname= "TEXT_OT_unlink";
+
+ /* api callbacks */
+ ot->exec= unlink_exec;
+ ot->invoke= WM_operator_confirm;
+ ot->poll= text_edit_poll;
+}
+
/******************* make internal operator *********************/
static int make_internal_exec(bContext *C, wmOperator *op)
@@ -2448,31 +2533,35 @@ static int resolve_conflict_exec(bContext *C, wmOperator *op)
static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Text *text= CTX_data_edit_text(C);
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
switch(text_file_modified(text)) {
case 1:
if(text->flags & TXT_ISDIRTY) {
/* modified locally and externally, ahhh. offer more possibilites. */
- head= uiPupMenuBegin("File Modified Outside and Inside Blender", 0);
- uiMenuItemEnumO(head, "Reload from disk (ignore local changes)", 0, op->type->idname, "resolution", RESOLVE_RELOAD);
- uiMenuItemEnumO(head, "Save to disk (ignore outside changes)", 0, op->type->idname, "resolution", RESOLVE_SAVE);
- uiMenuItemEnumO(head, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("File Modified Outside and Inside Blender", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemEnumO(layout, "Reload from disk (ignore local changes)", 0, op->type->idname, "resolution", RESOLVE_RELOAD);
+ uiItemEnumO(layout, "Save to disk (ignore outside changes)", 0, op->type->idname, "resolution", RESOLVE_SAVE);
+ uiItemEnumO(layout, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
+ uiPupMenuEnd(C, pup);
}
else {
- head= uiPupMenuBegin("File Modified Outside Blender", 0);
- uiMenuItemEnumO(head, "Reload from disk", 0, op->type->idname, "resolution", RESOLVE_RELOAD);
- uiMenuItemEnumO(head, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
- uiMenuItemEnumO(head, "Ignore", 0, op->type->idname, "resolution", RESOLVE_IGNORE);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("File Modified Outside Blender", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemEnumO(layout, "Reload from disk", 0, op->type->idname, "resolution", RESOLVE_RELOAD);
+ uiItemEnumO(layout, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
+ uiItemEnumO(layout, "Ignore", 0, op->type->idname, "resolution", RESOLVE_IGNORE);
+ uiPupMenuEnd(C, pup);
}
break;
case 2:
- head= uiPupMenuBegin("File Deleted Outside Blender", 0);
- uiMenuItemEnumO(head, "Make text internal", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
- uiMenuItemEnumO(head, "Recreate file", 0, op->type->idname, "resolution", RESOLVE_SAVE);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("File Deleted Outside Blender", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemEnumO(layout, "Make text internal", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL);
+ uiItemEnumO(layout, "Recreate file", 0, op->type->idname, "resolution", RESOLVE_SAVE);
+ uiPupMenuEnd(C, pup);
break;
}
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 5d149fb2f9b..e968756b11a 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -620,82 +620,82 @@ static void do_view3d_viewmenu(bContext *C, void *arg, int event)
}
#endif
-static void view3d_view_viewnavmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_view_viewnavmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
-// uiMenuItemO(head, 0, "VIEW3D_OT_view_fly_mode");
+// uiItemO(layout, NULL, 0, "VIEW3D_OT_view_fly_mode");
-// uiMenuSeparator(head);
+// uiItemS(layout);
- uiMenuItemsEnumO(head, "VIEW3D_OT_view_orbit", "type");
+ uiItemsEnumO(layout, "VIEW3D_OT_view_orbit", "type");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemsEnumO(head, "VIEW3D_OT_view_pan", "type");
+ uiItemsEnumO(layout, "VIEW3D_OT_view_pan", "type");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemFloatO(head, "Zoom in", 0, "VIEW3D_OT_zoom", "delta", 1.0f);
- uiMenuItemFloatO(head, "Zoom out", 0, "VIEW3D_OT_zoom", "delta", -1.0f);
+ uiItemFloatO(layout, "Zoom in", 0, "VIEW3D_OT_zoom", "delta", 1.0f);
+ uiItemFloatO(layout, "Zoom out", 0, "VIEW3D_OT_zoom", "delta", -1.0f);
}
-static void view3d_view_alignviewmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_view_alignviewmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
}
-static void view3d_viewmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
ScrArea *sa= CTX_wm_area(C);
-// uiMenuItemO(head, ICON_MENU_PANEL, "VIEW3D_OT_toggle_transform_orientations_panel"); // Transform Orientations...
-// uiMenuItemO(head, ICON_MENU_PANEL, "VIEW3D_OT_toggle_render_preview_panel"); // render preview...
-// uiMenuItemO(head, ICON_MENU_PANEL, "VIEW3D_OT_toggle_view_properties_panel"); // View Properties....
-// uiMenuItemO(head, ICON_MENU_PANEL, "VIEW3D_OT_toggle_background_image_panel"); // Background Image....
-// uiMenuItemO(head, ICON_MENU_PANEL, "VIEW3D_OT_toggle_grease_pencil_panel"); // Grease Pencil....
+// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_transform_orientations_panel"); // Transform Orientations...
+// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_render_preview_panel"); // render preview...
+// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_view_properties_panel"); // View Properties....
+// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_background_image_panel"); // Background Image....
+// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_grease_pencil_panel"); // Grease Pencil....
-// uiMenuSeparator(head);
+// uiItemS(layout);
- uiMenuItemEnumO(head, "", 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_CAMERA);
- uiMenuItemEnumO(head, "", 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_TOP);
- uiMenuItemEnumO(head, "", 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_FRONT);
- uiMenuItemEnumO(head, "", 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_RIGHT);
+ uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_CAMERA);
+ uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_TOP);
+ uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_FRONT);
+ uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_RIGHT);
- //uiMenuLevel(head, "Cameras", view3d_view_camerasmenu);
+ //uiItemLevel(layout, "Cameras", view3d_view_camerasmenu);
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "VIEW3D_OT_view_persportho");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_view_persportho");
- uiMenuSeparator(head);
+ uiItemS(layout);
-// uiMenuItemO(head, 0, "VIEW3D_OT_view_show_all_layers");
+// uiItemO(layout, NULL, 0, "VIEW3D_OT_view_show_all_layers");
-// uiMenuSeparator(head);
+// uiItemS(layout);
-// uiMenuItemO(head, 0, "VIEW3D_OT_view_local_view");
-// uiMenuItemO(head, 0, "VIEW3D_OT_view_global_view");
+// uiItemO(layout, NULL, 0, "VIEW3D_OT_view_local_view");
+// uiItemO(layout, NULL, 0, "VIEW3D_OT_view_global_view");
-// uiMenuSeparator(head);
+// uiItemS(layout);
- uiMenuLevel(head, "View Navigation", view3d_view_viewnavmenu);
- uiMenuLevel(head, "Align View", view3d_view_alignviewmenu);
+ uiItemLevel(layout, "View Navigation", 0, view3d_view_viewnavmenu);
+ uiItemLevel(layout, "Align View", 0, view3d_view_alignviewmenu);
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuContext(head, WM_OP_INVOKE_REGION_WIN);
+ uiLayoutContext(layout, WM_OP_INVOKE_REGION_WIN);
- uiMenuItemO(head, 0, "VIEW3D_OT_clipping");
- uiMenuItemO(head, 0, "VIEW3D_OT_zoom_border");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_clipping");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_zoom_border");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "VIEW3D_OT_viewcenter");
- uiMenuItemO(head, 0, "VIEW3D_OT_viewhome");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_viewcenter");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_viewhome");
- uiMenuSeparator(head);
+ uiItemS(layout);
- if(sa->full) uiMenuItemO(head, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
- else uiMenuItemO(head, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctr DownArrow
+ if(sa->full) uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
+ else uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctr DownArrow
}
#if 0
static uiBlock *view3d_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
@@ -1208,39 +1208,39 @@ static uiBlock *view3d_select_meshmenu(bContext *C, ARegion *ar, void *arg_unuse
return block;
}
-static void view3d_select_curvemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_select_curvemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
Object *obedit= CTX_data_edit_object(C);
- uiMenuItemO(head, 0, "VIEW3D_OT_select_border");
- uiMenuItemO(head, 0, "VIEW3D_OT_select_circle");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_select_circle");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "CURVE_OT_select_all_toggle");
- uiMenuItemO(head, 0, "CURVE_OT_select_invert");
- uiMenuItemO(head, 0, "CURVE_OT_select_random"); // Random...
- uiMenuItemO(head, 0, "CURVE_OT_select_every_nth"); // Every Nth..
+ uiItemO(layout, NULL, 0, "CURVE_OT_select_all_toggle");
+ uiItemO(layout, NULL, 0, "CURVE_OT_select_invert");
+ uiItemO(layout, NULL, 0, "CURVE_OT_select_random"); // Random...
+ uiItemO(layout, NULL, 0, "CURVE_OT_select_every_nth"); // Every Nth..
- uiMenuSeparator(head);
+ uiItemS(layout);
if(obedit->type == OB_SURF) {
- uiMenuItemO(head, 0, "CURVE_OT_select_row");
+ uiItemO(layout, NULL, 0, "CURVE_OT_select_row");
}
else {
- uiMenuItemO(head, 0, "CURVE_OT_de_select_first");
- uiMenuItemO(head, 0, "CURVE_OT_de_select_last");
- uiMenuItemO(head, 0, "CURVE_OT_select_next");
- uiMenuItemO(head, 0, "CURVE_OT_select_previous");
+ uiItemO(layout, NULL, 0, "CURVE_OT_de_select_first");
+ uiItemO(layout, NULL, 0, "CURVE_OT_de_select_last");
+ uiItemO(layout, NULL, 0, "CURVE_OT_select_next");
+ uiItemO(layout, NULL, 0, "CURVE_OT_select_previous");
}
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "CURVE_OT_select_more");
- uiMenuItemO(head, 0, "CURVE_OT_select_less");
+ uiItemO(layout, NULL, 0, "CURVE_OT_select_more");
+ uiItemO(layout, NULL, 0, "CURVE_OT_select_less");
/* commented out because it seems to only like the LKEY method - based on mouse pointer position :( */
- /* uiMenuItemO(head, 0, "CURVE_OT_select_linked"); */
+ /* uiItemO(layout, NULL, 0, "CURVE_OT_select_linked"); */
#if 0
G.qual |= LR_CTRLKEY;
@@ -3288,44 +3288,44 @@ static uiBlock *view3d_edit_meshmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void view3d_edit_curve_controlpointsmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_edit_curve_controlpointsmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
Object *obedit= CTX_data_edit_object(C);
if(obedit->type == OB_CURVE) {
- uiMenuItemEnumO(head, "", 0, "TFM_OT_transform", "mode", TFM_TILT);
- uiMenuItemO(head, 0, "CURVE_OT_tilt_clear");
- uiMenuItemO(head, 0, "CURVE_OT_separate");
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_TILT);
+ uiItemO(layout, NULL, 0, "CURVE_OT_tilt_clear");
+ uiItemO(layout, NULL, 0, "CURVE_OT_separate");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemEnumO(head, "", 0, "CURVE_OT_handle_type_set", "type", 1);
- uiMenuItemEnumO(head, "", 0, "CURVE_OT_handle_type_set", "type", 3);
- uiMenuItemEnumO(head, "", 0, "CURVE_OT_handle_type_set", "type", 2);
+ uiItemEnumO(layout, NULL, 0, "CURVE_OT_handle_type_set", "type", 1);
+ uiItemEnumO(layout, NULL, 0, "CURVE_OT_handle_type_set", "type", 3);
+ uiItemEnumO(layout, NULL, 0, "CURVE_OT_handle_type_set", "type", 2);
- uiMenuSeparator(head);
+ uiItemS(layout);
}
- // XXX uiMenuItemO(head, 0, "OBJECT_OT_make_vertex_parent"); Make VertexParent|Ctrl P
+ // XXX uiItemO(layout, NULL, 0, "OBJECT_OT_make_vertex_parent"); Make VertexParent|Ctrl P
// make_parent()
- // XXX uiMenuItemO(head, 0, "OBJECT_OT_add_hook"); Add Hook| Ctrl H
+ // XXX uiItemO(layout, NULL, 0, "OBJECT_OT_add_hook"); Add Hook| Ctrl H
// add_hook_menu()
}
-static void view3d_edit_curve_segmentsmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_edit_curve_segmentsmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemO(head, 0, "CURVE_OT_subdivide");
- uiMenuItemO(head, 0, "CURVE_OT_switch_direction");
+ uiItemO(layout, NULL, 0, "CURVE_OT_subdivide");
+ uiItemO(layout, NULL, 0, "CURVE_OT_switch_direction");
}
-static void view3d_edit_curve_showhidemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_edit_curve_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemO(head, 0, "CURVE_OT_reveal");
- uiMenuItemO(head, 0, "CURVE_OT_hide");
- uiMenuItemBooleanO(head, "Hide Unselected", 0, "CURVE_OT_hide", "unselected", 1);
+ uiItemO(layout, NULL, 0, "CURVE_OT_reveal");
+ uiItemO(layout, NULL, 0, "CURVE_OT_hide");
+ uiItemBooleanO(layout, "Hide Unselected", 0, "CURVE_OT_hide", "unselected", 1);
}
-static void view3d_edit_curvemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_edit_curvemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
PointerRNA sceneptr;
Scene *scene= CTX_data_scene(C);
@@ -3338,7 +3338,7 @@ static void view3d_edit_curvemenu(bContext *C, uiMenuItem *head, void *arg_unuse
uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
- uiMenuSeparator(head);
+ uiItemS(layout);
#endif
// XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
@@ -3347,26 +3347,26 @@ static void view3d_edit_curvemenu(bContext *C, uiMenuItem *head, void *arg_unuse
// common_deletekey();
- uiMenuItemO(head, 0, "CURVE_OT_extrude");
- uiMenuItemO(head, 0, "CURVE_OT_duplicate");
- uiMenuItemO(head, 0, "CURVE_OT_separate");
- uiMenuItemO(head, 0, "CURVE_OT_make_segment");
- uiMenuItemO(head, 0, "CURVE_OT_cyclic_toggle");
- uiMenuItemO(head, 0, "CURVE_OT_delete"); // Delete...
+ uiItemO(layout, NULL, 0, "CURVE_OT_extrude");
+ uiItemO(layout, NULL, 0, "CURVE_OT_duplicate");
+ uiItemO(layout, NULL, 0, "CURVE_OT_separate");
+ uiItemO(layout, NULL, 0, "CURVE_OT_make_segment");
+ uiItemO(layout, NULL, 0, "CURVE_OT_cyclic_toggle");
+ uiItemO(layout, NULL, 0, "CURVE_OT_delete"); // Delete...
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuLevel(head, "Control Points", view3d_edit_curve_controlpointsmenu);
- uiMenuLevel(head, "Segments", view3d_edit_curve_segmentsmenu);
+ uiItemLevel(layout, "Control Points", 0, view3d_edit_curve_controlpointsmenu);
+ uiItemLevel(layout, "Segments", 0, view3d_edit_curve_segmentsmenu);
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemBooleanR(head, &sceneptr, "proportional_editing"); // |O
- uiMenuLevelEnumR(head, &sceneptr, "proportional_editing_falloff");
+ uiItemR(layout, NULL, 0, &sceneptr, "proportional_editing", 0); // |O
+ uiItemLevelEnumR(layout, NULL, 0, &sceneptr, "proportional_editing_falloff");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuLevel(head, "Show/Hide Control Points", view3d_edit_curve_showhidemenu);
+ uiItemLevel(layout, "Show/Hide Control Points", 0, view3d_edit_curve_showhidemenu);
}
static void do_view3d_edit_mball_showhidemenu(bContext *C, void *arg, int event)
@@ -3477,43 +3477,43 @@ static uiBlock *view3d_edit_metaballmenu(bContext *C, ARegion *ar, void *arg_unu
return block;
}
-static void view3d_edit_text_charsmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_edit_text_charsmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
/* the character codes are specified in UTF-8 */
- uiMenuItemStringO(head, "Copyright|Alt C", 0, "FONT_OT_text_insert", "text", "\xC2\xA9");
- uiMenuItemStringO(head, "Registered Trademark|Alt R", 0, "FONT_OT_text_insert", "text", "\xC2\xAE");
+ uiItemStringO(layout, "Copyright|Alt C", 0, "FONT_OT_text_insert", "text", "\xC2\xA9");
+ uiItemStringO(layout, "Registered Trademark|Alt R", 0, "FONT_OT_text_insert", "text", "\xC2\xAE");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemStringO(head, "Degree Sign|Alt G", 0, "FONT_OT_text_insert", "text", "\xC2\xB0");
- uiMenuItemStringO(head, "Multiplication Sign|Alt x", 0, "FONT_OT_text_insert", "text", "\xC3\x97");
- uiMenuItemStringO(head, "Circle|Alt .", 0, "FONT_OT_text_insert", "text", "\xC2\x8A");
- uiMenuItemStringO(head, "Superscript 1|Alt 1", 0, "FONT_OT_text_insert", "text", "\xC2\xB9");
- uiMenuItemStringO(head, "Superscript 2|Alt 2", 0, "FONT_OT_text_insert", "text", "\xC2\xB2");
- uiMenuItemStringO(head, "Superscript 3|Alt 3", 0, "FONT_OT_text_insert", "text", "\xC2\xB3");
- uiMenuItemStringO(head, "Double >>|Alt >", 0, "FONT_OT_text_insert", "text", "\xC2\xBB");
- uiMenuItemStringO(head, "Double <<|Alt <", 0, "FONT_OT_text_insert", "text", "\xC2\xAB");
- uiMenuItemStringO(head, "Promillage|Alt %", 0, "FONT_OT_text_insert", "text", "\xE2\x80\xB0");
+ uiItemStringO(layout, "Degree Sign|Alt G", 0, "FONT_OT_text_insert", "text", "\xC2\xB0");
+ uiItemStringO(layout, "Multiplication Sign|Alt x", 0, "FONT_OT_text_insert", "text", "\xC3\x97");
+ uiItemStringO(layout, "Circle|Alt .", 0, "FONT_OT_text_insert", "text", "\xC2\x8A");
+ uiItemStringO(layout, "Superscript 1|Alt 1", 0, "FONT_OT_text_insert", "text", "\xC2\xB9");
+ uiItemStringO(layout, "Superscript 2|Alt 2", 0, "FONT_OT_text_insert", "text", "\xC2\xB2");
+ uiItemStringO(layout, "Superscript 3|Alt 3", 0, "FONT_OT_text_insert", "text", "\xC2\xB3");
+ uiItemStringO(layout, "Double >>|Alt >", 0, "FONT_OT_text_insert", "text", "\xC2\xBB");
+ uiItemStringO(layout, "Double <<|Alt <", 0, "FONT_OT_text_insert", "text", "\xC2\xAB");
+ uiItemStringO(layout, "Promillage|Alt %", 0, "FONT_OT_text_insert", "text", "\xE2\x80\xB0");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemStringO(head, "Dutch Florin|Alt F", 0, "FONT_OT_text_insert", "text", "\xC2\xA4");
- uiMenuItemStringO(head, "British Pound|Alt L", 0, "FONT_OT_text_insert", "text", "\xC2\xA3");
- uiMenuItemStringO(head, "Japanese Yen|Alt Y", 0, "FONT_OT_text_insert", "text", "\xC2\xA5");
+ uiItemStringO(layout, "Dutch Florin|Alt F", 0, "FONT_OT_text_insert", "text", "\xC2\xA4");
+ uiItemStringO(layout, "British Pound|Alt L", 0, "FONT_OT_text_insert", "text", "\xC2\xA3");
+ uiItemStringO(layout, "Japanese Yen|Alt Y", 0, "FONT_OT_text_insert", "text", "\xC2\xA5");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemStringO(head, "German S|Alt S", 0, "FONT_OT_text_insert", "text", "\xC3\x9F");
- uiMenuItemStringO(head, "Spanish Question Mark|Alt ?", 0, "FONT_OT_text_insert", "text", "\xC2\xBF");
- uiMenuItemStringO(head, "Spanish Exclamation Mark|Alt !", 0, "FONT_OT_text_insert", "text", "\xC2\xA1");
+ uiItemStringO(layout, "German S|Alt S", 0, "FONT_OT_text_insert", "text", "\xC3\x9F");
+ uiItemStringO(layout, "Spanish Question Mark|Alt ?", 0, "FONT_OT_text_insert", "text", "\xC2\xBF");
+ uiItemStringO(layout, "Spanish Exclamation Mark|Alt !", 0, "FONT_OT_text_insert", "text", "\xC2\xA1");
}
-static void view3d_edit_textmenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_edit_textmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemO(head, 0, "FONT_OT_file_paste");
- uiMenuSeparator(head);
- uiMenuLevel(head, "Special Characters", view3d_edit_text_charsmenu);
+ uiItemO(layout, NULL, 0, "FONT_OT_file_paste");
+ uiItemS(layout);
+ uiItemLevel(layout, "Special Characters", 0, view3d_edit_text_charsmenu);
}
static void do_view3d_edit_latticemenu(bContext *C, void *arg, int event)
@@ -4527,7 +4527,7 @@ uiBlock *view3d_sculpt_inputmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void view3d_sculpt_menu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_sculpt_menu(bContext *C, uiLayout *layout, void *arg_unused)
{
bScreen *sc= CTX_wm_screen(C);
Sculpt *s = CTX_data_tool_settings(C)->sculpt;
@@ -4535,30 +4535,30 @@ static void view3d_sculpt_menu(bContext *C, uiMenuItem *head, void *arg_unused)
RNA_pointer_create(&sc->id, &RNA_Sculpt, s, &rna);
- uiMenuItemBooleanR(head, &rna, "symmetry_x");
- uiMenuItemBooleanR(head, &rna, "symmetry_y");
- uiMenuItemBooleanR(head, &rna, "symmetry_z");
- uiMenuItemBooleanR(head, &rna, "lock_x");
- uiMenuItemBooleanR(head, &rna, "lock_y");
- uiMenuItemBooleanR(head, &rna, "lock_z");
+ uiItemR(layout, NULL, 0, &rna, "symmetry_x", 0);
+ uiItemR(layout, NULL, 0, &rna, "symmetry_y", 0);
+ uiItemR(layout, NULL, 0, &rna, "symmetry_z", 0);
+ uiItemR(layout, NULL, 0, &rna, "lock_x", 0);
+ uiItemR(layout, NULL, 0, &rna, "lock_y", 0);
+ uiItemR(layout, NULL, 0, &rna, "lock_z", 0);
/* Brush settings */
RNA_pointer_create(&sc->id, &RNA_Brush, s->brush, &rna);
/* Curve */
- uiMenuSeparator(head);
- uiMenuItemEnumO(head, "", 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SHARP);
- uiMenuItemEnumO(head, "", 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SMOOTH);
- uiMenuItemEnumO(head, "", 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_MAX);
+ uiItemS(layout);
+ uiItemEnumO(layout, NULL, 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SHARP);
+ uiItemEnumO(layout, NULL, 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SMOOTH);
+ uiItemEnumO(layout, NULL, 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_MAX);
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemBooleanR(head, &rna, "airbrush");
- uiMenuItemBooleanR(head, &rna, "rake");
- uiMenuItemBooleanR(head, &rna, "anchored");
- uiMenuItemBooleanR(head, &rna, "space");
+ uiItemR(layout, NULL, 0, &rna, "airbrush", 0);
+ uiItemR(layout, NULL, 0, &rna, "rake", 0);
+ uiItemR(layout, NULL, 0, &rna, "anchored", 0);
+ uiItemR(layout, NULL, 0, &rna, "space", 0);
- uiMenuItemBooleanR(head, &rna, "flip_direction");
+ uiItemR(layout, NULL, 0, &rna, "flip_direction", 0);
}
uiBlock *view3d_sculptmenu(bContext *C, ARegion *ar, void *arg_unused)
@@ -4695,59 +4695,59 @@ static uiBlock *view3d_faceselmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void view3d_select_particlemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_select_particlemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
Scene *scene= CTX_data_scene(C);
- uiMenuItemO(head, 0, "VIEW3D_OT_select_border");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "PARTICLE_OT_select_all_toggle");
- uiMenuItemO(head, 0, "PARTICLE_OT_select_linked");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_select_all_toggle");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_select_linked");
if(scene->selectmode & SCE_SELECT_POINT) {
- uiMenuItemO(head, 0, "PARTICLE_OT_select_last"); // |W, 4
- uiMenuItemO(head, 0, "PARTICLE_OT_select_first"); // |W, 3
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_select_last"); // |W, 4
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_select_first"); // |W, 3
}
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "PARTICLE_OT_select_more");
- uiMenuItemO(head, 0, "PARTICLE_OT_select_less");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_select_more");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_select_less");
}
-static void view3d_particle_showhidemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_particle_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiMenuItemO(head, 0, "PARTICLE_OT_reveal");
- uiMenuItemO(head, 0, "PARTICLE_OT_hide");
- uiMenuItemBooleanO(head, "Hide Unselected", 0, "PARTICLE_OT_hide", "unselected", 1);
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_reveal");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_hide");
+ uiItemBooleanO(layout, "Hide Unselected", 0, "PARTICLE_OT_hide", "unselected", 1);
}
-static void view3d_particlemenu(bContext *C, uiMenuItem *head, void *arg_unused)
+static void view3d_particlemenu(bContext *C, uiLayout *layout, void *arg_unused)
{
Scene *scene= CTX_data_scene(C);
// XXX uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Particle Edit Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
// add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
- // XXX uiMenuSeparator(head);
+ // XXX uiItemS(layout);
//
// XXX uiDefIconTextBut(block, BUTM, 1, (pset->flag & PE_X_MIRROR)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT, "X-Axis Mirror Editing", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
// pset->flag ^= PE_X_MIRROR;
- uiMenuItemO(head, 0, "PARTICLE_OT_mirror"); // |Ctrl M
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_mirror"); // |Ctrl M
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuItemO(head, 0, "PARTICLE_OT_remove_doubles"); // |W, 5
- uiMenuItemO(head, 0, "PARTICLE_OT_delete");
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_remove_doubles"); // |W, 5
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_delete");
if(scene->selectmode & SCE_SELECT_POINT)
- uiMenuItemO(head, 0, "PARTICLE_OT_subdivide"); // |W, 2
- uiMenuItemO(head, 0, "PARTICLE_OT_rekey"); // |W, 1
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_subdivide"); // |W, 2
+ uiItemO(layout, NULL, 0, "PARTICLE_OT_rekey"); // |W, 1
- uiMenuSeparator(head);
+ uiItemS(layout);
- uiMenuLevel(head, "Show/Hide Particles", view3d_particle_showhidemenu);
+ uiItemLevel(layout, "Show/Hide Particles", 0, view3d_particle_showhidemenu);
}
static char *view3d_modeselect_pup(Scene *scene)
@@ -5553,18 +5553,20 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
/* edit face toolbox */
static int editmesh_face_toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
- head= uiPupMenuBegin("Edit Faces", 0);
+ pup= uiPupMenuBegin("Edit Faces", 0);
+ layout= uiPupMenuLayout(pup);
- uiMenuItemO(head, 0, "MESH_OT_fill");
- uiMenuItemO(head, 0, "MESH_OT_beauty_fill");
- uiMenuItemO(head, 0, "MESH_OT_quads_convert_to_tris");
- uiMenuItemO(head, 0, "MESH_OT_tris_convert_to_quads");
- uiMenuItemO(head, 0, "MESH_OT_edge_flip");
- uiMenuItemO(head, 0, "MESH_OT_faces_shade_smooth");
- uiMenuItemO(head, 0, "MESH_OT_faces_shade_solid");
- uiPupMenuEnd(C, head);
+ uiItemO(layout, NULL, 0, "MESH_OT_fill");
+ uiItemO(layout, NULL, 0, "MESH_OT_beauty_fill");
+ uiItemO(layout, NULL, 0, "MESH_OT_quads_convert_to_tris");
+ uiItemO(layout, NULL, 0, "MESH_OT_tris_convert_to_quads");
+ uiItemO(layout, NULL, 0, "MESH_OT_edge_flip");
+ uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
+ uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_solid");
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index ad9d3f85538..7b417c94a73 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -1113,17 +1113,18 @@ int minmax_verts(Object *obedit, float *min, float *max)
static int snap_menu_invoke(bContext *C, wmOperator *unused, wmEvent *event)
{
- uiMenuItem *head= uiPupMenuBegin("Snap", 0);
+ uiPopupMenu *pup= uiPupMenuBegin("Snap", 0);
+ uiLayout *layout= uiPupMenuLayout(pup);
- uiMenuItemO(head, 0, "VIEW3D_OT_snap_selected_to_grid");
- uiMenuItemO(head, 0, "VIEW3D_OT_snap_selected_to_cursor");
- uiMenuItemO(head, 0, "VIEW3D_OT_snap_selected_to_center");
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "VIEW3D_OT_snap_cursor_to_selected");
- uiMenuItemO(head, 0, "VIEW3D_OT_snap_cursor_to_grid");
- uiMenuItemO(head, 0, "VIEW3D_OT_snap_cursor_to_active");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_grid");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_cursor");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_center");
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_selected");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_grid");
+ uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_active");
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
/* this operator is only for a menu, not used further */
return OPERATOR_CANCELLED;
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index f5a581fc4fd..46a6f121990 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -119,11 +119,13 @@ static int select_orientation_exec(bContext *C, wmOperator *op)
static int select_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
- head= uiPupMenuBegin("Orientation", 0);
- BIF_menuTransformOrientation(C, head, NULL);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("Orientation", 0);
+ layout= uiPupMenuLayout(pup);
+ BIF_menuTransformOrientation(C, layout, NULL);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index df785f92166..06fc7d99659 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -354,19 +354,19 @@ void BIF_selectTransformOrientationValue(bContext *C, int orientation) {
v3d->twmode = orientation;
}
-void BIF_menuTransformOrientation(bContext *C, uiMenuItem *head, void *arg)
+void BIF_menuTransformOrientation(bContext *C, uiLayout *layout, void *arg)
{
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts;
int i= V3D_MANIP_CUSTOM;
- uiMenuItemEnumO(head, "", 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_GLOBAL);
- uiMenuItemEnumO(head, "", 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_LOCAL);
- uiMenuItemEnumO(head, "", 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_NORMAL);
- uiMenuItemEnumO(head, "", 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_VIEW);
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_GLOBAL);
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_LOCAL);
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_NORMAL);
+ uiItemEnumO(layout, NULL, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_VIEW);
for(ts = transform_spaces->first; ts; ts = ts->next)
- uiMenuItemIntO(head, ts->name, 0, "TFM_OT_select_orientation", "custom_index", i++);
+ uiItemIntO(layout, ts->name, 0, "TFM_OT_select_orientation", "custom_index", i++);
}
char * BIF_menustringTransformOrientation(const bContext *C, char *title) {
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 4d12700d98c..be571c132ab 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -1284,18 +1284,22 @@ void UV_OT_cube_project(wmOperatorType *ot)
static int mapping_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- uiMenuItem *head;
-
- head= uiPupMenuBegin("UV Mapping", 0);
- uiMenuItemO(head, 0, "UV_OT_unwrap");
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "UV_OT_cube_project");
- uiMenuItemO(head, 0, "UV_OT_cylinder_project");
- uiMenuItemO(head, 0, "UV_OT_sphere_project");
- uiMenuItemO(head, 0, "UV_OT_project_from_view");
- uiMenuSeparator(head);
- uiMenuItemO(head, 0, "UV_OT_reset");
- uiPupMenuEnd(C, head);
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin("UV Mapping", 0);
+ layout= uiPupMenuLayout(pup);
+
+ uiItemO(layout, NULL, 0, "UV_OT_unwrap");
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "UV_OT_cube_project");
+ uiItemO(layout, NULL, 0, "UV_OT_cylinder_project");
+ uiItemO(layout, NULL, 0, "UV_OT_sphere_project");
+ uiItemO(layout, NULL, 0, "UV_OT_project_from_view");
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "UV_OT_reset");
+
+ uiPupMenuEnd(C, pup);
/* XXX python */
#ifndef DISABLE_PYTHON
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index d131bfc2081..77b0d6e2d49 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -110,6 +110,11 @@ typedef struct Header {
struct uiLayout *layout; /* runtime for drawing */
} Header;
+typedef struct Menu {
+ struct MenuType *type; /* runtime */
+ struct uiLayout *layout; /* runtime for drawing */
+} Menu;
+
typedef struct ScrArea {
struct ScrArea *next, *prev;
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index a3dc657217a..0e19a6845da 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -137,9 +137,9 @@ typedef struct SpaceButs {
short re_align;
short oldkeypress; /* for keeping track of the sub tab key cycling */
- char pad, flag;
+ char flag, texact;
- char texact, tab[7]; /* storing tabs for each context */
+ char tab[8]; /* storing tabs for each context */
} SpaceButs;
@@ -418,8 +418,8 @@ typedef struct SpaceImaSel {
/* **************** SPACE DEFINES ********************* */
-/* button defines */
-/* warning: the values of these defines are used in sbuts->tabs[7] */
+/* button defines (deprecated) */
+/* warning: the values of these defines are used in sbuts->tabs[8] */
/* sbuts->mainb new */
#define CONTEXT_SCENE 0
#define CONTEXT_OBJECT 1
@@ -429,7 +429,7 @@ typedef struct SpaceImaSel {
#define CONTEXT_SCRIPT 5
#define CONTEXT_LOGIC 6
-/* sbuts->mainb old */
+/* sbuts->mainb old (deprecated) */
#define BUTS_VIEW 0
#define BUTS_LAMP 1
#define BUTS_MAT 2
@@ -446,7 +446,7 @@ typedef struct SpaceImaSel {
#define BUTS_CONSTRAINT 13
#define BUTS_EFFECTS 14
-/* sbuts->tab new */
+/* sbuts->tab new (deprecated) */
#define TAB_SHADING_MAT 0
#define TAB_SHADING_TEX 1
#define TAB_SHADING_RAD 2
diff --git a/source/blender/makesrna/intern/rna_context.c b/source/blender/makesrna/intern/rna_context.c
index d3089917649..ece5b6cc1f9 100644
--- a/source/blender/makesrna/intern/rna_context.c
+++ b/source/blender/makesrna/intern/rna_context.c
@@ -37,31 +37,31 @@
static PointerRNA rna_Context_manager_get(PointerRNA *ptr)
{
bContext *C= (bContext*)ptr->data;
- return rna_pointer_inherit_refine(ptr, &RNA_Region, CTX_wm_manager(C));
+ return rna_pointer_inherit_refine(ptr, &RNA_WindowManager, CTX_wm_manager(C));
}
/*static PointerRNA rna_Context_window_get(PointerRNA *ptr)
{
bContext *C= (bContext*)ptr->data;
- return rna_pointer_inherit_refine(ptr, &RNA_Region, CTX_wm_window(C));
+ return rna_pointer_inherit_refine(ptr, &RNA_Window, CTX_wm_window(C));
}*/
static PointerRNA rna_Context_screen_get(PointerRNA *ptr)
{
bContext *C= (bContext*)ptr->data;
- return rna_pointer_inherit_refine(ptr, &RNA_Region, CTX_wm_screen(C));
+ return rna_pointer_inherit_refine(ptr, &RNA_Screen, CTX_wm_screen(C));
}
static PointerRNA rna_Context_area_get(PointerRNA *ptr)
{
bContext *C= (bContext*)ptr->data;
- return rna_pointer_inherit_refine(ptr, &RNA_Region, CTX_wm_area(C));
+ return rna_pointer_inherit_refine(ptr, &RNA_Area, CTX_wm_area(C));
}
static PointerRNA rna_Context_space_data_get(PointerRNA *ptr)
{
bContext *C= (bContext*)ptr->data;
- return rna_pointer_inherit_refine(ptr, &RNA_Region, CTX_wm_space_data(C));
+ return rna_pointer_inherit_refine(ptr, &RNA_Space, CTX_wm_space_data(C));
}
static PointerRNA rna_Context_region_get(PointerRNA *ptr)
@@ -73,7 +73,7 @@ static PointerRNA rna_Context_region_get(PointerRNA *ptr)
/*static PointerRNA rna_Context_region_data_get(PointerRNA *ptr)
{
bContext *C= (bContext*)ptr->data;
- return rna_pointer_inherit_refine(ptr, &RNA_Region, CTX_wm_region_data(C));
+ return rna_pointer_inherit_refine(ptr, &RNA_RegionData, CTX_wm_region_data(C));
}*/
static PointerRNA rna_Context_main_get(PointerRNA *ptr)
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index 5be3130609c..034fd603367 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -37,7 +37,7 @@ EnumPropertyItem region_type_items[] = {
{RGN_TYPE_HEADER, "HEADER", "Header", ""},
{RGN_TYPE_CHANNELS, "CHANNELS", "Channels", ""},
{RGN_TYPE_TEMPORARY, "TEMPORARY", "Temporary", ""},
- {RGN_TYPE_UI, "BUTTONS_WINDOW", "Window", ""},
+ {RGN_TYPE_UI, "UI", "UI", ""},
{0, NULL, NULL, NULL}};
#ifdef RNA_RUNTIME
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 9950d70af24..229a260efce 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -341,7 +341,7 @@ static void rna_def_space_text(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Text", "Text displayed and edited in this space.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceTextEditor_text_set");
- RNA_def_property_update(prop, NC_TEXT|ND_CURSOR, NULL);
+ RNA_def_property_update(prop, NC_TEXT|NA_EDITED, NULL);
/* display */
prop= RNA_def_property(srna, "syntax_highlight", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_text.c b/source/blender/makesrna/intern/rna_text.c
index 838822119e8..3dacd4c0898 100644
--- a/source/blender/makesrna/intern/rna_text.c
+++ b/source/blender/makesrna/intern/rna_text.c
@@ -40,6 +40,8 @@
#ifdef RNA_RUNTIME
+int text_file_modified(Text *text);
+
static void rna_Text_filename_get(PointerRNA *ptr, char *value)
{
Text *text= (Text*)ptr->data;
@@ -69,6 +71,12 @@ static void rna_Text_filename_set(PointerRNA *ptr, const char *value)
text->name= NULL;
}
+static int rna_Text_modified_get(PointerRNA *ptr)
+{
+ Text *text= (Text*)ptr->data;
+ return text_file_modified(text);
+}
+
static void rna_TextLine_line_get(PointerRNA *ptr, char *value)
{
TextLine *line= (TextLine*)ptr->data;
@@ -174,6 +182,11 @@ static void rna_def_text(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Dirty", "Text file has been edited since last save.");
+ prop= RNA_def_property(srna, "modified", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Text_modified_get", NULL);
+ RNA_def_property_ui_text(prop, "Modified", "Text file on disk is different than the one in memory.");
+
prop= RNA_def_property(srna, "memory", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISMEM);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index 4ad5273dd5d..405ae9a0f74 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -276,6 +276,121 @@ static StructRNA* rna_Header_refine(struct PointerRNA *htr)
return (hdr->type)? hdr->type->py_srna: &RNA_Header;
}
+/* Menu */
+
+static int menu_poll(const bContext *C, MenuType *pt)
+{
+ PointerRNA ptr;
+ ParameterList *list;
+ FunctionRNA *func;
+ void *ret;
+ int visible;
+
+ RNA_pointer_create(NULL, pt->py_srna, NULL, &ptr); /* dummy */
+ func= RNA_struct_find_function(&ptr, "poll");
+
+ list= RNA_parameter_list_create(&ptr, func);
+ RNA_parameter_set_lookup(list, "context", &C);
+ pt->py_call(&ptr, func, list);
+
+ RNA_parameter_get_lookup(list, "visible", &ret);
+ visible= *(int*)ret;
+
+ RNA_parameter_list_free(list);
+
+ return visible;
+}
+
+static void menu_draw(const bContext *C, Menu *hdr)
+{
+ PointerRNA mtr;
+ ParameterList *list;
+ FunctionRNA *func;
+
+ RNA_pointer_create(&CTX_wm_screen(C)->id, hdr->type->py_srna, hdr, &mtr);
+ func= RNA_struct_find_function(&mtr, "draw");
+
+ list= RNA_parameter_list_create(&mtr, func);
+ RNA_parameter_set_lookup(list, "context", &C);
+ hdr->type->py_call(&mtr, func, list);
+
+ RNA_parameter_list_free(list);
+}
+
+static void rna_Menu_unregister(const bContext *C, StructRNA *type)
+{
+ ARegionType *art;
+ MenuType *mt= RNA_struct_blender_type_get(type);
+
+ if(!mt)
+ return;
+ if(!(art=region_type_find(NULL, mt->space_type, RGN_TYPE_HEADER)))
+ return;
+
+ BLI_freelinkN(&art->menutypes, mt);
+ RNA_struct_free(&BLENDER_RNA, type);
+
+ /* update while blender is running */
+ if(C)
+ WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
+}
+
+static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void *data, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+{
+ ARegionType *art;
+ MenuType *mt, dummymt = {0};
+ Menu dummymenu= {0};
+ PointerRNA dummymtr;
+ int have_function[2];
+
+ /* setup dummy menu & menu type to store static properties in */
+ dummymenu.type= &dummymt;
+ RNA_pointer_create(NULL, &RNA_Menu, &dummymenu, &dummymtr);
+
+ /* validate the python class */
+ if(validate(&dummymtr, data, have_function) != 0)
+ return NULL;
+
+ if(!(art=region_type_find(reports, dummymt.space_type, RGN_TYPE_HEADER)))
+ return NULL;
+
+ /* check if we have registered this menu type before, and remove it */
+ for(mt=art->menutypes.first; mt; mt=mt->next) {
+ if(strcmp(mt->idname, dummymt.idname) == 0) {
+ if(mt->py_srna)
+ rna_Menu_unregister(C, mt->py_srna);
+ break;
+ }
+ }
+
+ /* create a new menu type */
+ mt= MEM_callocN(sizeof(MenuType), "python buttons menu");
+ memcpy(mt, &dummymt, sizeof(dummymt));
+
+ mt->py_srna= RNA_def_struct(&BLENDER_RNA, mt->idname, "Menu");
+ mt->py_data= data;
+ mt->py_call= call;
+ mt->py_free= free;
+ RNA_struct_blender_type_set(mt->py_srna, mt);
+
+ mt->poll= (have_function[0])? menu_poll: NULL;
+ mt->draw= (have_function[1])? menu_draw: NULL;
+
+ BLI_addtail(&art->menutypes, mt);
+
+ /* update while blender is running */
+ if(C)
+ WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
+
+ return mt->py_srna;
+}
+
+static StructRNA* rna_Menu_refine(struct PointerRNA *mtr)
+{
+ Menu *hdr= (Menu*)mtr->data;
+ return (hdr->type)? hdr->type->py_srna: &RNA_Menu;
+}
+
#else
static void rna_def_ui_layout(BlenderRNA *brna)
@@ -373,11 +488,55 @@ static void rna_def_header(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_REGISTER);
}
+static void rna_def_menu(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+ FunctionRNA *func;
+
+ srna= RNA_def_struct(brna, "Menu", NULL);
+ RNA_def_struct_ui_text(srna, "Menu", "Editor menu containing buttons.");
+ RNA_def_struct_sdna(srna, "Menu");
+ RNA_def_struct_refine_func(srna, "rna_Menu_refine");
+ RNA_def_struct_register_funcs(srna, "rna_Menu_register", "rna_Menu_unregister");
+
+ /* poll */
+ func= RNA_def_function(srna, "poll", NULL);
+ RNA_def_function_ui_description(func, "Test if the menu is visible or not.");
+ RNA_def_function_flag(func, FUNC_REGISTER|FUNC_REGISTER_OPTIONAL);
+ RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
+ RNA_def_pointer(func, "context", "Context", "", "");
+
+ /* draw */
+ func= RNA_def_function(srna, "draw", NULL);
+ RNA_def_function_ui_description(func, "Draw buttons into the menu UI layout.");
+ RNA_def_function_flag(func, FUNC_REGISTER);
+ RNA_def_pointer(func, "context", "Context", "", "");
+
+ prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "UILayout");
+
+ /* registration */
+ prop= RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "type->idname");
+ RNA_def_property_flag(prop, PROP_REGISTER);
+
+ prop= RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "type->label");
+ RNA_def_property_flag(prop, PROP_REGISTER);
+
+ prop= RNA_def_property(srna, "space_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type->space_type");
+ RNA_def_property_enum_items(prop, space_type_items);
+ RNA_def_property_flag(prop, PROP_REGISTER);
+}
+
void RNA_def_ui(BlenderRNA *brna)
{
rna_def_ui_layout(brna);
rna_def_panel(brna);
rna_def_header(brna);
+ rna_def_menu(brna);
}
#endif
diff --git a/source/blender/python/intern/bpy_ui.c b/source/blender/python/intern/bpy_ui.c
index e7143e8f84c..0959cf0b6b6 100644
--- a/source/blender/python/intern/bpy_ui.c
+++ b/source/blender/python/intern/bpy_ui.c
@@ -63,20 +63,6 @@ static PyObject *Method_pupMenuEnd( PyObject * self, PyObject * args )
Py_RETURN_NONE;
}
-static PyObject *Method_menuItemO( PyObject * self, PyObject * args )
-{
- PyObject *py_head;
- char *opname;
- int icon;
-
- if( !PyArg_ParseTuple( args, "O!is:menuItemO", &PyCObject_Type, &py_head, &icon, &opname))
- return NULL;
-
- uiMenuItemO(PyCObject_AsVoidPtr(py_head), icon, opname);
-
- Py_RETURN_NONE;
-}
-
static PyObject *Method_defButO( PyObject * self, PyObject * args )
{
uiBut *but;
@@ -405,7 +391,6 @@ static PyObject *Method_getWindowPtr( PyObject * self )
static struct PyMethodDef ui_methods[] = {
{"pupMenuBegin", (PyCFunction)Method_pupMenuBegin, METH_VARARGS, ""},
{"pupMenuEnd", (PyCFunction)Method_pupMenuEnd, METH_VARARGS, ""},
- {"menuItemO", (PyCFunction)Method_menuItemO, METH_VARARGS, ""},
{"defButO", (PyCFunction)Method_defButO, METH_VARARGS, ""},
{"defAutoButR", (PyCFunction)Method_defAutoButR, METH_VARARGS, ""},
{"pupBlock", (PyCFunction)Method_pupBlock, METH_VARARGS, ""},
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index c8a0dbd018a..5a10aa4490e 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -201,7 +201,8 @@ void WM_operator_properties_free(PointerRNA *ptr)
int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
PropertyRNA *prop= RNA_struct_find_property(op->ptr, "type");
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
if(prop==NULL) {
printf("WM_menu_invoke: %s has no \"type\" enum property\n", op->type->idname);
@@ -210,9 +211,10 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
printf("WM_menu_invoke: %s \"type\" is not an enum property\n", op->type->idname);
}
else {
- head= uiPupMenuBegin(op->type->name, 0);
- uiMenuItemsEnumO(head, op->type->idname, "type");
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin(op->type->name, 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemsEnumO(layout, op->type->idname, "type");
+ uiPupMenuEnd(C, pup);
}
return OPERATOR_CANCELLED;
@@ -221,11 +223,13 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* op->invoke */
int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *event)
{
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
- head= uiPupMenuBegin("OK?", ICON_HELP);
- uiMenuItemO(head, 0, op->type->idname);
- uiPupMenuEnd(C, head);
+ pup= uiPupMenuBegin("OK?", ICON_HELP);
+ layout= uiPupMenuLayout(pup);
+ uiItemO(layout, NULL, 0, op->type->idname);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
@@ -370,21 +374,23 @@ static int recentfile_exec(bContext *C, wmOperator *op)
static int wm_recentfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
struct RecentFile *recent;
- uiMenuItem *head;
+ uiPopupMenu *pup;
+ uiLayout *layout;
int i, ofs= 0;
- head= uiPupMenuBegin("Open Recent", 0);
+ pup= uiPupMenuBegin("Open Recent", 0);
+ layout= uiPupMenuLayout(pup);
if(G.sce[0]) {
- uiMenuItemIntO(head, G.sce, 0, op->type->idname, "nr", 1);
+ uiItemIntO(layout, G.sce, 0, op->type->idname, "nr", 1);
ofs = 1;
}
for(recent = G.recent_files.first, i=0; (i<U.recent_files) && (recent); recent = recent->next, i++)
if(strcmp(recent->filename, G.sce))
- uiMenuItemIntO(head, recent->filename, 0, op->type->idname, "nr", i+ofs+1);
+ uiItemIntO(layout, recent->filename, 0, op->type->idname, "nr", i+ofs+1);
- uiPupMenuEnd(C, head);
+ uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}