Command.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System.Diagnostics;
  2. using Avalonia.Media;
  3. using PixiEditor.AvaloniaUI.Models.Commands.Evaluators;
  4. using PixiEditor.AvaloniaUI.Models.Input;
  5. using PixiEditor.AvaloniaUI.ViewModels;
  6. using PixiEditor.Extensions.Common.Localization;
  7. namespace PixiEditor.AvaloniaUI.Models.Commands.Commands;
  8. [DebuggerDisplay("{InternalName,nq} ('{DisplayName,nq}')")]
  9. internal abstract partial class Command : PixiObservableObject
  10. {
  11. private KeyCombination _shortcut;
  12. public bool IsDebug { get; init; }
  13. public string InternalName { get; init; }
  14. public string IconPath { get; init; }
  15. public IconEvaluator IconEvaluator { get; init; }
  16. public LocalizedString DisplayName { get; set; }
  17. public LocalizedString Description { get; set; }
  18. public CommandMethods Methods { get; init; }
  19. public KeyCombination DefaultShortcut { get; init; }
  20. public KeyCombination Shortcut
  21. {
  22. get => _shortcut;
  23. set
  24. {
  25. var oldValue = _shortcut;
  26. if (SetProperty(ref _shortcut, value))
  27. {
  28. ShortcutChanged?.Invoke(this, new(oldValue, value));
  29. }
  30. }
  31. }
  32. public string? MenuItemPath { get; init; }
  33. public int MenuItemOrder { get; init; } = 100;
  34. public event ShortcutChangedEventHandler ShortcutChanged;
  35. public event Action CanExecuteChanged;
  36. public abstract object GetParameter();
  37. protected Command(Action<object> onExecute, CanExecuteEvaluator canExecute)
  38. {
  39. Methods = new(this, onExecute, canExecute);
  40. ILocalizationProvider.Current.OnLanguageChanged += OnLanguageChanged;
  41. /*InputLanguageManager.Current.InputLanguageChanged += (_, _) => this.OnPropertyChanged(nameof(Shortcut)); TODO: Didn't find implementation of this in Avalonia*/
  42. }
  43. private void OnLanguageChanged(Language obj)
  44. {
  45. DisplayName = new LocalizedString(DisplayName.Key, DisplayName.Parameters);
  46. Description = new LocalizedString(Description.Key, Description.Parameters);
  47. OnPropertyChanged(nameof(DisplayName));
  48. OnPropertyChanged(nameof(Description));
  49. }
  50. public void Execute() => Methods.Execute(GetParameter());
  51. public bool CanExecute() => Methods.CanExecute(GetParameter());
  52. public IImage GetIcon() => IconEvaluator == null ? null : IconEvaluator.CallEvaluate(this, GetParameter());
  53. public delegate void ShortcutChangedEventHandler(Command command, ShortcutChangedEventArgs args);
  54. public void OnCanExecuteChanged()
  55. {
  56. CanExecuteChanged?.Invoke();
  57. }
  58. }