InteractiveTree.cs 3.4 KB

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