ardupilot/Tools/ArdupilotMegaPlanner/Controls/FlashMessage.cs

143 lines
5.0 KiB
C#

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