FlagSelectorTEnum.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #nullable enable
  2. using System;
  3. namespace Terminal.Gui.Views;
  4. /// <summary>
  5. /// Provides a user interface for displaying and selecting non-mutually-exclusive flags in a type-safe way.
  6. /// <see cref="FlagSelector"/> provides a non-type-safe version. <c>TFlagsEnum</c> must be a valid enum type with
  7. /// the '[Flags]' attribute.
  8. /// </summary>
  9. public sealed class FlagSelector<TFlagsEnum> : FlagSelector where TFlagsEnum : struct, Enum
  10. {
  11. /// <summary>
  12. /// Initializes a new instance of the <see cref="FlagSelector{TFlagsEnum}"/> class.
  13. /// </summary>
  14. public FlagSelector ()
  15. {
  16. SetValuesAndLabels<TFlagsEnum> ();
  17. }
  18. /// <summary>
  19. /// Gets or sets the value of the selected flags.
  20. /// </summary>
  21. public new TFlagsEnum? Value
  22. {
  23. get => base.Value.HasValue ? (TFlagsEnum)Enum.ToObject (typeof (TFlagsEnum), base.Value.Value) : (TFlagsEnum?)null;
  24. set => base.Value = value.HasValue ? Convert.ToInt32 (value.Value) : (int?)null;
  25. }
  26. /// <summary>
  27. /// Raised when <see cref="Value"/> has changed. Provides the new value as <typeparamref name="TFlagsEnum"/>?.
  28. /// </summary>
  29. public new event EventHandler<EventArgs<TFlagsEnum?>>? ValueChanged;
  30. /// <summary>
  31. /// Called when <see cref="Value"/> has changed. Raises the generic <see cref="ValueChanged"/> event.
  32. /// </summary>
  33. protected override void OnValueChanged (int? value, int? previousValue)
  34. {
  35. base.OnValueChanged (value, previousValue);
  36. TFlagsEnum? newValue = value.HasValue ? (TFlagsEnum)Enum.ToObject (typeof (TFlagsEnum), value.Value) : null;
  37. ValueChanged?.Invoke (this, new EventArgs<TFlagsEnum?> (newValue));
  38. }
  39. }