using AIStudio.Dialogs; using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; using DialogOptions = AIStudio.Dialogs.DialogOptions; namespace AIStudio.Components; /// /// A configuration component for capturing and displaying keyboard shortcuts. /// public partial class ConfigurationShortcut : ConfigurationBaseCore { [Inject] private IDialogService DialogService { get; init; } = null!; [Inject] private RustService RustService { get; init; } = null!; /// /// The current shortcut value. /// [Parameter] public Func Shortcut { get; set; } = () => string.Empty; /// /// An action which is called when the shortcut was changed. /// [Parameter] public Action ShortcutUpdate { get; set; } = _ => { }; /// /// The name/identifier of the shortcut (used for conflict detection and registration). /// [Parameter] public string ShortcutName { get; set; } = string.Empty; /// /// The icon to display. /// [Parameter] public string Icon { get; set; } = Icons.Material.Filled.Keyboard; /// /// The color of the icon. /// [Parameter] public Color IconColor { get; set; } = Color.Default; #region Overrides of ConfigurationBase protected override bool Stretch => true; protected override Variant Variant => Variant.Outlined; protected override string Label => this.OptionDescription; #endregion private string GetDisplayShortcut() { var shortcut = this.Shortcut(); if (string.IsNullOrWhiteSpace(shortcut)) return string.Empty; // Convert internal format to display format: return shortcut .Replace("CmdOrControl", OperatingSystem.IsMacOS() ? "Cmd" : "Ctrl") .Replace("CommandOrControl", OperatingSystem.IsMacOS() ? "Cmd" : "Ctrl"); } private async Task OpenDialog() { // Suspend shortcut processing while the dialog is open, so the user can // press the current shortcut to re-enter it without triggering the action: await this.RustService.SuspendShortcutProcessing(); try { var dialogParameters = new DialogParameters { { x => x.InitialShortcut, this.Shortcut() }, { x => x.ShortcutName, this.ShortcutName }, }; var dialogReference = await this.DialogService.ShowAsync( this.T("Configure Keyboard Shortcut"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; if (dialogResult.Data is string newShortcut) { this.ShortcutUpdate(newShortcut); await this.SettingsManager.StoreSettings(); await this.InformAboutChange(); } } finally { // Resume the shortcut processing when the dialog is closed: await this.RustService.ResumeShortcutProcessing(); } } }