2.5: Added operator ui() callback for defining own ui layout

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.
This commit is contained in:
Brecht Van Lommel
2009-08-16 20:23:34 +00:00
parent 5765b1bfa4
commit 19babf988d
6 changed files with 65 additions and 38 deletions

View 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;

View 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)

View 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;
if(empty)
uiItemL(pa->layout, "No properties.", 0);
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);
}
}
void file_panels_register(ARegionType *art)

View 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);
}

View 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;

View 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);