Beispiel #1
0
static StructRNA *rna_Menu_register(Main *bmain, ReportList *reports, void *data, const char *identifier,
                                    StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
    MenuType *mt, dummymt = {NULL};
    Menu dummymenu= {NULL};
    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(strlen(identifier) >= sizeof(dummymt.idname)) {
        BKE_reportf(reports, RPT_ERROR, "registering menu class: '%s' is too long, maximum length is %d",
                    identifier, (int)sizeof(dummymt.idname));
        return NULL;
    }

    /* check if we have registered this menu type before, and remove it */
    mt= WM_menutype_find(dummymt.idname, TRUE);
    if(mt && mt->ext.srna)
        rna_Menu_unregister(bmain, mt->ext.srna);

    /* create a new menu type */
    mt= MEM_callocN(sizeof(MenuType), "python buttons menu");
    memcpy(mt, &dummymt, sizeof(dummymt));

    mt->ext.srna= RNA_def_struct(&BLENDER_RNA, mt->idname, "Menu");
    mt->ext.data= data;
    mt->ext.call= call;
    mt->ext.free= free;
    RNA_struct_blender_type_set(mt->ext.srna, mt);
    RNA_def_struct_flag(mt->ext.srna, STRUCT_NO_IDPROPERTIES);

    mt->poll= (have_function[0])? menu_poll: NULL;
    mt->draw= (have_function[1])? menu_draw: NULL;

    WM_menutype_add(mt);

    /* update while blender is running */
    WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);

    return mt->ext.srna;
}
Beispiel #2
0
static StructRNA *rna_Menu_register(
        Main *bmain, ReportList *reports, void *data, const char *identifier,
        StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
	MenuType *mt, dummymt = {NULL};
	Menu dummymenu = {NULL};
	PointerRNA dummymtr;
	int have_function[2];
	size_t over_alloc = 0; /* warning, if this becomes a bess, we better do another alloc */
	size_t description_size = 0;
	char _menu_descr[RNA_DYN_DESCR_MAX];

	/* setup dummy menu & menu type to store static properties in */
	dummymenu.type = &dummymt;
	_menu_descr[0] = '\0';
	dummymenu.type->description = _menu_descr;
	RNA_pointer_create(NULL, &RNA_Menu, &dummymenu, &dummymtr);

	/* We have to set default context! Else we get a void string... */
	strcpy(dummymt.translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);

	/* validate the python class */
	if (validate(&dummymtr, data, have_function) != 0)
		return NULL;

	if (strlen(identifier) >= sizeof(dummymt.idname)) {
		BKE_reportf(reports, RPT_ERROR, "Registering menu class: '%s' is too long, maximum length is %d",
		            identifier, (int)sizeof(dummymt.idname));
		return NULL;
	}

	/* check if we have registered this menu type before, and remove it */
	mt = WM_menutype_find(dummymt.idname, true);
	if (mt && mt->ext.srna) {
		rna_Menu_unregister(bmain, mt->ext.srna);
	}
	if (!RNA_struct_available_or_report(reports, dummymt.idname)) {
		return NULL;
	}
	if (!RNA_struct_bl_idname_ok_or_report(reports, dummymt.idname, "_MT_")) {
		return NULL;
	}

	/* create a new menu type */
	if (_menu_descr[0]) {
		description_size = strlen(_menu_descr) + 1;
		over_alloc += description_size;
	}

	mt = MEM_callocN(sizeof(MenuType) + over_alloc, "python buttons menu");
	memcpy(mt, &dummymt, sizeof(dummymt));

	if (_menu_descr[0]) {
		char *buf = (char *)(mt + 1);
		memcpy(buf, _menu_descr, description_size);
		mt->description = buf;
	}
	else
		mt->description = "";

	mt->ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, mt->idname, &RNA_Menu);
	RNA_def_struct_translation_context(mt->ext.srna, mt->translation_context);
	mt->ext.data = data;
	mt->ext.call = call;
	mt->ext.free = free;
	RNA_struct_blender_type_set(mt->ext.srna, mt);
	RNA_def_struct_flag(mt->ext.srna, STRUCT_NO_IDPROPERTIES);

	mt->poll = (have_function[0]) ? menu_poll : NULL;
	mt->draw = (have_function[1]) ? menu_draw : NULL;

	WM_menutype_add(mt);

	/* update while blender is running */
	WM_main_add_notifier(NC_WINDOW, NULL);

	return mt->ext.srna;
}