[Bf-blender-cvs] [a8b50c16892] custom-manipulators: PyAPI: widget group (un)register working again
Campbell Barton
noreply at git.blender.org
Mon Jun 5 14:17:39 CEST 2017
Commit: a8b50c168927b87bb4cef679854476cb77d3fb55
Author: Campbell Barton
Date: Mon Jun 5 22:09:49 2017 +1000
Branches: custom-manipulators
https://developer.blender.org/rBa8b50c168927b87bb4cef679854476cb77d3fb55
PyAPI: widget group (un)register working again
WIP, not yet usable.
===================================================================
M build_files/cmake/macros.cmake
M source/blender/makesrna/intern/rna_wm.c
M source/blender/python/intern/CMakeLists.txt
A source/blender/python/intern/bpy_widgetgroup_wrap.c
A source/blender/python/intern/bpy_widgetgroup_wrap.h
M source/blender/windowmanager/manipulators/WM_manipulator_api.h
M source/blender/windowmanager/manipulators/WM_manipulator_types.h
M source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
M source/blenderplayer/bad_level_call_stubs/stubs.c
===================================================================
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 92342d580c3..e327425949c 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -611,6 +611,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
bf_physics
bf_nodes
bf_rna
+ bf_python
bf_imbuf
bf_blenlib
bf_depsgraph
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 7e411d4ad05..c59dd72b27d 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -1568,12 +1568,11 @@ static void rna_WidgetGroup_unregister(struct Main *bmain, StructRNA *type)
WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
- //RNA_struct_free_extension(type, &wgrouptype->ext);
+ RNA_struct_free_extension(type, &wgrouptype->ext);
WM_manipulatorgrouptype_unregister(NULL, bmain, wgrouptype);
//WM_operatortype_remove_ptr(ot);
- /* not to be confused with the RNA_struct_free that WM_operatortype_remove calls, they are 2 different srna's */
RNA_struct_free(&BLENDER_RNA, type);
}
@@ -1669,14 +1668,14 @@ static void operator_cancel(bContext *C, wmManipulatorGroup *op)
}
#endif
-void widgetgroup_wrapper(wmManipulatorGroupType *ot, void *userdata);
+void widgetgroup_wrapper(wmManipulatorGroupType *mgrouptype, void *userdata);
static StructRNA *rna_WidgetGroup_register(
Main *bmain, ReportList *reports, void *data, const char *identifier,
StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
- wmManipulatorGroupType *wgrouptype, dummywgt = {NULL};
+ wmManipulatorGroupType dummywgt = {NULL};
wmManipulatorGroup dummywg = {NULL};
PointerRNA wgptr;
int have_function[3];
@@ -1697,7 +1696,9 @@ static StructRNA *rna_WidgetGroup_register(
/* check if the area supports widgets */
const struct wmManipulatorMapType_Params wmap_params = {
- dummywgt.mapidname, dummywgt.spaceid, dummywgt.regionid
+ .idname = dummywgt.idname,
+ .spaceid = dummywgt.spaceid,
+ .regionid = dummywgt.regionid,
};
wmManipulatorMapType *wmaptype = WM_manipulatormaptype_ensure(&wmap_params);
@@ -1706,54 +1707,37 @@ static StructRNA *rna_WidgetGroup_register(
return NULL;
}
-#if 0
/* check if we have registered this widgetgroup type before, and remove it */
{
- //wmManipulatorGroupType *ot = WM_manipulatorrouptype_find(dummywgt.idname, true);
- if (ot && ot->ext.srna)
- rna_WidgetGroup_unregister(bmain, ot->ext.srna);
+ wmManipulatorGroupType *wgrouptype = WM_manipulatorgrouptype_find(wmaptype, dummywgt.idname);
+ if (wgrouptype && wgrouptype->ext.srna) {
+ printf("Unregister!\n");
+ WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
+ WM_manipulatorgrouptype_unregister(NULL, bmain, wgrouptype);
+ }
}
-#endif
- /* XXX, this doubles up with the widgetgroup name [#29666]
- * for now just remove from dir(bpy.types) */
+ /* create a new widgetgroup type */
+ dummywgt.ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, dummywgt.idname, &RNA_WidgetGroup);
+ RNA_def_struct_flag(dummywgt.ext.srna, STRUCT_NO_IDPROPERTIES); /* widgetgroup properties are registered separately */
+ dummywgt.ext.data = data;
+ dummywgt.ext.call = call;
+ dummywgt.ext.free = free;
/* We used to register widget group types like this, now we do it similar to
* operator types. Thus we should be able to do the same as operator types now. */
-#if 0
- wgrouptype = WM_manipulatorrouptype_register_ptr(
- NULL, wmaptype,
- (have_function[0]) ? widgetgroup_poll : NULL,
- (have_function[2]) ? widgetgroup_draw : NULL,
- NULL, NULL, /* TODO */
- (have_function[1]) ? widgetgroup_keymap_init : NULL,
- dummywgt.name);
-#else
- /* XXX needs updating */
dummywgt.poll = (have_function[0]) ? widgetgroup_poll : NULL;
- dummywgt.init = (have_function[2]) ? widgetgroup_draw : NULL;
dummywgt.keymap_init = (have_function[1]) ? widgetgroup_keymap_init : NULL;
- wgrouptype = &dummywgt; /* XXX incorrect, just to avoid uninitialized value warning */
-#endif
-
- /* create a new widgetgroup type */
- wgrouptype->ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, wgrouptype->idname, &RNA_WidgetGroup);
- RNA_def_struct_flag(wgrouptype->ext.srna, STRUCT_NO_IDPROPERTIES); /* widgetgroup properties are registered separately */
- wgrouptype->ext.data = data;
- wgrouptype->ext.call = call;
- wgrouptype->ext.free = free;
-
- RNA_struct_blender_type_set(wgrouptype->ext.srna, wgrouptype);
+ dummywgt.init = (have_function[2]) ? widgetgroup_draw : NULL;
- /* by passing NULL as main to WM_manipulatorrouptype_register_ptr, we delay initialization */
+ WM_manipulatorgrouptype_append_ptr_runtime(bmain, wmaptype, widgetgroup_wrapper, (void *)&dummywgt);
- /* XXX, currently not working since we cant call own callbacks until this function finishes, catch22! */
- WM_manipulatorgrouptype_init_runtime(bmain, wmaptype, wgrouptype);
+ RNA_def_struct_duplicate_pointers(dummywgt.ext.srna);
/* update while blender is running */
WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
- return wgrouptype->ext.srna;
+ return dummywgt.ext.srna;
}
static void **rna_WidgetGroup_instance(PointerRNA *ptr)
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
index 038c1e7eb10..296a0fc1e6f 100644
--- a/source/blender/python/intern/CMakeLists.txt
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -78,6 +78,7 @@ set(SRC
bpy_util.c
bpy_utils_previews.c
bpy_utils_units.c
+ bpy_widgetgroup_wrap.c
stubs.c
gpu.h
@@ -108,6 +109,7 @@ set(SRC
bpy_util.h
bpy_utils_previews.h
bpy_utils_units.h
+ bpy_widgetgroup_wrap.h
../BPY_extern.h
)
diff --git a/source/blender/python/intern/bpy_widgetgroup_wrap.c b/source/blender/python/intern/bpy_widgetgroup_wrap.c
new file mode 100644
index 00000000000..de0eb40eb47
--- /dev/null
+++ b/source/blender/python/intern/bpy_widgetgroup_wrap.c
@@ -0,0 +1,90 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/bpy_widgetgroup_wrap.c
+ * \ingroup pythonintern
+ *
+ * This file is so Python can define widget-group's that C can call into.
+ * The generic callback functions for Python widget-group are defines in
+ * 'rna_wm.c', some calling into functions here to do python specific
+ * functionality.
+ *
+ * \note This follows 'bpy_operator_wrap.c' very closely.
+ * Keep in sync unless there is good reason not to!
+ */
+
+#include <Python.h>
+
+#include "BLI_utildefines.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "bpy_rna.h"
+#include "bpy_intern_string.h"
+#include "bpy_widgetgroup_wrap.h" /* own include */
+
+/* we may want to add, but not now */
+// #define USE_SRNA
+
+static void widgetgroup_properties_init(wmManipulatorGroupType *mgrouptype)
+{
+#ifdef USE_SRNA
+ PyTypeObject *py_class = mgrouptype->ext.data;
+#endif
+ RNA_struct_blender_type_set(mgrouptype->ext.srna, mgrouptype);
+
+#ifdef USE_SRNA
+ /* only call this so pyrna_deferred_register_class gives a useful error
+ * WM_operatortype_append_ptr will call RNA_def_struct_identifier
+ * later */
+ RNA_def_struct_identifier(mgrouptype->srna, mgrouptype->idname);
+
+ if (pyrna_deferred_register_class(mgrouptype->srna, py_class) != 0) {
+ PyErr_Print(); /* failed to register operator props */
+ PyErr_Clear();
+ }
+#endif
+}
+
+void widgetgroup_wrapper(wmManipulatorGroupType *mgrouptype, void *userdata)
+{
+ /* take care not to overwrite anything set in
+ * WM_manipulatorgrouptype_append_ptr before opfunc() is called */
+#ifdef USE_SRNA
+ StructRNA *srna = mgrouptype->srna;
+#endif
+ *mgrouptype = *((wmManipulatorGroupType *)userdata);
+#ifdef USE_SRNA
+ mgrouptype->srna = srna; /* restore */
+#endif
+
+#ifdef USE_SRNA
+ /* Use i18n context from ext.srna if possible (py widgetgroups). */
+ if (mgrouptype->ext.srna) {
+ RNA_def_struct_translation_context(mgrouptype->srna, RNA_struct_translation_context(mgrouptype->ext.srna));
+ }
+#endif
+
+ widgetgroup_properties_init(mgrouptype);
+}
diff --git a/source/blender/python/intern/bpy_widgetgroup_wrap.h b/source/blender/python/intern/bpy_widgetgroup_wrap.h
new file mode 100644
index 00000000000..9d6bcfabe81
--- /dev/null
+++ b/source/blender/python/intern/bpy_widgetgroup_wrap.h
@@ -0,0 +1,34 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/bpy_widgetgroup_wrap.h
+ * \ingroup pythonintern
+ */
+
+#ifndef __BPY_WIDGETGROUP_WRAP_H__
+#define __BPY_WIDGETGROUP_WRAP_H__
+
+struct wmManipulatorGroupType;
+
+/* exposed to rna/wm api */
+void widgetgroup_wrapper(struct wmManipulatorGroupT
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list