InteractiveTree.cs 4.6 KB

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