LANCommander/LANCommander.Launcher/UI/Components/PlayButton.razor

175 lines
5.1 KiB
Text
Raw Permalink Normal View History

@implements IDisposable
@using LANCommander.Launcher.Data.Models
@using LANCommander.Launcher.Models
2024-06-10 23:29:19 -05:00
@using System.Diagnostics
@using LANCommander.SDK.Helpers
@inject SDK.Client Client
2024-06-10 23:29:19 -05:00
@inject GameService GameService
@inject LibraryService LibraryService
@inject InstallService InstallService
2024-06-10 23:29:19 -05:00
@inject ModalService ModalService
2024-08-01 17:27:35 -05:00
@inject MessageService MessageService
2024-07-11 18:32:09 -05:00
@inject MessageBusService MessageBusService
2024-06-10 23:29:19 -05:00
2025-01-12 21:49:30 -06:00
@if (State == PlayButtonState.Running)
2024-06-10 23:29:19 -05:00
{
<Popconfirm Title="Do you want to stop this game?" OkText="Yes" OnConfirm="() => Stop()">
2024-12-31 18:21:41 -06:00
<Button Type="ButtonType.Primary" Size="ButtonSize.Large" Icon="@IconType.Outline.CaretRight">Running</Button>
2024-06-10 23:29:19 -05:00
</Popconfirm>
}
2025-01-12 21:49:30 -06:00
else if (State == PlayButtonState.Starting)
{
<Button Type="ButtonType.Primary" Size="ButtonSize.Large" Loading="true">Starting</Button>
}
else if (State == PlayButtonState.Stopping)
{
<Button Type="ButtonType.Primary" Size="ButtonSize.Large" Loading="true">Stopping</Button>
}
2024-06-10 23:29:19 -05:00
else
{
2024-12-31 18:21:41 -06:00
<Space Direction="SpaceDirection.Horizontal">
2024-06-10 23:29:19 -05:00
<SpaceItem>
2024-12-31 18:21:41 -06:00
<Button Type="ButtonType.Primary" Size="ButtonSize.Large" Icon="@IconType.Outline.CaretRight" OnClick="() => Run()">Play</Button>
2024-06-10 23:29:19 -05:00
</SpaceItem>
<SpaceItem>
<Dropdown>
<Overlay>
<Menu>
<LibraryItemContextMenu Model="LibraryItem" MenuExtra="MenuExtra" />
2024-06-10 23:29:19 -05:00
</Menu>
</Overlay>
<ChildContent>
2024-12-31 18:21:41 -06:00
<Button Type="@ButtonType.Default" Size="ButtonSize.Large" Icon="@IconType.Outline.Ellipsis" />
2024-06-10 23:29:19 -05:00
</ChildContent>
</Dropdown>
</SpaceItem>
</Space>
}
@code {
[Parameter] public Guid LibraryItemId { get; set; }
2024-11-09 17:15:04 -06:00
[Parameter] public Models.ListItem LibraryItem { get; set; }
[Parameter] public RenderFragment MenuExtra { get; set; }
2024-06-10 23:29:19 -05:00
Timer StateTimer;
Settings Settings;
2025-01-12 21:49:30 -06:00
PlayButtonState State = PlayButtonState.Idle;
public enum PlayButtonState
{
Idle,
Starting,
Running,
Stopping
}
2024-07-11 18:32:09 -05:00
protected override async Task OnInitializedAsync()
{
StateTimer = new Timer(state => { InvokeAsync(UpdateState); }, null, 0, 250);
Settings = SettingService.GetSettings();
2024-07-11 18:32:09 -05:00
}
2024-06-10 23:29:19 -05:00
protected override async Task OnParametersSetAsync()
{
if (LibraryItem == null && LibraryItemId != Guid.Empty)
2024-11-09 17:15:04 -06:00
LibraryItem = await LibraryService.GetItemAsync(LibraryItemId);
2024-06-10 23:29:19 -05:00
}
async Task UpdateState()
2024-07-11 18:32:09 -05:00
{
2025-01-12 21:49:30 -06:00
if (Client.Games.IsRunning(LibraryItem.Key))
{
2025-01-12 21:49:30 -06:00
await ChangeState(PlayButtonState.Running);
}
2025-01-12 21:49:30 -06:00
else if (State == PlayButtonState.Running && !Client.Games.IsRunning(LibraryItem.Key))
2024-07-11 18:32:09 -05:00
{
2025-01-12 21:49:30 -06:00
await ChangeState(PlayButtonState.Idle);
2024-07-11 18:32:09 -05:00
}
}
2025-01-12 21:49:30 -06:00
async Task ChangeState(PlayButtonState state)
{
State = state;
await InvokeAsync(StateHasChanged);
}
2024-06-10 23:29:19 -05:00
async Task Run()
{
var game = LibraryItem.DataItem as Game;
2025-02-28 14:02:27 -06:00
var actions = await Client.Games.GetActionsAsync(game.InstallDirectory, game.Id);
2024-06-10 23:29:19 -05:00
2025-01-12 21:49:30 -06:00
await ChangeState(PlayButtonState.Starting);
2024-08-01 17:27:35 -05:00
if (actions == null || actions.Count() == 0)
{
MessageService.Error("No actions found!");
2025-01-12 21:49:30 -06:00
await ChangeState(PlayButtonState.Idle);
2024-08-01 17:27:35 -05:00
return;
}
var primaryActions = actions.Where(a => a.IsPrimaryAction && (LibraryService.IsInstalled(a.GameId) || a.GameId == Guid.Empty));
2024-06-10 23:29:19 -05:00
2024-08-01 17:27:35 -05:00
if (primaryActions.Count() == 0)
{
MessageService.Error("No primary action found!");
2025-01-12 21:49:30 -06:00
await ChangeState(PlayButtonState.Idle);
2024-08-01 17:27:35 -05:00
return;
}
2024-06-10 23:29:19 -05:00
if (primaryActions.Count() == 1)
{
var task = GameService.Run(game, primaryActions.First());
2024-06-10 23:29:19 -05:00
await InvokeAsync(StateHasChanged);
await task;
}
else
{
var modalOptions = new ModalOptions()
{
Title = $"Play {game.Title}",
2024-06-10 23:29:19 -05:00
Maximizable = false,
DefaultMaximized = false,
Closable = true,
MaskClosable = true,
2024-06-10 23:29:19 -05:00
Footer = null,
Centered = true,
WrapClassName = "game-actions-dialog",
AfterClose = async () =>
{
Client.Lobbies.ReleaseSteam();
await ChangeState(PlayButtonState.Idle);
}
2024-06-10 23:29:19 -05:00
};
var model = new ActionSelectorDialogOptions
{
Actions = actions.Where(a => a.IsPrimaryAction),
Game = game
2024-06-10 23:29:19 -05:00
};
var modalRef = ModalService.CreateModal<ActionSelectorDialog, ActionSelectorDialogOptions, Process>(modalOptions, model);
}
}
async Task Stop()
{
2025-01-12 21:49:30 -06:00
await ChangeState(PlayButtonState.Stopping);
await Client.Games.Stop(LibraryItem.Key);
2024-06-10 23:29:19 -05:00
2025-01-12 21:49:30 -06:00
await ChangeState(PlayButtonState.Idle);
2024-06-10 23:29:19 -05:00
}
public void Dispose()
{
StateTimer.Dispose();
}
2024-06-10 23:29:19 -05:00
}