[Bf-blender-cvs] [291c286] custom-manipulators temp_manipulators_core: Split wmManipulator flag into behavior flags and state flags

Julian Eisel noreply at git.blender.org
Tue Oct 4 02:17:13 CEST 2016


Commit: 291c28642dce6b0ab22d1a848c40ed352bef8975
Author: Julian Eisel
Date:   Mon Oct 3 20:04:21 2016 +0200
Branches: custom-manipulators temp_manipulators_core
https://developer.blender.org/rB291c28642dce6b0ab22d1a848c40ed352bef8975

Split wmManipulator flag into behavior flags and state flags

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

M	source/blender/windowmanager/manipulators/WM_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/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index 13ae223..ab9220a 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -59,19 +59,15 @@ typedef struct wmManipulatorWrapper {
 } wmManipulatorWrapper;
 
 /* wmManipulator->flag */
+/* TODO some of these could become group-type flags */
 enum eManipulatorFlag {
-	/* states (TODO separate bitfield) */
-	WM_MANIPULATOR_HIGHLIGHT   = (1 << 0),
-	WM_MANIPULATOR_ACTIVE      = (1 << 1),
-	WM_MANIPULATOR_SELECTED    = (1 << 2),
-	/* settings */
-	WM_MANIPULATOR_DRAW_HOVER  = (1 << 3),
-	WM_MANIPULATOR_DRAW_ACTIVE = (1 << 4), /* draw while dragging */
-	WM_MANIPULATOR_DRAW_VALUE  = (1 << 5), /* draw a indicator for the current value while dragging */
-	WM_MANIPULATOR_SCALE_3D    = (1 << 6),
-	WM_MANIPULATOR_SCENE_DEPTH = (1 << 7), /* manipulator is depth culled with scene objects (TODO could be group flag) */
-	WM_MANIPULATOR_HIDDEN      = (1 << 8),
-	WM_MANIPULATOR_SELECTABLE  = (1 << 9),
+	WM_MANIPULATOR_DRAW_HOVER  = (1 << 0), /* draw *only* while hovering */
+	WM_MANIPULATOR_DRAW_ACTIVE = (1 << 1), /* draw while dragging */
+	WM_MANIPULATOR_DRAW_VALUE  = (1 << 2), /* draw a indicator for the current value while dragging */
+	WM_MANIPULATOR_SCALE_3D    = (1 << 3),
+	WM_MANIPULATOR_SCENE_DEPTH = (1 << 4), /* manipulator can be depth culled with scene objects */
+	WM_MANIPULATOR_HIDDEN      = (1 << 5),
+	WM_MANIPULATOR_SELECTABLE  = (1 << 6),
 };
 
 
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index 0d5c46b..347726e 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -185,13 +185,13 @@ bool wm_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *manipula
  */
 void WM_manipulator_delete(ListBase *manipulatorlist, wmManipulatorMap *mmap, wmManipulator *manipulator, bContext *C)
 {
-	if (manipulator->flag & WM_MANIPULATOR_HIGHLIGHT) {
+	if (manipulator->state & WM_MANIPULATOR_HIGHLIGHT) {
 		wm_manipulatormap_set_highlighted_manipulator(mmap, C, NULL, 0);
 	}
-	if (manipulator->flag & WM_MANIPULATOR_ACTIVE) {
+	if (manipulator->state & WM_MANIPULATOR_ACTIVE) {
 		wm_manipulatormap_set_active_manipulator(mmap, C, NULL, NULL);
 	}
-	if (manipulator->flag & WM_MANIPULATOR_SELECTED) {
+	if (manipulator->state & WM_MANIPULATOR_SELECTED) {
 		wm_manipulator_deselect(mmap, manipulator);
 	}
 
@@ -338,7 +338,7 @@ bool wm_manipulator_deselect(wmManipulatorMap *mmap, wmManipulator *manipulator)
 	bool changed = false;
 
 	/* caller should check! */
-	BLI_assert(manipulator->flag & WM_MANIPULATOR_SELECTED);
+	BLI_assert(manipulator->state & WM_MANIPULATOR_SELECTED);
 
 	/* remove manipulator from selected_manipulators array */
 	for (int i = 0; i < (*tot_selected); i++) {
@@ -360,7 +360,7 @@ bool wm_manipulator_deselect(wmManipulatorMap *mmap, wmManipulator *manipulator)
 		(*tot_selected)--;
 	}
 
-	manipulator->flag &= ~WM_MANIPULATOR_SELECTED;
+	manipulator->state &= ~WM_MANIPULATOR_SELECTED;
 	return changed;
 }
 
@@ -375,7 +375,7 @@ bool wm_manipulator_select(bContext *C, wmManipulatorMap *mmap, wmManipulator *m
 	wmManipulator ***sel = &mmap->mmap_context.selected_manipulator;
 	int *tot_selected = &mmap->mmap_context.tot_selected;
 
-	if (!manipulator || (manipulator->flag & WM_MANIPULATOR_SELECTED))
+	if (!manipulator || (manipulator->state & WM_MANIPULATOR_SELECTED))
 		return false;
 
 	(*tot_selected)++;
@@ -383,7 +383,7 @@ bool wm_manipulator_select(bContext *C, wmManipulatorMap *mmap, wmManipulator *m
 	*sel = MEM_reallocN(*sel, sizeof(wmManipulator *) * (*tot_selected));
 	(*sel)[(*tot_selected) - 1] = manipulator;
 
-	manipulator->flag |= WM_MANIPULATOR_SELECTED;
+	manipulator->state |= WM_MANIPULATOR_SELECTED;
 	if (manipulator->select) {
 		manipulator->select(C, manipulator, SEL_SELECT);
 	}
@@ -442,13 +442,13 @@ bool wm_manipulator_is_visible(wmManipulator *manipulator)
 	if (manipulator->flag & WM_MANIPULATOR_HIDDEN) {
 		return false;
 	}
-	if ((manipulator->flag & WM_MANIPULATOR_ACTIVE) &&
+	if ((manipulator->state & WM_MANIPULATOR_ACTIVE) &&
 	    !(manipulator->flag & (WM_MANIPULATOR_DRAW_ACTIVE | WM_MANIPULATOR_DRAW_VALUE)))
 	{
 		/* don't draw while active (while dragging) */
 		return false;
 	}
-	if ((manipulator->flag & WM_MANIPULATOR_DRAW_HOVER) && !(manipulator->flag & WM_MANIPULATOR_HIGHLIGHT)) {
+	if ((manipulator->flag & WM_MANIPULATOR_DRAW_HOVER) && !(manipulator->state & WM_MANIPULATOR_HIGHLIGHT)) {
 		/* only draw on mouse hover */
 		return false;
 	}
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
index 4791282..dd284e9 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
@@ -71,7 +71,8 @@ typedef struct wmManipulator {
 	/* called when manipulator selection state changes */
 	wmManipulatorSelectFunc select;
 
-	int flag; /* flags set by drawing and interaction, such as highlighting */
+	int flag; /* flags that influence the behavior or how the manipulators are drawn */
+	short state; /* state flags (active, highlighted, selected) */
 
 	unsigned char highlighted_part;
 
@@ -105,6 +106,13 @@ typedef struct wmManipulator {
 	PropertyRNA **props;
 } wmManipulator;
 
+/* wmManipulator.state */
+enum {
+	WM_MANIPULATOR_HIGHLIGHT   = (1 << 0), /* while hovered */
+	WM_MANIPULATOR_ACTIVE      = (1 << 1), /* while dragging */
+	WM_MANIPULATOR_SELECTED    = (1 << 2),
+};
+
 /**
  * \brief Manipulator tweak flag.
  * Bitflag passed to manipulator while tweaking.
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
index c2780d3..fc869eb 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
@@ -204,7 +204,7 @@ static int manipulator_select_invoke(bContext *C, wmOperator *op, const wmEvent
 	}
 
 	if (highlighted) {
-		const bool is_selected = (highlighted->flag & WM_MANIPULATOR_SELECTED);
+		const bool is_selected = (highlighted->state & WM_MANIPULATOR_SELECTED);
 		bool redraw = false;
 
 		if (toggle) {
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
index 579d6b2..cac8eb1 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
@@ -212,13 +212,11 @@ static void manipulatormap_prepare_drawing(
 	for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; mgroup; mgroup = mgroup->next) {
 		/* account for drawstep on manipulator-group level (do first to avoid calling mgroup->poll if not needed) */
 		if ((drawstep == WM_MANIPULATORMAP_DRAWSTEP_2D && mgroup->type->is_3d) ||
-		    (drawstep == WM_MANIPULATORMAP_DRAWSTEP_3D && !mgroup->type->is_3d))
+		    (drawstep == WM_MANIPULATORMAP_DRAWSTEP_3D && !mgroup->type->is_3d) ||
+		    !wm_manipulatorgroup_is_visible(mgroup, C))
 		{
 			continue;
 		}
-		if (!wm_manipulatorgroup_is_visible(mgroup, C)) {
-			continue;
-		}
 
 		/* needs to be initialized on first draw */
 		wm_manipulatorgroup_ensure_initialized(mgroup, C);
@@ -485,7 +483,7 @@ bool wm_manipulatormap_deselect_all(wmManipulatorMap *mmap, wmManipulator ***sel
 		return false;
 
 	for (int i = 0; i < mmap->mmap_context.tot_selected; i++) {
-		(*sel)[i]->flag &= ~WM_MANIPULATOR_SELECTED;
+		(*sel)[i]->state &= ~WM_MANIPULATOR_SELECTED;
 		(*sel)[i] = NULL;
 	}
 	wm_manipulatormap_selected_delete(mmap);
@@ -523,10 +521,10 @@ static bool wm_manipulatormap_select_all_intern(
 	GHASH_ITER_INDEX (gh_iter, hash, i) {
 		wmManipulator *manipulator_iter = BLI_ghashIterator_getValue(&gh_iter);
 
-		if ((manipulator_iter->flag & WM_MANIPULATOR_SELECTED) == 0) {
+		if ((manipulator_iter->state & WM_MANIPULATOR_SELECTED) == 0) {
 			changed = true;
 		}
-		manipulator_iter->flag |= WM_MANIPULATOR_SELECTED;
+		manipulator_iter->state |= WM_MANIPULATOR_SELECTED;
 		if (manipulator_iter->select) {
 			manipulator_iter->select(C, manipulator_iter, action);
 		}
@@ -628,14 +626,14 @@ void wm_manipulatormap_set_highlighted_manipulator(
 	    (manipulator && part != manipulator->highlighted_part))
 	{
 		if (mmap->mmap_context.highlighted_manipulator) {
-			mmap->mmap_context.highlighted_manipulator->flag &= ~WM_MANIPULATOR_HIGHLIGHT;
+			mmap->mmap_context.highlighted_manipulator->state &= ~WM_MANIPULATOR_HIGHLIGHT;
 			mmap->mmap_context.highlighted_manipulator->highlighted_part = 0;
 		}
 
 		mmap->mmap_context.highlighted_manipulator = manipulator;
 
 		if (manipulator) {
-			manipulator->flag |= WM_MANIPULATOR_HIGHLIGHT;
+			manipulator->state |= WM_MANIPULATOR_HIGHLIGHT;
 			manipulator->highlighted_part = part;
 
 			if (C && manipulator->get_cursor) {
@@ -667,7 +665,7 @@ void wm_manipulatormap_set_active_manipulator(
         wmManipulatorMap *mmap, bContext *C, const wmEvent *event, wmManipulator *manipulator)
 {
 	if (manipulator && C) {
-		manipulator->flag |= WM_MANIPULATOR_ACTIVE;
+		manipulator->state |= WM_MANIPULATOR_ACTIVE;
 		mmap->mmap_context.active_manipulator = manipulator;
 
 		if (manipulator->opname) {
@@ -683,7 +681,7 @@ void wm_manipulatormap_set_active_manipulator(
 
 				/* we failed to hook the manipulator to the operator handler or operator was cancelled, return */
 				if (!mmap->mmap_context.active_manipulator) {
-					manipulator->flag &= ~WM_MANIPULATOR_ACTIVE;
+					manipulator->state &= ~WM_MANIPULATOR_ACTIVE;
 					/* first activate the manipulator itself */
 					if (manipulator->interaction_data) {
 						MEM_freeN(manipulator->interaction_data);
@@ -711,7 +709,7 @@ void wm_manipulatormap_set_active_manipulator(
 
 	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list