demo.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. using Terminal.Gui;
  2. using System;
  3. using Mono.Terminal;
  4. static class Demo {
  5. class Box10x : View {
  6. public Box10x (int x, int y) : base (new Rect (x, y, 10, 10))
  7. {
  8. }
  9. public override void Redraw (Rect region)
  10. {
  11. Driver.SetAttribute (ColorScheme.Focus);
  12. for (int y = 0; y < 10; y++) {
  13. Move (0, y);
  14. for (int x = 0; x < 10; x++) {
  15. Driver.AddRune ((Rune)('0' + (x + y) % 10));
  16. }
  17. }
  18. }
  19. }
  20. class Filler : View {
  21. public Filler (Rect rect) : base (rect)
  22. {
  23. }
  24. public override void Redraw (Rect region)
  25. {
  26. Driver.SetAttribute (ColorScheme.Focus);
  27. var f = Frame;
  28. for (int y = 0; y < f.Width; y++) {
  29. Move (0, y);
  30. for (int x = 0; x < f.Height; x++) {
  31. Rune r;
  32. switch (x % 3) {
  33. case 0:
  34. r = '.';
  35. break;
  36. case 1:
  37. r = 'o';
  38. break;
  39. default:
  40. r = 'O';
  41. break;
  42. }
  43. Driver.AddRune (r);
  44. }
  45. }
  46. }
  47. }
  48. static void ShowTextAlignments (View container)
  49. {
  50. container.Add (
  51. new Label (new Rect (0, 0, 40, 3), "1-Hello world, how are you doing today") { TextAlignment = TextAlignment.Left },
  52. new Label (new Rect (0, 4, 40, 3), "2-Hello world, how are you doing today") { TextAlignment = TextAlignment.Right },
  53. new Label (new Rect (0, 8, 40, 3), "3-Hello world, how are you doing today") { TextAlignment = TextAlignment.Centered },
  54. new Label (new Rect (0, 12, 40, 3), "4-Hello world, how are you doing today") { TextAlignment = TextAlignment.Justified });
  55. }
  56. static void ShowEntries (View container)
  57. {
  58. var scrollView = new ScrollView (new Rect (50, 10, 20, 8)) {
  59. ContentSize = new Size (100, 100),
  60. ContentOffset = new Point (-1, -1),
  61. ShowVerticalScrollIndicator = true,
  62. ShowHorizontalScrollIndicator = true
  63. };
  64. scrollView.Add (new Box10x (0, 0));
  65. //scrollView.Add (new Filler (new Rect (0, 0, 40, 40)));
  66. // This is just to debug the visuals of the scrollview when small
  67. var scrollView2 = new ScrollView (new Rect (72, 10, 3, 3)) {
  68. ContentSize = new Size (100, 100),
  69. ShowVerticalScrollIndicator = true,
  70. ShowHorizontalScrollIndicator = true
  71. };
  72. scrollView2.Add (new Box10x (0, 0));
  73. var progress = new ProgressBar (new Rect (68, 1, 10, 1));
  74. bool timer (MainLoop caller)
  75. {
  76. progress.Pulse ();
  77. return true;
  78. }
  79. Application.MainLoop.AddTimeout (TimeSpan.FromMilliseconds (300), timer);
  80. // A little convoluted, this is because I am using this to test the
  81. // layout based on referencing elements of another view:
  82. var login = new Label ("Login: ") { X = 3, Y = 6 };
  83. var password = new Label ("Password: ") {
  84. X = Pos.Left (login),
  85. Y = Pos.Bottom (login) + 1
  86. };
  87. var loginText = new TextField ("") {
  88. X = Pos.Right (password),
  89. Y = Pos.Top (login),
  90. Width = 40
  91. };
  92. var passText = new TextField ("") {
  93. Secret = true,
  94. X = Pos.Left (loginText),
  95. Y = Pos.Top (password),
  96. Width = Dim.Width (loginText)
  97. };
  98. // Add some content
  99. container.Add (
  100. login,
  101. loginText,
  102. password,
  103. passText,
  104. new FrameView (new Rect (3, 10, 25, 6), "Options"){
  105. new CheckBox (1, 0, "Remember me"),
  106. new RadioGroup (1, 2, new [] { "_Personal", "_Company" }),
  107. },
  108. new ListView (new Rect (60, 6, 16, 4), new string [] {
  109. "First row",
  110. "<>",
  111. "This is a very long row that should overflow what is shown",
  112. "4th",
  113. "There is an empty slot on the second row",
  114. "Whoa",
  115. "This is so cool"
  116. }),
  117. scrollView,
  118. //scrollView2,
  119. new Button (3, 19, "Ok"),
  120. new Button (10, 19, "Cancel"),
  121. progress,
  122. new Label (3, 22, "Press ESC and 9 to activate the menubar")
  123. );
  124. }
  125. public static Label ml2;
  126. static void NewFile ()
  127. {
  128. var d = new Dialog (
  129. "New File", 50, 20,
  130. new Button ("Ok", is_default: true) { Clicked = () => { Application.RequestStop (); } },
  131. new Button ("Cancel") { Clicked = () => { Application.RequestStop (); } });
  132. ml2 = new Label (1, 1, "Mouse Debug Line");
  133. d.Add (ml2);
  134. Application.Run (d);
  135. }
  136. //
  137. // Creates a nested editor
  138. static void Editor (Toplevel top)
  139. {
  140. var tframe = top.Frame;
  141. var ntop = new Toplevel (tframe);
  142. var menu = new MenuBar (new MenuBarItem [] {
  143. new MenuBarItem ("_File", new MenuItem [] {
  144. new MenuItem ("_Close", "", () => {Application.RequestStop ();}),
  145. }),
  146. new MenuBarItem ("_Edit", new MenuItem [] {
  147. new MenuItem ("_Copy", "", null),
  148. new MenuItem ("C_ut", "", null),
  149. new MenuItem ("_Paste", "", null)
  150. }),
  151. });
  152. ntop.Add (menu);
  153. var win = new Window ("/etc/passwd") {
  154. X = 0,
  155. Y = 0,
  156. Width = Dim.Fill (),
  157. Height = Dim.Fill ()
  158. };
  159. ntop.Add (win);
  160. var text = new TextView (new Rect (0, 0, tframe.Width - 2, tframe.Height - 3));
  161. text.Text = System.IO.File.ReadAllText ("/etc/passwd");
  162. win.Add (text);
  163. Application.Run (ntop);
  164. }
  165. static bool Quit ()
  166. {
  167. var n = MessageBox.Query (50, 7, "Quit Demo", "Are you sure you want to quit this demo?", "Yes", "No");
  168. return n == 0;
  169. }
  170. static void Close ()
  171. {
  172. MessageBox.ErrorQuery (50, 5, "Error", "There is nothing to close", "Ok");
  173. }
  174. // Watch what happens when I try to introduce a newline after the first open brace
  175. // it introduces a new brace instead, and does not indent. Then watch me fight
  176. // the editor as more oddities happen.
  177. public static void Open ()
  178. {
  179. var d = new OpenDialog ("Open", "Open a file");
  180. Application.Run (d);
  181. }
  182. public static void ShowHex (Toplevel top)
  183. {
  184. var tframe = top.Frame;
  185. var ntop = new Toplevel (tframe);
  186. var menu = new MenuBar (new MenuBarItem [] {
  187. new MenuBarItem ("_File", new MenuItem [] {
  188. new MenuItem ("_Close", "", () => {Application.RequestStop ();}),
  189. }),
  190. });
  191. ntop.Add (menu);
  192. var win = new Window ("/etc/passwd") {
  193. X = 0,
  194. Y = 1,
  195. Width = Dim.Fill (),
  196. Height = Dim.Fill ()
  197. };
  198. ntop.Add (win);
  199. var source = System.IO.File.OpenRead ("/etc/passwd");
  200. var hex = new HexView (source) {
  201. X = 0,
  202. Y = 0,
  203. Width = Dim.Fill (),
  204. Height = Dim.Fill ()
  205. };
  206. win.Add (hex);
  207. Application.Run (ntop);
  208. }
  209. public static Label ml;
  210. static void Main ()
  211. {
  212. //Application.UseSystemConsole = true;
  213. Application.Init ();
  214. var top = Application.Top;
  215. var tframe = top.Frame;
  216. //Open ();
  217. #if true
  218. var win = new Window ("Hello") {
  219. X = 0,
  220. Y = 1,
  221. Width = Dim.Fill (),
  222. Height = Dim.Fill ()
  223. };
  224. #else
  225. var win = new Window (new Rect (0, 1, tframe.Width, tframe.Height - 1), "Hello");
  226. #endif
  227. var menu = new MenuBar (new MenuBarItem [] {
  228. new MenuBarItem ("_File", new MenuItem [] {
  229. new MenuItem ("Text Editor Demo", "", () => { Editor (top); }),
  230. new MenuItem ("_New", "Creates new file", NewFile),
  231. new MenuItem ("_Open", "", Open),
  232. new MenuItem ("_Hex", "", () => ShowHex (top)),
  233. new MenuItem ("_Close", "", () => Close ()),
  234. new MenuItem ("_Quit", "", () => { if (Quit ()) top.Running = false; })
  235. }),
  236. new MenuBarItem ("_Edit", new MenuItem [] {
  237. new MenuItem ("_Copy", "", null),
  238. new MenuItem ("C_ut", "", null),
  239. new MenuItem ("_Paste", "", null)
  240. }),
  241. });
  242. ShowEntries (win);
  243. int count = 0;
  244. ml = new Label (new Rect (3, 17, 47, 1), "Mouse: ");
  245. Application.RootMouseEvent += delegate (MouseEvent me) {
  246. ml.Text = $"Mouse: ({me.X},{me.Y}) - {me.Flags} {count++}";
  247. };
  248. win.Add (ml);
  249. // ShowTextAlignments (win);
  250. top.Add (win);
  251. top.Add (menu);
  252. Application.Run ();
  253. }
  254. }