a8e6d104f2
Panes can now be selected and moved around. Panes can be resized from corners or edges. Improved hit detection for panes. Mouse left click now selects and moves panes. Use middle mouse or hold shift + left mouse to pan/move camera. More progress on timeline, but currently not functional so currently disabled atm. Multiple layout animations can be selected and played at once. Goes to the highest amount of frames. Start to impliment a parts manager. Will allow editing external layout and animation data, and saving back properly.
256 lines
6.7 KiB
C#
256 lines
6.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using Toolbox.Library.Animations;
|
|
|
|
namespace Toolbox.Library.Forms
|
|
{
|
|
public partial class MiniAnimationPlayer : UserControl
|
|
{
|
|
public EventHandler OnAnimationFrameAdvance;
|
|
|
|
public AnimPlayerState AnimationPlayerState = AnimPlayerState.Stop;
|
|
|
|
public bool IsPlaying
|
|
{
|
|
get
|
|
{
|
|
return AnimationPlayerState == AnimPlayerState.Playing;
|
|
}
|
|
}
|
|
|
|
public bool IsLooping
|
|
{
|
|
get { return loopChkBox.Checked; }
|
|
set { loopChkBox.Checked = value; }
|
|
}
|
|
|
|
public float Frame
|
|
{
|
|
set
|
|
{
|
|
UpdateFrame(value);
|
|
}
|
|
}
|
|
|
|
public float FrameCount
|
|
{
|
|
get
|
|
{
|
|
float frameCount = 1;
|
|
for (int i = 0; i < currentAnimations.Count; i++)
|
|
frameCount = Math.Max(frameCount, currentAnimations[i].FrameCount);
|
|
|
|
return frameCount;
|
|
}
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
currentAnimations.Clear();
|
|
}
|
|
|
|
private List<STAnimation> currentAnimations = new List<STAnimation>();
|
|
|
|
public void AddAnimation(STAnimation animation, bool reset = true)
|
|
{
|
|
if (animation == null)
|
|
return;
|
|
|
|
if (reset)
|
|
Reset();
|
|
|
|
currentAnimations.Add(animation);
|
|
|
|
animation.Reset();
|
|
totalFrame.Maximum = (decimal)FrameCount;
|
|
totalFrame.Value = (decimal)FrameCount;
|
|
currentFrameUpDown.Maximum = (decimal)FrameCount;
|
|
currentFrameUpDown.Value = 0;
|
|
animationTrackBar.Maximum = (int)FrameCount;
|
|
|
|
SetAnimationsToFrame(0);
|
|
}
|
|
|
|
public MiniAnimationPlayer()
|
|
{
|
|
InitializeComponent();
|
|
|
|
stPanel3.BackColor = FormThemes.BaseTheme.FormBackColor;
|
|
stPanel4.BackColor = FormThemes.BaseTheme.FormBackColor;
|
|
|
|
SetupTimer();
|
|
}
|
|
|
|
private Timer animationTimer;
|
|
private void SetupTimer()
|
|
{
|
|
animationTimer = new Timer
|
|
{
|
|
Interval = 100 / 60
|
|
};
|
|
animationTimer.Tick += new EventHandler(animationTimer_Tick);
|
|
}
|
|
|
|
|
|
private void animationTimer_Tick(object sender, EventArgs e)
|
|
{
|
|
UpdateAnimationFrame();
|
|
}
|
|
|
|
private void Play()
|
|
{
|
|
AnimationPlayerState = AnimPlayerState.Playing;
|
|
UpdateAnimationUI();
|
|
animationTimer.Start();
|
|
}
|
|
|
|
private void Pause()
|
|
{
|
|
AnimationPlayerState = AnimPlayerState.Stop;
|
|
UpdateAnimationUI();
|
|
animationTimer.Stop();
|
|
}
|
|
|
|
private void Stop()
|
|
{
|
|
currentFrameUpDown.Value = 0;
|
|
AnimationPlayerState = AnimPlayerState.Stop;
|
|
UpdateAnimationUI();
|
|
animationTimer.Stop();
|
|
}
|
|
|
|
private void UpdateAnimationUI()
|
|
{
|
|
btnPlay.BackgroundImage = IsPlaying ? Properties.Resources.stop
|
|
: Properties.Resources.arrowR;
|
|
}
|
|
|
|
private void UpdateAnimationFrame()
|
|
{
|
|
if (IsPlaying)
|
|
{
|
|
if (currentFrameUpDown.InvokeRequired)
|
|
{
|
|
currentFrameUpDown.BeginInvoke((Action)(() =>
|
|
{
|
|
AdvanceNextFrame();
|
|
}));
|
|
}
|
|
else
|
|
{
|
|
AdvanceNextFrame();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void AdvanceNextFrame()
|
|
{
|
|
if (animationTrackBar.Value == FrameCount - 1)
|
|
{
|
|
if (IsLooping)
|
|
currentFrameUpDown.Value = 0;
|
|
else
|
|
Stop();
|
|
}
|
|
else
|
|
{
|
|
if (currentFrameUpDown.Value < totalFrame.Value)
|
|
currentFrameUpDown.Value++;
|
|
}
|
|
|
|
currentFrameUpDown.Refresh();
|
|
totalFrame.Refresh();
|
|
}
|
|
|
|
public void UpdateFrame(float frame)
|
|
{
|
|
if (frame < (float)currentFrameUpDown.Maximum && frame > (float)currentFrameUpDown.Minimum)
|
|
currentFrameUpDown.Value = (decimal)frame;
|
|
currentFrameUpDown.Refresh();
|
|
}
|
|
|
|
private void currentFrameUpDown_ValueChanged(object sender, EventArgs e) {
|
|
|
|
if (currentFrameUpDown.Value > totalFrame.Value)
|
|
currentFrameUpDown.Value = totalFrame.Value;
|
|
|
|
animationTrackBar.Value = (int)currentFrameUpDown.Value;
|
|
|
|
OnFrameAdvanced();
|
|
|
|
}
|
|
|
|
private void totalFrame_ValueChanged(object sender, EventArgs e)
|
|
{
|
|
if (currentAnimations.Count == 0) return;
|
|
|
|
if (totalFrame.Value < 1)
|
|
{
|
|
totalFrame.Value = 1;
|
|
}
|
|
else
|
|
{
|
|
animationTrackBar.Value = 0;
|
|
}
|
|
}
|
|
|
|
private void OnFrameAdvanced()
|
|
{
|
|
SetAnimationsToFrame(animationTrackBar.Value);
|
|
}
|
|
|
|
private void SetAnimationsToFrame(float frameNum)
|
|
{
|
|
if (currentAnimations.Count == 0)
|
|
return;
|
|
|
|
foreach (var anim in currentAnimations)
|
|
{
|
|
if (frameNum > anim.FrameCount)
|
|
continue;
|
|
|
|
float animFrameNum = frameNum;
|
|
|
|
anim.SetFrame(animFrameNum);
|
|
anim.NextFrame();
|
|
|
|
OnAnimationFrameAdvance?.Invoke(anim, new EventArgs());
|
|
|
|
//Add frames to the playing animation
|
|
anim.Frame += frameNum;
|
|
|
|
//Reset it when it reaches the total frame count
|
|
if (anim.Frame >= anim.FrameCount && anim.Loop)
|
|
{
|
|
anim.Frame = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void animationTrackBar_Scroll(object sender, ScrollEventArgs e) {
|
|
if (currentAnimations.Count == 0 || totalFrame.Value <= 0)
|
|
return;
|
|
|
|
currentFrameUpDown.Value = (decimal)animationTrackBar.Value;
|
|
}
|
|
|
|
private void btnPlay_Click(object sender, EventArgs e)
|
|
{
|
|
if (currentAnimations.Count == 0 || FrameCount <= 0)
|
|
return;
|
|
|
|
if (AnimationPlayerState == AnimPlayerState.Playing)
|
|
Pause();
|
|
else
|
|
Play();
|
|
}
|
|
}
|
|
}
|