115 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.Drawing;
 | |
| using System.ComponentModel;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Animation
 | |
| {
 | |
|     internal class AnimationRectangle : Animation
 | |
|     {
 | |
|         #region Constructor
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the Animation class.
 | |
|         /// </summary>
 | |
|         /// <param name="target">Target object for animation</param>
 | |
|         /// <param name="targetPropertyName">Target property name for animation</param>
 | |
|         public AnimationRectangle(AnimationEasing animationEasing, int animationDuration)
 | |
|             :
 | |
|             base(new AnimationRequest[0], animationEasing, animationDuration)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the Animation class.
 | |
|         /// </summary>
 | |
|         /// <param name="target">Target object for animation</param>
 | |
|         /// <param name="targetPropertyName">Target property name for animation</param>
 | |
|         public AnimationRectangle(AnimationRequest animationRequest, AnimationEasing animationEasing, int animationDuration)
 | |
|             :
 | |
|             base(new AnimationRequest[] { animationRequest }, animationEasing, animationDuration)
 | |
|         {
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the Animation class.
 | |
|         /// </summary>
 | |
|         /// <param name="target">Target object for animation</param>
 | |
|         /// <param name="targetPropertyName">Target property name for animation</param>
 | |
|         public AnimationRectangle(AnimationRequest[] animationRequests, AnimationEasing animationEasing, int animationDuration)
 | |
|             :
 | |
|             base(animationRequests, animationEasing, animationDuration) { }
 | |
|         #endregion
 | |
| 
 | |
|         #region Implementation
 | |
|         protected override void WorkerDoWork(object sender, DoWorkEventArgs e)
 | |
|         {
 | |
|             AnimationRequest[] requests = (AnimationRequest[])e.Argument;
 | |
|             double elapsedTime = 0;
 | |
|             DateTime startTime = DateTime.Now;
 | |
|             double duration = Duration;
 | |
| 
 | |
|             bool firstPass = true;
 | |
|             while (elapsedTime <= duration)
 | |
|             {
 | |
|                 foreach (AnimationRequest request in requests)
 | |
|                 {
 | |
|                     Rectangle toValue = (Rectangle)request.To;
 | |
|                     Rectangle fromValue = (Rectangle)request.From;
 | |
|                     Rectangle change = new Rectangle(toValue.X - fromValue.X, toValue.Y - fromValue.Y, 
 | |
|                         toValue.Width - fromValue.Width, toValue.Height - fromValue.Height);
 | |
|                     Rectangle newValue = toValue;
 | |
|                     if (IsDisposed(request.Target)) return;
 | |
|                     if (firstPass)
 | |
|                         SetTargetPropertyValue(request.Target, request.Property, request.From);
 | |
|                     
 | |
|                     if (change.X != 0)
 | |
|                         newValue.X = (int)AnimationFunctions[(int)EasingFunction](elapsedTime, fromValue.X, change.X, duration);
 | |
|                     if (change.Y != 0)
 | |
|                         newValue.Y = (int)AnimationFunctions[(int)EasingFunction](elapsedTime, fromValue.Y, change.Y, duration);
 | |
|                     if (change.Width != 0)
 | |
|                         newValue.Width = (int)AnimationFunctions[(int)EasingFunction](elapsedTime, fromValue.Width, change.Width, duration);
 | |
|                     if (change.Height != 0)
 | |
|                         newValue.Height = (int)AnimationFunctions[(int)EasingFunction](elapsedTime, fromValue.Height, change.Height, duration);
 | |
| 
 | |
|                     SetTargetPropertyValue(request.Target, request.Property, newValue);
 | |
| 
 | |
|                     elapsedTime = DateTime.Now.Subtract(startTime).TotalMilliseconds;
 | |
| 
 | |
|                     if (e.Cancel) return;
 | |
|                 }
 | |
|                 
 | |
|                 ExecuteStepUpdateMethod();
 | |
| 
 | |
|                 //if (AnimationUpdateControl != null)
 | |
|                 //    AnimationUpdateControl.Invoke(new MethodInvoker(delegate { AnimationUpdateControl.Update(); }));
 | |
| 
 | |
|                 firstPass = false;
 | |
|             }
 | |
| 
 | |
|             // Make sure final to value is assigned
 | |
|             foreach (AnimationRequest request in requests)
 | |
|             {
 | |
|                 SetTargetPropertyValue(request.Target, request.Property, request.To);
 | |
|             }
 | |
| 
 | |
|             //Console.WriteLine("{0}  WorkerDoWork Complete", DateTime.Now);
 | |
|         }
 | |
| 
 | |
|         private bool IsDisposed(object p)
 | |
|         {
 | |
|             if (p == null) return true;
 | |
|             if (p is Control && ((Control)p).IsDisposed) return true;
 | |
|             if (p is BaseItem && ((BaseItem)p).IsDisposed) return true;
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         protected override object GetPropertyValueCorrectType(double value)
 | |
|         {
 | |
|             return (int)value;
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|     }
 | |
| }
 |