Frames.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. using System.Globalization;
  2. using System;
  3. using Terminal.Gui;
  4. using System.Linq;
  5. using NStack;
  6. using Terminal.Gui.Configuration;
  7. namespace UICatalog.Scenarios {
  8. [ScenarioMetadata (Name: "Frames Demo", Description: "Demonstrates Margin, Border, and Padding on Views.")]
  9. [ScenarioCategory ("Layout")]
  10. [ScenarioCategory ("Borders")]
  11. public class Frames : Scenario {
  12. public class ThicknessEditor : View {
  13. private Thickness thickness;
  14. public Thickness Thickness {
  15. get => thickness;
  16. set {
  17. thickness = value;
  18. ThicknessChanged?.Invoke (this, new ThicknessEventArgs () { Thickness = Thickness });
  19. }
  20. }
  21. public event EventHandler<ThicknessEventArgs> ThicknessChanged;
  22. public ThicknessEditor ()
  23. {
  24. Margin.Thickness = new Thickness (1);
  25. BorderFrame.Thickness = new Thickness (1);
  26. }
  27. public override void BeginInit ()
  28. {
  29. base.BeginInit ();
  30. var topEdit = new TextField ("") {
  31. X = Pos.Center (),
  32. Y = 0,
  33. Width = 5
  34. };
  35. topEdit.TextChanging += (e) => {
  36. try {
  37. Thickness = new Thickness (Thickness.Left,
  38. int.Parse (e.NewText.ToString ()), Thickness.Right,
  39. Thickness.Bottom);
  40. } catch {
  41. if (!e.NewText.IsEmpty) {
  42. e.Cancel = true;
  43. }
  44. }
  45. };
  46. topEdit.Text = $"{Thickness.Top}";
  47. Add (topEdit);
  48. var leftEdit = new TextField ("") {
  49. X = 0,
  50. Y = Pos.Bottom (topEdit),
  51. Width = 5
  52. };
  53. leftEdit.TextChanging += (e) => {
  54. try {
  55. Thickness = new Thickness (int.Parse (e.NewText.ToString ()),
  56. Thickness.Top, Thickness.Right,
  57. Thickness.Bottom);
  58. } catch {
  59. if (!e.NewText.IsEmpty) {
  60. e.Cancel = true;
  61. }
  62. }
  63. };
  64. leftEdit.Text = $"{Thickness.Left}";
  65. Add (leftEdit);
  66. var rightEdit = new TextField ("") {
  67. X = Pos.Right (topEdit) + 1,
  68. Y = Pos.Bottom (topEdit),
  69. Width = 5
  70. };
  71. rightEdit.TextChanging += (e) => {
  72. try {
  73. Thickness = new Thickness (Thickness.Left,
  74. Thickness.Top, int.Parse (e.NewText.ToString ()),
  75. Thickness.Bottom);
  76. } catch {
  77. if (!e.NewText.IsEmpty) {
  78. e.Cancel = true;
  79. }
  80. }
  81. };
  82. rightEdit.Text = $"{Thickness.Right}";
  83. Add (rightEdit);
  84. var bottomEdit = new TextField ("") {
  85. X = Pos.Center (),
  86. Y = Pos.Bottom (leftEdit),
  87. Width = 5
  88. };
  89. bottomEdit.TextChanging += (e) => {
  90. try {
  91. Thickness = new Thickness (Thickness.Left,
  92. Thickness.Top, Thickness.Right,
  93. int.Parse (e.NewText.ToString ()));
  94. } catch {
  95. if (!e.NewText.IsEmpty) {
  96. e.Cancel = true;
  97. }
  98. }
  99. };
  100. bottomEdit.Text = $"{Thickness.Bottom}";
  101. Add (bottomEdit);
  102. var copyTop = new Button ("Copy Top") {
  103. X = Pos.Center (),
  104. Y = Pos.AnchorEnd (1)
  105. };
  106. copyTop.Clicked += () => {
  107. Thickness = new Thickness (Thickness.Top);
  108. if (topEdit.Text.IsEmpty) {
  109. topEdit.Text = "0";
  110. }
  111. bottomEdit.Text = leftEdit.Text = rightEdit.Text = topEdit.Text;
  112. };
  113. Add (copyTop);
  114. LayoutSubviews ();
  115. Height = Margin.Thickness.Vertical + BorderFrame.Thickness.Vertical + Padding.Thickness.Vertical + 4;
  116. Width = 20;
  117. }
  118. }
  119. public class FramesEditor : Window {
  120. public FramesEditor (NStack.ustring title, View viewToEdit)
  121. {
  122. viewToEdit.Margin.ColorScheme = Colors.ColorSchemes ["Toplevel"];
  123. var marginEditor = new ThicknessEditor () {
  124. X = 20,
  125. Y = 0,
  126. Title = "Margin",
  127. Thickness = viewToEdit.Margin.Thickness,
  128. };
  129. marginEditor.ThicknessChanged += (s, a) => {
  130. viewToEdit.Margin.Thickness = a.Thickness;
  131. };
  132. Add (marginEditor);
  133. viewToEdit.BorderFrame.ColorScheme = Colors.ColorSchemes ["Base"];
  134. var borderEditor = new ThicknessEditor () {
  135. X = Pos.Right(marginEditor),
  136. Y = 0,
  137. Title = "Border",
  138. Thickness = viewToEdit.BorderFrame.Thickness,
  139. };
  140. borderEditor.ThicknessChanged += (s, a) => {
  141. viewToEdit.BorderFrame.Thickness = a.Thickness;
  142. };
  143. Add (borderEditor);
  144. viewToEdit.Padding.ColorScheme = Colors.ColorSchemes ["Error"];
  145. var paddingEditor = new ThicknessEditor () {
  146. X = Pos.Right (borderEditor),
  147. Y = 0,
  148. Title = "Padding",
  149. Thickness = viewToEdit.Padding.Thickness,
  150. };
  151. paddingEditor.ThicknessChanged += (s, a) => {
  152. viewToEdit.Padding.Thickness = a.Thickness;
  153. };
  154. Add (paddingEditor);
  155. viewToEdit.Y = Pos.Center () + 4;
  156. Add (new Label ("BorderStyle:"));
  157. var borderStyleEnum = Enum.GetValues (typeof (BorderStyle)).Cast<BorderStyle> ().ToList ();
  158. var rbBorderStyle = new RadioGroup (borderStyleEnum.Select (
  159. e => NStack.ustring.Make (e.ToString ())).ToArray ()) {
  160. X = 2,
  161. Y = 1,
  162. SelectedItem = (int)viewToEdit.BorderFrame.BorderStyle
  163. };
  164. Add (rbBorderStyle);
  165. //rbBorderStyle.SelectedItemChanged += (e) => {
  166. // viewToEdit.BorderFrame.BorderStyle = (BorderStyle)e.SelectedItem;
  167. // viewToEdit.SetNeedsDisplay ();
  168. //};
  169. //Add (new Label ("Background:") {
  170. // Y = 5
  171. //});
  172. //var colorEnum = Enum.GetValues (typeof (Color)).Cast<Color> ().ToList ();
  173. //var rbBackground = new RadioGroup (colorEnum.Select (
  174. // e => NStack.ustring.Make (e.ToString ())).ToArray ()) {
  175. // X = 2,
  176. // Y = 6,
  177. // SelectedItem = (int)viewToEdit.Border.BackgroundColor
  178. //};
  179. //rbBackground.SelectedItemChanged += (e) => {
  180. // if (viewToEdit.Border != null) {
  181. // viewToEdit.Border.BackgroundColor = (Color)e.SelectedItem;
  182. // }
  183. //};
  184. //Add (rbBackground);
  185. //Add (new Label ("BorderBrush:") {
  186. // X = Pos.AnchorEnd (20),
  187. // Y = 5
  188. //});
  189. //var rbBorderBrush = new RadioGroup (colorEnum.Select (
  190. // e => NStack.ustring.Make (e.ToString ())).ToArray ()) {
  191. // X = Pos.AnchorEnd (18),
  192. // Y = 6,
  193. // SelectedItem = (int)viewToEdit.Border.ForgroundColor
  194. //};
  195. //rbBorderBrush.SelectedItemChanged += (e) => {
  196. // if (viewToEdit.Border != null) {
  197. // viewToEdit.Border.ForgroundColor = (Color)e.SelectedItem;
  198. // }
  199. //};
  200. //Add (rbBorderBrush);
  201. viewToEdit.X = Pos.Center ();
  202. viewToEdit.Y = Pos.Bottom (marginEditor);
  203. viewToEdit.Width = 50;
  204. viewToEdit.Height = 20;
  205. Add (viewToEdit);
  206. LayoutSubviews ();
  207. Title = title;
  208. }
  209. }
  210. public override void Init ()
  211. {
  212. Application.Init ();
  213. ConfigurationManager.Themes.Theme = Theme;
  214. ConfigurationManager.Apply ();
  215. Application.Top.ColorScheme = Colors.ColorSchemes [TopLevelColorScheme];
  216. var view = new Window ();
  217. var tf1 = new TextField ("1234567890") { Width = 10 };
  218. var button = new Button ("Press me!") {
  219. X = Pos.Center (),
  220. Y = Pos.Center (),
  221. };
  222. button.Clicked += () => MessageBox.Query (20, 7, "Hi", $"I'm a {view.GetType().Name}?", "Yes", "No");
  223. var label = new Label ($"I'm a {view.GetType ().Name}") {
  224. X = Pos.Center (),
  225. Y = Pos.Center () - 1,
  226. };
  227. var tf2 = new TextField ("1234567890") {
  228. X = Pos.AnchorEnd (10),
  229. Y = Pos.AnchorEnd (1),
  230. Width = 10
  231. };
  232. var tv = new TextView () {
  233. Y = Pos.AnchorEnd (2),
  234. Width = 10,
  235. Height = Dim.Fill (),
  236. Text = "1234567890"
  237. };
  238. view.Margin.Thickness = new Thickness (3);
  239. view.Margin.ColorScheme = Colors.ColorSchemes ["Dialog"];
  240. view.Add (tf1, button, label, tf2, tv);
  241. view.LayoutComplete += (a) => view.Title = view.ToString ();
  242. var editor = new FramesEditor (
  243. $"{Application.QuitKey} to Quit - Scenario: {GetName ()}",
  244. view);
  245. Application.Run (editor);
  246. Application.Shutdown ();
  247. }
  248. public override void Run ()
  249. {
  250. }
  251. }
  252. }