ArrangementEditor.cs 4.1 KB

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