2.5: Added operator ui() callback for defining own ui layout
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Sun, 16 Aug 2009 20:23:34 +0000 (20:23 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Sun, 16 Aug 2009 20:23:34 +0000 (20:23 +0000)
to show properties.

* One problem is that we currently have 3 different kinds of
  property layouts, single column, two column, and single column
  with text inside button, probably best to reduce this..
* Last operator panel now shows operator name in the header.
* Fix extrude operator to not include transform properties
  anymore, since they are already there now due to macro system.

source/blender/editors/interface/interface_utils.c
source/blender/editors/mesh/editmesh_tools.c
source/blender/editors/space_file/file_panels.c
source/blender/editors/space_view3d/view3d_toolbar.c
source/blender/makesdna/DNA_windowmanager_types.h
source/blender/windowmanager/intern/wm_operators.c

index f8578be1f332466fedce6a8118018f96523a8ef5..4201850f5e439029ec1ad746c9ec1e4d1b19b8d4 100644 (file)
@@ -152,8 +152,6 @@ void uiDefAutoButsRNA(const bContext *C, uiLayout *layout, PointerRNA *ptr, int
        uiLayout *split, *col;
        char *name;
 
-       uiItemL(layout, (char*)RNA_struct_ui_name(ptr->type), 0);
-
        RNA_STRUCT_BEGIN(ptr, prop) {
                if(strcmp(RNA_property_identifier(prop), "rna_type") == 0)
                        continue;
index 70c3cf15a3b3a31958bb8b847c3a76b8d96a8fc4..1ceebb3d75624f3a12ff1c6968d08f49ca5f4c80 100644 (file)
@@ -756,11 +756,6 @@ void MESH_OT_extrude(wmOperatorType *ot)
 
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
-       /* to give to transform */
-       Properties_Proportional(ot);
-       Properties_Constraints(ot);
-       RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
 }
 
 static int split_mesh(bContext *C, wmOperator *op)
index f3c18859fb02ecfcbef7f7498427dad335c71a9f..30598d39d58248cc09d9cb2123a24d8fd820bfc3 100644 (file)
@@ -170,23 +170,28 @@ static void file_panel_operator(const bContext *C, Panel *pa)
        wmOperator *op= sfile->op;
        int empty= 1;
 
-       RNA_STRUCT_BEGIN(op->ptr, prop) {
-               if(strcmp(RNA_property_identifier(prop), "rna_type") == 0)
-                       continue;
-               if(strcmp(RNA_property_identifier(prop), "filename") == 0)
-                       continue;
-               if(strcmp(RNA_property_identifier(prop), "display") == 0)
-                       continue;
-               if(strncmp(RNA_property_identifier(prop), "filter", 6) == 0)
-                       continue;
-
-               uiItemFullR(pa->layout, NULL, 0, op->ptr, prop, -1, 0, 0, 0, 0);
-               empty= 0;
+       if(op->type->ui) {
+               op->type->ui((bContext*)C, op->ptr, pa->layout);
        }
-       RNA_STRUCT_END;
+       else {
+               RNA_STRUCT_BEGIN(op->ptr, prop) {
+                       if(strcmp(RNA_property_identifier(prop), "rna_type") == 0)
+                               continue;
+                       if(strcmp(RNA_property_identifier(prop), "filename") == 0)
+                               continue;
+                       if(strcmp(RNA_property_identifier(prop), "display") == 0)
+                               continue;
+                       if(strncmp(RNA_property_identifier(prop), "filter", 6) == 0)
+                               continue;
+
+                       uiItemFullR(pa->layout, NULL, 0, op->ptr, prop, -1, 0, 0, 0, 0);
+                       empty= 0;
+               }
+               RNA_STRUCT_END;
 
-       if(empty)
-               uiItemL(pa->layout, "No properties.", 0);
+               if(empty)
+                       uiItemL(pa->layout, "No properties.", 0);
+       }
 }
 
 void file_panels_register(ARegionType *art)
index ec1ed10cd0b5bb792c8e2385d057231dcfa193e9..32378a915bd43b299bcbbe97732c09abc9d62f45 100644 (file)
@@ -118,6 +118,19 @@ static void redo_cb(bContext *C, void *arg_op, void *arg2)
        }
 }
 
