UI/TrackBuilder/TrackBuilderWindow.razor
@using System
@using Sandbox
@using Sandbox.UI
@using HC3
@using HC3.Rides
@namespace HC3.UI
@inherits Window
@if (TrackBuilder.Instance?.IsBuilding is not true)
{
Close();
return;
}
<root>
<div class="column">
<div class="header">Direction</div>
<div class="row">
<div class="button @(TrackBuilder.CanFilter(TrackFeature.Station) ? "enabled" : "disabled") @(TrackBuilder.Filter.Feature == TrackFeature.Station ? "selected" : "")"
tooltip="@TrackFeature.Station.ToString().ToTitleCase()"
onclick="@(() => TrackBuilder.ToggleFilter(TrackFeature.Station))">
<i>home</i>
</div>
<div class="divider"></div>
@foreach ( var direction in TrackBuilder.AllDirections )
{
<div class="button @(TrackBuilder.CanFilter(direction) ? "enabled" : "disabled") @(TrackBuilder.Filter.Direction == direction ? "selected" : "")"
tooltip="@direction.ToString().ToTitleCase()"
onclick="@(() => TrackBuilder.SetFilter( direction ))">
<i>@GetDirectionIcon( direction )</i>
</div>
}
<div class="divider"></div>
<div class="button @(TrackBuilder.CanFilter(TrackFeature.ChainLift) ? "enabled" : "disabled") @(TrackBuilder.Filter.Feature == TrackFeature.ChainLift ? "selected" : "")"
tooltip="@TrackFeature.ChainLift.ToString().ToTitleCase()"
onclick="@(() => TrackBuilder.ToggleFilter(TrackFeature.ChainLift))">
<i>link</i>
</div>
</div>
<div class="divider"></div>
<div class="header">Banking</div>
<div class="row">
@foreach ( var banking in TrackBuilder.AllBanking )
{
<div class="button @(TrackBuilder.CanFilter(banking) ? "enabled" : "disabled") @(TrackBuilder.Filter.Banking == banking ? "selected" : "")"
tooltip="@banking.ToString().ToTitleCase() (@banking.Roll()°)"
onclick="@(() => TrackBuilder.SetFilter( banking ))">
<i style="transform: rotate(@banking.Roll()deg)">directions_car</i>
</div>
}
</div>
<div class="divider"></div>
<div class="header">Incline</div>
<div class="row">
@foreach (var incline in TrackBuilder.AllInclines)
{
<div class="button @(TrackBuilder.CanFilter(incline) ? "enabled" : "disabled") @(TrackBuilder.Filter.Incline == incline ? "selected" : "")"
tooltip="@incline.ToString().ToTitleCase() (@incline.Pitch().ToString("F0")°)"
onclick="@(() => TrackBuilder.SetFilter( incline ))">
<i style="transform: rotate(@incline.Pitch()deg)">arrow_right_alt</i>
</div>
}
</div>
<div class="divider"></div>
<div class="row">
@if (TrackBuilder.Filter.Feature == TrackFeature.Special)
{
foreach (var element in TrackBuilder.PossibleSpecialElements)
{
<div class="button element @(TrackBuilder.SpecialElement == element ? "selected" : "")" onclick="@( () => TrackBuilder.SpecialElement = element )">
<label>@element.Title</label>
</div>
}
}
else
{
foreach (var size in TrackBuilder.AllSizes)
{
<div class="button element @(TrackBuilder.Size == size ? "selected" : "")" onclick="@( () => TrackBuilder.Size = size )">
<label>@size</label>
</div>
}
}
</div>
<div class="row">
<div class="button @(TrackBuilder.CanFilter(TrackFeature.Special) ? "enabled" : "disabled")" onclick="@(() => TrackBuilder.ToggleFilter(TrackFeature.Special))"><i>star</i></div>
<div class="button build" onclick="@(() => TrackBuilder.Build())">Build</div>
<div class="button" onclick="@(() => TrackBuilder.Demolish())"><i>backspace</i></div>
</div>
</div>
</root>
@code
{
#nullable enable
public TrackBuilder TrackBuilder => TrackBuilder.Instance ?? throw new Exception( "Not currently building track." );
public TrackRide? Ride => TrackBuilder.SelectedRide;
public TrackSection Section => TrackBuilder.SelectedSection ?? throw new Exception( "Not currently building track." );
public override string Title => $"{(string.IsNullOrEmpty( Ride?.CustomTitle ) ? Ride?.Title : Ride?.CustomTitle) ?? "Track"} Builder";
public override string Icon => Ride?.BuildingType.GetAttributeOfType<IconAttribute>()?.Value ?? "build";
public override object? Key => TrackBuilder.Instance;
private string GetDirectionIcon( TurnDirection dir )
{
var enumDesc = TypeLibrary.GetEnumDescription( typeof(TurnDirection) );
return enumDesc.GetEntry( dir ).Icon;
}
public override void OnClose()
{
base.OnClose();
TrackBuilder.ClearSelection();
}
protected override int BuildHash() => System.HashCode.Combine( Time.Now );
}