Commit: 6d4f08467715030e7ef8833758b8da986280f236
Author: Campbell Barton
Date:   Tue Jun 6 03:34:09 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB6d4f08467715030e7ef8833758b8da986280f236

WM: pass manipulator-map when creating wmManipulatorGroup

Also store parent-pointer in wmManipulatorGroup's,
since its not always possible to access the parent pointer.

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

M       source/blender/makesdna/DNA_manipulator_types.h
M       source/blender/windowmanager/manipulators/intern/wm_manipulator.c
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/makesdna/DNA_manipulator_types.h 
b/source/blender/makesdna/DNA_manipulator_types.h
index 7b75806f7c0..006a308162b 100644
--- a/source/blender/makesdna/DNA_manipulator_types.h
+++ b/source/blender/makesdna/DNA_manipulator_types.h
@@ -31,6 +31,8 @@ typedef struct wmManipulatorGroup {
        struct wmManipulatorGroupType *type;
        ListBase manipulators;
 
+       struct wmManipulatorMap *parent_mmap;
+
        void *py_instance;            /* python stores the class instance here 
*/
        struct ReportList *reports;   /* errors and warnings storage */
 
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index de2096dbde9..3d44e0c5d59 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -232,7 +232,7 @@ void WM_manipulator_delete(ListBase *manipulatorlist, 
wmManipulatorMap *mmap, wm
 
 wmManipulatorGroup *wm_manipulator_get_parent_group(const wmManipulator 
*manipulator)
 {
-       return manipulator->mgroup;
+       return manipulator->parent_mgroup;
 }
 
 
@@ -295,7 +295,7 @@ void WM_manipulator_set_custom_handler(
  */
 void WM_manipulator_set_func_select(wmManipulator *manipulator, 
wmManipulatorSelectFunc select)
 {
-       BLI_assert(manipulator->mgroup->type->flag & 
WM_MANIPULATORGROUPTYPE_SELECTABLE);
+       BLI_assert(manipulator->parent_mgroup->type->flag & 
WM_MANIPULATORGROUPTYPE_SELECTABLE);
        manipulator->select = select;
 }
 
@@ -421,7 +421,7 @@ void wm_manipulator_calculate_scale(wmManipulator 
*manipulator, const bContext *
        const RegionView3D *rv3d = CTX_wm_region_view3d(C);
        float scale = 1.0f;
 
-       if (manipulator->mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SCALE_3D) 
{
+       if (manipulator->parent_mgroup->type->flag & 
WM_MANIPULATORGROUPTYPE_SCALE_3D) {
                if (rv3d /*&& (U.manipulator_flag & V3D_DRAW_MANIPULATOR) == 
0*/) { /* UserPref flag might be useful for later */
                        if (manipulator->get_final_position) {
                                float position[3];
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
index 595eb4034a4..d2f81951f28 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
@@ -41,7 +41,7 @@ struct wmManipulator {
 
        char idname[MAX_NAME + 4]; /* + 4 for unique '.001', '.002', etc suffix 
*/
        /* pointer back to group this manipulator is in (just for quick access) 
*/
-       struct wmManipulatorGroup *mgroup;
+       struct wmManipulatorGroup *parent_mgroup;
 
        /* could become wmManipulatorType */
        /* draw manipulator */
@@ -153,8 +153,9 @@ enum {
        TWEAK_MODAL_PRECISION_OFF,
 };
 
-struct wmManipulatorGroup *wm_manipulatorgroup_new_from_type(struct 
wmManipulatorGroupType *mgrouptype);
-void wm_manipulatorgroup_free(bContext *C, struct wmManipulatorMap *mmap, 
struct wmManipulatorGroup *mgroup);
+struct wmManipulatorGroup *wm_manipulatorgroup_new_from_type(
+        struct wmManipulatorMap *mmap, struct wmManipulatorGroupType 
*mgrouptype);
+void wm_manipulatorgroup_free(bContext *C, struct wmManipulatorGroup *mgroup);
 void wm_manipulatorgroup_manipulator_register(struct wmManipulatorGroup 
*mgroup, struct wmManipulator *manipulator);
 struct wmManipulator *wm_manipulatorgroup_find_intersected_mainpulator(
         const struct wmManipulatorGroup *mgroup, struct bContext *C, const 
struct wmEvent *event,
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
index 11fc1b32047..ad31b1f7618 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
@@ -73,16 +73,23 @@ enum {
 /**
  * Create a new manipulator-group from \a mgrouptype.
  */
-wmManipulatorGroup *wm_manipulatorgroup_new_from_type(wmManipulatorGroupType 
*mgrouptype)
+wmManipulatorGroup *wm_manipulatorgroup_new_from_type(
+        wmManipulatorMap *mmap, wmManipulatorGroupType *mgrouptype)
 {
        wmManipulatorGroup *mgroup = MEM_callocN(sizeof(*mgroup), 
"manipulator-group");
        mgroup->type = mgrouptype;
 
+       /* keep back-link */
+       mgroup->parent_mmap = mmap;
+
+       BLI_addtail(&mmap->manipulator_groups, mgroup);
+
        return mgroup;
 }
 
-void wm_manipulatorgroup_free(bContext *C, wmManipulatorMap *mmap, 
wmManipulatorGroup *mgroup)
+void wm_manipulatorgroup_free(bContext *C, wmManipulatorGroup *mgroup)
 {
+       wmManipulatorMap *mmap = mgroup->parent_mmap;
        for (wmManipulator *manipulator = mgroup->manipulators.first; 
manipulator;) {
                wmManipulator *manipulator_next = manipulator->next;
                WM_manipulator_delete(&mgroup->manipulators, mmap, manipulator, 
C);
@@ -121,7 +128,7 @@ void 
wm_manipulatorgroup_manipulator_register(wmManipulatorGroup *mgroup, wmMani
 {
        BLI_assert(!BLI_findstring(&mgroup->manipulators, manipulator->idname, 
offsetof(wmManipulator, idname)));
        BLI_addtail(&mgroup->manipulators, manipulator);
-       manipulator->mgroup = mgroup;
+       manipulator->parent_mgroup = mgroup;
 }
 
 void wm_manipulatorgroup_attach_to_modal_handler(
@@ -570,10 +577,9 @@ void WM_manipulatorgrouptype_init_runtime(
                                for (ARegion *ar = lb->first; ar; ar = 
ar->next) {
                                        wmManipulatorMap *mmap = 
ar->manipulator_map;
                                        if (mmap->type == mmaptype) {
-                                               wmManipulatorGroup *mgroup = 
wm_manipulatorgroup_new_from_type(mgrouptype);
+                                               
wm_manipulatorgroup_new_from_type(mmap, mgrouptype);
 
                                                /* just add here, drawing will 
occur on next update */
-                                               
BLI_addtail(&mmap->manipulator_groups, mgroup);
                                                
wm_manipulatormap_set_highlighted_manipulator(mmap, NULL, NULL, 0);
                                                ED_region_tag_redraw(ar);
                                        }
@@ -596,7 +602,8 @@ void WM_manipulatorgrouptype_unregister(bContext *C, Main 
*bmain, wmManipulatorG
                                        for (mgroup = 
mmap->manipulator_groups.first; mgroup; mgroup = mgroup_next) {
                                                mgroup_next = mgroup->next;
                                                if (mgroup->type == mgrouptype) 
{
-                                                       
wm_manipulatorgroup_free(C, mmap, mgroup);
+                                                       
BLI_assert(mgroup->parent_mmap == mmap);
+                                                       
wm_manipulatorgroup_free(C, mgroup);
                                                        
ED_region_tag_redraw(ar);
                                                }
                                        }
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
index cfc393c30b3..faf76a47d7a 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
@@ -93,8 +93,7 @@ wmManipulatorMap *WM_manipulatormap_new_from_type(const 
struct wmManipulatorMapT
             mgrouptype;
             mgrouptype = mgrouptype->next)
        {
-               wmManipulatorGroup *mgroup = 
wm_manipulatorgroup_new_from_type(mgrouptype);
-               BLI_addtail(&mmap->manipulator_groups, mgroup);
+               wm_manipulatorgroup_new_from_type(mmap, mgrouptype);
        }
 
        return mmap;
@@ -113,7 +112,8 @@ void wm_manipulatormap_delete(wmManipulatorMap *mmap)
 
        for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first, 
*mgroup_next; mgroup; mgroup = mgroup_next) {
                mgroup_next = mgroup->next;
-               wm_manipulatorgroup_free(NULL, mmap, mgroup);
+               BLI_assert(mgroup->parent_mmap == mmap);
+               wm_manipulatorgroup_free(NULL, mgroup);
        }
        BLI_assert(BLI_listbase_is_empty(&mmap->manipulator_groups));
 
@@ -462,7 +462,7 @@ bool wm_manipulatormap_deselect_all(wmManipulatorMap *mmap, 
wmManipulator ***sel
 
 BLI_INLINE bool manipulator_selectable_poll(const wmManipulator *manipulator, 
void *UNUSED(data))
 {
-       return (manipulator->mgroup->type->flag & 
WM_MANIPULATORGROUPTYPE_SELECTABLE);
+       return (manipulator->parent_mgroup->type->flag & 
WM_MANIPULATORGROUPTYPE_SELECTABLE);
 }
 
 /**

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to