f-spot r3753 - in trunk: . src/Widgets



Author: sdelcroix
Date: Thu Mar 13 09:48:13 2008
New Revision: 3753
URL: http://svn.gnome.org/viewvc/f-spot?rev=3753&view=rev

Log:
2008-03-13  Stephane Delcroix  <stephane delcroix org>

	* src/Widgets/Filmstrip.cs: default to an order 2 animator (constant 
	acceleration)


Modified:
   trunk/ChangeLog
   trunk/src/Widgets/Filmstrip.cs

Modified: trunk/src/Widgets/Filmstrip.cs
==============================================================================
--- trunk/src/Widgets/Filmstrip.cs	(original)
+++ trunk/src/Widgets/Filmstrip.cs	Thu Mar 13 09:48:13 2008
@@ -242,7 +242,7 @@
 		IAnimator Animator {
 			get {
 				if (animator == null)
-					animator = new ConstantSpeedAnimator (this, OnPositionChanged);
+					animator = new AcceleratedAnimator (this, OnPositionChanged);
 				return animator;
 			}
 		}
@@ -252,6 +252,12 @@
 				case 0:
 					animator = new DirectAnimator (OnPositionChanged);
 					break;
+				case 1:
+					animator = new ConstantSpeedAnimator (this, OnPositionChanged);
+					break;
+				case 2:
+					animator = new AcceleratedAnimator (this, OnPositionChanged);
+					break;
 				default:
 					throw new ArgumentException ("No animator of that order defined");
 				}
@@ -557,5 +563,51 @@
 				return true;
 			}
 		}
+
+		public class AcceleratedAnimator : IAnimator
+		{
+			PositionChangedHandler handler;
+			Filmstrip filmstrip;
+			uint interval = 10;
+			float target;
+			float speed;
+			float acc = 50f; //images/second^2
+
+			public AcceleratedAnimator (Filmstrip filmstrip, PositionChangedHandler handler)
+			{
+				this.handler = handler;
+				this.filmstrip = filmstrip;
+			}
+
+			public void MoveTo (float target)
+			{
+				this.target = target;
+				GLib.Timeout.Add (interval, new GLib.TimeoutHandler (Step)); 	
+			}
+
+			bool Step ()
+			{
+				float distance = Math.Abs (filmstrip.Position - target);
+				if ( distance < speed * speed / acc )	//SLOW DOWN!
+					speed -= acc * interval / 1000f;
+
+				else	//SPEED UP
+					speed += acc * interval / 1000f;
+
+				float increment = speed * interval / 1000f;
+
+				if (Math.Abs (distance - increment) < 0.0001) {
+					handler (target);
+					return false;
+				}
+
+				if (target > filmstrip.Position)
+					handler (filmstrip.Position + increment);
+				else
+					handler (filmstrip.Position - increment);
+
+				return true;
+			}
+		}
 	}
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]