Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2017-06-05 20:34:09 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-06-05 20:34:09 +0300
commit6d4f08467715030e7ef8833758b8da986280f236 (patch)
tree01a0c20cd3a5d65a85e72beecb9d81444dd92722 /source/blender
parente83001b782f9a3cdd33a4cf57777ee7f2967dc2c (diff)
WM: pass manipulator-map when creating wmManipulatorGroup
Also store parent-pointer in wmManipulatorGroup's, since its not always possible to access the parent pointer.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/makesdna/DNA_manipulator_types.h2
-rw-r--r--source/blender/windowmanager/manipulators/intern/wm_manipulator.c6
-rw-r--r--source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h7
-rw-r--r--source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c19
-rw-r--r--source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c8
5 files changed, 26 insertions, 16 deletions
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);
}
/**