Navigation.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. using System.Timers;
  2. using Terminal.Gui;
  3. namespace UICatalog.Scenarios;
  4. [ScenarioMetadata ("Navigation", "Navigation Tester")]
  5. [ScenarioCategory ("Mouse and Keyboard")]
  6. [ScenarioCategory ("Layout")]
  7. [ScenarioCategory ("Overlapped")]
  8. public class Navigation : Scenario
  9. {
  10. private int _hotkeyCount;
  11. public override void Main ()
  12. {
  13. Application.Init ();
  14. Window app = new ()
  15. {
  16. Title = GetQuitKeyAndName (),
  17. TabStop = TabBehavior.TabGroup
  18. };
  19. var adornmentsEditor = new AdornmentsEditor
  20. {
  21. X = 0,
  22. Y = 0,
  23. AutoSelectViewToEdit = true,
  24. TabStop = TabBehavior.NoStop
  25. };
  26. app.Add (adornmentsEditor);
  27. var arrangementEditor = new ArrangementEditor()
  28. {
  29. X = Pos.Right (adornmentsEditor),
  30. Y = 0,
  31. //Height = Dim.Fill(),
  32. AutoSelectViewToEdit = true,
  33. TabStop = TabBehavior.NoStop
  34. };
  35. app.Add (arrangementEditor);
  36. FrameView testFrame = new ()
  37. {
  38. Title = "_1 Test Frame",
  39. X = Pos.Right (arrangementEditor),
  40. Y = 0,
  41. Width = Dim.Fill (),
  42. Height = Dim.Fill ()
  43. };
  44. app.Add (testFrame);
  45. Button button = new ()
  46. {
  47. X = 0,
  48. Y = 0,
  49. Title = $"TopButton _{GetNextHotKey ()}"
  50. };
  51. testFrame.Add (button);
  52. View tiledView1 = CreateTiledView (0, 2, 2);
  53. View tiledView2 = CreateTiledView (1, Pos.Right (tiledView1), Pos.Top (tiledView1));
  54. testFrame.Add (tiledView1);
  55. testFrame.Add (tiledView2);
  56. View tiledView3 = CreateTiledView (1, Pos.Right (tiledView2), Pos.Top (tiledView2));
  57. tiledView3.TabStop = TabBehavior.TabGroup;
  58. tiledView3.BorderStyle = LineStyle.Double;
  59. testFrame.Add (tiledView3);
  60. View overlappedView1 = CreateOverlappedView (2, 10, Pos.Center ());
  61. View tiledSubView = CreateTiledView (4, 0, 2);
  62. overlappedView1.Add (tiledSubView);
  63. ProgressBar progressBar = new ()
  64. {
  65. X = Pos.AnchorEnd (),
  66. Y = Pos.AnchorEnd (),
  67. Width = Dim.Fill (),
  68. Id = "progressBar"
  69. };
  70. overlappedView1.Add (progressBar);
  71. Timer timer = new (10)
  72. {
  73. AutoReset = true
  74. };
  75. timer.Elapsed += (o, args) =>
  76. {
  77. if (progressBar.Fraction == 1.0)
  78. {
  79. progressBar.Fraction = 0;
  80. }
  81. progressBar.Fraction += 0.01f;
  82. Application.Wakeup ();
  83. progressBar.SetNeedsDisplay ();
  84. };
  85. timer.Start ();
  86. View overlappedView2 = CreateOverlappedView (3, 8, 10);
  87. View overlappedInOverlapped1 = CreateOverlappedView (4, 1, 4);
  88. overlappedView2.Add (overlappedInOverlapped1);
  89. View overlappedInOverlapped2 = CreateOverlappedView (5, 10, 7);
  90. overlappedView2.Add (overlappedInOverlapped2);
  91. StatusBar statusBar = new ();
  92. statusBar.Add (
  93. new Shortcut
  94. {
  95. Title = "Hide",
  96. Text = "Hotkey",
  97. Key = Key.F4,
  98. Action = () =>
  99. {
  100. // TODO: move this logic into `View.ShowHide()` or similar
  101. overlappedView2.Visible = false;
  102. overlappedView2.Enabled = overlappedView2.Visible;
  103. }
  104. });
  105. statusBar.Add (
  106. new Shortcut
  107. {
  108. Title = "Toggle Hide",
  109. Text = "App",
  110. KeyBindingScope = KeyBindingScope.Application,
  111. Key = Key.F4.WithCtrl,
  112. Action = () =>
  113. {
  114. // TODO: move this logic into `View.ShowHide()` or similar
  115. overlappedView2.Visible = !overlappedView2.Visible;
  116. overlappedView2.Enabled = overlappedView2.Visible;
  117. if (overlappedView2.Visible)
  118. {
  119. overlappedView2.SetFocus ();
  120. }
  121. }
  122. });
  123. overlappedView2.Add (statusBar);
  124. ColorPicker colorPicker = new ()
  125. {
  126. Y = 12,
  127. Width = Dim.Fill (),
  128. Id = "colorPicker",
  129. Style = new ()
  130. {
  131. ShowTextFields = true,
  132. ShowColorName = true
  133. }
  134. };
  135. colorPicker.ApplyStyleChanges ();
  136. colorPicker.SelectedColor = testFrame.ColorScheme.Normal.Background;
  137. colorPicker.ColorChanged += ColorPicker_ColorChanged;
  138. overlappedView2.Add (colorPicker);
  139. overlappedView2.Width = 50;
  140. testFrame.Add (overlappedView1);
  141. testFrame.Add (overlappedView2);
  142. DatePicker datePicker = new ()
  143. {
  144. X = 1,
  145. Y = 7,
  146. Id = "datePicker",
  147. ColorScheme = Colors.ColorSchemes ["Toplevel"],
  148. ShadowStyle = ShadowStyle.Transparent,
  149. BorderStyle = LineStyle.Double,
  150. CanFocus = true, // Can't drag without this? BUGBUG
  151. TabStop = TabBehavior.TabGroup,
  152. Arrangement = ViewArrangement.Movable | ViewArrangement.Overlapped
  153. };
  154. testFrame.Add (datePicker);
  155. button = new ()
  156. {
  157. X = Pos.AnchorEnd (),
  158. Y = Pos.AnchorEnd (),
  159. Title = $"TopButton _{GetNextHotKey ()}"
  160. };
  161. testFrame.Add (button);
  162. adornmentsEditor.AutoSelectSuperView = testFrame;
  163. arrangementEditor.AutoSelectSuperView = testFrame;
  164. testFrame.SetFocus ();
  165. Application.Run (app);
  166. timer.Close ();
  167. app.Dispose ();
  168. Application.Shutdown ();
  169. return;
  170. void ColorPicker_ColorChanged (object sender, ColorEventArgs e)
  171. {
  172. testFrame.ColorScheme = testFrame.ColorScheme with { Normal = new (testFrame.ColorScheme.Normal.Foreground, e.CurrentValue) };
  173. }
  174. }
  175. private View CreateOverlappedView (int id, Pos x, Pos y)
  176. {
  177. var overlapped = new View
  178. {
  179. X = x,
  180. Y = y,
  181. Height = Dim.Auto (),
  182. Width = Dim.Auto (),
  183. Title = $"Overlapped{id} _{GetNextHotKey ()}",
  184. ColorScheme = Colors.ColorSchemes ["Toplevel"],
  185. Id = $"Overlapped{id}",
  186. ShadowStyle = ShadowStyle.Transparent,
  187. BorderStyle = LineStyle.Double,
  188. CanFocus = true, // Can't drag without this? BUGBUG
  189. TabStop = TabBehavior.TabGroup,
  190. Arrangement = ViewArrangement.Movable | ViewArrangement.Overlapped | ViewArrangement.Resizable
  191. };
  192. Button button = new ()
  193. {
  194. Title = $"Button{id} _{GetNextHotKey ()}"
  195. };
  196. overlapped.Add (button);
  197. button = new ()
  198. {
  199. Y = Pos.Bottom (button),
  200. Title = $"Button{id} _{GetNextHotKey ()}"
  201. };
  202. overlapped.Add (button);
  203. return overlapped;
  204. }
  205. private View CreateTiledView (int id, Pos x, Pos y)
  206. {
  207. var overlapped = new View
  208. {
  209. X = x,
  210. Y = y,
  211. Height = Dim.Auto (),
  212. Width = Dim.Auto (),
  213. Title = $"Tiled{id} _{GetNextHotKey ()}",
  214. Id = $"Tiled{id}",
  215. BorderStyle = LineStyle.Single,
  216. CanFocus = true, // Can't drag without this? BUGBUG
  217. TabStop = TabBehavior.TabStop,
  218. Arrangement = ViewArrangement.Fixed
  219. };
  220. Button button = new ()
  221. {
  222. Title = $"Tiled Button{id} _{GetNextHotKey ()}"
  223. };
  224. overlapped.Add (button);
  225. button = new ()
  226. {
  227. Y = Pos.Bottom (button),
  228. Title = $"Tiled Button{id} _{GetNextHotKey ()}"
  229. };
  230. overlapped.Add (button);
  231. return overlapped;
  232. }
  233. private char GetNextHotKey () { return (char)('A' + _hotkeyCount++); }
  234. }