|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Windows.Forms;
|
|
|
using System.Diagnostics;
|
|
|
|
|
|
namespace Implab.Fx
|
|
|
{
|
|
|
public static class AnimationHelpers
|
|
|
{
|
|
|
public static Animation<TTarget> AnimateProperty<TTarget, TVal>(this Animation<TTarget> animation, Action<TTarget, TVal> setter, Func<TTarget, TVal> getter, TVal newValue, Func<TVal, TVal, int, int, TVal> fx) where TTarget : class
|
|
|
{
|
|
|
if (animation == null)
|
|
|
throw new ArgumentNullException("animation");
|
|
|
|
|
|
TVal oldValue = getter(animation.Traget);
|
|
|
|
|
|
animation.Step += (target, elaped, duration) =>
|
|
|
{
|
|
|
var value = fx(oldValue, newValue, elaped, duration);
|
|
|
setter(target, value);
|
|
|
};
|
|
|
|
|
|
return animation;
|
|
|
}
|
|
|
|
|
|
public static Animation<T> AnimateTransparency<T>(this T ctl, float newValue) where T : Form
|
|
|
{
|
|
|
var anim = new Animation<T>(ctl);
|
|
|
|
|
|
anim.AnimateProperty(
|
|
|
(target, value) => target.Opacity = value,
|
|
|
target => target.Opacity,
|
|
|
newValue,
|
|
|
(ov, nv, el, du) => ov + ((float)el / du) * (nv - ov)
|
|
|
);
|
|
|
return anim;
|
|
|
}
|
|
|
|
|
|
public static Promise<T> CloseFadeOut<T>(this T ctl) where T : Form
|
|
|
{
|
|
|
var anim = ctl.AnimateTransparency(0);
|
|
|
|
|
|
return anim.Play().DispatchToControl(ctl).Then(frm => frm.Close());
|
|
|
}
|
|
|
|
|
|
public static Promise<T> OverlayFadeIn<T>(this Form that, T overlay) where T : Form
|
|
|
{
|
|
|
if (that == null)
|
|
|
throw new ArgumentNullException("that");
|
|
|
if (overlay == null)
|
|
|
throw new ArgumentNullException("overlay");
|
|
|
|
|
|
// setup overlay
|
|
|
overlay.Opacity = 0;
|
|
|
overlay.FormBorderStyle = FormBorderStyle.None;
|
|
|
overlay.ShowInTaskbar = false;
|
|
|
|
|
|
that.AddOwnedForm(overlay);
|
|
|
|
|
|
EventHandler handler = (object sender, EventArgs args) =>
|
|
|
{
|
|
|
overlay.Bounds = that.RectangleToScreen(that.ClientRectangle);
|
|
|
};
|
|
|
|
|
|
// attach handlers
|
|
|
that.Move += handler;
|
|
|
that.Resize += handler;
|
|
|
that.Shown += handler;
|
|
|
|
|
|
// remove handlers to release overlay
|
|
|
overlay.FormClosed += (sender, args) =>
|
|
|
{
|
|
|
that.Move -= handler;
|
|
|
that.Resize -= handler;
|
|
|
that.Shown -= handler;
|
|
|
};
|
|
|
|
|
|
overlay.Show(that);
|
|
|
overlay.Bounds = that.RectangleToScreen(that.ClientRectangle);
|
|
|
|
|
|
return overlay
|
|
|
.AnimateTransparency(1)
|
|
|
.Play()
|
|
|
.DispatchToControl(overlay);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|