using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using System.Drawing;
using AnotoData;
namespace ProjectedStripBoard
{
public class ProjectedStrip
{
public enum DrawingMod { Normal, Markers };
#region Static members
static public float DX = 0.050f;
static public float DY = 0.03f;
static public float MarkerWidth = 0.062f;
static public float MarkerHeight = 0.075f;
static public Vector2 TopLeft = new Vector2(0.08f, 0.13f);
static public Vector2 BottomRight = new Vector2(0.93f, 0.89f);
static public Font TheFont = new Font("Arial", 20.0f, FontStyle.Bold);
static public Color DefaultColor = Color.FromArgb(100,100,100,100);
static public Brush DefaultTextColor = Brushes.Black;
static public Brush SelectedStripBrushColor = new SolidBrush(Color.FromArgb(150,0,50,100));
#endregion
public Color StripColor = ProjectedStrip.DefaultColor;
public Brush TextColor = ProjectedStrip.DefaultTextColor;
public Vector2 Postition;
public string Name;
public Color Color = Color.Blue;
public AnotoStrip TheAnotoStrip;
public bool[] VisibleTags;
public ProjectedStrip(AnotoStrip item)
{
TheAnotoStrip = item;
VisibleTags = new bool[TheAnotoStrip.TagIds.Length];
}
public void ClearVisibleTags()
{
VisibleTags = new bool[TheAnotoStrip.TagIds.Length];
}
static public Vector2 GetCorrectedPostion(Vector2 pos)
{
float corretedX = GenericScaleF(pos.X, 0, TopLeft.X, 1, BottomRight.X);
float corretedY = GenericScaleF(pos.Y, 0, TopLeft.Y, 1, BottomRight.Y);
return new Vector2(corretedX, corretedY);
}
public void Draw(DrawingMod drawingMod, Color BackColor, Graphics g, float screenWidth, float screenHeight, Font font)
{
//First, we need to scale the view
Vector2 correctedPos = GetCorrectedPostion(Postition);
RectangleF OuterBound = new RectangleF((correctedPos.X - DX) * screenWidth, (correctedPos.Y - DY) * screenHeight, (MarkerWidth*5) * screenWidth, (MarkerHeight) * screenHeight);
string text = TheAnotoStrip.CallSign;
SizeF size = g.MeasureString(text, TheFont);
if (drawingMod == DrawingMod.Markers)
{
for (int i = 0; i < VisibleTags.Length; i++)
{
if (VisibleTags[i])
{
OuterBound = new RectangleF((correctedPos.X + i * MarkerWidth - DX) * screenWidth, (correctedPos.Y - DY) * screenHeight, (MarkerWidth) * screenWidth, (MarkerHeight) * screenHeight);
g.DrawRectangle(new Pen(Color, 1.0f), OuterBound.X, OuterBound.Y, OuterBound.Width, OuterBound.Height);
// g.DrawString(Name, font, Brushes.Black, Postition.X * screenWidth, Postition.Y * screenHeight);
g.DrawString(TheAnotoStrip.TagIds[i].ToString(), TheFont, TextColor, new PointF(OuterBound.X, OuterBound.Y + TheFont.Height));
}
}
}
if (drawingMod == DrawingMod.Normal)
{
//Draw only if one tag is visible
if (VisibleTags.Contains(true))
{
if ( IsSelected)
g.FillRectangle(Brushes.DarkBlue, OuterBound);
else
g.FillRectangle(new SolidBrush(StripColor), OuterBound);
// g.DrawString(Name, font, Brushes.Black, Postition.X * screenWidth, Postition.Y * screenHeight);
// g.DrawString(text, TheFont, TextColor, new PointF(OuterBound.X + (OuterBound.Width - size.Width) / 2, OuterBound.Y + (OuterBound.Height - size.Height) / 2));
g.DrawString(text, TheFont, TextColor, new PointF(OuterBound.X + 10, OuterBound.Y + 10));
}
if ( !(VisibleTags.Contains(true)) && IsSelected )
{
//This is strip that is not in the strip board, then display it as a virtual one
this.Postition = new Vector2(0.3f,1.05f);
g.FillRectangle(SelectedStripBrushColor, OuterBound);
g.DrawString(text, TheFont, TextColor, new PointF(OuterBound.X + (OuterBound.Width - size.Width) / 2, OuterBound.Y + (OuterBound.Height - size.Height) / 2));
}
}
}
static public float GenericScaleF(float input, float i1, float o1, float i2, float o2)
{
if (i2 == i1) return ((o2 + o1) / 2.0f);
float a = (o2 - o1) / (i2 - i1);
float b = o1 - a * i1;
return (a * input + b);
}
///
/// Return the requested strip with the marker index within the strip
///
///
///
///
///
public static ProjectedStrip FindStrip(List strips, int markerId, out int idIndex)
{
idIndex = -1;
foreach (var strip in strips)
{
if (strip.HasThisMarker(markerId))
{
idIndex = Array.IndexOf(strip.TheAnotoStrip.TagIds, markerId);
return strip;
}
}
return null;
}
private bool HasThisMarker(int markerId)
{
return TheAnotoStrip.TagIds.Contains(markerId);
}
///
/// Update the strip position with the given tag index
///
///
///
///
internal void UpdatePosition(int tagIndex, float x, float y)
{
//if (tagIndex == 0)
//{
this.Postition.X = x - tagIndex * MarkerWidth;
this.Postition.Y = y;
VisibleTags[tagIndex] = true;
//}
//else
// VisibleTags[tagIndex] = false;
}
public bool IsSelected { get; set; }
}
}