SpinnerStyles.cs 7.4 KB

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