+static wmOperator *view3d_last_operator(const bContext *C)
+{
+       wmWindowManager *wm= CTX_wm_manager(C);
+       wmOperator *op;
+
+       /* only for operators that are registered and did an undo push */
+       for(op= wm->operators.last; op; op= op->prev)
+               if((op->type->flag & OPTYPE_REGISTER) && (op->type->flag & OPTYPE_UNDO))
+                       break;
+
+       return op;
+}
+
 static void view3d_panel_operator_redo_buts(const bContext *C, Panel *pa, wmOperator *op)
 {
        wmWindowManager *wm= CTX_wm_manager(C);
@@ -129,28 +142,32 @@ static void view3d_panel_operator_redo_buts(const bContext *C, Panel *pa, wmOper
        }
        
        RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
-       uiDefAutoButsRNA(C, pa->layout, &ptr, 1);
-       
+       if(op->type->ui)
+               op->type->ui((bContext*)C, &ptr, pa->layout);
+       else
+               uiDefAutoButsRNA(C, pa->layout, &ptr, 1);
+}
+
+static void view3d_panel_operator_redo_header(const bContext *C, Panel *pa)
+{
+       wmOperator *op= view3d_last_operator(C);
+
+       if(op) BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname));
+       else BLI_strncpy(pa->drawname, "Operator", sizeof(pa->drawname));
 }
 
 static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
 {
-       wmWindowManager *wm= CTX_wm_manager(C);
-       wmOperator *op;
+       wmOperator *op= view3d_last_operator(C);
        uiBlock *block;
        
-       block= uiLayoutGetBlock(pa->layout);
-
-       /* only for operators that are registered and did an undo push */
-       for(op= wm->operators.last; op; op= op->prev)
-               if((op->type->flag & OPTYPE_REGISTER) && (op->type->flag & OPTYPE_UNDO))
-                       break;
-       
        if(op==NULL)
                return;
        if(op->type->poll && op->type->poll((bContext *)C)==0)
                return;
        
+       block= uiLayoutGetBlock(pa->layout);
+
        uiBlockSetFunc(block, redo_cb, op, NULL);
        
        if(op->macro.first) {
@@ -279,7 +296,8 @@ void view3d_tool_props_register(ARegionType *art)
        
        pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel last operator");
        strcpy(pt->idname, "VIEW3D_PT_last_operator");
-       strcpy(pt->label, "Last Operator");
+       strcpy(pt->label, "Operator");
+       pt->draw_header= view3d_panel_operator_redo_header;
        pt->draw= view3d_panel_operator_redo;
        BLI_addtail(&art->paneltypes, pt);
 }
index b6a2b4c054484fd1ea8d0426c33e0f3bea0cd09e..7d03bbec1ee987218c6b090ab86df4dce43bc848 100644 (file)
@@ -54,6 +54,7 @@ struct StructRNA;
 struct PointerRNA;
 struct ReportList;
 struct Report;
+struct uiLayout;
 
 #define OP_MAX_TYPENAME        64
 #define KMAP_MAX_NAME  64
@@ -208,8 +209,8 @@ typedef struct wmOperatorType {
         * that the operator might still fail to execute even if this return true */
        int (*poll)(struct bContext *);
        
-       /* panel for redo and repeat */
-       void *(*uiBlock)(struct wmOperator *);
+       /* optional panel for redo and repeat, autogenerated if not set */
+       void (*ui)(struct bContext *, struct PointerRNA *, struct uiLayout *);
        
        /* rna for properties */
        struct StructRNA *srna;
index dd4728d97affd2fb785599e8a4f39896b83a48c6..1cdf68ebc191e1ecd594a91097f9cbba4dbfc590 100644 (file)
@@ -543,7 +543,12 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
 
        RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
        layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 300, 20, style);
-       uiDefAutoButsRNA(C, layout, &ptr, 2);
+       uiItemL(layout, op->type->name, 0);
+
+       if(op->type->ui)
+               op->type->ui((bContext*)C, &ptr, layout);
+       else
+               uiDefAutoButsRNA(C, layout, &ptr, 2);
 
        uiPopupBoundsBlock(block, 4.0f, 0, 0);
        uiEndBlock(C, block);
@@ -585,7 +590,12 @@ static uiBlock *wm_block_create_menu(bContext *C, ARegion *ar, void *arg_op)
        uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1);
        
        layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 300, 20, style);
-       uiDefAutoButsRNA(C, layout, op->ptr, 2);
+       uiItemL(layout, op->type->name, 0);
+
+       if(op->type->ui)
+               op->type->ui(C, op->ptr, layout);
+       else
+               uiDefAutoButsRNA(C, layout, op->ptr, 2);
        
        uiPopupBoundsBlock(block, 4.0f, 0, 0);
        uiEndBlock(C, block);