Editor/MovieMaker/Session/Ticks.cs
using Sandbox.MovieMaker;
namespace Editor.MovieMaker;
#nullable enable
public enum TickStyle
{
TimeLabel,
Major,
Minor
}
public record struct TimelineTick( TickStyle Style, MovieTime Interval );
partial class Session
{
private const float MinMajorTickWidth = 70f;
private const float MinMinorTickWidth = 6f;
public TimelineTick MajorTick
{
get
{
MovieTime majorTime = 1d;
foreach ( var tickScale in TickScales )
{
if ( TimeToPixels( majorTime ) < MinMajorTickWidth )
{
majorTime = 1d * tickScale;
}
else
{
break;
}
}
return new TimelineTick( TickStyle.Major, majorTime );
}
}
public TimelineTick MinorTick
{
get
{
var minorTime = MovieTime.FromFrames( 1, FrameRate );
while ( TimeToPixels( minorTime ) < MinMinorTickWidth )
{
minorTime *= 2;
}
return new TimelineTick( TickStyle.Minor, minorTime );
}
}
public IEnumerable<TimelineTick> Ticks
{
get
{
var major = MajorTick;
yield return major with { Style = TickStyle.TimeLabel };
yield return major;
yield return MinorTick;
}
}
private static IEnumerable<int> TickScales
{
get
{
for ( var i = 1; i <= 1_000_000; i *= 10 )
{
yield return i;
yield return i * 2;
yield return i * 5;
}
}
}
}