Commit: 123af0cd5f9ccf7cbb590c1d726e00a3e766c3bc
Author: Campbell Barton
Date:   Thu Jun 8 21:32:02 2017 +1000
Branches: custom-manipulators
https://developer.blender.org/rB123af0cd5f9ccf7cbb590c1d726e00a3e766c3bc

Unregister support for manipulator type

===================================================================

M       source/blender/makesrna/intern/rna_wm_manipulator.c
M       source/blender/windowmanager/intern/wm_operators.c
M       source/blender/windowmanager/manipulators/WM_manipulator_api.h
M       source/blender/windowmanager/manipulators/intern/wm_manipulator.c
M       source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c

===================================================================

diff --git a/source/blender/makesrna/intern/rna_wm_manipulator.c 
b/source/blender/makesrna/intern/rna_wm_manipulator.c
index f06bc9657fc..101ebb75df8 100644
--- a/source/blender/makesrna/intern/rna_wm_manipulator.c
+++ b/source/blender/makesrna/intern/rna_wm_manipulator.c
@@ -252,12 +252,13 @@ static void rna_Manipulator_color_hi_set(PointerRNA *ptr, 
const float *values)
        WM_manipulator_set_color_highlight(mnp, values);
 }
 
+static void rna_Manipulator_unregister(struct Main *bmain, StructRNA *type);
 void manipulator_wrapper(wmManipulatorType *wgt, void *userdata);
 
 static char _manipulator_idname[OP_MAX_TYPENAME];
 
 static StructRNA *rna_Manipulator_register(
-        Main *UNUSED(bmain), ReportList *reports, void *data, const char 
*identifier,
+        Main *bmain, ReportList *reports, void *data, const char *identifier,
         StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc 
free)
 {
        wmManipulatorType dummywt = {NULL};
@@ -286,17 +287,12 @@ static StructRNA *rna_Manipulator_register(
        }
 
        /* check if we have registered this manipulator type before, and remove 
it */
-
-       /* TODO: unregister */
-#if 0
        {
-               const wmManipulatorType *wtype = 
WM_manipulatortype_find(dummywt.idname, true);
-               if (wtype && wtype->ext.srna) {
-                       WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
-                       WM_manipulatortype_unregister(NULL, bmain, wtype);
+               const wmManipulatorType *wt = 
WM_manipulatortype_find(dummywt.idname, true);
+               if (wt && wt->ext.srna) {
+                       rna_Manipulator_unregister(bmain, wt->ext.srna);
                }
        }
-#endif
 
        /* create a new manipulator type */
        dummywt.ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, dummywt.idname, 
&RNA_Manipulator);
@@ -332,10 +328,12 @@ static StructRNA *rna_Manipulator_register(
        return dummywt.ext.srna;
 }
 
-static void rna_Manipulator_unregister(struct Main *bmain, StructRNA *type)
+static void rna_Manipulator_unregister(struct Main *UNUSED(bmain), StructRNA 
*type)
 {
        wmManipulatorType *wt = RNA_struct_blender_type_get(type);
 
+       /* TODO, remove widgets from interface! */
+
        if (!wt)
                return;
 
@@ -343,8 +341,7 @@ static void rna_Manipulator_unregister(struct Main *bmain, 
StructRNA *type)
 
        RNA_struct_free_extension(type, &wt->ext);
 
-       WM_manipulatortype_unregister(wt);
-       //WM_operatortype_remove_ptr(ot);
+       WM_manipulatortype_remove_ptr(wt);
 
        RNA_struct_free(&BLENDER_RNA, type);
 }
@@ -367,9 +364,14 @@ static StructRNA *rna_Manipulator_refine(PointerRNA 
*mnp_ptr)
  * \{ */
 
 static wmManipulator *rna_ManipulatorGroup_manipulator_new(
-        wmManipulatorGroup *mgroup, const char *idname, const char *name)
+        wmManipulatorGroup *mgroup, ReportList *reports, const char *idname, 
const char *name)
 {
-       wmManipulator *mpr = WM_manipulator_new(idname, mgroup, name);
+       const wmManipulatorType *wt = WM_manipulatortype_find(idname, true);
+       if (wt == NULL) {
+               BKE_reportf(reports, RPT_ERROR, "ManipulatorType '%s' not 
known", idname);
+               return NULL;
+       }
+       wmManipulator *mpr = WM_manipulator_new_ptr(wt, mgroup, name);
        return mpr;
 }
 
@@ -536,7 +538,7 @@ static StructRNA *rna_ManipulatorGroup_register(
                wmManipulatorGroupType *wgt = 
WM_manipulatorgrouptype_find(wmaptype, dummywgt.idname);
                if (wgt && wgt->ext.srna) {
                        WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
-                       WM_manipulatorgrouptype_unregister(NULL, bmain, wgt);
+                       WM_manipulatorgrouptype_remove_ptr(NULL, bmain, wgt);
                }
        }
 
@@ -581,10 +583,7 @@ static StructRNA *rna_ManipulatorGroup_register(
 
 static void rna_ManipulatorGroup_unregister(struct Main *bmain, StructRNA 
*type)
 {
-       //const char *idname;
        wmManipulatorGroupType *wgt = RNA_struct_blender_type_get(type);
-       //wmWindowManager *wm;
-       //wmManipulatorMapType *wmap = NULL;
 
        if (!wgt)
                return;
@@ -593,8 +592,7 @@ static void rna_ManipulatorGroup_unregister(struct Main 
*bmain, StructRNA *type)
 
        RNA_struct_free_extension(type, &wgt->ext);
 
-       WM_manipulatorgrouptype_unregister(NULL, bmain, wgt);
-       //WM_operatortype_remove_ptr(ot);
+       WM_manipulatorgrouptype_remove_ptr(NULL, bmain, wgt);
 
        RNA_struct_free(&BLENDER_RNA, type);
 }
@@ -634,6 +632,7 @@ static void rna_def_manipulators(BlenderRNA *brna, 
PropertyRNA *cprop)
 
        func = RNA_def_function(srna, "new", 
"rna_ManipulatorGroup_manipulator_new");
        RNA_def_function_ui_description(func, "Add manipulator");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_string(func, "type", "Type", 0, "", "Manipulator identifier"); 
/* optional */
        RNA_def_string(func, "name", "Name", 0, "", "Manipulator name"); /* 
optional */
        parm = RNA_def_pointer(func, "manipulator", "Manipulator", "", "New 
manipulator");
@@ -725,7 +724,7 @@ static void rna_def_manipulator(BlenderRNA *brna, 
PropertyRNA *cprop)
 
        /* wmManipulator.handler */
        static EnumPropertyItem tweak_actions[] = {
-               {1 /* WM_MANIPULATOR_TWEAK_PRECISE */, "PRECISE", 0, "Precise", 
""},
+               {WM_MANIPULATOR_TWEAK_PRECISE, "PRECISE", 0, "Precise", ""},
                {0, NULL, 0, NULL, NULL}
        };
        func = RNA_def_function(srna, "handler", NULL);
diff --git a/source/blender/windowmanager/intern/wm_operators.c 
b/source/blender/windowmanager/intern/wm_operators.c
index 429e35c7043..03e3ab2e7be 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -499,7 +499,7 @@ void WM_operatortype_remove_ptr(wmOperatorType *ot)
 
        WM_keyconfig_update_operatortype();
        if (ot->mgrouptype) {
-               WM_manipulatorgrouptype_unregister(NULL, G.main, 
ot->mgrouptype);
+               WM_manipulatorgrouptype_remove_ptr(NULL, G.main, 
ot->mgrouptype);
        }
 
        MEM_freeN(ot);
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h 
b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index 62a863c081f..00cc4274847 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -85,7 +85,8 @@ void WM_manipulator_set_color_highlight(struct wmManipulator 
*manipulator, const
 const struct wmManipulatorType *WM_manipulatortype_find(const char *idname, 
bool quiet);
 void WM_manipulatortype_append(void (*wtfunc)(struct wmManipulatorType *));
 void WM_manipulatortype_append_ptr(void (*mnpfunc)(struct wmManipulatorType *, 
void *), void *userdata);
-void WM_manipulatortype_unregister(struct wmManipulatorType *wt);
+bool WM_manipulatortype_remove(const char *idname);
+void WM_manipulatortype_remove_ptr(struct wmManipulatorType *wt);
 void WM_manipulatortype_iter(struct GHashIterator *ghi);
 
 /* -------------------------------------------------------------------- */
@@ -112,7 +113,7 @@ struct wmManipulatorGroupType 
*WM_manipulatorgrouptype_append_ptr_runtime(
 void WM_manipulatorgrouptype_init_runtime(
         const struct Main *bmain, struct wmManipulatorMapType *mmaptype,
         struct wmManipulatorGroupType *mgrouptype);
-void WM_manipulatorgrouptype_unregister(
+void WM_manipulatorgrouptype_remove_ptr(
         struct bContext *C, struct Main *bmain, struct wmManipulatorGroupType 
*mgroup);
 
 struct wmKeyMap *WM_manipulatorgroup_keymap_common(
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index 5f2c2ddf73d..37f60f72aaa 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -133,20 +133,44 @@ void WM_manipulatortype_append_ptr(void (*wtfunc)(struct 
wmManipulatorType *, vo
        wm_manipulatortype_append__end(mt);
 }
 
-void WM_manipulatortype_unregister(wmManipulatorType *UNUSED(wt))
+/**
+ * Free but don't remove from ghash.
+ */
+static void manipulatortype_free(wmManipulatorType *wt)
+{
+       MEM_freeN(wt);
+}
+
+void WM_manipulatortype_remove_ptr(wmManipulatorType *wt)
+{
+       BLI_assert(wt == WM_manipulatortype_find(wt->idname, false));
+
+       BLI_ghash_remove(global_manipulatortype_hash, wt->idname, NULL, NULL);
+
+       manipulatortype_free(wt);
+}
+
+bool WM_manipulatortype_remove(const char *idname)
 {
-       /* TODO */
-       BLI_assert(0);
+       wmManipulatorType *wt = BLI_ghash_lookup(global_manipulatortype_hash, 
idname);
+
+       if (wt == NULL) {
+               return false;
+       }
+
+       WM_manipulatortype_remove_ptr(wt);
+
+       return true;
 }
 
-static void manipulatortype_ghash_free_cb(wmManipulatorType *mt)
+static void wm_manipulatortype_ghash_free_cb(wmManipulatorType *mt)
 {
-       MEM_freeN(mt);
+       manipulatortype_free(mt);
 }
 
 void wm_manipulatortype_free(void)
 {
-       BLI_ghash_free(global_manipulatortype_hash, NULL, 
(GHashValFreeFP)manipulatortype_ghash_free_cb);
+       BLI_ghash_free(global_manipulatortype_hash, NULL, 
(GHashValFreeFP)wm_manipulatortype_ghash_free_cb);
        global_manipulatortype_hash = NULL;
 }
 
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
index 191f0eb36a2..37681eb60b2 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
@@ -611,7 +611,7 @@ void WM_manipulatorgrouptype_init_runtime(
        }
 }
 
-void WM_manipulatorgrouptype_unregister(bContext *C, Main *bmain, 
wmManipulatorGroupType *mgrouptype)
+void WM_manipulatorgrouptype_remove_ptr(bContext *C, Main *bmain, 
wmManipulatorGroupType *mgrouptype)
 {
        for (bScreen *sc = bmain->screen.first; sc; sc = sc->id.next) {
                for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) {

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

Reply via email to