[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58358] trunk/blender/source/blender: fix for action editor view-selected behaving strangely.

Campbell Barton ideasman42 at gmail.com
Thu Jul 18 04:59:29 CEST 2013


Revision: 58358
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58358
Author:   campbellbarton
Date:     2013-07-18 02:59:28 +0000 (Thu, 18 Jul 2013)
Log Message:
-----------
fix for action editor view-selected behaving strangely.
- when an fcurve had no selected keyframes, a default fallback value was used which caused view-selected to include frame 1, even when no selected frames were there.

- the vertical axis was always reset, ideally we would center vertically too but the way this operator currently works we only know about the frame range,
  now don't change the vertical scroll when viewing selected since it would always jump to the top of the screen (view-all still acts this way).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_fcurve.h
    trunk/blender/source/blender/blenkernel/intern/fcurve.c
    trunk/blender/source/blender/editors/space_action/action_edit.c

Modified: trunk/blender/source/blender/blenkernel/BKE_fcurve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_fcurve.h	2013-07-18 00:48:42 UTC (rev 58357)
+++ trunk/blender/source/blender/blenkernel/BKE_fcurve.h	2013-07-18 02:59:28 UTC (rev 58358)
@@ -216,7 +216,7 @@
 int binarysearch_bezt_index(struct BezTriple array[], float frame, int arraylen, bool *r_replace);
 
 /* get the time extents for F-Curve */
-void calc_fcurve_range(struct FCurve *fcu, float *min, float *max,
+bool calc_fcurve_range(struct FCurve *fcu, float *min, float *max,
                        const short do_sel_only, const short do_min_length);
 
 /* get the bounding-box extents for F-Curve */

Modified: trunk/blender/source/blender/blenkernel/intern/fcurve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/fcurve.c	2013-07-18 00:48:42 UTC (rev 58357)
+++ trunk/blender/source/blender/blenkernel/intern/fcurve.c	2013-07-18 02:59:28 UTC (rev 58358)
@@ -577,7 +577,7 @@
 }
 
 /* Calculate the extents of F-Curve's keyframes */
-void calc_fcurve_range(FCurve *fcu, float *start, float *end,
+bool calc_fcurve_range(FCurve *fcu, float *start, float *end,
                        const short do_sel_only, const short do_min_length)
 {
 	float min = 999999999.0f, max = -999999999.0f;
@@ -621,6 +621,8 @@
 
 	*start = min;
 	*end = max;
+
+	return foundvert;
 }
 
 /* ----------------- Status Checks -------------------------- */

Modified: trunk/blender/source/blender/editors/space_action/action_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_action/action_edit.c	2013-07-18 00:48:42 UTC (rev 58357)
+++ trunk/blender/source/blender/editors/space_action/action_edit.c	2013-07-18 02:59:28 UTC (rev 58358)
@@ -231,11 +231,12 @@
 /* *************************** Calculate Range ************************** */
 
 /* Get the min/max keyframes*/
-static void get_keyframe_extents(bAnimContext *ac, float *min, float *max, const short onlySel)
+static bool get_keyframe_extents(bAnimContext *ac, float *min, float *max, const short onlySel)
 {
 	ListBase anim_data = {NULL, NULL};
 	bAnimListElem *ale;
 	int filter;
+	bool found = false;
 	
 	/* get data to filter, from Action or Dopesheet */
 	/* XXX: what is sel doing here?!
@@ -261,6 +262,7 @@
 					const float framenum = (float)gpf->framenum;
 					*min = min_ff(*min, framenum);
 					*max = max_ff(*max, framenum);
+					found = true;
 				}
 			}
 			else if (ale->datatype == ALE_MASKLAY) {
@@ -275,6 +277,7 @@
 					const float framenum = (float)masklay_shape->frame;
 					*min = min_ff(*min, framenum);
 					*max = max_ff(*max, framenum);
+					found = true;
 				}
 			}
 			else {
@@ -282,16 +285,18 @@
 				float tmin, tmax;
 
 				/* get range and apply necessary scaling before processing */
-				calc_fcurve_range(fcu, &tmin, &tmax, onlySel, TRUE);
+				if (calc_fcurve_range(fcu, &tmin, &tmax, onlySel, TRUE)) {
 
-				if (adt) {
-					tmin = BKE_nla_tweakedit_remap(adt, tmin, NLATIME_CONVERT_MAP);
-					tmax = BKE_nla_tweakedit_remap(adt, tmax, NLATIME_CONVERT_MAP);
+					if (adt) {
+						tmin = BKE_nla_tweakedit_remap(adt, tmin, NLATIME_CONVERT_MAP);
+						tmax = BKE_nla_tweakedit_remap(adt, tmax, NLATIME_CONVERT_MAP);
+					}
+
+					/* try to set cur using these values, if they're more extreme than previously set values */
+					*min = min_ff(*min, tmin);
+					*max = max_ff(*max, tmax);
+					found = true;
 				}
-
-				/* try to set cur using these values, if they're more extreme than previously set values */
-				*min = min_ff(*min, tmin);
-				*max = max_ff(*max, tmax);
 			}
 		}
 		
@@ -309,6 +314,8 @@
 			*max = 100;
 		}
 	}
+
+	return found;
 }
 
 /* ****************** Automatic Preview-Range Operator ****************** */
@@ -357,11 +364,12 @@
 
 /* ****************** View-All Operator ****************** */
 
-static int actkeys_viewall(bContext *C, const short onlySel)
+static int actkeys_viewall(bContext *C, const bool only_sel, const bool only_xaxis)
 {
 	bAnimContext ac;
 	View2D *v2d;
 	float extra;
+	bool found;
 	
 	/* get editor data */
 	if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -369,15 +377,20 @@
 	v2d = &ac.ar->v2d;
 	
 	/* set the horizontal range, with an extra offset so that the extreme keys will be in view */
-	get_keyframe_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, onlySel);
+	found = get_keyframe_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, only_sel);
+
+	if (only_sel && (found == false))
+		return OPERATOR_CANCELLED;
 	
 	extra = 0.1f * BLI_rctf_size_x(&v2d->cur);
 	v2d->cur.xmin -= extra;
 	v2d->cur.xmax += extra;
 	
 	/* set vertical range */
-	v2d->cur.ymax = 0.0f;
-	v2d->cur.ymin = (float)-BLI_rcti_size_y(&v2d->mask);
+	if (only_xaxis == false) {
+		v2d->cur.ymax = 0.0f;
+		v2d->cur.ymin = (float)-BLI_rcti_size_y(&v2d->mask);
+	}
 	
 	/* do View2D syncing */
 	UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
@@ -393,13 +406,13 @@
 static int actkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
 {	
 	/* whole range */
-	return actkeys_viewall(C, FALSE);
+	return actkeys_viewall(C, false, false);
 }
 
 static int actkeys_viewsel_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	/* only selected */
-	return actkeys_viewall(C, TRUE);
+	return actkeys_viewall(C, true, true);
 }
  
 void ACTION_OT_view_all(wmOperatorType *ot)




More information about the Bf-blender-cvs mailing list