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;
+       }
+}
+
+/** \} */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to