view Implab.Fx/AnimationHelpers.cs @ 33:b255e4aeef17

removed the reference to the parent from the promise object this allows resolved promises to release parents and results they are holding. Added complete set of operations to IPromiseBase interface Subscribing to the cancellation event of the promise should not affect it's IsExclusive property More tests.
author cin
date Thu, 10 Apr 2014 02:39:29 +0400
parents 2fad2d1f4b03
children d4e38929ce36
line wrap: on
line source

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 IPromise<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 IPromise<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);
        }
    }
}