You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
5.0 KiB
142 lines
5.0 KiB
using System; |
|
using System.ComponentModel; |
|
using System.Drawing; |
|
using System.Text; |
|
using System.Windows.Forms; |
|
using System.Collections; |
|
|
|
namespace ArdupilotMega.Controls |
|
{ |
|
public partial class FlashMessage : Label |
|
{ |
|
private const int fadeInterval = 20; //time in ms between "frames" of animation |
|
private const int fadeDuration = 200; //overall animation duration in ms in one direction |
|
private const int desiredHeight = 20; //desired height to animate to |
|
private const int inOutDelay = 800 / fadeInterval; //number in ms between in and out |
|
private const float fadeStepValue = desiredHeight * (float)fadeInterval / (float)fadeDuration; |
|
private int inOutDelayCounter; |
|
private int direction; |
|
private int heightVisible; |
|
private bool disposeOnComplete; |
|
private Timer fadeTimer; |
|
private bool inOut; |
|
private Queue messages = new Queue(); |
|
|
|
public FlashMessage() |
|
{ |
|
Visible = false; |
|
|
|
Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) |
|
| System.Windows.Forms.AnchorStyles.Right))); |
|
Font = new System.Drawing.Font("Microsoft Sans Serif", 9.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); |
|
Location = new Point(0, 0); |
|
TextAlign = System.Drawing.ContentAlignment.MiddleCenter; |
|
|
|
fadeTimer = new Timer(); |
|
fadeTimer.Interval = fadeInterval; |
|
fadeTimer.Tick += new EventHandler(fadeTimer_Tick); |
|
} |
|
|
|
public void FadeInOut(string msg, bool success) |
|
{ |
|
if (Visible) |
|
{ |
|
messages.Enqueue(new { msg = msg, success = success }); |
|
} |
|
else |
|
{ |
|
if (this.Parent != null) Width = this.Parent.ClientSize.Width; |
|
BringToFront(); |
|
direction = 1; |
|
inOut = true; |
|
inOutDelayCounter = inOutDelay; |
|
heightVisible = Height = 0; |
|
Text = msg; |
|
BackColor = success ? Color.YellowGreen : Color.Coral; |
|
} |
|
Visible = true; |
|
fadeTimer.Enabled = true; |
|
} |
|
|
|
//public void FadeIn(string msg, bool success) |
|
//{ |
|
// if (this.Parent != null) Width = this.Parent.ClientSize.Width; |
|
// BringToFront(); |
|
// direction = 1; |
|
// inOut = false; |
|
// heightVisible = Height = 0; |
|
// if (Visible) |
|
// { |
|
// messages.Enqueue(msg); |
|
// } |
|
// else |
|
// { |
|
// Text = msg; |
|
// } |
|
// BackColor = success ? Color.YellowGreen : Color.Coral; |
|
// Visible = true; |
|
// fadeTimer.Enabled = true; |
|
//} |
|
|
|
private void FadeOut(bool disposeOnComplete = false) |
|
{ |
|
if (this.Parent != null) Width = this.Parent.ClientSize.Width; |
|
BringToFront(); |
|
direction = -1; |
|
inOut = false; |
|
heightVisible = Height = desiredHeight; |
|
this.disposeOnComplete = disposeOnComplete; |
|
fadeTimer.Enabled = true; |
|
} |
|
|
|
private void fadeTimer_Tick(object sender, EventArgs e) |
|
{ |
|
bool done = false; |
|
heightVisible += (int)Math.Round(direction * fadeStepValue); |
|
if (heightVisible < 0) { done = true; heightVisible = 0; } |
|
if (heightVisible > desiredHeight) { done = true; heightVisible = desiredHeight; } |
|
Height = heightVisible; |
|
if (done) |
|
{ |
|
if (inOut) |
|
{ |
|
if (--inOutDelayCounter == 0) |
|
{ |
|
FadeOut(disposeOnComplete); |
|
} |
|
} |
|
else |
|
{ |
|
if (messages.Count > 0) |
|
{ |
|
Object o = messages.Dequeue(); |
|
Text = (string)o.GetType().GetProperty("msg").GetValue(o, null); |
|
bool success = (bool)o.GetType().GetProperty("success").GetValue(o, null); |
|
BackColor = success ? Color.YellowGreen : Color.Coral; |
|
|
|
direction = 1; |
|
inOut = true; |
|
inOutDelayCounter = inOutDelay; |
|
heightVisible = Height = 0; |
|
|
|
//Text = (messages.Dequeue()).msg; |
|
} |
|
else |
|
{ |
|
fadeTimer.Enabled = false; |
|
Visible = false; |
|
if (direction == -1) //hide after fadeOut |
|
{ |
|
if (disposeOnComplete) this.Dispose(); |
|
} |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
//this.Height = heightVisible; |
|
//this.Invalidate(); |
|
} |
|
} |
|
} |
|
}
|
|
|