[Bf-blender-cvs] [0b1e9ff65de] custom-manipulators: Support dynamic registration w/ RNA widget types
Campbell Barton
noreply at git.blender.org
Tue Jun 13 08:47:51 CEST 2017
Commit: 0b1e9ff65de78c37517c7485bf5704b8bdb2c100
Author: Campbell Barton
Date: Tue Jun 13 16:48:59 2017 +1000
Branches: custom-manipulators
https://developer.blender.org/rB0b1e9ff65de78c37517c7485bf5704b8bdb2c100
Support dynamic registration w/ RNA widget types
Dynamically registered types are now correctly initialized in each view.
===================================================================
M source/blender/makesrna/intern/rna_wm_manipulator.c
M source/blender/windowmanager/intern/wm_event_system.c
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_manipulator_intern.h
M source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
M source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
===================================================================
diff --git a/source/blender/makesrna/intern/rna_wm_manipulator.c b/source/blender/makesrna/intern/rna_wm_manipulator.c
index 957eb709745..5adc54809db 100644
--- a/source/blender/makesrna/intern/rna_wm_manipulator.c
+++ b/source/blender/makesrna/intern/rna_wm_manipulator.c
@@ -619,9 +619,10 @@ static StructRNA *rna_ManipulatorGroup_register(
dummywgt.idname = dummywgt.ext.srna->identifier;
dummywgt.name = dummywgt.ext.srna->name;
- WM_manipulatorgrouptype_append_ptr(wmaptype, BPY_RNA_manipulatorgroup_wrapper, (void *)&dummywgt);
+ WM_manipulatorconfig_update_tag_init(wmaptype, &dummywgt);
- /* TODO: WM_manipulatorgrouptype_init_runtime */
+ /* Appending flags to initialize in next use. */
+ WM_manipulatorgrouptype_append_ptr(wmaptype, BPY_RNA_manipulatorgroup_wrapper, (void *)&dummywgt);
/* update while blender is running */
WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 2cace058373..0e7f4a33811 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2466,6 +2466,7 @@ void wm_event_do_handlers(bContext *C)
/* update key configuration before handling events */
WM_keyconfig_update(wm);
+ WM_manipulatorconfig_update(CTX_data_main(C));
for (win = wm->windows.first; win; win = win->next) {
bScreen *screen = WM_window_get_active_screen(win);
@@ -2678,6 +2679,7 @@ void wm_event_do_handlers(bContext *C)
/* update key configuration after handling events */
WM_keyconfig_update(wm);
+ WM_manipulatorconfig_update(CTX_data_main(C));
}
/* ********** filesector handling ************ */
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index 8f5878d8cc6..ab7c35407da 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -95,6 +95,13 @@ bool WM_manipulatortype_remove(const char *idname);
void WM_manipulatortype_remove_ptr(struct wmManipulatorType *wt);
void WM_manipulatortype_iter(struct GHashIterator *ghi);
+/* wm_manipulatormap.c */
+
+/* Dynamic Updates (for RNA runtime registration) */
+void WM_manipulatorconfig_update_tag_init(struct wmManipulatorMapType *mmaptype, struct wmManipulatorGroupType *wgt);
+void WM_manipulatorconfig_update(const struct Main *bmain);
+
+
/* -------------------------------------------------------------------- */
/* wmManipulatorGroup */
@@ -139,4 +146,3 @@ bool WM_manipulatormap_select_all(struct bContext *C, struct wmManipulatorMap *m
bool WM_manipulatormap_cursor_set(const struct wmManipulatorMap *mmap, struct wmWindow *win);
#endif /* __WM_MANIPULATOR_API_H__ */
-
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index d0abcb7ee3c..bf98a9ca0b7 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -227,12 +227,23 @@ typedef struct wmManipulatorGroupType {
int flag;
+ /* eManipulatorMapTypeUpdateFlags (so we know which group type to update) */
+ uchar type_update_flag;
+
/* same as manipulator-maps, so registering/unregistering goes to the correct region */
short spaceid, regionid;
char mapidname[64];
} wmManipulatorGroupType;
/**
+ * Manipulator-map type update flag: `wmManipulatorMapType.type_update_flag`
+ */
+enum eManipulatorMapTypeUpdateFlags {
+ /* A new type has been added, needs to be initialized for all views. */
+ WM_MANIPULATORMAPTYPE_UPDATE_INIT = (1 << 0),
+};
+
+/**
* wmManipulatorGroupType.flag
* Flags that influence the behavior of all manipulators in the group.
*/
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
index 0692b1830db..b663b26a751 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
@@ -112,6 +112,9 @@ struct wmManipulatorMapType {
short spaceid, regionid;
/* types of manipulator-groups for this manipulator-map type */
ListBase manipulator_grouptypes;
+
+ /* eManipulatorMapTypeUpdateFlags */
+ uchar type_update_flag;
};
void wm_manipulatormap_selected_clear(struct wmManipulatorMap *mmap);
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
index 8f1480ed984..f2da7fdb38f 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
@@ -521,6 +521,11 @@ static void wm_manipulatorgrouptype_append__end(
/* add the type for future created areas of the same type */
BLI_addtail(&mmaptype->manipulator_grouptypes, wgt);
+
+ /* Only call this from RNA registration, else we can assume types are initialized before the screens are. */
+#if 0
+ WM_manipulatorconfig_update_tag_init(mmaptype, wgt);
+#endif
}
/**
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
index 6732a4cfee9..fa6bec70a76 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
@@ -29,13 +29,14 @@
#include <string.h>
-#include "BKE_context.h"
-
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_string.h"
#include "BLI_ghash.h"
+#include "BKE_context.h"
+#include "BKE_global.h"
+
#include "DNA_manipulator_types.h"
#include "ED_screen.h"
@@ -62,6 +63,16 @@
static ListBase manipulatormaptypes = {NULL, NULL};
/**
+ * Update when manipulator-map types change.
+ */
+/* so operator removal can trigger update */
+enum {
+ WM_MANIPULATORMAPTYPE_GLOBAL_UPDATE_INIT = (1 << 0),
+};
+
+static char wm_mmap_type_update_flag = 0;
+
+/**
* Manipulator-map update tagging.
*/
enum eManipulatorMapUpdateFlags {
@@ -736,10 +747,7 @@ void wm_manipulatormaptypes_free(void)
mmaptype = mmaptype_next)
{
mmaptype_next = mmaptype->next;
- for (wmManipulatorGroupType *wgt = mmaptype->manipulator_grouptypes.first, *wgt_next;
- wgt;
- wgt = wgt_next)
- {
+ for (wmManipulatorGroupType *wgt = mmaptype->manipulator_grouptypes.first, *wgt_next; wgt; wgt = wgt_next) {
wgt_next = wgt->next;
WM_manipulatorgrouptype_free(wgt);
}
@@ -767,3 +775,46 @@ void wm_manipulators_keymap(wmKeyConfig *keyconf)
/** \} */ /* wmManipulatorMapType */
+/* -------------------------------------------------------------------- */
+/** \name Updates for Dynamic Type Registraion
+ *
+ * \{ */
+
+
+void WM_manipulatorconfig_update_tag_init(wmManipulatorMapType *mmaptype, wmManipulatorGroupType *wgt)
+{
+ /* tag for update on next use */
+ mmaptype->type_update_flag |= WM_MANIPULATORMAPTYPE_UPDATE_INIT;
+ wgt->type_update_flag |= WM_MANIPULATORMAPTYPE_UPDATE_INIT;
+
+ wm_mmap_type_update_flag |= WM_MANIPULATORMAPTYPE_GLOBAL_UPDATE_INIT;
+}
+
+/**
+ * Run incase new types have been added (runs often, early exit where possible).
+ * Follows #WM_keyconfig_update concentions.
+ */
+void WM_manipulatorconfig_update(const struct Main *bmain)
+{
+ if (G.background)
+ return;
+
+ if (wm_mmap_type_update_flag == 0)
+ return;
+
+ if (wm_mmap_type_update_flag & WM_MANIPULATORMAPTYPE_GLOBAL_UPDATE_INIT) {
+ for (wmManipulatorMapType *mmaptype = manipulatormaptypes.first; mmaptype; mmaptype = mmaptype->next) {
+ if (mmaptype->type_update_flag & WM_MANIPULATORMAPTYPE_UPDATE_INIT) {
+ mmaptype->type_update_flag &= ~WM_MANIPULATORMAPTYPE_UPDATE_INIT;
+ for (wmManipulatorGroupType *wgt = mmaptype->manipulator_grouptypes.first; wgt; wgt = wgt->next) {
+ wgt->type_update_flag &= ~WM_MANIPULATORMAPTYPE_UPDATE_INIT;
+ WM_manipulatorgrouptype_init_runtime(bmain, mmaptype, wgt);
+ }
+ }
+ }
+
+ wm_mmap_type_update_flag &= ~WM_MANIPULATORMAPTYPE_GLOBAL_UPDATE_INIT;
+ }
+}
+
+/** \} */
More information about the Bf-blender-cvs
mailing list