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:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user