f-spot r3753 - in trunk: . src/Widgets
- From: sdelcroix svn gnome org
- To: svn-commits-list gnome org
- Subject: f-spot r3753 - in trunk: . src/Widgets
- Date: Thu, 13 Mar 2008 09:48:13 +0000 (GMT)
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]