SpinnerStyles.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Terminal.Gui;
  5. namespace UICatalog.Scenarios {
  6. [ScenarioMetadata (Name: "SpinnerView Styles", Description: "Shows the SpinnerView Styles.")]
  7. [ScenarioCategory ("Controls")]
  8. [ScenarioCategory ("Progress")]
  9. public class SpinnerViewStyles : Scenario {
  10. class Property {
  11. public string Name { get; set; }
  12. }
  13. public override void Setup ()
  14. {
  15. const int DEFAULT_DELAY = 130;
  16. const string DEFAULT_CUSTOM = @"-\|/";
  17. var styleDict = new Dictionary<int, KeyValuePair<string, Type>> ();
  18. int i = 0;
  19. foreach (var style in typeof (SpinnerStyle).GetNestedTypes ()) {
  20. styleDict.Add (i, new KeyValuePair<string, Type> (style.Name, style));
  21. i++;
  22. }
  23. var preview = new View () {
  24. X = Pos.Center (),
  25. Y = 0,
  26. Width = 22,
  27. Height = 3,
  28. //Title = "Preview",
  29. BorderStyle = LineStyle.Single
  30. };
  31. Win.Add (preview);
  32. var spinner = new SpinnerView () {
  33. X = Pos.Center (),
  34. Y = 0
  35. };
  36. preview.Add (spinner);
  37. spinner.AutoSpin = true;
  38. var ckbAscii = new CheckBox ("Ascii Only", false) {
  39. X = Pos.Center () - 7,
  40. Y = Pos.Bottom (preview),
  41. Enabled = false,
  42. Checked = true
  43. };
  44. Win.Add (ckbAscii);
  45. var ckbNoSpecial = new CheckBox ("No Special", false) {
  46. X = Pos.Center () + 7,
  47. Y = Pos.Bottom (preview),
  48. Enabled = false,
  49. Checked = true
  50. };
  51. Win.Add (ckbNoSpecial);
  52. var ckbReverse = new CheckBox ("Reverse", false) {
  53. X = Pos.Center () - 22,
  54. Y = Pos.Bottom (preview) + 1,
  55. Checked = false
  56. };
  57. Win.Add (ckbReverse);
  58. var ckbBounce = new CheckBox ("Bounce", false) {
  59. X = Pos.Right (ckbReverse) + 2,
  60. Y = Pos.Bottom (preview) + 1,
  61. Checked = false
  62. };
  63. Win.Add (ckbBounce);
  64. var delayLabel = new Label ("Delay:") {
  65. X = Pos.Right (ckbBounce) + 2,
  66. Y = Pos.Bottom (preview) + 1
  67. };
  68. Win.Add (delayLabel);
  69. var delayField = new TextField (DEFAULT_DELAY.ToString ()) {
  70. X = Pos.Right (delayLabel),
  71. Y = Pos.Bottom (preview) + 1,
  72. Width = 5
  73. };
  74. Win.Add (delayField);
  75. delayField.TextChanged += (s, e) => {
  76. if (ushort.TryParse (delayField.Text, out var i))
  77. spinner.SpinDelay = i;
  78. };
  79. var customLabel = new Label ("Custom:") {
  80. X = Pos.Right (delayField) + 2,
  81. Y = Pos.Bottom (preview) + 1
  82. };
  83. Win.Add (customLabel);
  84. var customField = new TextField (DEFAULT_CUSTOM) {
  85. X = Pos.Right (customLabel),
  86. Y = Pos.Bottom (preview) + 1,
  87. Width = 12
  88. };
  89. Win.Add (customField);
  90. var styleArray = styleDict.Select (e => e.Value.Key).ToArray ();
  91. if (styleArray.Length < 1)
  92. return;
  93. var styles = new ListView () {
  94. X = Pos.Center (),
  95. Y = Pos.Bottom (preview) + 2,
  96. Height = Dim.Fill (),
  97. Width = Dim.Fill (1)
  98. };
  99. styles.SetSource (styleArray);
  100. styles.SelectedItem = 0; // SpinnerStyle.Custom;
  101. Win.Add (styles);
  102. SetCustom ();
  103. customField.TextChanged += (s, e) => {
  104. if (customField.Text.Length > 0) {
  105. if (styles.SelectedItem != 0)
  106. styles.SelectedItem = 0; // SpinnerStyle.Custom
  107. SetCustom ();
  108. }
  109. };
  110. styles.SelectedItemChanged += (s, e) => {
  111. if (e.Item == 0) { // SpinnerStyle.Custom
  112. if (customField.Text.Length < 1)
  113. customField.Text = DEFAULT_CUSTOM;
  114. if (delayField.Text.Length < 1)
  115. delayField.Text = DEFAULT_DELAY.ToString ();
  116. SetCustom ();
  117. } else {
  118. spinner.Visible = true;
  119. spinner.Style = (SpinnerStyle)Activator.CreateInstance(styleDict [e.Item].Value);
  120. delayField.Text = spinner.SpinDelay.ToString ();
  121. ckbBounce.Checked = spinner.SpinBounce;
  122. ckbNoSpecial.Checked = !spinner.HasSpecialCharacters;
  123. ckbAscii.Checked = spinner.IsAsciiOnly;
  124. ckbReverse.Checked = false;
  125. }
  126. };
  127. ckbReverse.Toggled += (s, e) => {
  128. spinner.SpinReverse = (bool)!e.OldValue;
  129. };
  130. ckbBounce.Toggled += (s, e) => {
  131. spinner.SpinBounce = (bool)!e.OldValue;
  132. };
  133. Application.Top.Unloaded += Top_Unloaded;
  134. void SetCustom ()
  135. {
  136. if (customField.Text.Length > 0) {
  137. spinner.Visible = true;
  138. if (ushort.TryParse (delayField.Text, out var d))
  139. spinner.SpinDelay = d;
  140. else {
  141. delayField.Text = DEFAULT_DELAY.ToString ();
  142. spinner.SpinDelay = DEFAULT_DELAY;
  143. }
  144. var str = new List<string> ();
  145. foreach (var c in customField.Text.ToCharArray ()) {
  146. str.Add (c.ToString ());
  147. }
  148. spinner.Sequence = str.ToArray ();
  149. } else {
  150. spinner.Visible = false;
  151. }
  152. }
  153. void Top_Unloaded (object sender, EventArgs args)
  154. {
  155. if (spinner != null) {
  156. spinner.Dispose ();
  157. spinner = null;
  158. }
  159. Application.Top.Unloaded -= Top_Unloaded;
  160. }
  161. }
  162. }
  163. }