# HG changeset patch # User cin # Date 2013-09-23 23:31:24 # Node ID f2559580b48107966e8e99395d5abc6163dba95e # Parent 381095ad0a6990c59e6371ff5a073f230602ce14 implemented overlay helpers and some animation heplers improvments diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -8,3 +8,5 @@ Implab/obj/ TestResults/ Implab.Fx/obj/ Implab.Fx/bin/ +Implab.Fx.Test/bin/ +Implab.Fx.Test/obj/ diff --git a/Implab.Fx.Test/Implab.Fx.Test.csproj b/Implab.Fx.Test/Implab.Fx.Test.csproj new file mode 100644 --- /dev/null +++ b/Implab.Fx.Test/Implab.Fx.Test.csproj @@ -0,0 +1,94 @@ + + + + Debug + AnyCPU + + + 2.0 + {2F31E405-E267-4195-A05D-574093C21209} + Library + Properties + Implab.Fx.Test + Implab.Fx.Test + v4.0 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + 3.5 + + + + + + + + + + False + + + + + + + Form + + + MainForm.cs + + + Form + + + OverlayForm.cs + + + + + MainForm.cs + + + OverlayForm.cs + + + + + {06E706F8-6881-43EB-927E-FFC503AF6ABC} + Implab.Fx + + + {F550F1F8-8746-4AD0-9614-855F4C4B7F05} + Implab + + + + + \ No newline at end of file diff --git a/Implab.Fx.Test/OverlayTest.cs b/Implab.Fx.Test/OverlayTest.cs new file mode 100644 --- /dev/null +++ b/Implab.Fx.Test/OverlayTest.cs @@ -0,0 +1,35 @@ +using System; +using System.Text; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Windows.Forms; +using Implab.Fx.Test.Sample; +using System.Drawing; +using Implab.Fx; + +namespace Implab.Fx.Test +{ + [TestClass] + public class OverlayTest + { + [TestMethod] + public void TestMethod1() + { + var mainForm = new MainForm(); + + mainForm.ButtonEvent += (sender, args) => + { + var overlay = new OverlayForm(); + mainForm.OverlayFadeIn(overlay).Then( + o => o.ButtonEvent += (s2, args2) => + { + o.CloseFadeOut(); + } + ); + }; + + Application.Run(mainForm); + } + } +} diff --git a/Implab.Fx.Test/Properties/AssemblyInfo.cs b/Implab.Fx.Test/Properties/AssemblyInfo.cs new file mode 100644 --- /dev/null +++ b/Implab.Fx.Test/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Implab.Fx.Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Implab.Fx.Test")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ac9cc552-177e-4b6d-923c-763dc6f87dd6")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Implab.Fx.Test/Sample/MainForm.Designer.cs b/Implab.Fx.Test/Sample/MainForm.Designer.cs new file mode 100644 --- /dev/null +++ b/Implab.Fx.Test/Sample/MainForm.Designer.cs @@ -0,0 +1,82 @@ +namespace Implab.Fx.Test.Sample +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.listBox1 = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(138, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(138, 41); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(121, 21); + this.comboBox1.TabIndex = 1; + // + // listBox1 + // + this.listBox1.FormattingEnabled = true; + this.listBox1.Location = new System.Drawing.Point(12, 12); + this.listBox1.Name = "listBox1"; + this.listBox1.Size = new System.Drawing.Size(120, 95); + this.listBox1.TabIndex = 2; + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.listBox1); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.button1); + this.Name = "MainForm"; + this.Text = "MainForm"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.ListBox listBox1; + } +} \ No newline at end of file diff --git a/Implab.Fx.Test/Sample/MainForm.cs b/Implab.Fx.Test/Sample/MainForm.cs new file mode 100644 --- /dev/null +++ b/Implab.Fx.Test/Sample/MainForm.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Implab.Fx.Test.Sample +{ + public partial class MainForm : Form + { + public event EventHandler ButtonEvent; + + public MainForm() + { + InitializeComponent(); + } + + private void button1_Click(object sender, EventArgs e) + { + EventHandler temp = ButtonEvent; + if (temp != null) + { + temp(this,new EventArgs()); + } + } + } +} diff --git a/Implab.Fx.Test/Sample/MainForm.resx b/Implab.Fx.Test/Sample/MainForm.resx new file mode 100644 --- /dev/null +++ b/Implab.Fx.Test/Sample/MainForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Implab.Fx.Test/Sample/OverlayForm.Designer.cs b/Implab.Fx.Test/Sample/OverlayForm.Designer.cs new file mode 100644 --- /dev/null +++ b/Implab.Fx.Test/Sample/OverlayForm.Designer.cs @@ -0,0 +1,99 @@ +namespace Implab.Fx.Test.Sample +{ + partial class OverlayForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(12, 88); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(80, 17); + this.checkBox1.TabIndex = 1; + this.checkBox1.Text = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(13, 42); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 2; + this.label1.Text = "label1"; + // + // progressBar1 + // + this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.progressBar1.Location = new System.Drawing.Point(12, 59); + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(260, 23); + this.progressBar1.TabIndex = 3; + // + // OverlayForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.progressBar1); + this.Controls.Add(this.label1); + this.Controls.Add(this.checkBox1); + this.Controls.Add(this.button1); + this.Name = "OverlayForm"; + this.Text = "OverlayForm"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ProgressBar progressBar1; + } +} \ No newline at end of file diff --git a/Implab.Fx.Test/Sample/OverlayForm.cs b/Implab.Fx.Test/Sample/OverlayForm.cs new file mode 100644 --- /dev/null +++ b/Implab.Fx.Test/Sample/OverlayForm.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Implab.Fx.Test.Sample +{ + public partial class OverlayForm : Form + { + public event EventHandler ButtonEvent; + + public OverlayForm() + { + InitializeComponent(); + } + + private void button1_Click(object sender, EventArgs e) + { + EventHandler temp = ButtonEvent; + if (temp != null) + { + temp(this,new EventArgs()); + } + } + } +} diff --git a/Implab.Fx.Test/Sample/OverlayForm.resx b/Implab.Fx.Test/Sample/OverlayForm.resx new file mode 100644 --- /dev/null +++ b/Implab.Fx.Test/Sample/OverlayForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Implab.Fx/AnimationHelpers.cs b/Implab.Fx/AnimationHelpers.cs --- a/Implab.Fx/AnimationHelpers.cs +++ b/Implab.Fx/AnimationHelpers.cs @@ -9,7 +9,7 @@ namespace Implab.Fx { public static class AnimationHelpers { - public static Animation AnimateProperty(this Animation animation, Action setter, Func getter, TVal newValue, Func fx) where TTarget: class + public static Animation AnimateProperty(this Animation animation, Action setter, Func getter, TVal newValue, Func fx) where TTarget : class { if (animation == null) throw new ArgumentNullException("animation"); @@ -25,9 +25,9 @@ namespace Implab.Fx return animation; } - public static Animation
AnimateTransparency(this Form ctl, float newValue) + public static Animation AnimateTransparency(this T ctl, float newValue) where T : Form { - var anim = new Animation(ctl); + var anim = new Animation(ctl); anim.AnimateProperty( (target, value) => target.Opacity = value, @@ -37,5 +37,53 @@ namespace Implab.Fx ); return anim; } + + public static Promise CloseFadeOut(this T ctl) where T : Form + { + var anim = ctl.AnimateTransparency(0); + + return anim.Play().DispatchToControl(ctl).Then(frm => frm.Close()); + } + + public static Promise OverlayFadeIn(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); + } } } diff --git a/Implab.Fx/Implab.Fx.csproj b/Implab.Fx/Implab.Fx.csproj --- a/Implab.Fx/Implab.Fx.csproj +++ b/Implab.Fx/Implab.Fx.csproj @@ -33,6 +33,7 @@ + diff --git a/Implab.sln b/Implab.sln --- a/Implab.sln +++ b/Implab.sln @@ -14,6 +14,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab.Fx", "Implab.Fx\Implab.Fx.csproj", "{06E706F8-6881-43EB-927E-FFC503AF6ABC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Implab.Fx.Test", "Implab.Fx.Test\Implab.Fx.Test.csproj", "{2F31E405-E267-4195-A05D-574093C21209}" +EndProject Global GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = Implab.vsmdi @@ -35,6 +37,10 @@ Global {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Debug|Any CPU.Build.0 = Debug|Any CPU {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Release|Any CPU.ActiveCfg = Release|Any CPU {06E706F8-6881-43EB-927E-FFC503AF6ABC}.Release|Any CPU.Build.0 = Release|Any CPU + {2F31E405-E267-4195-A05D-574093C21209}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F31E405-E267-4195-A05D-574093C21209}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F31E405-E267-4195-A05D-574093C21209}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F31E405-E267-4195-A05D-574093C21209}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Implab.suo b/Implab.suo index 203e41ed2a3711da61caa28207d1625fb6bf3ecb..b05584cb87294b827c30a9fda45191a622c8d457 GIT binary patch literal 42496 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