ArrangementEditor.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #nullable enable
  2. using System;
  3. using System.Collections.Generic;
  4. using Terminal.Gui;
  5. namespace UICatalog.Scenarios;
  6. /// <summary>
  7. /// Provides an editor UI for the Margin, Border, and Padding of a View.
  8. /// </summary>
  9. public sealed class ArrangementEditor : EditorBase
  10. {
  11. public ArrangementEditor ()
  12. {
  13. Title = "ArrangementEditor";
  14. TabStop = TabBehavior.TabGroup;
  15. Initialized += ArrangementEditor_Initialized;
  16. _arrangementSlider.Options =
  17. [
  18. new SliderOption<ViewArrangement>
  19. {
  20. Legend = ViewArrangement.Movable.ToString (),
  21. Data = ViewArrangement.Movable
  22. },
  23. new SliderOption<ViewArrangement>
  24. {
  25. Legend = ViewArrangement.LeftResizable.ToString (),
  26. Data = ViewArrangement.LeftResizable
  27. },
  28. new SliderOption<ViewArrangement>
  29. {
  30. Legend = ViewArrangement.RightResizable.ToString (),
  31. Data = ViewArrangement.RightResizable
  32. },
  33. new SliderOption<ViewArrangement>
  34. {
  35. Legend = ViewArrangement.TopResizable.ToString (),
  36. Data = ViewArrangement.TopResizable
  37. },
  38. new SliderOption<ViewArrangement>
  39. {
  40. Legend = ViewArrangement.BottomResizable.ToString (),
  41. Data = ViewArrangement.BottomResizable
  42. },
  43. new SliderOption<ViewArrangement>
  44. {
  45. Legend = ViewArrangement.Overlapped.ToString (),
  46. Data = ViewArrangement.Overlapped
  47. }
  48. ];
  49. Add (_arrangementSlider);
  50. }
  51. private readonly Slider<ViewArrangement> _arrangementSlider = new()
  52. {
  53. Orientation = Orientation.Vertical,
  54. UseMinimumSize = true,
  55. Type = SliderType.Multiple,
  56. AllowEmpty = true,
  57. };
  58. protected override void OnViewToEditChanged ()
  59. {
  60. _arrangementSlider.Enabled = ViewToEdit is not Adornment;
  61. _arrangementSlider.OptionsChanged -= ArrangementSliderOnOptionsChanged;
  62. // Set the appropriate options in the slider based on _viewToEdit.Arrangement
  63. if (ViewToEdit is { })
  64. {
  65. _arrangementSlider.Options.ForEach (
  66. option =>
  67. {
  68. _arrangementSlider.ChangeOption (
  69. _arrangementSlider.Options.IndexOf (option),
  70. (ViewToEdit.Arrangement & option.Data) == option.Data);
  71. });
  72. }
  73. _arrangementSlider.OptionsChanged += ArrangementSliderOnOptionsChanged;
  74. }
  75. private void ArrangementEditor_Initialized (object? sender, EventArgs e) { _arrangementSlider.OptionsChanged += ArrangementSliderOnOptionsChanged; }
  76. private void ArrangementSliderOnOptionsChanged (object? sender, SliderEventArgs<ViewArrangement> e)
  77. {
  78. if (ViewToEdit is { })
  79. {
  80. // Set the arrangement based on the selected options
  81. var arrangement = ViewArrangement.Fixed;
  82. foreach (KeyValuePair<int, SliderOption<ViewArrangement>> option in e.Options)
  83. {
  84. arrangement |= option.Value.Data;
  85. }
  86. ViewToEdit.Arrangement = arrangement;
  87. if (ViewToEdit.Arrangement.HasFlag (ViewArrangement.Overlapped))
  88. {
  89. ViewToEdit.ShadowStyle = ShadowStyle.Transparent;
  90. ViewToEdit.SchemeName = "Toplevel";
  91. }
  92. else
  93. {
  94. ViewToEdit.ShadowStyle = ShadowStyle.None;
  95. ViewToEdit.SchemeName = ViewToEdit!.SuperView!.SchemeName;
  96. }
  97. if (ViewToEdit.Arrangement.HasFlag (ViewArrangement.Movable))
  98. {
  99. ViewToEdit.BorderStyle = LineStyle.Double;
  100. }
  101. else
  102. {
  103. ViewToEdit.BorderStyle = LineStyle.Single;
  104. }
  105. }
  106. }
  107. }