UI
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 22 Apr 2009 18:39:44 +0000 (18:39 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 22 Apr 2009 18:39:44 +0000 (18:39 +0000)
* Headers and menus can now be created in python.
* Replaced the uiMenuItem functions to create menus with equivalent
  uiItem functions using a layout, removing duplicated code.
* More uiItem functions are now exposed to python.
* The text editor header, panels and one of its menus are now created
  in space_text.py.
* Buttons window data context icon new changes depending on active
  object.

Issues
* Icons are not wrapped yet, hardcoded ints at the moment.
* The ID browse template is unfinished.

45 files changed:
release/ui/space_text.py [new file with mode: 0644]
source/blender/blenkernel/BKE_library.h
source/blender/blenkernel/BKE_screen.h
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/screen.c
source/blender/editors/animation/keyframing.c
source/blender/editors/armature/editarmature.c
source/blender/editors/armature/poselib.c
source/blender/editors/curve/curve_ops.c
source/blender/editors/curve/editcurve.c
source/blender/editors/include/BIF_transform.h
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_anim.c
source/blender/editors/interface/interface_api.c
source/blender/editors/interface/interface_layout.c
source/blender/editors/interface/interface_regions.c
source/blender/editors/interface/interface_utils.c
source/blender/editors/mesh/editmesh_tools.c
source/blender/editors/object/object_edit.c
source/blender/editors/physics/editparticle.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/space_buttons/buttons_header.c
source/blender/editors/space_image/image_header.c
source/blender/editors/space_image/image_ops.c
source/blender/editors/space_image/space_image.c
source/blender/editors/space_info/info_header.c
source/blender/editors/space_sequencer/sequencer_header.c
source/blender/editors/space_text/space_text.c
source/blender/editors/space_text/text_header.c
source/blender/editors/space_text/text_intern.h
source/blender/editors/space_text/text_ops.c
source/blender/editors/space_view3d/view3d_header.c
source/blender/editors/space_view3d/view3d_snap.c
source/blender/editors/transform/transform_ops.c
source/blender/editors/transform/transform_orientations.c
source/blender/editors/uvedit/uvedit_unwrap_ops.c
source/blender/makesdna/DNA_screen_types.h
source/blender/makesdna/DNA_space_types.h
source/blender/makesrna/intern/rna_context.c
source/blender/makesrna/intern/rna_screen.c
source/blender/makesrna/intern/rna_space.c
source/blender/makesrna/intern/rna_text.c
source/blender/makesrna/intern/rna_ui.c
source/blender/python/intern/bpy_ui.c
source/blender/windowmanager/intern/wm_operators.c

diff --git a/release/ui/space_text.py b/release/ui/space_text.py
new file mode 100644 (file)
index 0000000..a3d2737
--- /dev/null
@@ -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)
+
index 212e9f08c35c813169aff133ea0fb098661cf3ab..e598394cc605c65a6fa979c465f8ce5d90b02c51 100644 (file)
@@ -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);
index 8ac3b4b0b513399c0e6d48256f640304b05ec514..4797616a471f2c8c802c382d0a23d6b1235ce820 100644 (file)
@@ -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);
index 5728b844a883dfcec586bbb21ef8c5bf9d85438f..d0e4c1a15bcbf4b4dea42c2e00ce2c0574a89d15 100644 (file)
@@ -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;
index f43dc287062ed7f919ab7825fd5de3a30b23db02..e25e4be90c8a999d5e1bd36151b6046b8e36cf31 100644 (file)
@@ -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);
index c341e32db8c8a75faa16faf8c088cad905102692..b09cc3b78e196135849fcf605517cac676e2cc83 100644 (file)
@@ -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;
 }
index 80f51f3797c0503a8c2fffb954c3f8b89c23efea..ca0694a7ecef0a09ed612292e9caff77c9c18269 100644 (file)
@@ -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;
 }
index fc5b98b16904b81cd99f8ba7c03064ddcae69037..9b4a9d63439c7ddd80b62274bd01d5077b910dfa 100644 (file)
@@ -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;
index c27c498f55ee182c8e8d1bc4c31b7ce4db080a60..49d86d08db22470df61465da7e1c06219ebf14db 100644 (file)
 
 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;
 }
index 72806a79c50d18f512d328caa3148c87e3ffd6d5..78b86ad7f32b7e3c467379450cfb869092394b8d 100644 (file)
@@ -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;
index d16ac563eb3484f2231e3d13be1b47c1d4b290c8..e02202eb8e0a7919e6189427a66ba2a98af437a7 100644 (file)
@@ -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);
 
index 5a827a2311b570fdffd406eca07b3666350728fe..c491dee6ba69251f58e2744ccd0e7da2185fcc21 100644 (file)
@@ -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
index 6775a63959700a5c8b87c250527c2fc907e0e268..af8aa91f358da3233317eadf7c9e14c33c2621c5 100644 (file)
@@ -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);
        }
 }
 
index a184655df83d9c3070dca3955cbbbff99ff5720f..3153f13bd0bcb5424d02e523c2c24ca6ff655119 100644 (file)
@@ -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.");
 }
 
