using Microsoft.Xna.Framework;
using MonogameLibrary.UI.Elements;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NativeFileDialogSharp;
using Microsoft.Xna.Framework.Graphics;
using System.Runtime.CompilerServices;
namespace AnimatorFileCreatorAdvanced.Core.GUI
{
internal class CreatingAnimationGUI : AbstractGUI
{
protected override void CreateUI()
{
int width = AppManager.Instance.CurentScreenResolution.X;
int height = AppManager.Instance.CurentScreenResolution.Y;
Label FileNameLabel = new Label(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0, 0.2f, 0, 0.1f),
text = "TEXT",
scale = 0.1f,
fontColor = Color.White,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
Label AnimationPath = new Label(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0f, 0.2f, 0.1f, 0.1f),
text = "AnimationFileFolder/Path",
scale = 0.1f,
fontColor = Color.White,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
Label AnimationTexturePath = new Label(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0.2f, 0.2f, 0.1f, 0.1f),
text = "AnimationTextureFolder/Path",
scale = 0.1f,
fontColor = Color.White,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
Button openFileButton = new Button(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0.4f, 0.2f, 0, 0.1f),
text = "Open File",
scale = 0.1f,
fontColor = Color.White,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
openFileButton.LeftButtonPressed += () =>
{
DialogResult result = Dialog.FileOpen();
var temp = result.Path.Split('\\');
string textureName = temp[temp.Length - 2] + "/" + temp[temp.Length - 1];
textureName = textureName.Split('.')[0];
FileNameLabel.text = textureName;
AppLogic.LoadFile(result.Path);
SetAnimationSample();
};
Elements.Add(openFileButton);
Button AutoBuildButton = new Button(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0.6f, 0.1f, 0, 0.1f),
text = "AutoBuild",
scale = 0.1f,
fontColor = Color.White,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
Button RunButton = new Button(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0.7f, 0.1f, 0, 0.1f),
text = "Run",
scale = 0.1f,
fontColor = Color.White,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
RunButton.LeftButtonPressed += () => {
BuildAnimation();
};
Button Save = new Button(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0.8f, 0.1f, 0, 0.1f),
text = "Save",
scale = 0.1f,
fontColor = Color.White,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
Button AddToMGCB = new Button(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0.9f, 0.1f, 0, 0.1f),
text = "Add To MGCB",
scale = 0.1f,
fontColor = Color.White,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
AddToMGCB.LeftButtonPressed += () =>
{
/*
add this to mgcb
#begin Textures/Animations/explosion_1.animation
/copy:Textures/Animations/explosion_1.animation
#begin GUI/checkboxs_off.png
/importer:TextureImporter
/processor:TextureProcessor
/processorParam:ColorKeyColor=255,0,255,255
/processorParam:ColorKeyEnabled=True
/processorParam:GenerateMipmaps=False
/processorParam:PremultiplyAlpha=True
/processorParam:ResizeToPowerOfTwo=False
/processorParam:MakeSquare=False
/processorParam:TextureFormat=Color
/build:GUI/checkboxs_off.png
*/
};
#region LowerPanel
TextBox InpurWidth = new TextBox(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0.0f, 0.1f, 0.9f, 0.1f),
text = "columns",
scale = 0.1f,
fontColor = Color.Orange,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
TextBox InpurHeight = new TextBox(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0.1f, 0.1f, 0.9f, 0.1f),
text = "rows",
scale = 0.1f,
fontColor = Color.Orange,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
TextBox animationRow = new TextBox(Manager)
{
rectangle = GetRelativeRectangle_SettingSizes(0.2f, 0.1f, 0.9f, 0.1f),
text = "animationrow",
scale = 0.1f,
fontColor = Color.Orange,
mainColor = Color.Gray,
fontName = "Fonts\\Font",
textureName = "GUI/Button"
};
#endregion
}
Texture2D BlackTexture;
Texture2D LoadedSample;
Rectangle SampleRectangle;
Rectangle ExampleAnimation;
Rectangle AnimationSampleRectangle;
Rectangle AnimationExampleSampleRectangle;
public override void LoadContent()
{
BlackTexture = new Texture2D(AppManager.Instance.GraphicsDevice, 1, 1);
BlackTexture.SetData(new Color[] { Color.Black });
SampleRectangle = GetRelativeRectangle(0.01f, 0.31f, 0.1f, 0.01f);
ExampleAnimation = GetRelativeRectangle(0.7f, 0.01f, 0.1f, 0.01f);
base.LoadContent();
}
public override void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Begin();
spriteBatch.Draw(BlackTexture, SampleRectangle, Color.White);
spriteBatch.Draw(BlackTexture, ExampleAnimation, Color.White);
if (LoadedSample != null)
{
spriteBatch.Draw(LoadedSample, AnimationSampleRectangle,Color.White);
spriteBatch.Draw(LoadedSample, AnimationExampleSampleRectangle, AppLogic.animationRectangle,Color.White);
}
spriteBatch.End();
base.Draw(spriteBatch);
}
float margin_left = 0.01f;
float margin_right = 0.01f;
float margin_top = 0.01f;
float margin_bottom = 0.01f;
public Rectangle GetRelativeRectangle_SettingSizes(float marginPercentFromLeft, float relativeXSize, float marginPercentFromTop, float relativeYSize, Rectangle? area = null)
=> GetRelativeRectangle(marginPercentFromLeft, 1 - marginPercentFromLeft - relativeXSize, marginPercentFromTop, 1 - marginPercentFromTop - relativeYSize, area);
public Rectangle GetRelativeRectangle(float marginPercentFromLeft, float marginPercentFromRight, float marginPercentFromTop, float marginPercentFromBottom, Rectangle? area = null)
{
int width;
int height;
if (area is null)
{
width = AppManager.Instance.CurentScreenResolution.X;
height = AppManager.Instance.CurentScreenResolution.Y;
}
else
{
width = area.Value.Width;
height = area.Value.Height;
}
float left = width * (marginPercentFromLeft + margin_left);
float right = width * (1 - marginPercentFromRight - margin_right);
float top = height * (marginPercentFromTop + margin_top);
float bottom = height * (1 - marginPercentFromBottom - margin_bottom);
return new Rectangle((int)left, (int)top, (int)(right - left), (int)(bottom - top));
}
public void SetAnimationSample()
{
Texture2D texture = AppLogic.fileTexture;
if (texture is null)
{
return;
}
LoadedSample = texture;
if (texture.Width / (float)texture.Height > SampleRectangle.Width / (float)SampleRectangle.Height)
{
//not full height
AnimationSampleRectangle = new Rectangle(SampleRectangle.X,
SampleRectangle.Y + (SampleRectangle.Height -
(int)(SampleRectangle.Width * (texture.Height / (float)texture.Width))
) / 2,
SampleRectangle.Width,
(int)(SampleRectangle.Width * (texture.Height / (float)texture.Width))
);
}
else
{
//TODO
AnimationSampleRectangle = new Rectangle(SampleRectangle.X
+ (SampleRectangle.Width -
(int)(SampleRectangle.Height * (texture.Width / (float)texture.Height))
) / 2
,
SampleRectangle.Y ,
(int)(SampleRectangle.Height * (texture.Width / (float)texture.Height)),
SampleRectangle.Height
);
}
}
public void BuildAnimation()
{
Point point = new Point(13,1);
AppLogic.BuildBaseRectangle(point.X, point.Y);
AppLogic.SetRow(0);
if (AppLogic.animationRectangle.Width / (float)AppLogic.animationRectangle.Height > ExampleAnimation.Width / (float)ExampleAnimation.Height)
{
//not full height
AnimationExampleSampleRectangle = new Rectangle(ExampleAnimation.X,
ExampleAnimation.Y + (ExampleAnimation.Height -
(int)(ExampleAnimation.Width * (AppLogic.animationRectangle.Height / (float)AppLogic.animationRectangle.Width))
) / 2,
ExampleAnimation.Width,
(int)(ExampleAnimation.Width * (AppLogic.animationRectangle.Height / (float)AppLogic.animationRectangle.Width))
);
}
else
{
//TODO
AnimationSampleRectangle = new Rectangle(ExampleAnimation.X
+ (ExampleAnimation.Width -
(int)(ExampleAnimation.Height * (AppLogic.animationRectangle.Width / (float)AppLogic.animationRectangle.Height))
) / 2
,
ExampleAnimation.Y,
(int)(ExampleAnimation.Height * (AppLogic.animationRectangle.Width / (float)AppLogic.animationRectangle.Height)),
ExampleAnimation.Height
);
}
}
public override void Update(GameTime gameTime)
{
AppLogic.Update();
base.Update(gameTime);
}
}
static class AppLogic
{
public static Texture2D fileTexture;
public static Rectangle textureTotalRectangle;
public static Rectangle animationRectangle;
public static Point animjationStep;
public static int rows;
public static int columns;
public static bool buildDone = false;
public static void LoadFile(string filePath)
{
fileTexture = Texture2D.FromFile(AppManager.Instance.GraphicsDevice, filePath);
textureTotalRectangle = new Rectangle(0, 0, fileTexture.Width, fileTexture.Height);
buildDone = false;
}
public static void BuildBaseRectangle(int _columns, int _rows)
{
rows = _rows;
columns = _columns;
animationRectangle = new Rectangle(0, 0, textureTotalRectangle.Width / columns, textureTotalRectangle.Height / rows);
animjationStep = new Point(animationRectangle.Width, 0);
buildDone = true;
}
///
/// rows from 0
///
///
public static void SetRow(int row)
{
animationRectangle.Y = animationRectangle.Width * row;
}
public static int framesPassed = 0;
public static void Update()
{
if (!buildDone) return;
framesPassed++;
if (framesPassed > 5)
{
framesPassed = 0;
SetNextFrame();
}
}
private static void SetNextFrame()
{
animationRectangle.X += animjationStep.X;
animationRectangle.Y += animjationStep.Y;
if (animationRectangle.Right > textureTotalRectangle.Width) // ended row
{
animationRectangle.X = 0;
}
}
}
}