InteractiveTree.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Terminal.Gui;
  7. using static UICatalog.Scenario;
  8. namespace UICatalog.Scenarios {
  9. [ScenarioMetadata (Name: "Interactive Tree", Description: "Create nodes and child nodes in TreeView")]
  10. [ScenarioCategory ("Controls")]
  11. class InteractiveTree : Scenario {
  12. TreeView treeView;
  13. public override void Setup ()
  14. {
  15. Win.Title = this.GetName ();
  16. Win.Y = 1; // menu
  17. Win.Height = Dim.Fill (1); // status bar
  18. Top.LayoutSubviews ();
  19. var menu = new MenuBar (new MenuBarItem [] {
  20. new MenuBarItem ("_File", new MenuItem [] {
  21. new MenuItem ("_Quit", "", () => Quit()),
  22. })
  23. });
  24. Top.Add (menu);
  25. treeView = new TreeView () {
  26. X = 0,
  27. Y = 0,
  28. Width = Dim.Fill (),
  29. Height = Dim.Fill (1),
  30. };
  31. treeView.KeyPress += TreeView_KeyPress;
  32. Win.Add (treeView);
  33. var statusBar = new StatusBar (new StatusItem [] {
  34. new StatusItem(Key.CtrlMask | Key.Q, "~^Q~ Quit", () => Quit()),
  35. new StatusItem(Key.CtrlMask | Key.C, "~^C~ Add Child", () => AddChildNode()),
  36. new StatusItem(Key.CtrlMask | Key.T, "~^T~ Add Root", () => AddRootNode()),
  37. new StatusItem(Key.CtrlMask | Key.R, "~^R~ Rename Node", () => RenameNode()),
  38. });
  39. Top.Add (statusBar);
  40. }
  41. private void TreeView_KeyPress (View.KeyEventEventArgs obj)
  42. {
  43. if (obj.KeyEvent.Key == Key.DeleteChar) {
  44. var toDelete = treeView.SelectedObject;
  45. if (toDelete == null) {
  46. return;
  47. }
  48. obj.Handled = true;
  49. // if it is a root object remove it
  50. if (treeView.Objects.Contains (toDelete)) {
  51. treeView.Remove (toDelete);
  52. } else {
  53. var parent = treeView.GetParent (toDelete);
  54. if (parent == null) {
  55. MessageBox.ErrorQuery ("Could not delete", $"Parent of '{toDelete}' was unexpectedly null", "Ok");
  56. } else {
  57. //update the model
  58. parent.Children.Remove (toDelete);
  59. //refresh the tree
  60. treeView.RefreshObject (parent);
  61. }
  62. }
  63. }
  64. }
  65. private void RenameNode ()
  66. {
  67. var node = treeView.SelectedObject;
  68. if (node != null) {
  69. if (GetText ("Text", "Enter text for node:", node.Text, out string entered)) {
  70. node.Text = entered;
  71. treeView.RefreshObject (node);
  72. }
  73. }
  74. }
  75. private void AddRootNode ()
  76. {
  77. if (GetText ("Text", "Enter text for node:", "", out string entered)) {
  78. treeView.AddObject (new TreeNode (entered));
  79. }
  80. }
  81. private void AddChildNode ()
  82. {
  83. var node = treeView.SelectedObject;
  84. if (node != null) {
  85. if (GetText ("Text", "Enter text for node:", "", out string entered)) {
  86. node.Children.Add (new TreeNode (entered));
  87. treeView.RefreshObject (node);
  88. }
  89. }
  90. }
  91. private bool GetText (string title, string label, string initialText, out string enteredText)
  92. {
  93. bool okPressed = false;
  94. var ok = new Button ("Ok", is_default: true);
  95. ok.Clicked += () => { okPressed = true; Application.RequestStop (); };
  96. var cancel = new Button ("Cancel");
  97. cancel.Clicked += () => { Application.RequestStop (); };
  98. var d = new Dialog (title, 60, 20, ok, cancel);
  99. var lbl = new Label () {
  100. X = 0,
  101. Y = 1,
  102. Text = label
  103. };
  104. var tf = new TextField () {
  105. Text = initialText,
  106. X = 0,
  107. Y = 2,
  108. Width = Dim.Fill ()
  109. };
  110. d.Add (lbl, tf);
  111. tf.SetFocus ();
  112. Application.Run (d);
  113. enteredText = okPressed ? tf.Text.ToString () : null;
  114. return okPressed;
  115. }
  116. private void Quit ()
  117. {
  118. Application.RequestStop ();
  119. }
  120. }
  121. }