index e0059041774104d9b43eaeb6b877823460f84add..56acd75520543691a50c1410cdc9adb3140af98f 100644 (file)
 #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"
 
 
 /************************ 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;
index 181513b58bc04cf21adcb5556e656080bef163aa..7bc7e2e3c192ce9fe9a2726f016f94dfbe089bd1 100644 (file)
@@ -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 *************** */
index 5ef1e68bd596892c05cdd586e22d030320a607dd..3bb7581b16c2f9f07afb96c05ae3a639477bd359 100644 (file)
@@ -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)
index f3868b1f01c95704b0b1e84987b58fddcc82e90e..90b26d0f4252cf35de17faef272f109389ce2518 100644 (file)
@@ -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;
 }
index eeba0ad22aed20a8741e590a8504abcd5966edbb..1a3b3e5e031ee4d51268d6e88ef50f49928a1704 100644 (file)
@@ -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;
 }
index 96f3ad2f8df2deeb3b24145f9986487c1795bbb5..0d58a0bfdcd35dae54cda57ef6c990b3d5273763 100644 (file)
@@ -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;
 }
index bf57e2e7d529f9aca716af75a4f984f3198ef0b0..ce7022d8176fe60e2bfa45b9f9189e330e449aec 100644 (file)
@@ -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;
index 53fb4c388d3a8000c5d5981d54d5460d06265f4c..5ca8330694e71dacb9677d985830faed0d07ea44 100644 (file)
@@ -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;
index 288fc76d8e402381d6215fb8ae42a9631b978fc0..7e009dfc479f819bc0ebeaf37786cb72b2892a15 100644 (file)
 #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;
 }
index fcafcd22a3dd81653dfe0e6641e34756a1e6e9a0..908b24bd84d2fe964aa2292e511b166b982d9d39 100644 (file)
@@ -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;
        }
index fab9317bbd0ccf315117dba2d295167d922da68c..5f743afd65dc9d5f7bc6c7afeb5f251e324a2805 100644 (file)
@@ -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"
 
index 8b940bd6ca854e8536a9f21ebe71a233b6bca4d8..af792d0b22cff2b7ec13d5b197051f0ddaa87812 100644 (file)
@@ -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) {
index aee589cb982816269941760284f51f5904d2f29b..c8dc4cc006acb93fd99303cae388713abc9cdace 100644 (file)
@@ -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)
index 89852955ca3136fcbec84f7eaaa3bde6bd3336d7..577dae433c1dbe22211c0c18822d281352d63fba 100644 (file)
@@ -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 */
index 0ab43cbf45559e4df41bfbc0c0c27aa2401e283b..a3b62adf6c85768cb82f5db55e65d5d4e7f30f0c 100644 (file)
@@ -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
 
index 7ec75e292ce1712b04e9f287e7b900bd9fc41be6..50109ba8c42cddc62be44205e2a39331b527b651 100644 (file)
@@ -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);
index c7fe02975efe56894b8c591da9a35422fe42107d..913bd307ab295d225e759a4da9a3ccb130ab0056 100644 (file)
@@ -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;
        }
 
index 5d149fb2f9b6ef111e599925b4c48c4f82583df7..e968756b11a8d284b438d7f9775de9c63d2238eb 100644 (file)
@@ -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;
 }
index ad9d3f85538e4a2e7839bb9ee76baaa3a2ad7cf7..7b417c94a735ec9e662499944ae9009a8e006706 100644 (file)
@@ -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;
index f5a581fc4fd818c6b36ae8c566e4ddccd26a968e..46a6f121990b716aecb677cb5ce408e9229b5ed1 100644 (file)
@@ -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;
 }
index df785f92166e7bfd82a53ee324cf338ca8f0c569..06fc7d9965990edc2a82db2ff202175aba2cfef0 100644 (file)
@@ -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) {
index 4d12700d98c0cac98a25f79204ce5fd2f9d1f5a3..be571c132ab2b9301a489732b2e1952a7ed8de95 100644 (file)
@@ -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
index d131bfc2081b086363f281bcd0e1fd8cd871587c..77b0d6e2d49077b7c99be10c9f15c57b16f5f7b9 100644 (file)
@@ -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;
        
index a3dc657217a1c62e4eac14b2b94aed3e45657f9b..0e19a6845dad7d7f83c426ba90302646f9087c0d 100644 (file)
@@ -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
index d30899176495090c18aeef1f8e697ceb17bcec95..ece5b6cc1f98a58b51632b71a8cd6633b66492da 100644 (file)
 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)
index 5be3130609c57f801d0dd59bacb703240b5f0269..034fd6033670d9b18c1dff3d5723a4966965222c 100644 (file)
@@ -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
index 9950d70af24885e2fc413f2888848fd1781b96df..229a260efce95479f7fac882235c7844d46bd95c 100644 (file)
@@ -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);
index 838822119e881d208481b17e3616cc9bc3576f69..3dacd4c0898d387f969ce865493ccdc2aa23fdb1 100644 (file)
@@ -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);
index 4ad5273dd5ddca023c8931fe1cdcf4ffb5c26cb5..405ae9a0f74eea2dd45180bc823c603fb817bcec 100644 (file)
@@ -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
index e7143e8f84cb173adabc2d982b32e02b94e08965..0959cf0b6b67c5736e1d917bbd6f31ad104650ae 100644 (file)
@@ -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, ""},
index c8a0dbd018a5fc93b23ba4eae3fb986fdc03b232..5a10aa4490e93cfdb9532ed86832aa15a86c968d 100644 (file)
@@ -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;
 }